xref: /rk3399_rockchip-uboot/arch/m68k/cpu/mcf530x/start.S (revision a4d88920e5d0b67a92f8041f5e0fac0ce027bb48)
1e77e65dfSangelo@sysam.it/*
2e77e65dfSangelo@sysam.it * (C) Copyright 2015  Angelo Dureghello <angelo@sysam.it>
3e77e65dfSangelo@sysam.it * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
4e77e65dfSangelo@sysam.it *
5e77e65dfSangelo@sysam.it * SPDX-License-Identifier:	GPL-2.0+
6e77e65dfSangelo@sysam.it */
7e77e65dfSangelo@sysam.it
8e77e65dfSangelo@sysam.it#include <asm-offsets.h>
9e77e65dfSangelo@sysam.it#include <config.h>
10e77e65dfSangelo@sysam.it#include "version.h"
11e77e65dfSangelo@sysam.it#include <asm/cache.h>
12e77e65dfSangelo@sysam.it
13e77e65dfSangelo@sysam.it#define _START	_start
14e77e65dfSangelo@sysam.it#define _FAULT	_fault
15e77e65dfSangelo@sysam.it
16e77e65dfSangelo@sysam.it
17e77e65dfSangelo@sysam.it.macro  SAVE_ALL
18e77e65dfSangelo@sysam.it	move.w	#0x2700,%sr;		/* disable intrs */
19e77e65dfSangelo@sysam.it	subl	#60,%sp;		/* space for 15 regs */
20e77e65dfSangelo@sysam.it	moveml	%d0-%d7/%a0-%a6,%sp@
21e77e65dfSangelo@sysam.it.endm
22e77e65dfSangelo@sysam.it
23e77e65dfSangelo@sysam.it.macro  RESTORE_ALL
24e77e65dfSangelo@sysam.it	moveml	%sp@,%d0-%d7/%a0-%a6;
25e77e65dfSangelo@sysam.it	addl	#60,%sp;		/* space for 15 regs */
26e77e65dfSangelo@sysam.it	rte
27e77e65dfSangelo@sysam.it.endm
28e77e65dfSangelo@sysam.it
29e77e65dfSangelo@sysam.it/* If we come from a pre-loader we don't need an initial exception
30e77e65dfSangelo@sysam.it * table.
31e77e65dfSangelo@sysam.it */
32e77e65dfSangelo@sysam.it#if !defined(CONFIG_MONITOR_IS_IN_RAM)
33e77e65dfSangelo@sysam.it
34e77e65dfSangelo@sysam.it.text
35*5c928d02SAngelo Dureghello
36e77e65dfSangelo@sysam.it/*
37e77e65dfSangelo@sysam.it * Vector table. This is used for initial platform startup.
38e77e65dfSangelo@sysam.it * These vectors are to catch any un-intended traps.
39e77e65dfSangelo@sysam.it */
40e77e65dfSangelo@sysam.it_vectors:
41e77e65dfSangelo@sysam.it/* Flash offset is 0 until we setup CS0 */
42e77e65dfSangelo@sysam.it.long	0x00000000
43e77e65dfSangelo@sysam.it#if defined(CONFIG_M5307) && \
44e77e65dfSangelo@sysam.it	   (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
45e77e65dfSangelo@sysam.it.long	_start - CONFIG_SYS_TEXT_BASE
46e77e65dfSangelo@sysam.it#else
47e77e65dfSangelo@sysam.it.long	_START
48e77e65dfSangelo@sysam.it#endif
49e77e65dfSangelo@sysam.it
50e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
51e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
52e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
53e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
54e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
55e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
56e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
57e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
58e77e65dfSangelo@sysam.it
59e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
60e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
61e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
62e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
63e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
64e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
65e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
66e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
67e77e65dfSangelo@sysam.it
68e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
69e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
70e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
71e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
72e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
73e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
74e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
75e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
76e77e65dfSangelo@sysam.it
77e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
78e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
79e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
80e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
81e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
82e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
83e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
84e77e65dfSangelo@sysam.it.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
85e77e65dfSangelo@sysam.it
86e77e65dfSangelo@sysam.it#endif
87e77e65dfSangelo@sysam.it
88e77e65dfSangelo@sysam.it.text
89*5c928d02SAngelo Dureghello
90e77e65dfSangelo@sysam.it.globl _start
91e77e65dfSangelo@sysam.it_start:
92e77e65dfSangelo@sysam.it	nop
93e77e65dfSangelo@sysam.it	nop
94e77e65dfSangelo@sysam.it	move.w	#0x2700,%sr
95e77e65dfSangelo@sysam.it
96e77e65dfSangelo@sysam.it	/* set MBAR address + valid flag */
97e77e65dfSangelo@sysam.it	move.l	#(CONFIG_SYS_MBAR + 1), %d0
98e77e65dfSangelo@sysam.it	move.c	%d0, %MBAR
99e77e65dfSangelo@sysam.it
100e77e65dfSangelo@sysam.it	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + 1), %d0
101e77e65dfSangelo@sysam.it	move.c	%d0, %RAMBAR
102e77e65dfSangelo@sysam.it
103e77e65dfSangelo@sysam.it	/* DS 4.8.2 (Cache Organization) invalidate and disable cache */
104e77e65dfSangelo@sysam.it        move.l	#CF_CACR_CINVA, %d0
105e77e65dfSangelo@sysam.it        movec	%d0, %CACR
106e77e65dfSangelo@sysam.it        move.l	#0, %d0
107e77e65dfSangelo@sysam.it        movec	%d0, %ACR0
108e77e65dfSangelo@sysam.it        movec	%d0, %ACR1
109e77e65dfSangelo@sysam.it
110e77e65dfSangelo@sysam.it	/*
111e77e65dfSangelo@sysam.it	 * if we come from a pre-loader we have no exception table and
112e77e65dfSangelo@sysam.it	 * therefore no VBR to set
113e77e65dfSangelo@sysam.it	 */
114e77e65dfSangelo@sysam.it#if !defined(CONFIG_MONITOR_IS_IN_RAM)
115e77e65dfSangelo@sysam.it	move.l	#CONFIG_SYS_FLASH_BASE, %d0
116e77e65dfSangelo@sysam.it	movec	%d0, %VBR
117e77e65dfSangelo@sysam.it#endif
118e77e65dfSangelo@sysam.it
119e77e65dfSangelo@sysam.it	/* initialize general use internal ram */
120e77e65dfSangelo@sysam.it	move.l	#0, %d0
121e77e65dfSangelo@sysam.it	move.l	#(ICACHE_STATUS), %a1	/* icache */
122e77e65dfSangelo@sysam.it	move.l	#(DCACHE_STATUS), %a2	/* dcache */
123e77e65dfSangelo@sysam.it	move.l	%d0, (%a1)
124e77e65dfSangelo@sysam.it	move.l	%d0, (%a2)
125e77e65dfSangelo@sysam.it
126e77e65dfSangelo@sysam.it	/* put relocation table address to a5 */
127e77e65dfSangelo@sysam.it	move.l	#__got_start, %a5
128e77e65dfSangelo@sysam.it
1295044c9ccSangelo@sysam.it	/* setup stack initially on top of internal static ram  */
1305044c9ccSangelo@sysam.it	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
1315044c9ccSangelo@sysam.it
1325044c9ccSangelo@sysam.it	/*
1335044c9ccSangelo@sysam.it	 * if configured, malloc_f arena will be reserved first,
1345044c9ccSangelo@sysam.it	 * then (and always) gd struct space will be reserved
1355044c9ccSangelo@sysam.it	 */
1365044c9ccSangelo@sysam.it	move.l	%sp, -(%sp)
1375044c9ccSangelo@sysam.it	bsr	board_init_f_alloc_reserve
1385044c9ccSangelo@sysam.it
1395044c9ccSangelo@sysam.it	/* update stack and frame-pointers */
1405044c9ccSangelo@sysam.it	move.l	%d0, %sp
1415044c9ccSangelo@sysam.it	move.l	%sp, %fp
1425044c9ccSangelo@sysam.it
1435044c9ccSangelo@sysam.it	/* initialize reserved area */
1445044c9ccSangelo@sysam.it	move.l	%d0, -(%sp)
1455044c9ccSangelo@sysam.it	bsr	board_init_f_init_reserve
1465044c9ccSangelo@sysam.it
147e77e65dfSangelo@sysam.it	/* run low-level CPU init code (from flash) */
148e77e65dfSangelo@sysam.it	bsr	cpu_init_f
149e77e65dfSangelo@sysam.it
150e77e65dfSangelo@sysam.it	/* run low-level board init code (from flash) */
1515044c9ccSangelo@sysam.it	clr.l	%sp@-
152e77e65dfSangelo@sysam.it	bsr	board_init_f
153e77e65dfSangelo@sysam.it
154e77e65dfSangelo@sysam.it	/* board_init_f() does not return */
155e77e65dfSangelo@sysam.it
156*5c928d02SAngelo Dureghello/******************************************************************************/
157e77e65dfSangelo@sysam.it
158e77e65dfSangelo@sysam.it/*
159e77e65dfSangelo@sysam.it * void relocate_code (addr_sp, gd, addr_moni)
160e77e65dfSangelo@sysam.it *
161e77e65dfSangelo@sysam.it * This "function" does not return, instead it continues in RAM
162e77e65dfSangelo@sysam.it * after relocating the monitor code.
163e77e65dfSangelo@sysam.it *
164e77e65dfSangelo@sysam.it */
165e77e65dfSangelo@sysam.it.globl relocate_code
166e77e65dfSangelo@sysam.itrelocate_code:
167e77e65dfSangelo@sysam.it	link.w	%a6,#0
168e77e65dfSangelo@sysam.it	move.l	8(%a6), %sp	/* set new stack pointer */
169e77e65dfSangelo@sysam.it	move.l	12(%a6), %d0	/* Save copy of Global Data pointer */
170e77e65dfSangelo@sysam.it	move.l	16(%a6), %a0	/* Save copy of Destination Address */
171e77e65dfSangelo@sysam.it
172e77e65dfSangelo@sysam.it	move.l	#CONFIG_SYS_MONITOR_BASE, %a1
173e77e65dfSangelo@sysam.it	move.l	#__init_end, %a2
174e77e65dfSangelo@sysam.it	move.l	%a0, %a3
175e77e65dfSangelo@sysam.it	/* copy the code to RAM */
176e77e65dfSangelo@sysam.it1:
177e77e65dfSangelo@sysam.it	move.l	(%a1)+, (%a3)+
178e77e65dfSangelo@sysam.it	cmp.l	%a1,%a2
179e77e65dfSangelo@sysam.it	bgt.s	1b
180e77e65dfSangelo@sysam.it
181e77e65dfSangelo@sysam.it/*
182e77e65dfSangelo@sysam.it * We are done. Do not return, instead branch to second part of board
183e77e65dfSangelo@sysam.it * initialization, now running from RAM.
184e77e65dfSangelo@sysam.it */
185e77e65dfSangelo@sysam.it	move.l	%a0, %a1
186e77e65dfSangelo@sysam.it	add.l	#(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
187e77e65dfSangelo@sysam.it	jmp	(%a1)
188e77e65dfSangelo@sysam.it
189e77e65dfSangelo@sysam.itin_ram:
190e77e65dfSangelo@sysam.it
191e77e65dfSangelo@sysam.itclear_bss:
192e77e65dfSangelo@sysam.it	/*
193e77e65dfSangelo@sysam.it	 * Now clear BSS segment
194e77e65dfSangelo@sysam.it	 */
195e77e65dfSangelo@sysam.it	move.l	%a0, %a1
196e77e65dfSangelo@sysam.it	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE), %a1
197e77e65dfSangelo@sysam.it	move.l	%a0, %d1
198e77e65dfSangelo@sysam.it	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE), %d1
199e77e65dfSangelo@sysam.it6:
200e77e65dfSangelo@sysam.it	clr.l	(%a1)+
201e77e65dfSangelo@sysam.it	cmp.l	%a1,%d1
202e77e65dfSangelo@sysam.it	bgt.s	6b
203e77e65dfSangelo@sysam.it
204e77e65dfSangelo@sysam.it	/*
205e77e65dfSangelo@sysam.it	 * fix got table in RAM
206e77e65dfSangelo@sysam.it	 */
207e77e65dfSangelo@sysam.it	move.l	%a0, %a1
208e77e65dfSangelo@sysam.it	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE), %a1
209*5c928d02SAngelo Dureghello
210*5c928d02SAngelo Dureghello	/* fix got pointer register a5 */
211e77e65dfSangelo@sysam.it	move.l	%a1,%a5
212e77e65dfSangelo@sysam.it
213e77e65dfSangelo@sysam.it	move.l	%a0, %a2
214e77e65dfSangelo@sysam.it	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE), %a2
215e77e65dfSangelo@sysam.it
216e77e65dfSangelo@sysam.it7:
217e77e65dfSangelo@sysam.it	move.l	(%a1),%d1
218e77e65dfSangelo@sysam.it	sub.l	#_start, %d1
219e77e65dfSangelo@sysam.it	add.l	%a0,%d1
220e77e65dfSangelo@sysam.it	move.l	%d1,(%a1)+
221e77e65dfSangelo@sysam.it	cmp.l	%a2, %a1
222e77e65dfSangelo@sysam.it	bne	7b
223e77e65dfSangelo@sysam.it
224e77e65dfSangelo@sysam.it	/* calculate relative jump to board_init_r in ram */
225e77e65dfSangelo@sysam.it	move.l	%a0, %a1
226e77e65dfSangelo@sysam.it	add.l	#(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
227e77e65dfSangelo@sysam.it
228e77e65dfSangelo@sysam.it	/* set parameters for board_init_r */
229e77e65dfSangelo@sysam.it	move.l	%a0,-(%sp)	/* dest_addr */
230e77e65dfSangelo@sysam.it	move.l	%d0,-(%sp)	/* gd */
231e77e65dfSangelo@sysam.it#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE!=CONFIG_SYS_INT_FLASH_BASE) && \
232e77e65dfSangelo@sysam.it    defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
233e77e65dfSangelo@sysam.it	halt
234e77e65dfSangelo@sysam.it#endif
235e77e65dfSangelo@sysam.it	jsr	(%a1)
236e77e65dfSangelo@sysam.it
237*5c928d02SAngelo Dureghello/******************************************************************************/
238*5c928d02SAngelo Dureghello
239e77e65dfSangelo@sysam.it/* exception code */
240e77e65dfSangelo@sysam.it.globl _fault
241e77e65dfSangelo@sysam.it_fault:
242e77e65dfSangelo@sysam.it	bra	_fault
243e77e65dfSangelo@sysam.it
244e77e65dfSangelo@sysam.it.globl _exc_handler
245e77e65dfSangelo@sysam.it_exc_handler:
246e77e65dfSangelo@sysam.it	SAVE_ALL
247e77e65dfSangelo@sysam.it	movel	%sp,%sp@-
248e77e65dfSangelo@sysam.it	bsr	exc_handler
249e77e65dfSangelo@sysam.it	addql	#4,%sp
250e77e65dfSangelo@sysam.it	RESTORE_ALL
251e77e65dfSangelo@sysam.it
252e77e65dfSangelo@sysam.it.globl _int_handler
253e77e65dfSangelo@sysam.it_int_handler:
254e77e65dfSangelo@sysam.it	SAVE_ALL
255e77e65dfSangelo@sysam.it	movel	%sp,%sp@-
256e77e65dfSangelo@sysam.it	bsr	int_handler
257e77e65dfSangelo@sysam.it	addql	#4,%sp
258e77e65dfSangelo@sysam.it	RESTORE_ALL
259e77e65dfSangelo@sysam.it
260*5c928d02SAngelo Dureghello/******************************************************************************/
261e77e65dfSangelo@sysam.it
262e77e65dfSangelo@sysam.it.globl version_string
263e77e65dfSangelo@sysam.itversion_string:
264e77e65dfSangelo@sysam.it.ascii	U_BOOT_VERSION
265e77e65dfSangelo@sysam.it.ascii	" (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
266e77e65dfSangelo@sysam.it.ascii	CONFIG_IDENT_STRING, "\0"
267e77e65dfSangelo@sysam.it.align	4
268