blob: 131ad6e392e9c48fabe730f46baf97222951528e [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
angelo@sysam.it55ac54c2016-04-12 00:30:59 +0200158 /* run low-level CPU init code (from flash) */
159 move.l #cpu_init_f, %a1
160 jsr (%a1)
161 /* run low-level board init code (from flash) */
162 move.l #board_init_f, %a1
163 jsr (%a1)
TsiChung Liew8e585f02007-06-18 13:50:13 -0500164
165 /* board_init_f() does not return */
166
167/*------------------------------------------------------------------------------*/
168
169/*
170 * void relocate_code (addr_sp, gd, addr_moni)
171 *
172 * This "function" does not return, instead it continues in RAM
173 * after relocating the monitor code.
174 *
175 * r3 = dest
176 * r4 = src
177 * r5 = length in bytes
178 * r6 = cachelinesize
179 */
180 .globl relocate_code
181relocate_code:
182 link.w %a6,#0
183 move.l 8(%a6), %sp /* set new stack pointer */
184
185 move.l 12(%a6), %d0 /* Save copy of Global Data pointer */
186 move.l 16(%a6), %a0 /* Save copy of Destination Address */
187
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200188 move.l #CONFIG_SYS_MONITOR_BASE, %a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500189 move.l #__init_end, %a2
190 move.l %a0, %a3
191
192 /* copy the code to RAM */
1931:
194 move.l (%a1)+, (%a3)+
195 cmp.l %a1,%a2
196 bgt.s 1b
197
198/*
199 * We are done. Do not return, instead branch to second part of board
200 * initialization, now running from RAM.
201 */
202 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200203 add.l #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500204 jmp (%a1)
205
206in_ram:
207
208clear_bss:
209 /*
210 * Now clear BSS segment
211 */
212 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200213 add.l #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500214 move.l %a0, %d1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200215 add.l #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
TsiChung Liew8e585f02007-06-18 13:50:13 -05002166:
217 clr.l (%a1)+
218 cmp.l %a1,%d1
219 bgt.s 6b
220
221 /*
222 * fix got table in RAM
223 */
224 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200225 add.l #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500226 move.l %a1,%a5 /* * fix got pointer register a5 */
227
228 move.l %a0, %a2
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200229 add.l #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
TsiChung Liew8e585f02007-06-18 13:50:13 -0500230
2317:
232 move.l (%a1),%d1
233 sub.l #_start,%d1
234 add.l %a0,%d1
235 move.l %d1,(%a1)+
236 cmp.l %a2, %a1
237 bne 7b
238
239 /* calculate relative jump to board_init_r in ram */
240 move.l %a0, %a1
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200241 add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
TsiChung Liew8e585f02007-06-18 13:50:13 -0500242
243 /* set parameters for board_init_r */
244 move.l %a0,-(%sp) /* dest_addr */
245 move.l %d0,-(%sp) /* gd */
246 jsr (%a1)
247
248/*------------------------------------------------------------------------------*/
249/* exception code */
250 .globl _fault
251_fault:
Marek Vasut37d6cc32012-10-03 13:28:43 +0000252 bra _fault
TsiChung Liew8e585f02007-06-18 13:50:13 -0500253 .globl _exc_handler
254
255_exc_handler:
256 SAVE_ALL
257 movel %sp,%sp@-
258 bsr exc_handler
259 addql #4,%sp
260 RESTORE_ALL
261
262 .globl _int_handler
263_int_handler:
264 SAVE_ALL
265 movel %sp,%sp@-
266 bsr int_handler
267 addql #4,%sp
268 RESTORE_ALL
269
270/*------------------------------------------------------------------------------*/
TsiChung Liew8e585f02007-06-18 13:50:13 -0500271 .globl version_string
272version_string:
Andreas Bießmann09c2e902011-07-18 20:24:04 +0200273 .ascii U_BOOT_VERSION_STRING, "\0"
TsiChung Liew9b464322008-03-28 08:47:45 -0500274 .align 4