Merge tag 'efi-2020-07-rc6' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / arch / m68k / cpu / mcf52x2 / start.S
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 2003   Josef Baumgartner <josef.baumgartner@telex.de>
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 #define 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
21 #define RESTORE_ALL                                             \
22         moveml  %sp@,%d0-%d7/%a0-%a6;                           \
23         addl    #60,%sp;                /* space for 15 regs */ \
24         rte
25
26 /* If we come from a pre-loader we don't need an initial exception
27  * table.
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:
38 .long   0x00000000              /* Flash offset is 0 until we setup CS0 */
39 #if defined(CONFIG_M5282) && (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
40 .long   _start - CONFIG_SYS_TEXT_BASE
41 #else
42 .long   _START
43 #endif
44
45 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
46 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
47 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
48 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
53
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, _FAULT, _FAULT
57 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
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
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 .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
81 #endif
82
83 .text
84
85 #if defined(CONFIG_SYS_INT_FLASH_BASE) && \
86     (defined(CONFIG_M5282) || defined(CONFIG_M5281))
87 #if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
88 .long   0x55AA55AA,0xAA55AA55           /* CFM Backdoorkey */
89 .long   0xFFFFFFFF                      /* all sectors protected */
90 .long   0x00000000                      /* supervisor/User restriction */
91 .long   0x00000000                      /* programm/data space restriction */
92 .long   0x00000000                      /* Flash security */
93 #endif
94 #endif
95
96 .globl _start
97 _start:
98         nop
99         nop
100         move.w  #0x2700,%sr
101
102 #if defined(CONFIG_M5208)
103         /* Initialize RAMBAR: locate SRAM and validate it */
104         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
105         movec   %d0, %RAMBAR1
106 #endif
107
108 #if defined(CONFIG_M5272) || defined(CONFIG_M5249) || defined(CONFIG_M5253)
109         /* set MBAR address + valid flag */
110         move.l  #(CONFIG_SYS_MBAR + 1), %d0
111         move.c  %d0, %MBAR
112
113         /*** The 5249 has MBAR2 as well ***/
114 #ifdef CONFIG_SYS_MBAR2
115         /* Get MBAR2 address */
116         move.l  #(CONFIG_SYS_MBAR2 + 1), %d0
117          /* Set MBAR2 */
118         movec   %d0, #0xc0e
119 #endif
120         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + 1), %d0
121         movec   %d0, %RAMBAR0
122 #endif /* CONFIG_M5272 || CONFIG_M5249 || CONFIG_M5253 */
123
124 #if defined(CONFIG_M5282) || defined(CONFIG_M5271)
125         /* set MBAR address + valid flag */
126         move.l  #(CONFIG_SYS_MBAR + 1), %d0
127         move.l  %d0, 0x40000000
128
129         /* Initialize RAMBAR1: locate SRAM and validate it */
130         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + 0x21), %d0
131         movec   %d0, %RAMBAR1
132
133 #if defined(CONFIG_M5282)
134 #if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
135         /*
136          * Setup code in SRAM to initialize FLASHBAR,
137          * if start from internal Flash
138          */
139         move.l  #(_flashbar_setup-CONFIG_SYS_INT_FLASH_BASE), %a0
140         move.l  #(_flashbar_setup_end-CONFIG_SYS_INT_FLASH_BASE), %a1
141         move.l  #(CONFIG_SYS_INIT_RAM_ADDR), %a2
142 _copy_flash:
143         move.l  (%a0)+, (%a2)+
144         cmp.l   %a0, %a1
145         bgt.s   _copy_flash
146         jmp     CONFIG_SYS_INIT_RAM_ADDR
147
148 _flashbar_setup:
149         /* Initialize FLASHBAR: locate internal Flash and validate it */
150         move.l  #(CONFIG_SYS_INT_FLASH_BASE + CONFIG_SYS_INT_FLASH_ENABLE), %d0
151         movec   %d0, %FLASHBAR
152         jmp     _after_flashbar_copy.L  /* Force jump to absolute address */
153 _flashbar_setup_end:
154         nop
155 _after_flashbar_copy:
156 #else
157         /* Setup code to initialize FLASHBAR, if start from external Memory */
158         move.l  #(CONFIG_SYS_INT_FLASH_BASE + CONFIG_SYS_INT_FLASH_ENABLE), %d0
159         movec   %d0, %FLASHBAR
160 #endif /* (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE) */
161
162 #endif
163 #endif
164         /*
165          * if we come from a pre-loader we have no exception table and
166          * therefore no VBR to set
167          */
168 #if !defined(CONFIG_MONITOR_IS_IN_RAM)
169 #if defined(CONFIG_M5282) && (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
170         move.l  #CONFIG_SYS_INT_FLASH_BASE, %d0
171 #else
172         move.l  #CONFIG_SYS_FLASH_BASE, %d0
173 #endif
174         movec   %d0, %VBR
175 #endif
176
177 #ifdef CONFIG_M5275
178         /* set MBAR address + valid flag */
179         move.l  #(CONFIG_SYS_MBAR + 1), %d0
180         move.l  %d0, 0x40000000
181 /*      movec   %d0, %MBAR */
182
183         /* Initialize RAMBAR: locate SRAM and validate it */
184         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + 0x21), %d0
185         movec   %d0, %RAMBAR1
186 #endif
187
188         /* initialize general use internal ram */
189         move.l  #0, %d0
190         move.l  #(ICACHE_STATUS), %a1   /* icache */
191         move.l  #(DCACHE_STATUS), %a2   /* icache */
192         move.l  %d0, (%a1)
193         move.l  %d0, (%a2)
194
195         /* put relocation table address to a5 */
196         move.l  #__got_start, %a5
197
198         /* setup stack initially on top of internal static ram  */
199         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
200
201         /*
202          * if configured, malloc_f arena will be reserved first,
203          * then (and always) gd struct space will be reserved
204          */
205         move.l  %sp, -(%sp)
206         move.l  #board_init_f_alloc_reserve, %a1
207         jsr     (%a1)
208
209         /* update stack and frame-pointers */
210         move.l  %d0, %sp
211         move.l  %sp, %fp
212
213         /* initialize reserved area */
214         move.l  %d0, -(%sp)
215         move.l  #board_init_f_init_reserve, %a1
216         jsr     (%a1)
217
218         /* run low-level CPU init code (from flash) */
219         move.l  #cpu_init_f, %a1
220         jsr     (%a1)
221
222         /* run low-level board init code (from flash) */
223         clr.l   %sp@-
224         move.l  #board_init_f, %a1
225         jsr     (%a1)
226
227         /* board_init_f() does not return */
228
229 /******************************************************************************/
230
231 /*
232  * void relocate_code(addr_sp, gd, addr_moni)
233  *
234  * This "function" does not return, instead it continues in RAM
235  * after relocating the monitor code.
236  *
237  * r3 = dest
238  * r4 = src
239  * r5 = length in bytes
240  * r6 = cachelinesize
241  */
242 .globl relocate_code
243 relocate_code:
244         link.w  %a6,#0
245         move.l  8(%a6), %sp             /* set new stack pointer */
246
247         move.l  12(%a6), %d0            /* Save copy of Global Data pointer */
248         move.l  16(%a6), %a0            /* Save copy of Destination Address */
249
250         move.l  #CONFIG_SYS_MONITOR_BASE, %a1
251         move.l  #__init_end, %a2
252         move.l  %a0, %a3
253         /* copy the code to RAM */
254 1:
255         move.l  (%a1)+, (%a3)+
256         cmp.l   %a1,%a2
257         bgt.s   1b
258
259 /*
260  * We are done. Do not return, instead branch to second part of board
261  * initialization, now running from RAM.
262  */
263         move.l  %a0, %a1
264         add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
265         jmp     (%a1)
266
267 in_ram:
268
269 clear_bss:
270         /*
271          * Now clear BSS segment
272          */
273         move.l  %a0, %a1
274         add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
275         move.l  %a0, %d1
276         add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
277 6:
278         clr.l   (%a1)+
279         cmp.l   %a1,%d1
280         bgt.s   6b
281
282         /*
283          * fix got table in RAM
284          */
285         move.l  %a0, %a1
286         add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
287         move.l  %a1,%a5                 /* fix got pointer register a5 */
288
289         move.l  %a0, %a2
290         add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
291
292 7:
293         move.l  (%a1),%d1
294         sub.l   #_start,%d1
295         add.l   %a0,%d1
296         move.l  %d1,(%a1)+
297         cmp.l   %a2, %a1
298         bne     7b
299
300         /* calculate relative jump to board_init_r in ram */
301         move.l  %a0, %a1
302         add.l   #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
303
304         /* set parameters for board_init_r */
305         move.l  %a0,-(%sp)              /* dest_addr */
306         move.l  %d0,-(%sp)              /* gd */
307 #if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE != CONFIG_SYS_INT_FLASH_BASE) && \
308     defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
309         halt
310 #endif
311         jsr     (%a1)
312
313 /******************************************************************************/
314
315 /* exception code */
316 .globl _fault
317 _fault:
318         bra     _fault
319
320 .globl _exc_handler
321 _exc_handler:
322         SAVE_ALL
323         movel   %sp,%sp@-
324         bsr     exc_handler
325         addql   #4,%sp
326         RESTORE_ALL
327
328 .globl _int_handler
329 _int_handler:
330         SAVE_ALL
331         movel   %sp,%sp@-
332         bsr     int_handler
333         addql   #4,%sp
334         RESTORE_ALL
335
336 /******************************************************************************/
337
338 .globl version_string
339 version_string:
340 .ascii U_BOOT_VERSION_STRING, "\0"
341 .align 4