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 <asm/cache.h> 10 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 33 34/* 35 * Vector table. This is used for initial platform startup. 36 * These vectors are to catch any un-intended traps. 37 */ 38_vectors: 39/* Flash offset is 0 until we setup CS0 */ 40.long 0x00000000 41#if defined(CONFIG_M5307) && \ 42 (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE) 43.long _start - CONFIG_SYS_TEXT_BASE 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 86.text 87 88.globl _start 89_start: 90 nop 91 nop 92 move.w #0x2700,%sr 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 */ 102 move.l #CF_CACR_CINVA, %d0 103 movec %d0, %CACR 104 move.l #0, %d0 105 movec %d0, %ACR0 106 movec %d0, %ACR1 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 124 /* put relocation table address to a5 */ 125 move.l #__got_start, %a5 126 127 /* setup stack initially on top of internal static ram */ 128 move.l #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp 129 130 /* 131 * if configured, malloc_f arena will be reserved first, 132 * then (and always) gd struct space will be reserved 133 */ 134 move.l %sp, -(%sp) 135 bsr board_init_f_alloc_reserve 136 137 /* update stack and frame-pointers */ 138 move.l %d0, %sp 139 move.l %sp, %fp 140 141 /* initialize reserved area */ 142 move.l %d0, -(%sp) 143 bsr board_init_f_init_reserve 144 145 /* run low-level CPU init code (from flash) */ 146 bsr cpu_init_f 147 148 /* run low-level board init code (from flash) */ 149 clr.l %sp@- 150 bsr board_init_f 151 152 /* board_init_f() does not return */ 153 154/******************************************************************************/ 155 156/* 157 * void relocate_code(addr_sp, gd, addr_moni) 158 * 159 * This "function" does not return, instead it continues in RAM 160 * after relocating the monitor code. 161 * 162 */ 163.globl relocate_code 164relocate_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 */ 1741: 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 187in_ram: 188 189clear_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 1976: 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 207 208 /* fix got pointer register a5 */ 209 move.l %a1,%a5 210 211 move.l %a0, %a2 212 add.l #(__got_end - CONFIG_SYS_MONITOR_BASE), %a2 213 2147: 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 */ 229#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE!=CONFIG_SYS_INT_FLASH_BASE) && \ 230 defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP) 231 halt 232#endif 233 jsr (%a1) 234 235/******************************************************************************/ 236 237/* exception code */ 238.globl _fault 239_fault: 240 bra _fault 241 242.globl _exc_handler 243_exc_handler: 244 SAVE_ALL 245 movel %sp,%sp@- 246 bsr exc_handler 247 addql #4,%sp 248 RESTORE_ALL 249 250.globl _int_handler 251_int_handler: 252 SAVE_ALL 253 movel %sp,%sp@- 254 bsr int_handler 255 addql #4,%sp 256 RESTORE_ALL 257 258/******************************************************************************/ 259 260.align 4 261