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 243relocate_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 */ 2541: 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 267in_ram: 268 269clear_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 2776: 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 2927: 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 339version_string: 340.ascii U_BOOT_VERSION_STRING, "\0" 341.align 4 342