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