xref: /openbmc/u-boot/arch/m68k/cpu/mcf52x2/start.S (revision 87a62bce)
1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright (C) 2003	Josef Baumgartner <josef.baumgartner@telex.de>
4 * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
5 */
6
7#include <asm-offsets.h>
8#include <config.h>
9#include "version.h"
10#include <asm/cache.h>
11
12#define _START	_start
13#define _FAULT	_fault
14
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/* If we come from a pre-loader we don't need an initial exception
27 * table.
28 */
29#if !defined(CONFIG_MONITOR_IS_IN_RAM)
30
31.text
32
33/*
34 * Vector table. This is used for initial platform startup.
35 * These vectors are to catch any un-intended traps.
36 */
37_vectors:
38.long	0x00000000		/* Flash offset is 0 until we setup CS0 */
39#if defined(CONFIG_M5282) && (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
40.long	_start - CONFIG_SYS_TEXT_BASE
41#else
42.long	_START
43#endif
44
45.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
46.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
47.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
48.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
49.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
50.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
51.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
52.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
53
54.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
55.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
56.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
57.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
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.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
67.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
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.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
77.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
78.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
79.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
80
81#endif
82
83.text
84
85#if defined(CONFIG_SYS_INT_FLASH_BASE) && \
86    (defined(CONFIG_M5282) || defined(CONFIG_M5281))
87#if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
88.long	0x55AA55AA,0xAA55AA55		/* CFM Backdoorkey */
89.long	0xFFFFFFFF			/* all sectors protected */
90.long	0x00000000			/* supervisor/User restriction */
91.long	0x00000000			/* programm/data space restriction */
92.long	0x00000000			/* Flash security */
93#endif
94#endif
95
96.globl _start
97_start:
98	nop
99	nop
100	move.w	#0x2700,%sr
101
102#if defined(CONFIG_M5208)
103	/* Initialize RAMBAR: locate SRAM and validate it */
104	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
105	movec	%d0, %RAMBAR1
106#endif
107
108#if defined(CONFIG_M5272) || defined(CONFIG_M5249) || defined(CONFIG_M5253)
109	/* set MBAR address + valid flag */
110	move.l	#(CONFIG_SYS_MBAR + 1), %d0
111	move.c	%d0, %MBAR
112
113	/*** The 5249 has MBAR2 as well ***/
114#ifdef CONFIG_SYS_MBAR2
115	/* Get MBAR2 address */
116	move.l	#(CONFIG_SYS_MBAR2 + 1), %d0
117	 /* Set MBAR2 */
118	movec	%d0, #0xc0e
119#endif
120	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + 1), %d0
121	movec	%d0, %RAMBAR0
122#endif /* CONFIG_M5272 || CONFIG_M5249 || CONFIG_M5253 */
123
124#if defined(CONFIG_M5282) || defined(CONFIG_M5271)
125	/* set MBAR address + valid flag */
126	move.l	#(CONFIG_SYS_MBAR + 1), %d0
127	move.l	%d0, 0x40000000
128
129	/* Initialize RAMBAR1: locate SRAM and validate it */
130	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + 0x21), %d0
131	movec	%d0, %RAMBAR1
132
133#if defined(CONFIG_M5282)
134#if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
135	/*
136	 * Setup code in SRAM to initialize FLASHBAR,
137	 * if start from internal Flash
138	 */
139	move.l	#(_flashbar_setup-CONFIG_SYS_INT_FLASH_BASE), %a0
140	move.l	#(_flashbar_setup_end-CONFIG_SYS_INT_FLASH_BASE), %a1
141	move.l	#(CONFIG_SYS_INIT_RAM_ADDR), %a2
142_copy_flash:
143	move.l	(%a0)+, (%a2)+
144	cmp.l	%a0, %a1
145	bgt.s	_copy_flash
146	jmp	CONFIG_SYS_INIT_RAM_ADDR
147
148_flashbar_setup:
149	/* Initialize FLASHBAR: locate internal Flash and validate it */
150	move.l	#(CONFIG_SYS_INT_FLASH_BASE + CONFIG_SYS_INT_FLASH_ENABLE), %d0
151	movec	%d0, %FLASHBAR
152	jmp	_after_flashbar_copy.L	/* Force jump to absolute address */
153_flashbar_setup_end:
154	nop
155_after_flashbar_copy:
156#else
157	/* Setup code to initialize FLASHBAR, if start from external Memory */
158	move.l	#(CONFIG_SYS_INT_FLASH_BASE + CONFIG_SYS_INT_FLASH_ENABLE), %d0
159	movec	%d0, %FLASHBAR
160#endif /* (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE) */
161
162#endif
163#endif
164	/*
165	 * if we come from a pre-loader we have no exception table and
166	 * therefore no VBR to set
167	 */
168#if !defined(CONFIG_MONITOR_IS_IN_RAM)
169#if defined(CONFIG_M5282) && (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
170	move.l	#CONFIG_SYS_INT_FLASH_BASE, %d0
171#else
172	move.l	#CONFIG_SYS_FLASH_BASE, %d0
173#endif
174	movec	%d0, %VBR
175#endif
176
177#ifdef CONFIG_M5275
178	/* set MBAR address + valid flag */
179	move.l	#(CONFIG_SYS_MBAR + 1), %d0
180	move.l	%d0, 0x40000000
181/*	movec	%d0, %MBAR */
182
183	/* Initialize RAMBAR: locate SRAM and validate it */
184	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + 0x21), %d0
185	movec	%d0, %RAMBAR1
186#endif
187
188	/* initialize general use internal ram */
189	move.l	#0, %d0
190	move.l	#(ICACHE_STATUS), %a1	/* icache */
191	move.l	#(DCACHE_STATUS), %a2	/* icache */
192	move.l	%d0, (%a1)
193	move.l	%d0, (%a2)
194
195	/* put relocation table address to a5 */
196	move.l	#__got_start, %a5
197
198	/* setup stack initially on top of internal static ram  */
199	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
200
201	/*
202	 * if configured, malloc_f arena will be reserved first,
203	 * then (and always) gd struct space will be reserved
204	 */
205	move.l	%sp, -(%sp)
206	move.l	#board_init_f_alloc_reserve, %a1
207	jsr	(%a1)
208
209	/* update stack and frame-pointers */
210	move.l	%d0, %sp
211	move.l	%sp, %fp
212
213	/* initialize reserved area */
214	move.l	%d0, -(%sp)
215	move.l	#board_init_f_init_reserve, %a1
216	jsr	(%a1)
217
218	/* run low-level CPU init code (from flash) */
219	move.l	#cpu_init_f, %a1
220	jsr	(%a1)
221
222	/* run low-level board init code (from flash) */
223	clr.l	%sp@-
224	move.l	#board_init_f, %a1
225	jsr	(%a1)
226
227	/* board_init_f() does not return */
228
229/******************************************************************************/
230
231/*
232 * void relocate_code (addr_sp, gd, addr_moni)
233 *
234 * This "function" does not return, instead it continues in RAM
235 * after relocating the monitor code.
236 *
237 * r3 = dest
238 * r4 = src
239 * r5 = length in bytes
240 * r6 = cachelinesize
241 */
242.globl relocate_code
243relocate_code:
244	link.w	%a6,#0
245	move.l	8(%a6), %sp		/* set new stack pointer */
246
247	move.l	12(%a6), %d0		/* Save copy of Global Data pointer */
248	move.l	16(%a6), %a0		/* Save copy of Destination Address */
249
250	move.l	#CONFIG_SYS_MONITOR_BASE, %a1
251	move.l	#__init_end, %a2
252	move.l	%a0, %a3
253	/* copy the code to RAM */
2541:
255	move.l	(%a1)+, (%a3)+
256	cmp.l	%a1,%a2
257	bgt.s	1b
258
259/*
260 * We are done. Do not return, instead branch to second part of board
261 * initialization, now running from RAM.
262 */
263	move.l	%a0, %a1
264	add.l	#(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
265	jmp	(%a1)
266
267in_ram:
268
269clear_bss:
270	/*
271	 * Now clear BSS segment
272	 */
273	move.l	%a0, %a1
274	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
275	move.l	%a0, %d1
276	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
2776:
278	clr.l	(%a1)+
279	cmp.l	%a1,%d1
280	bgt.s	6b
281
282	/*
283	 * fix got table in RAM
284	 */
285	move.l	%a0, %a1
286	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
287	move.l	%a1,%a5			/* fix got pointer register a5 */
288
289	move.l	%a0, %a2
290	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
291
2927:
293	move.l	(%a1),%d1
294	sub.l	#_start,%d1
295	add.l	%a0,%d1
296	move.l	%d1,(%a1)+
297	cmp.l	%a2, %a1
298	bne	7b
299
300	/* calculate relative jump to board_init_r in ram */
301	move.l	%a0, %a1
302	add.l	#(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
303
304	/* set parameters for board_init_r */
305	move.l	%a0,-(%sp)		/* dest_addr */
306	move.l	%d0,-(%sp)		/* gd */
307#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE != CONFIG_SYS_INT_FLASH_BASE) && \
308    defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
309	halt
310#endif
311	jsr	(%a1)
312
313/******************************************************************************/
314
315/* exception code */
316.globl _fault
317_fault:
318	bra	_fault
319
320.globl _exc_handler
321_exc_handler:
322	SAVE_ALL
323	movel	%sp,%sp@-
324	bsr	exc_handler
325	addql	#4,%sp
326	RESTORE_ALL
327
328.globl _int_handler
329_int_handler:
330	SAVE_ALL
331	movel	%sp,%sp@-
332	bsr	int_handler
333	addql	#4,%sp
334	RESTORE_ALL
335
336/******************************************************************************/
337
338.globl version_string
339version_string:
340.ascii U_BOOT_VERSION_STRING, "\0"
341.align 4
342