summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/mpc55xxevb/start/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/powerpc/mpc55xxevb/start/start.S')
-rw-r--r--bsps/powerpc/mpc55xxevb/start/start.S299
1 files changed, 299 insertions, 0 deletions
diff --git a/bsps/powerpc/mpc55xxevb/start/start.S b/bsps/powerpc/mpc55xxevb/start/start.S
new file mode 100644
index 0000000000..0a757e7ada
--- /dev/null
+++ b/bsps/powerpc/mpc55xxevb/start/start.S
@@ -0,0 +1,299 @@
+/**
+ * @file
+ *
+ * @ingroup mpc55xx_asm
+ *
+ * @brief Boot and system start code.
+ */
+
+/*
+ * Copyright (c) 2008-2012 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <bspopts.h>
+#include <bsp/linker-symbols.h>
+#include <libcpu/powerpc-utility.h>
+
+#if MPC55XX_CHIP_FAMILY != 551
+ #define HAS_SPE
+#endif
+
+#if MPC55XX_CHIP_FAMILY == 564
+ #define INIT_REGISTERS_FOR_LSM
+#endif
+
+#ifdef HAS_SPE
+ #define ZERO_GPR(reg) evxor reg, reg, reg
+#else
+ #define ZERO_GPR(reg) xor reg, reg, reg
+#endif
+
+ .extern __eabi
+ .extern boot_card
+ .extern bsp_ram_start
+ .extern mpc55xx_start_config_mmu_early
+ .extern mpc55xx_start_config_mmu_early_count
+ .extern mpc55xx_start_early
+
+ .globl _start
+ .globl mpc55xx_start_load_section
+ .globl mpc55xx_start_mmu_apply_config
+
+#ifdef MPC55XX_BOOTFLAGS
+ .globl mpc55xx_bootflag_0
+ .globl mpc55xx_bootflag_1
+#endif
+
+ .section ".bsp_start_text", "ax"
+
+ /* BAM: RCHW */
+ .int 0x005a0000
+
+ /* BAM: Address of start instruction */
+ .int _start
+
+#ifdef MPC55XX_BOOTFLAGS
+ /*
+ * We skip over the next two boot flag words to the next 64-bit
+ * aligned start address. It is 64-bit aligned to play well with
+ * FLASH programming. These boot flags can be set by debuggers
+ * and emulators to customize boot. Currently bit0 of
+ * bootflag_0 means to "skip setting up the MMU", allowing
+ * external MMU setup in a debugger before branching to 0x10.
+ * This can be used e.g., to map FLASH into RAM.
+ */
+mpc55xx_bootflag_0:
+ .int 0xffffffff
+mpc55xx_bootflag_1:
+ .int 0xffffffff
+#endif
+
+_start:
+
+#ifdef MPC55XX_ENABLE_START_PROLOGUE
+ bl mpc55xx_start_prologue
+#endif
+
+#ifdef MPC55XX_NEEDS_LOW_LEVEL_INIT
+
+ /* Enable SPE */
+#ifdef HAS_SPE
+ mfmsr r3
+ oris r3, r3, MSR_SPE >> 16
+ mtmsr r3
+ isync
+#endif
+
+ /*
+ * Initialization of core registers according to "e200z4 Power
+ * Architecture Core Reference Manual" section 2.6 "Reset Settings"
+ * table 2-16 "Reset Settings of e200 Resources". This is necessary
+ * for lock step mode (LSM).
+ */
+ ZERO_GPR(r0)
+#ifdef INIT_REGISTERS_FOR_LSM
+ ZERO_GPR(r1)
+ ZERO_GPR(r2)
+ ZERO_GPR(r4)
+ ZERO_GPR(r5)
+ ZERO_GPR(r6)
+ ZERO_GPR(r7)
+ ZERO_GPR(r8)
+ ZERO_GPR(r9)
+ ZERO_GPR(r10)
+ ZERO_GPR(r11)
+ ZERO_GPR(r12)
+ ZERO_GPR(r13)
+ ZERO_GPR(r14)
+ ZERO_GPR(r15)
+ ZERO_GPR(r16)
+ ZERO_GPR(r17)
+ ZERO_GPR(r18)
+ ZERO_GPR(r19)
+ ZERO_GPR(r20)
+ ZERO_GPR(r21)
+ ZERO_GPR(r22)
+ ZERO_GPR(r23)
+ ZERO_GPR(r24)
+ ZERO_GPR(r25)
+ ZERO_GPR(r26)
+ ZERO_GPR(r27)
+ ZERO_GPR(r28)
+ ZERO_GPR(r29)
+ ZERO_GPR(r30)
+ ZERO_GPR(r31)
+ mtcrf 0xff, r0
+ mtcsrr0 r0
+ mtcsrr1 r0
+ mtctr r0
+ mtspr FSL_EIS_DBCNT, r0
+ mtspr DEAR_BOOKE, r0
+ mtdec r0
+ mtspr BOOKE_DECAR, r0
+ mtspr FSL_EIS_DSRR0, r0
+ mtspr FSL_EIS_DSRR1, r0
+ mtspr BOOKE_DVC1, r0
+ mtspr BOOKE_DVC2, r0
+ mtspr BOOKE_IVPR, r0
+ mtlr r0
+ mtspr FSL_EIS_MCAR, r0
+ mtmcsrr0 r0
+ mtmcsrr1 r0
+ mtspr SPRG0, r0
+ mtspr SPRG1, r0
+ mtspr SPRG2, r0
+ mtspr SPRG3, r0
+ mtspr SPRG4, r0
+ mtspr SPRG5, r0
+ mtspr SPRG6, r0
+ mtspr SPRG7, r0
+ mtspr FSL_EIS_SPRG8, r0
+ mtspr FSL_EIS_SPRG9, r0
+ mtsrr0 r0
+ mtsrr1 r0
+ mtspr USPRG0, r0
+#ifdef HAS_SPE
+ evmra r0, r0
+#endif
+#endif /* INIT_REGISTERS_FOR_LSM */
+ mtspr TBWL, r0
+ mtspr TBWU, r0
+
+ /* Enable time base */
+ mfspr r3, HID0
+ ori r3, r3, 0x4000
+ mtspr HID0, r3
+
+ /*
+ * Enable branch prediction.
+ *
+ * Errata e4396: e200z7: Erroneous Address Fetch
+ *
+ * The propose workaround does not work.
+ */
+#if MPC55XX_CHIP_FAMILY != 567
+ LWI r3, FSL_EIS_BUCSR_BBFI | FSL_EIS_BUCSR_BALLOC_ALL | FSL_EIS_BUCSR_BPRED_NOT_TAKEN | FSL_EIS_BUCSR_BPEN
+ mtspr FSL_EIS_BUCSR, r3
+#endif
+
+#endif /* MPC55XX_NEEDS_LOW_LEVEL_INIT */
+
+ /* MMU early initialization */
+ LA r3, mpc55xx_start_config_mmu_early
+ LW r4, mpc55xx_start_config_mmu_early_count
+ bl mpc55xx_start_mmu_apply_config
+
+#ifdef MPC55XX_NEEDS_LOW_LEVEL_INIT
+
+ /* Initialize intermediate stack (ECC) */
+
+ LA r3, bsp_ram_start
+ addi r4, r3, MPC55XX_EARLY_STACK_SIZE
+
+zero_intermediate_stack_loop:
+
+#ifdef HAS_SPE
+ evstdd r0, 0(r3)
+ evstdd r0, 8(r3)
+ evstdd r0, 16(r3)
+ evstdd r0, 24(r3)
+#else
+ stw r0, 0(r3)
+ stw r0, 4(r3)
+ stw r0, 8(r3)
+ stw r0, 12(r3)
+ stw r0, 16(r3)
+ stw r0, 20(r3)
+ stw r0, 24(r3)
+ stw r0, 28(r3)
+#endif
+ addi r3, r3, 32
+ cmpw cr7, r3, r4
+ bne cr7, zero_intermediate_stack_loop
+ subi r1, r3, 16
+
+#endif /* MPC55XX_NEEDS_LOW_LEVEL_INIT */
+
+ /* Next steps in C */
+ bl mpc55xx_start_early
+
+ /* Initialize start stack */
+ LA r1, start_stack_end
+ subi r1, r1, 16
+ li r0, 0
+ stw r0, 0(r1)
+
+ /*
+ * Load sections. This must be performed after the stack switch
+ * because it may overwrite the initial stack.
+ */
+ LA r3, bsp_section_fast_text_begin
+ LA r4, bsp_section_fast_text_load_begin
+ LA r5, bsp_section_fast_text_size
+ bl mpc55xx_start_load_section
+ LA r3, bsp_section_fast_data_begin
+ LA r4, bsp_section_fast_data_load_begin
+ LA r5, bsp_section_fast_data_size
+ bl mpc55xx_start_load_section
+ LA r3, bsp_section_data_begin
+ LA r4, bsp_section_data_load_begin
+ LA r5, bsp_section_data_size
+ bl mpc55xx_start_load_section
+
+ /* Set up EABI and SYSV environment */
+ bl __eabi
+
+ /* Clear command line */
+ li r3, 0
+
+ /* Start RTEMS */
+ bl boot_card
+
+ /* Spin around */
+twiddle:
+
+ b twiddle
+
+mpc55xx_start_mmu_apply_config:
+
+ cmpwi cr7, r4, r0
+ beqlr cr7
+ mtctr r4
+
+mmu_init_loop:
+
+ lwz r4, 0(r3)
+ lwz r5, 4(r3)
+ lwz r6, 8(r3)
+ lwz r7, 12(r3)
+ mtspr FSL_EIS_MAS0, r4
+ mtspr FSL_EIS_MAS1, r5
+ mtspr FSL_EIS_MAS2, r6
+ mtspr FSL_EIS_MAS3, r7
+ tlbwe
+ addi r3, r3, 16
+ bdnz mmu_init_loop
+ blr
+
+mpc55xx_start_load_section:
+ cmpw cr7, r3, r4
+ beqlr cr7
+ b memcpy
+
+ /* Start stack area */
+
+ .section ".bsp_rwextra", "aw", @nobits
+ .align 4
+ .space 4096
+
+start_stack_end: