[U-Boot] [PATCH] ARM1176: Coexist with other ARM1176 platforms
Tom Rix
tom at bumblecow.com
Mon Apr 26 15:10:45 CEST 2010
Cyril Chemparathy wrote:
> 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 <cyril at ti.com>
> ---
> cpu/arm1176/cpu.c | 1 -
> cpu/arm1176/start.S | 60 ++++++++++++++++++++++++++++++++++++++------
> include/configs/smdk6400.h | 6 ++++
> 3 files changed, 58 insertions(+), 9 deletions(-)
>
> diff --git a/cpu/arm1176/cpu.c b/cpu/arm1176/cpu.c
> index 2c0014f..c0fd114 100644
> --- a/cpu/arm1176/cpu.c
> +++ b/cpu/arm1176/cpu.c
> @@ -33,7 +33,6 @@
>
> #include <common.h>
> #include <command.h>
> -#include <asm/arch/s3c6400.h>
> #include <asm/system.h>
>
> static void cache_flush (void);
> diff --git a/cpu/arm1176/start.S b/cpu/arm1176/start.S
> index 68a356d..beec574 100644
> --- a/cpu/arm1176/start.S
> +++ b/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,7 +35,6 @@
> #ifdef CONFIG_ENABLE_MMU
> #include <asm/proc/domain.h>
> #endif
> -#include <asm/arch/s3c6400.h>
>
> #if !defined(CONFIG_ENABLE_MMU) && !defined(CONFIG_SYS_PHY_UBOOT_BASE)
> #define CONFIG_SYS_PHY_UBOOT_BASE CONFIG_SYS_UBOOT_BASE
> @@ -145,6 +144,7 @@ reset:
> *
> *************************************************************************
> */
> +#ifndef CONFIG_SKIP_LOWLEVEL_INIT
CONFIG_SKIP_LOWLEVEL_INIT is not used in the other patches.
Why is this needed ?
board/samsung/samsung/smdk6400 has a lowlevel_init.o function.
It is confusing why this function is being if-def and not the real
lowlevel_init..
> /*
> * we do sys-critical inits only at reboot,
> * not when booting from ram!
> @@ -170,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
This logic is may not be quite correct
From include/configs/smdk6400.h
#if !defined(CONFIG_NAND_SPL) && (TEXT_BASE >= 0xc0000000)
#define CONFIG_ENABLE_MMU
#endif
Please check
> /* Prepare to disable the MMU */
> adr r1, mmu_disable_phys
> /* We presume we're within the first 1024 bytes */
> @@ -187,20 +189,60 @@ mmu_disable:
> nop
> nop
> mov pc, r2
> +mmu_disable_phys:
> +#else
> + mcr p15, 0, r0, c1, c0, 0
Are the noop's above needed here?
> #endif
>
> -mmu_disable_phys:
> +#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)
This comment '@ 256 .. ' is no longer valid.
> +#endif
>
> /*
> * 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 */
> @@ -236,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 */
> @@ -306,6 +348,8 @@ phy_last_jump:
> mov r0, #0
> mov pc, r9
> #endif
> +
> +
> /*
> *************************************************************************
> *
> @@ -373,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 */
The old comment makes more sense.
Revert this.
> 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
There is logic later in this file to undef this value.
This is likely an error.
If it isn't, add a comment.
> +
> +#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 */
Tom
More information about the U-Boot
mailing list