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 <cy...@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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to