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