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#ifndef  CONFIG_IDENT_STRING
  14#define  CONFIG_IDENT_STRING ""
  15#endif
  16
  17#define _START  _start
  18#define _FAULT  _fault
  19
  20
  21#define SAVE_ALL                                                \
  22        move.w  #0x2700,%sr;            /* disable intrs */     \
  23        subl    #60,%sp;                /* space for 15 regs */ \
  24        moveml  %d0-%d7/%a0-%a6,%sp@;                           \
  25
  26#define RESTORE_ALL                                             \
  27        moveml  %sp@,%d0-%d7/%a0-%a6;                           \
  28        addl    #60,%sp;                /* space for 15 regs */ \
  29        rte
  30
  31/* If we come from a pre-loader we don't need an initial exception
  32 * table.
  33 */
  34#if !defined(CONFIG_MONITOR_IS_IN_RAM)
  35
  36.text
  37/*
  38 *      Vector table. This is used for initial platform startup.
  39 *      These vectors are to catch any un-intended traps.
  40 */
  41_vectors:
  42
  43.long   0x00000000              /* Flash offset is 0 until we setup CS0 */
  44#if defined(CONFIG_M5282) && (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
  45.long   _start - CONFIG_SYS_TEXT_BASE
  46#else
  47.long   _START
  48#endif
  49
  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, _FAULT, _FAULT
  57.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  58
  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.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  67
  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.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  76
  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.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  85
  86#endif
  87
  88        .text
  89
  90
  91#if defined(CONFIG_SYS_INT_FLASH_BASE) && \
  92    (defined(CONFIG_M5282) || defined(CONFIG_M5281))
  93        #if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
  94                .long   0x55AA55AA,0xAA55AA55 /* CFM Backdoorkey */
  95                .long   0xFFFFFFFF /* all sectors protected */
  96                .long   0x00000000 /* supervisor/User restriction */
  97                .long   0x00000000 /* programm/data space restriction */
  98                .long   0x00000000 /* Flash security */
  99        #endif
 100#endif
 101        .globl  _start
 102_start:
 103        nop
 104        nop
 105        move.w #0x2700,%sr
 106
 107#if defined(CONFIG_M5208)
 108        /* Initialize RAMBAR: locate SRAM and validate it */
 109        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
 110        movec   %d0, %RAMBAR1
 111#endif
 112
 113#if defined(CONFIG_M5272) || defined(CONFIG_M5249) || defined(CONFIG_M5253)
 114        move.l  #(CONFIG_SYS_MBAR + 1), %d0             /* set MBAR address + valid flag */
 115        move.c  %d0, %MBAR
 116
 117        /*** The 5249 has MBAR2 as well ***/
 118#ifdef CONFIG_SYS_MBAR2
 119        move.l  #(CONFIG_SYS_MBAR2 + 1), %d0            /* Get MBAR2 address */
 120        movec   %d0, #0xc0e                     /* Set MBAR2 */
 121#endif
 122
 123        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + 1), %d0
 124        movec   %d0, %RAMBAR0
 125#endif /* CONFIG_M5272 || CONFIG_M5249 || CONFIG_M5253 */
 126
 127#if defined(CONFIG_M5282) || defined(CONFIG_M5271)
 128        /* Initialize IPSBAR */
 129        move.l  #(CONFIG_SYS_MBAR + 1), %d0             /* set IPSBAR address + valid flag */
 130        move.l  %d0, 0x40000000
 131
 132        /* Initialize RAMBAR1: locate SRAM and validate it */
 133        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + 0x21), %d0
 134        movec   %d0, %RAMBAR1
 135
 136#if defined(CONFIG_M5282)
 137#if (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
 138        /* Setup code in SRAM to initialize FLASHBAR, 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        /* 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        /* Initialize IPSBAR */
 179        move.l  #(CONFIG_SYS_MBAR + 1), %d0             /* set IPSBAR address + valid flag */
 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        /* run low-level board init code (from flash) */
 222        clr.l   %sp@-
 223        move.l #board_init_f, %a1
 224        jsr (%a1)
 225
 226        /* board_init_f() does not return */
 227
 228/*------------------------------------------------------------------------------*/
 229
 230/*
 231 * void relocate_code (addr_sp, gd, addr_moni)
 232 *
 233 * This "function" does not return, instead it continues in RAM
 234 * after relocating the monitor code.
 235 *
 236 * r3 = dest
 237 * r4 = src
 238 * r5 = length in bytes
 239 * r6 = cachelinesize
 240 */
 241        .globl  relocate_code
 242relocate_code:
 243        link.w %a6,#0
 244        move.l 8(%a6), %sp              /* set new stack pointer */
 245
 246        move.l 12(%a6), %d0             /* Save copy of Global Data pointer */
 247        move.l 16(%a6), %a0             /* Save copy of Destination Address */
 248
 249        move.l #CONFIG_SYS_MONITOR_BASE, %a1
 250        move.l #__init_end, %a2
 251        move.l %a0, %a3
 252        /* copy the code to RAM */
 2531:
 254        move.l (%a1)+, (%a3)+
 255        cmp.l  %a1,%a2
 256        bgt.s    1b
 257
 258/*
 259 * We are done. Do not return, instead branch to second part of board
 260 * initialization, now running from RAM.
 261 */
 262        move.l  %a0, %a1
 263        add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
 264        jmp     (%a1)
 265
 266in_ram:
 267
 268clear_bss:
 269        /*
 270         * Now clear BSS segment
 271         */
 272        move.l  %a0, %a1
 273        add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
 274        move.l  %a0, %d1
 275        add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
 2766:
 277        clr.l   (%a1)+
 278        cmp.l   %a1,%d1
 279        bgt.s   6b
 280
 281        /*
 282         * fix got table in RAM
 283         */
 284        move.l  %a0, %a1
 285        add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
 286        move.l  %a1,%a5         /* * fix got pointer register a5 */
 287
 288        move.l  %a0, %a2
 289        add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
 290
 2917:
 292        move.l  (%a1),%d1
 293        sub.l   #_start,%d1
 294        add.l   %a0,%d1
 295        move.l  %d1,(%a1)+
 296        cmp.l   %a2, %a1
 297        bne     7b
 298
 299        /* calculate relative jump to board_init_r in ram */
 300        move.l %a0, %a1
 301        add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
 302
 303        /* set parameters for board_init_r */
 304        move.l %a0,-(%sp)               /* dest_addr */
 305        move.l %d0,-(%sp)               /* gd */
 306#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE != CONFIG_SYS_INT_FLASH_BASE) && \
 307    defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
 308        halt
 309#endif
 310        jsr     (%a1)
 311
 312/*------------------------------------------------------------------------------*/
 313/* exception code */
 314        .globl _fault
 315_fault:
 316        bra _fault
 317
 318        .globl  _exc_handler
 319_exc_handler:
 320        SAVE_ALL
 321        movel   %sp,%sp@-
 322        bsr exc_handler
 323        addql   #4,%sp
 324        RESTORE_ALL
 325
 326        .globl  _int_handler
 327_int_handler:
 328        SAVE_ALL
 329        movel   %sp,%sp@-
 330        bsr int_handler
 331        addql   #4,%sp
 332        RESTORE_ALL
 333
 334/*------------------------------------------------------------------------------*/
 335
 336        .globl  version_string
 337version_string:
 338        .ascii U_BOOT_VERSION_STRING, "\0"
 339        .align 4
 340