The current ARM1176 CPU specific code is too specific to the SMDK6400
architecture.  The following changes were necessary prerequisites for the
addition of other SoCs based on ARM1176.

Existing board's (SMDK6400) configuration has been modified to keep behavior
unchanged despite these changes.

1. Peripheral port remap configurability
The earlier code had hardcoded remap values specific to s3c64xx in start.S.
This change makes the peripheral port remap addresses and sizes configurable.

2. Skip low level initialization
Ability to skip low level initialization if necessary.  Many other platforms
have a similar capability, and this is quite useful during debug/bring-up.

3. U-Boot code relocation support
Most architectures allow u-boot code to run initially at a different
address (possibly in NOR) and then get relocated to its final resting place
in RAM.  Added support for this capability in ARM1176 architecture.

4. Disable TCM if necessary
If a ROM based bootloader happened to have initialized TCM, we disable it here
to keep things sane.

5. Remove unnecessary SoC specific includes
ARM1176 code does not really need this SoC specific include.  The presence
of this include prevents builds on other ARM1176 archs.

6. ARM926 style MMU disable when !CONFIG_ENABLE_MMU
The original MMU disable code masks out too many bits from the load address
when it tries to figure out the physical address of the jump target label.
Consequently, it ends up branching to the wrong address after disabling the
MMU.

Signed-off-by: Cyril Chemparathy <cy...@ti.com>
---
v5: rebased on master in u-boot-arm.git
v4: rebased on next in u-boot-arm.git
v3: unchanged from v2
v2: unchanged from v1

 arch/arm/cpu/arm1176/cpu.c   |    3 --
 arch/arm/cpu/arm1176/start.S |   62 ++++++++++++++++++++++++++++++++++-------
 include/configs/smdk6400.h   |    6 ++++
 3 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/arch/arm/cpu/arm1176/cpu.c b/arch/arm/cpu/arm1176/cpu.c
index befa0cd..c0fd114 100644
--- a/arch/arm/cpu/arm1176/cpu.c
+++ b/arch/arm/cpu/arm1176/cpu.c
@@ -33,9 +33,6 @@
 
 #include <common.h>
 #include <command.h>
-#ifdef CONFIG_S3C64XX
-#include <asm/arch/s3c6400.h>
-#endif
 #include <asm/system.h>
 
 static void cache_flush (void);
diff --git a/arch/arm/cpu/arm1176/start.S b/arch/arm/cpu/arm1176/start.S
index e2b6c9b..beec574 100644
--- a/arch/arm/cpu/arm1176/start.S
+++ b/arch/arm/cpu/arm1176/start.S
@@ -1,5 +1,5 @@
 /*
- *  armboot - Startup Code for S3C6400/ARM1176 CPU-core
+ *  armboot - Startup Code for ARM1176 CPU-core
  *
  * Copyright (c) 2007  Samsung Electronics
  *
@@ -35,9 +35,6 @@
 #ifdef CONFIG_ENABLE_MMU
 #include <asm/proc/domain.h>
 #endif
-#ifdef CONFIG_S3C64XX
-#include <asm/arch/s3c6400.h>
-#endif
 
 #if !defined(CONFIG_ENABLE_MMU) && !defined(CONFIG_SYS_PHY_UBOOT_BASE)
 #define CONFIG_SYS_PHY_UBOOT_BASE      CONFIG_SYS_UBOOT_BASE
@@ -147,6 +144,7 @@ reset:
  *
  *************************************************************************
  */
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
        /*
         * we do sys-critical inits only at reboot,
         * not when booting from ram!
@@ -172,6 +170,8 @@ cpu_init_crit:
        bic     r0, r0, #0x00000087     @ clear bits 7, 2:0 (B--- -CAM)
        orr     r0, r0, #0x00000002     @ set bit 2 (A) Align
        orr     r0, r0, #0x00001000     @ set bit 12 (I) I-Cache
+
+#ifdef CONFIG_ENABLE_MMU
        /* Prepare to disable the MMU */
        adr     r1, mmu_disable_phys
        /* We presume we're within the first 1024 bytes */
@@ -189,13 +189,32 @@ mmu_disable:
        nop
        nop
        mov     pc, r2
