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        /* set stackpointer to end of internal ram to get some stackspace for the first c-code */
 196        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
 197        clr.l %sp@-
 198
 199        move.l #__got_start, %a5                /* put relocation table address to a5 */
 200
 201        /* run low-level CPU init code (from flash) */
 202        move.l #cpu_init_f, %a1
 203        jsr (%a1)
 204        /* run low-level board init code (from flash) */
 205        move.l #board_init_f, %a1
 206        jsr (%a1)
 207
 208        /* board_init_f() does not return */
 209
 210/*------------------------------------------------------------------------------*/
 211
 212/*
 213 * void relocate_code (addr_sp, gd, addr_moni)
 214 *
 215 * This "function" does not return, instead it continues in RAM
 216 * after relocating the monitor code.
 217 *
 218 * r3 = dest
 219 * r4 = src
 220 * r5 = length in bytes
 221 * r6 = cachelinesize
 222 */
 223        .globl  relocate_code
 224relocate_code:
 225        link.w %a6,#0
 226        move.l 8(%a6), %sp              /* set new stack pointer */
 227
 228        move.l 12(%a6), %d0             /* Save copy of Global Data pointer */
 229        move.l 16(%a6), %a0             /* Save copy of Destination Address */
 230
 231        move.l #CONFIG_SYS_MONITOR_BASE, %a1
 232        move.l #__init_end, %a2
 233        move.l %a0, %a3
 234        /* copy the code to RAM */
 2351:
 236        move.l (%a1)+, (%a3)+
 237        cmp.l  %a1,%a2
 238        bgt.s    1b
 239
 240/*
 241 * We are done. Do not return, instead branch to second part of board
 242 * initialization, now running from RAM.
 243 */
 244        move.l  %a0, %a1
 245        add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
 246        jmp     (%a1)
 247
 248in_ram:
 249
 250clear_bss:
 251        /*
 252         * Now clear BSS segment
 253         */
 254        move.l  %a0, %a1
 255        add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
 256        move.l  %a0, %d1
 257        add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
 2586:
 259        clr.l   (%a1)+
 260        cmp.l   %a1,%d1
 261        bgt.s   6b
 262
 263        /*
 264         * fix got table in RAM
 265         */
 266        move.l  %a0, %a1
 267        add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
 268        move.l  %a1,%a5         /* * fix got pointer register a5 */
 269
 270        move.l  %a0, %a2
 271        add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
 272
 2737:
 274        move.l  (%a1),%d1
 275        sub.l   #_start,%d1
 276        add.l   %a0,%d1
 277        move.l  %d1,(%a1)+
 278        cmp.l   %a2, %a1
 279        bne     7b
 280
 281        /* calculate relative jump to board_init_r in ram */
 282        move.l %a0, %a1
 283        add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
 284
 285        /* set parameters for board_init_r */
 286        move.l %a0,-(%sp)               /* dest_addr */
 287        move.l %d0,-(%sp)               /* gd */
 288#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE != CONFIG_SYS_INT_FLASH_BASE) && \
 289    defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
 290        halt
 291#endif
 292        jsr     (%a1)
 293
 294/*------------------------------------------------------------------------------*/
 295/* exception code */
 296        .globl _fault
 297_fault:
 298        bra _fault
 299
 300        .globl  _exc_handler
 301_exc_handler:
 302        SAVE_ALL
 303        movel   %sp,%sp@-
 304        bsr exc_handler
 305        addql   #4,%sp
 306        RESTORE_ALL
 307
 308        .globl  _int_handler
 309_int_handler:
 310        SAVE_ALL
 311        movel   %sp,%sp@-
 312        bsr int_handler
 313        addql   #4,%sp
 314        RESTORE_ALL
 315
 316/*------------------------------------------------------------------------------*/
 317
 318        .globl  version_string
 319version_string:
 320        .ascii U_BOOT_VERSION_STRING, "\0"
 321        .align 4
 322