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