+mmu_disable_phys:
+#else
+       mcr     p15, 0, r0, c1, c0, 0
 #endif
 
-mmu_disable_phys:
-#ifdef CONFIG_S3C64XX
+#ifdef CONFIG_DISABLE_TCM
+       /*
+        * Disable the TCMs
+        */
+       mrc     p15, 0, r0, c0, c0, 2   /* Return TCM details */
+       cmp     r0, #0
+       beq     skip_tcmdisable
+       mov     r1, #0
+       mov     r2, #1
+       tst     r0, r2
+       mcrne   p15, 0, r1, c9, c1, 1   /* Disable Instruction TCM if present*/
+       tst     r0, r2, LSL #16
+       mcrne   p15, 0, r1, c9, c1, 0   /* Disable Data TCM if present*/
+skip_tcmdisable:
+#endif
+#endif
+
+#ifdef CONFIG_PERIPORT_REMAP
        /* Peri port setup */
-       ldr     r0, =0x70000000
-       orr     r0, r0, #0x13
+       ldr     r0, =CONFIG_PERIPORT_BASE
+       orr     r0, r0, #CONFIG_PERIPORT_SIZE
        mcr     p15,0,r0,c15,c2,4       @ 256M (0x70000000 - 0x7fffffff)
 #endif
 
@@ -203,8 +222,27 @@ mmu_disable_phys:
         * Go setup Memory and board specific bits prior to relocation.
         */
        bl      lowlevel_init           /* go setup pll,mux,memory */
+#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
+
+#ifndef CONFIG_SKIP_RELOCATE_UBOOT
+relocate:                              /* relocate U-Boot to RAM           */
+       adr     r0, _start              /* r0 <- current position of code   */
+       ldr     r1, _TEXT_BASE          /* test if we run from flash or RAM */
+       cmp     r0, r1                  /* don't reloc during debug         */
+       beq     stack_setup
+
+       ldr     r2, _armboot_start
+       ldr     r3, _bss_start
+       sub     r2, r3, r2              /* r2 <- size of armboot            */
+       add     r2, r0, r2              /* r2 <- source end address         */
+
+copy_loop:
+       ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */
+       stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */
+       cmp     r0, r2                  /* until source end addreee [r2]    */
+       ble     copy_loop
+#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
 
-after_copy:
 #ifdef CONFIG_ENABLE_MMU
 enable_mmu:
        /* enable domain access */
@@ -240,9 +278,9 @@ mmu_enable:
        nop
        nop
        mov     pc, r2
+skip_hw_init:
 #endif
 
-skip_hw_init:
        /* Set up the stack                                                 */
 stack_setup:
        ldr     r0, =CONFIG_SYS_UBOOT_BASE      /* base of copy in DRAM     */
@@ -310,6 +348,8 @@ phy_last_jump:
        mov     r0, #0
        mov     pc, r9
 #endif
+
+
 /*
  *************************************************************************
  *
@@ -377,7 +417,7 @@ phy_last_jump:
        ldr     r13, _armboot_start
        /* move past malloc pool */
        sub     r13, r13, #(CONFIG_SYS_MALLOC_LEN)
-       /* move to reserved a couple spots for abort stack */
+       /* reserved a couple spots for abort stack */
        sub     r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE + 8)
 
        /* save caller lr in position 0 of saved stack */
diff --git a/include/configs/smdk6400.h b/include/configs/smdk6400.h
index f04feae..7b4501d 100644
--- a/include/configs/smdk6400.h
+++ b/include/configs/smdk6400.h
@@ -40,6 +40,12 @@
 #define CONFIG_S3C64XX         1       /* in a SAMSUNG S3C64XX Family  */
 #define CONFIG_SMDK6400                1       /* on a SAMSUNG SMDK6400 Board  
*/
 
+#define CONFIG_SKIP_RELOCATE_UBOOT
+
+#define CONFIG_PERIPORT_REMAP
+#define CONFIG_PERIPORT_BASE   0x70000000
+#define CONFIG_PERIPORT_SIZE   0x13
+
 #define CONFIG_SYS_SDRAM_BASE  0x50000000
 
 /* input clock of PLL: SMDK6400 has 12MHz input clock */
-- 
1.6.3.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to