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