xref: /openbmc/u-boot/arch/m68k/cpu/mcf532x/start.S (revision 729c2db7)
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#ifndef	 CONFIG_IDENT_STRING
17#define	 CONFIG_IDENT_STRING ""
18#endif
19
20#define _START	_start
21#define _FAULT	_fault
22
23#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
33#if !defined(CONFIG_MONITOR_IS_IN_RAM)
34
35.text
36
37/*
38 * Vector table. This is used for initial platform startup.
39 * These vectors are to catch any un-intended traps.
40 */
41_vectors:
42INITSP:	.long	0x00000000		/* Initial SP	*/
43INITPC:	.long	_START			/* Initial PC		*/
44
45vector02_0F:
46.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
47.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
48
49/* Reserved */
50vector10_17:
51.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
52
53vector18_1F:
54.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
55
56/* TRAP #0 - #15 */
57vector20_2F:
58.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
59.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
60
61/* Reserved	*/
62vector30_3F:
63.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
64.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
65
66vector64_127:
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.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
76vector128_191:
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.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
86vector192_255:
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.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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#endif /* !defined(CONFIG_MONITOR_IS_IN_RAM) */
96
97.text
98
99.globl _start
100_start:
101	nop
102	nop
103	move.w	#0x2700,%sr	/* Mask off Interrupt */
104
105#if !defined(CONFIG_MONITOR_IS_IN_RAM)
106	/* Set vector base register at the beginning of the Flash */
107	move.l	#CONFIG_SYS_FLASH_BASE, %d0
108	movec	%d0, %VBR
109#endif
110
111	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
112	movec	%d0, %RAMBAR1
113
114	/* invalidate and disable cache */
115	move.l	#CF_CACR_CINVA, %d0		/* Invalidate cache cmd */
116	movec	%d0, %CACR			/* Invalidate cache */
117	move.l	#0, %d0
118	movec	%d0, %ACR0
119	movec	%d0, %ACR1
120
121#ifdef CONFIG_MCF5301x
122	move.l	#(0xFC0a0010), %a0
123	move.w	(%a0), %d0
124	and.l	%d0, 0xEFFF
125
126	move.w	%d0, (%a0)
127#endif
128
129	/* initialize general use internal ram */
130	move.l	#0, %d0
131	move.l	#(ICACHE_STATUS), %a1	/* icache */
132	move.l	#(DCACHE_STATUS), %a2	/* icache */
133	move.l	%d0, (%a1)
134	move.l	%d0, (%a2)
135
136	/* put relocation table address to a5 */
137	move.l	#__got_start, %a5
138
139	/* setup stack initially on top of internal static ram  */
140	move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
141
142	/*
143	 * if configured, malloc_f arena will be reserved first,
144	 * then (and always) gd struct space will be reserved
145	 */
146	move.l	%sp, -(%sp)
147	move.l	#board_init_f_alloc_reserve, %a1
148	jsr	(%a1)
149
150	/* update stack and frame-pointers */
151	move.l  %d0, %sp
152	move.l  %sp, %fp
153
154	/* initialize reserved area */
155	move.l	%d0, -(%sp)
156	move.l	#board_init_f_init_reserve, %a1
157	jsr	(%a1)
158
159	/* run low-level CPU init code (from flash) */
160	move.l	#cpu_init_f, %a1
161	jsr	(%a1)
162
163	/* run low-level board init code (from flash) */
164	clr.l   %sp@-
165	move.l #board_init_f, %a1
166	jsr (%a1)
167
168	/* board_init_f() does not return */
169
170/******************************************************************************/
171
172/*
173 * void relocate_code (addr_sp, gd, addr_moni)
174 *
175 * This "function" does not return, instead it continues in RAM
176 * after relocating the monitor code.
177 *
178 * r3 = dest
179 * r4 = src
180 * r5 = length in bytes
181 * r6 = cachelinesize
182 */
183.globl relocate_code
184relocate_code:
185	link.w	%a6,#0
186	move.l	8(%a6), %sp		/* set new stack pointer */
187
188	move.l	12(%a6), %d0		/* Save copy of Global Data pointer */
189	move.l	16(%a6), %a0		/* Save copy of Destination Address */
190
191	move.l	#CONFIG_SYS_MONITOR_BASE, %a1
192	move.l	#__init_end, %a2
193	move.l	%a0, %a3
194
195	/* copy the code to RAM */
1961:
197	move.l	(%a1)+, (%a3)+
198	cmp.l	%a1,%a2
199	bgt.s	1b
200
201/*
202 * We are done. Do not return, instead branch to second part of board
203 * initialization, now running from RAM.
204 */
205	move.l	%a0, %a1
206	add.l	#(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
207	jmp	(%a1)
208
209in_ram:
210
211clear_bss:
212	/*
213	 * Now clear BSS segment
214	 */
215	move.l	%a0, %a1
216	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
217	move.l	%a0, %d1
218	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
2196:
220	clr.l	(%a1)+
221	cmp.l	%a1,%d1
222	bgt.s	6b
223
224	/*
225	 * fix got table in RAM
226	 */
227	move.l	%a0, %a1
228	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
229	move.l	%a1,%a5			/* fix got pointer register a5 */
230
231	move.l	%a0, %a2
232	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
233
2347:
235	move.l	(%a1),%d1
236	sub.l	#_start,%d1
237	add.l	%a0,%d1
238	move.l	%d1,(%a1)+
239	cmp.l	%a2, %a1
240	bne	7b
241
242	/* calculate relative jump to board_init_r in ram */
243	move.l	%a0, %a1
244	add.l	#(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
245
246	/* set parameters for board_init_r */
247	move.l	%a0,-(%sp)		/* dest_addr */
248	move.l	%d0,-(%sp)		/* gd */
249	jsr	(%a1)
250
251/******************************************************************************/
252
253/* exception code */
254.globl _fault
255_fault:
256	bra _fault
257
258.globl _exc_handler
259_exc_handler:
260	SAVE_ALL
261	movel	%sp,%sp@-
262	bsr	exc_handler
263	addql	#4,%sp
264	RESTORE_ALL
265
266.globl _int_handler
267_int_handler:
268	SAVE_ALL
269	movel	%sp,%sp@-
270	bsr	int_handler
271	addql	#4,%sp
272	RESTORE_ALL
273
274/******************************************************************************/
275
276.globl version_string
277version_string:
278.ascii U_BOOT_VERSION_STRING, "\0"
279.align 4
280