xref: /openbmc/u-boot/arch/m68k/cpu/mcf523x/start.S (revision 382bee57)
1/*
2 * Copyright (C) 2003	Josef Baumgartner <josef.baumgartner@telex.de>
3 * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
4 *
5 * SPDX-License-Identifier:	GPL-2.0+
6 */
7
8#include <asm-offsets.h>
9#include <config.h>
10#include "version.h"
11#include <asm/cache.h>
12
13#define _START	_start
14#define _FAULT	_fault
15
16#define SAVE_ALL						\
17	move.w	#0x2700,%sr;		/* disable intrs */	\
18	subl	#60,%sp;		/* space for 15 regs */ \
19	moveml	%d0-%d7/%a0-%a6,%sp@;
20
21#define RESTORE_ALL						\
22	moveml	%sp@,%d0-%d7/%a0-%a6;				\
23	addl	#60,%sp;		/* space for 15 regs */ \
24	rte;
25
26.text
27
28/*
29 * Vector table. This is used for initial platform startup.
30 * These vectors are to catch any un-intended traps.
31 */
32_vectors:
33INITSP:	.long	0x00000000		/* Initial SP	*/
34INITPC:	.long	_START			/* Initial PC	*/
35
36vector02_0F:
37.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
38.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
39
40/* Reserved */
41vector10_17:
42.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
43
44vector18_1F:
45.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
46
47/* TRAP #0 - #15 */
48vector20_2F:
49.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
50.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
51
52/* Reserved	*/
53vector30_3F:
54.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
55.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
56
57vector64_127:
58.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
59.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
60.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
61.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
62.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
63.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
64.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
65.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
66
67vector128_191:
68.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
69.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
70.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
71.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
72.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
73.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
74.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
75.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
76
77vector192_255:
78.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
79.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
80.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
81.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
87.text
88
89.globl _start
90_start:
91	nop
92	nop
93	move.w	#0x2700,%sr		/* Mask off Interrupt */
94
95	/* Set vector base register at the beginning of the Flash */
96	move.l	#CONFIG_SYS_FLASH_BASE, %d0
97	movec	%d0, %VBR
98
99	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
100	movec	%d0, %RAMBAR1
101
102	/* invalidate and disable cache */
103	move.l	#CF_CACR_CINV, %d0	/* Invalidate cache cmd */
104	movec	%d0, %CACR		/* Invalidate cache */
105	nop
106	move.l	#0, %d0
107	movec	%d0, %ACR0
108	movec	%d0, %ACR1
109
110	/* initialize general use internal ram */
111	move.l	#0, %d0
112	move.l	#(ICACHE_STATUS), %a1	/* icache */
113	move.l	#(DCACHE_STATUS), %a2	/* icache */
114	move.l	%d0, (%a1)
115	move.l	%d0, (%a2)
116
117	/* put relocation table address to a5 */
118	move.l	#__got_start, %a5
119
120	/* setup stack initially on top of internal static ram  */
121	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
122
123	/*
124	 * if configured, malloc_f arena will be reserved first,
125	 * then (and always) gd struct space will be reserved
126	 */
127	move.l	%sp, -(%sp)
128	move.l	#board_init_f_alloc_reserve, %a1
129	jsr	(%a1)
130
131	/* update stack and frame-pointers */
132	move.l	%d0, %sp
133	move.l	%sp, %fp
134
135	/* initialize reserved area */
136	move.l	%d0, -(%sp)
137	move.l	#board_init_f_init_reserve, %a1
138	jsr	(%a1)
139
140	/* run low-level CPU init code (from flash) */
141	move.l	#cpu_init_f, %a1
142	jsr	(%a1)
143
144	/* run low-level board init code (from flash) */
145	clr.l	%sp@-
146	move.l	#board_init_f, %a1
147	jsr	(%a1)
148
149	/* board_init_f() does not return */
150
151/******************************************************************************/
152
153/*
154 * void relocate_code (addr_sp, gd, addr_moni)
155 *
156 * This "function" does not return, instead it continues in RAM
157 * after relocating the monitor code.
158 *
159 * r3 = dest
160 * r4 = src
161 * r5 = length in bytes
162 * r6 = cachelinesize
163 */
164.globl relocate_code
165relocate_code:
166	link.w	%a6,#0
167	move.l	8(%a6), %sp		/* set new stack pointer */
168
169	move.l	12(%a6), %d0		/* Save copy of Global Data pointer */
170	move.l	16(%a6), %a0		/* Save copy of Destination Address */
171
172	move.l	#CONFIG_SYS_MONITOR_BASE, %a1
173	move.l	#__init_end, %a2
174	move.l	%a0, %a3
175
176	/* copy the code to RAM */
1771:
178	move.l	(%a1)+, (%a3)+
179	cmp.l	%a1,%a2
180	bgt.s	1b
181
182/*
183 * We are done. Do not return, instead branch to second part of board
184 * initialization, now running from RAM.
185 */
186	move.l	%a0, %a1
187	add.l	#(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
188	jmp	(%a1)
189
190in_ram:
191
192clear_bss:
193	/*
194	 * Now clear BSS segment
195	 */
196	move.l	%a0, %a1
197	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
198	move.l	%a0, %d1
199	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
2006:
201	clr.l	(%a1)+
202	cmp.l	%a1,%d1
203	bgt.s	6b
204
205	/*
206	 * fix got table in RAM
207	 */
208	move.l	%a0, %a1
209	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
210	move.l	%a1,%a5		/* * fix got pointer register a5 */
211
212	move.l	%a0, %a2
213	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
214
2157:
216	move.l	(%a1),%d1
217	sub.l	#_start,%d1
218	add.l	%a0,%d1
219	move.l	%d1,(%a1)+
220	cmp.l	%a2, %a1
221	bne	7b
222
223	/* calculate relative jump to board_init_r in ram */
224	move.l	%a0, %a1
225	add.l	#(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
226
227	/* set parameters for board_init_r */
228	move.l	%a0,-(%sp)		/* dest_addr */
229	move.l	%d0,-(%sp)		/* gd */
230	jsr	(%a1)
231
232/******************************************************************************/
233
234/* exception code */
235.globl _fault
236_fault:
237	bra	_fault
238
239.globl _exc_handler
240_exc_handler:
241	SAVE_ALL
242	movel	%sp,%sp@-
243	bsr	exc_handler
244	addql	#4,%sp
245	RESTORE_ALL
246
247.globl _int_handler
248_int_handler:
249	SAVE_ALL
250	movel	%sp,%sp@-
251	bsr	int_handler
252	addql	#4,%sp
253	RESTORE_ALL
254
255/******************************************************************************/
256
257.globl version_string
258version_string:
259.ascii U_BOOT_VERSION_STRING, "\0"
260.align 4
261