blob: 3b9ede0d3d49a1df9408e5ae6fa9b4530691d2d0 [file] [log] [blame]
TsiChung Liew8e585f02007-06-18 13:50:13 -05001/*
2 * Copyright (C) 2003 Josef Baumgartner <josef.baumgartner@telex.de>
3 * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
4 *
TsiChung Liew536e7da2008-10-22 11:38:21 +00005 * (C) Copyright 2004-2008 Freescale Semiconductor, Inc.
6 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
7 *
Wolfgang Denk3765b3e2013-10-07 13:07:26 +02008 * SPDX-License-Identifier: GPL-2.0+
TsiChung Liew8e585f02007-06-18 13:50:13 -05009 */
10
Wolfgang Denk25ddd1f2010-10-26 14:34:52 +020011#include <asm-offsets.h>
TsiChung Liew8e585f02007-06-18 13:50:13 -050012#include <config.h>
13#include "version.h"
TsiChung Liewdd9f0542010-03-11 22:12:53 -060014#include <asm/cache.h>
TsiChung Liew8e585f02007-06-18 13:50:13 -050015
16#ifndef CONFIG_IDENT_STRING
17#define CONFIG_IDENT_STRING ""
18#endif
19
20#define _START _start
21#define _FAULT _fault
22
TsiChung Liew8e585f02007-06-18 13:50:13 -050023#define SAVE_ALL \
24 move.w #0x2700,%sr; /* disable intrs */ \
25 subl #60,%sp; /* space for 15 regs */ \
26 moveml %d0-%d7/%a0-%a6,%sp@;
27
28#define RESTORE_ALL \
29 moveml %sp@,%d0-%d7/%a0-%a6; \
30 addl #60,%sp; /* space for 15 regs */ \
31 rte;
32
Wolfgang Wegnerc7de8102010-03-02 10:59:20 +010033#if !defined(CONFIG_MONITOR_IS_IN_RAM)
TsiChung Liew8e585f02007-06-18 13:50:13 -050034.text
35/*
36 * Vector table. This is used for initial platform startup.
37 * These vectors are to catch any un-intended traps.
38 */
39_vectors:
40
TsiChungLiewddd104f2007-07-05 23:06:55 -050041INITSP: .long 0x00000000 /* Initial SP */
Wolfgang Denk53677ef2008-05-20 16:00:29 +020042INITPC: .long _START /* Initial PC */
TsiChungLiewddd104f2007-07-05 23:06:55 -050043vector02: .long _FAULT /* Access Error */
44vector03: .long _FAULT /* Address Error */
45vector04: .long _FAULT /* Illegal Instruction */
46vector05: .long _FAULT /* Reserved */
47vector06: .long _FAULT /* Reserved */
48vector07: .long _FAULT /* Reserved */
49vector08: .long _FAULT /* Privilege Violation */
50vector09: .long _FAULT /* Trace */
51vector0A: .long _FAULT /* Unimplemented A-Line */
52vector0B: .long _FAULT /* Unimplemented F-Line */
53vector0C: .long _FAULT /* Debug Interrupt */
54vector0D: .long _FAULT /* Reserved */
55vector0E: .long _FAULT /* Format Error */
56vector0F: .long _FAULT /* Unitialized Int. */
TsiChung Liew8e585f02007-06-18 13:50:13 -050057
TsiChungLiewddd104f2007-07-05 23:06:55 -050058/* Reserved */
TsiChung Liew8e585f02007-06-18 13:50:13 -050059vector10_17:
60.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
61
TsiChungLiewddd104f2007-07-05 23:06:55 -050062vector18: .long _FAULT /* Spurious Interrupt */
63vector19: .long _FAULT /* Autovector Level 1 */
64vector1A: .long _FAULT /* Autovector Level 2 */
65vector1B: .long _FAULT /* Autovector Level 3 */
66vector1C: .long _FAULT /* Autovector Level 4 */
67vector1D: .long _FAULT /* Autovector Level 5 */
68vector1E: .long _FAULT /* Autovector Level 6 */
69vector1F: .long _FAULT /* Autovector Level 7 */
TsiChung Liew8e585f02007-06-18 13:50:13 -050070
71/* TRAP #0 - #15 */
72vector20_2F:
73.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
74.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
75
76/* Reserved */
77vector30_3F:
78.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
79.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
80
81vector64_127:
82.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
83.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
84.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
85.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
86.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
87.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
88.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
89.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
90
91vector128_191:
92.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
93.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
94.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
95.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
96.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
97.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
98.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
99.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
100
101vector192_255:
102.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
103.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
104.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
105.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
106.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
107.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
108.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
109.long _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
Wolfgang Wegnerc7de8102010-03-02 10:59:20 +0100110#endif /* !defined(CONFIG_MONITOR_IS_IN_RAM) */
TsiChung Liew8e585f02007-06-18 13:50:13 -0500111
112 .text
113
114 .globl _start
115_start:
116 nop
117 nop
TsiChungLiewddd104f2007-07-05 23:06:55 -0500118 move.w #0x2700,%sr /* Mask off Interrupt */
TsiChung Liew8e585f02007-06-18 13:50:13 -0500119
Wolfgang Wegnerc7de8102010-03-02 10:59:20 +0100120#if !defined(CONFIG_MONITOR_IS_IN_RAM)
TsiChungLiewddd104f2007-07-05 23:06:55 -0500121 /* Set vector base register at the beginning of the Flash */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200122 move.l #CONFIG_SYS_FLASH_BASE, %d0
TsiChung Liew8e585f02007-06-18 13:50:13 -0500123 movec %d0, %VBR
Wolfgang Wegnerc7de8102010-03-02 10:59:20 +0100124#endif
TsiChung Liew8e585f02007-06-18 13:50:13 -0500125
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200126 move.l #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
TsiChungLiewc67e12e2007-10-25 17:12:36 -0500127 movec %d0, %RAMBAR1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500128
129 /* invalidate and disable cache */
TsiChung Liewdd9f0542010-03-11 22:12:53 -0600130 move.l #CF_CACR_CINVA, %d0 /* Invalidate cache cmd */
TsiChung Liew8e585f02007-06-18 13:50:13 -0500131 movec %d0, %CACR /* Invalidate cache */
132 move.l #0, %d0
133 movec %d0, %ACR0
134 movec %d0, %ACR1
135
TsiChung Liew536e7da2008-10-22 11:38:21 +0000136#ifdef CONFIG_MCF5301x
137 move.l #(0xFC0a0010), %a0
138 move.w (%a0), %d0
139 and.l %d0, 0xEFFF
140
141 move.w %d0, (%a0)
142#endif
143
TsiChung Liew8e585f02007-06-18 13:50:13 -0500144 /* initialize general use internal ram */
145 move.l #0, %d0
TsiChung Liewdd9f0542010-03-11 22:12:53 -0600146 move.l #(ICACHE_STATUS), %a1 /* icache */
147 move.l #(DCACHE_STATUS), %a2 /* icache */
TsiChung Liew8e585f02007-06-18 13:50:13 -0500148 move.l %d0, (%a1)
149 move.l %d0, (%a2)
150
TsiChungLiewddd104f2007-07-05 23:06:55 -0500151 /* set stackpointer to end of internal ram to get some stackspace for the
152 first c-code */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200153 move.l #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
TsiChung Liew8e585f02007-06-18 13:50:13 -0500154 clr.l %sp@-
155
TsiChungLiewddd104f2007-07-05 23:06:55 -0500156 move.l #__got_start, %a5 /* put relocation table address to a5 */
TsiChung Liew8e585f02007-06-18 13:50:13 -0500157
TsiChungLiewddd104f2007-07-05 23:06:55 -0500158 bsr cpu_init_f /* run low-level CPU init code (from flash) */
159 bsr board_init_f /* run low-level board init code (from flash) */
TsiChung Liew8e585f02007-06-18 13:50:13 -0500160
161 /* board_init_f() does not return */
162
163/*------------------------------------------------------------------------------*/
164
165/*
166 * void relocate_code (addr_sp, gd, addr_moni)
167 *
168 * This "function" does not return, instead it continues in RAM
169 * after relocating the monitor code.
170 *
171 * r3 = dest
172 * r4 = src
173 * r5 = length in bytes
174 * r6 = cachelinesize
175 */
176 .globl relocate_code
177relocate_code:
178 link.w %a6,#0
179 move.l 8(%a6), %sp /* set new stack pointer */
180
181 move.l 12(%a6), %d0 /* Save copy of Global Data pointer */
182 move.l 16(%a6), %a0 /* Save copy of Destination Address */
183
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200184 move.l #CONFIG_SYS_MONITOR_BASE, %a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500185 move.l #__init_end, %a2
186 move.l %a0, %a3
187
188 /* copy the code to RAM */
1891:
190 move.l (%a1)+, (%a3)+
191 cmp.l %a1,%a2
192 bgt.s 1b
193
194/*
195 * We are done. Do not return, instead branch to second part of board
196 * initialization, now running from RAM.
197 */
198 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200199 add.l #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500200 jmp (%a1)
201
202in_ram:
203
204clear_bss:
205 /*
206 * Now clear BSS segment
207 */
208 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200209 add.l #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500210 move.l %a0, %d1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200211 add.l #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
TsiChung Liew8e585f02007-06-18 13:50:13 -05002126:
213 clr.l (%a1)+
214 cmp.l %a1,%d1
215 bgt.s 6b
216
217 /*
218 * fix got table in RAM
219 */
220 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200221 add.l #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500222 move.l %a1,%a5 /* * fix got pointer register a5 */
223
224 move.l %a0, %a2
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200225 add.l #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
TsiChung Liew8e585f02007-06-18 13:50:13 -0500226
2277:
228 move.l (%a1),%d1
229 sub.l #_start,%d1
230 add.l %a0,%d1
231 move.l %d1,(%a1)+
232 cmp.l %a2, %a1
233 bne 7b
234
235 /* calculate relative jump to board_init_r in ram */
236 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200237 add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500238
239 /* set parameters for board_init_r */
240 move.l %a0,-(%sp) /* dest_addr */
241 move.l %d0,-(%sp) /* gd */
242 jsr (%a1)
243
244/*------------------------------------------------------------------------------*/
245/* exception code */
246 .globl _fault
247_fault:
Marek Vasut37d6cc32012-10-03 13:28:43 +0000248 bra _fault
TsiChung Liew8e585f02007-06-18 13:50:13 -0500249 .globl _exc_handler
250
251_exc_handler:
252 SAVE_ALL
253 movel %sp,%sp@-
254 bsr exc_handler
255 addql #4,%sp
256 RESTORE_ALL
257
258 .globl _int_handler
259_int_handler:
260 SAVE_ALL
261 movel %sp,%sp@-
262 bsr int_handler
263 addql #4,%sp
264 RESTORE_ALL
265
266/*------------------------------------------------------------------------------*/
TsiChung Liew8e585f02007-06-18 13:50:13 -0500267 .globl version_string
268version_string:
Andreas Bießmann09c2e902011-07-18 20:24:04 +0200269 .ascii U_BOOT_VERSION_STRING, "\0"
TsiChung Liew9b464322008-03-28 08:47:45 -0500270 .align 4