Relocation may not be needed and desirable in many cases: * For many boards the amount of SDRAM is fixed. So relocation is not needed. * Relocation adds un-necessary additional overhead when it's not needed. This delay is singificant on slower platforms such as FPGA * Many boards have ample memory. So reserving enough memory for Linux in the first half is not a challenge even without relocation
Add a CONFIG option to disable relocation on platforms that do not need it. When this flag is enabled allocate memory for stack heap etc at the end of memory as usual, but U-Boot itself is not moved from TEXT_BASE. Additionally, -pie is removed from the final link step because it was causing the absolute value of all symbols coming from the linker script to be 0. This affects find_cmd() Tested on OMAP4430 SDP Cc: Albert Aribaud <albert.arib...@free.fr> Cc: Wolfgang Denk <w...@denx.de> Signed-off-by: Aneesh V <ane...@ti.com> --- arch/arm/config.mk | 2 ++ arch/arm/lib/board.c | 5 +++++ board/ti/sdp4430/config.mk | 9 +++++++-- include/configs/omap4_sdp4430.h | 2 ++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/arch/arm/config.mk b/arch/arm/config.mk index 1785e73..2315bcb 100644 --- a/arch/arm/config.mk +++ b/arch/arm/config.mk @@ -71,5 +71,7 @@ LDSCRIPT := $(SRCTREE)/$(CPUDIR)/u-boot.lds # needed for relocation ifndef CONFIG_NAND_SPL +ifndef CONFIG_SYS_SKIP_ARM_RELOCATION LDFLAGS_u-boot += -pie endif +endif diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c index 72ee108..ed3898f 100644 --- a/arch/arm/lib/board.c +++ b/arch/arm/lib/board.c @@ -361,6 +361,7 @@ void board_init_f (ulong bootflag) gd->fb_base = addr; #endif /* CONFIG_LCD */ +#ifndef CONFIG_SYS_SKIP_ARM_RELOCATION /* * reserve memory for U-Boot code, data & bss * round down to next 4 kB limit @@ -369,6 +370,7 @@ void board_init_f (ulong bootflag) addr &= ~(4096 - 1); debug ("Reserving %ldk for U-Boot at: %08lx\n", gd->mon_len >> 10, addr); +#endif #ifndef CONFIG_PRELOADER /* @@ -420,6 +422,9 @@ void board_init_f (ulong bootflag) dram_init_banksize(); display_dram_config(); /* and display it */ +#ifdef CONFIG_SYS_SKIP_ARM_RELOCATION + addr = _TEXT_BASE; +#endif gd->relocaddr = addr; gd->start_addr_sp = addr_sp; gd->reloc_off = addr - _TEXT_BASE; diff --git a/board/ti/sdp4430/config.mk b/board/ti/sdp4430/config.mk index c62965d..8846732 100644 --- a/board/ti/sdp4430/config.mk +++ b/board/ti/sdp4430/config.mk @@ -28,5 +28,10 @@ # Linux-Kernel is expected to be at 8000'8000, entry 8000'8000 # (mem base + reserved) -# 1MB into the SDRAM to allow for SPL's bss at the beginning of SDRAM -CONFIG_SYS_TEXT_BASE = 0x80100000 +# 64MB into the SDRAM +# Assuming a minimum of 128 MB on the board: +# - 64MB before U-Boot is more than enough for Linux when relocation is +# disabled +# - ~63MB after the U-Boot is more than enough for U-Boot to relocate +# itself without stepping on itself +CONFIG_SYS_TEXT_BASE = 0x84000000 diff --git a/include/configs/omap4_sdp4430.h b/include/configs/omap4_sdp4430.h index fff67d8..e9f76d3 100644 --- a/include/configs/omap4_sdp4430.h +++ b/include/configs/omap4_sdp4430.h @@ -278,4 +278,6 @@ #define CONFIG_SYS_SPL_BSS_MAX_SIZE 0x80000 /* 512 KB */ #define CONFIG_SYS_THUMB_BUILD + +#define CONFIG_SYS_SKIP_ARM_RELOCATION #endif /* __CONFIG_H */ -- 1.7.0.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot