[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