1/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * (C) Copyright 2015  Angelo Dureghello <angelo@sysam.it>
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.macro  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.endm
21
22.macro  RESTORE_ALL
23	moveml	%sp@,%d0-%d7/%a0-%a6;
24	addl	#60,%sp;		/* space for 15 regs */
25	rte
26.endm
27
28/* If we come from a pre-loader we don't need an initial exception
29 * table.
30 */
31#if !defined(CONFIG_MONITOR_IS_IN_RAM)
32
33.text
34
35/*
36 * Vector table. This is used for initial platform startup.
37 * These vectors are to catch any un-intended traps.
38 */
39_vectors:
40/* Flash offset is 0 until we setup CS0 */
41.long	0x00000000
42#if defined(CONFIG_M5307) && \
43	   (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
44.long	_start - CONFIG_SYS_TEXT_BASE
45#else
46.long	_START
47#endif
48
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, _FAULT, _FAULT
53.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
57
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.long	_FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
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
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.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
85#endif
86
87.text
88
89.globl _start
90_start:
91	nop
92	nop
93	move.w	#0x2700,%sr
94
95	/* set MBAR address + valid flag */
96	move.l	#(CONFIG_SYS_MBAR + 1), %d0
97	move.c	%d0, %MBAR
98
99	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + 1), %d0
100	move.c	%d0, %RAMBAR
101
102	/* DS 4.8.2 (Cache Organization) invalidate and disable cache */
103        move.l	#CF_CACR_CINVA, %d0
104        movec	%d0, %CACR
105        move.l	#0, %d0
106        movec	%d0, %ACR0
107        movec	%d0, %ACR1
108
109	/*
110	 * if we come from a pre-loader we have no exception table and
111	 * therefore no VBR to set
112	 */
113#if !defined(CONFIG_MONITOR_IS_IN_RAM)
114	move.l	#CONFIG_SYS_FLASH_BASE, %d0
115	movec	%d0, %VBR
116#endif
117
118	/* initialize general use internal ram */
119	move.l	#0, %d0
120	move.l	#(ICACHE_STATUS), %a1	/* icache */
121	move.l	#(DCACHE_STATUS), %a2	/* dcache */
122	move.l	%d0, (%a1)
123	move.l	%d0, (%a2)
124
125	/* put relocation table address to a5 */
126	move.l	#__got_start, %a5
127
128	/* setup stack initially on top of internal static ram  */
129	move.l	#(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
130
131	/*
132	 * if configured, malloc_f arena will be reserved first,
133	 * then (and always) gd struct space will be reserved
134	 */
135	move.l	%sp, -(%sp)
136	bsr	board_init_f_alloc_reserve
137
138	/* update stack and frame-pointers */
139	move.l	%d0, %sp
140	move.l	%sp, %fp
141
142	/* initialize reserved area */
143	move.l	%d0, -(%sp)
144	bsr	board_init_f_init_reserve
145
146	/* run low-level CPU init code (from flash) */
147	bsr	cpu_init_f
148
149	/* run low-level board init code (from flash) */
150	clr.l	%sp@-
151	bsr	board_init_f
152
153	/* board_init_f() does not return */
154
155/******************************************************************************/
156
157/*
158 * void relocate_code(addr_sp, gd, addr_moni)
159 *
160 * This "function" does not return, instead it continues in RAM
161 * after relocating the monitor code.
162 *
163 */
164.globl relocate_code
165relocate_code:
166	link.w	%a6,#0
167	move.l	8(%a6), %sp	/* set new stack pointer */
168	move.l	12(%a6), %d0	/* Save copy of Global Data pointer */
169	move.l	16(%a6), %a0	/* Save copy of Destination Address */
170
171	move.l	#CONFIG_SYS_MONITOR_BASE, %a1
172	move.l	#__init_end, %a2
173	move.l	%a0, %a3
174	/* copy the code to RAM */
1751:
176	move.l	(%a1)+, (%a3)+
177	cmp.l	%a1,%a2
178	bgt.s	1b
179
180/*
181 * We are done. Do not return, instead branch to second part of board
182 * initialization, now running from RAM.
183 */
184	move.l	%a0, %a1
185	add.l	#(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
186	jmp	(%a1)
187
188in_ram:
189
190clear_bss:
191	/*
192	 * Now clear BSS segment
193	 */
194	move.l	%a0, %a1
195	add.l	#(_sbss - CONFIG_SYS_MONITOR_BASE), %a1
196	move.l	%a0, %d1
197	add.l	#(_ebss - CONFIG_SYS_MONITOR_BASE), %d1
1986:
199	clr.l	(%a1)+
200	cmp.l	%a1,%d1
201	bgt.s	6b
202
203	/*
204	 * fix got table in RAM
205	 */
206	move.l	%a0, %a1
207	add.l	#(__got_start - CONFIG_SYS_MONITOR_BASE), %a1
208
209	/* fix got pointer register a5 */
210	move.l	%a1,%a5
211
212	move.l	%a0, %a2
213	add.l	#(__got_end - CONFIG_SYS_MONITOR_BASE), %a2
214
2157:
216	move.l	(%a1),%d1
217	sub.l	#_start, %d1
218	add.l	%a0,%d1
219	move.l	%d1,(%a1)+
220	cmp.l	%a2, %a1
221	bne	7b
222
223	/* calculate relative jump to board_init_r in ram */
224	move.l	%a0, %a1
225	add.l	#(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
226
227	/* set parameters for board_init_r */
228	move.l	%a0,-(%sp)	/* dest_addr */
229	move.l	%d0,-(%sp)	/* gd */
230#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE!=CONFIG_SYS_INT_FLASH_BASE) && \
231    defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
232	halt
233#endif
234	jsr	(%a1)
235
236/******************************************************************************/
237
238/* exception code */
239.globl _fault
240_fault:
241	bra	_fault
242
243.globl _exc_handler
244_exc_handler:
245	SAVE_ALL
246	movel	%sp,%sp@-
247	bsr	exc_handler
248	addql	#4,%sp
249	RESTORE_ALL
250
251.globl _int_handler
252_int_handler:
253	SAVE_ALL
254	movel	%sp,%sp@-
255	bsr	int_handler
256	addql	#4,%sp
257	RESTORE_ALL
258
259/******************************************************************************/
260
261.globl version_string
262version_string:
263.ascii	U_BOOT_VERSION
264.ascii	" (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
265.ascii	CONFIG_IDENT_STRING, "\0"
266.align	4
267