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