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