[U-Boot] [PATCH] arm: fix bug on relocation address
Luca Ellero
lroluk at gmail.com
Thu Jan 31 15:29:02 CET 2013
If (N. SDRAM banks > 1) and they are not contiguous, don't relocate
u-boot at (CONFIG_SYS_SDRAM_BASE + gd->ram_size), which is a bug.
Instead use the end of 2nd bank (even if there are more than 2 banks)
Signed-off-by: Luca Ellero <lroluk at gmail.com>
Cc: Albert Aribaud <albert.u.boot at aribaud.net>
Cc: Heiko Schocher <hs at denx.de>
---
On ARM architectures there is a bug getting top of SDRAM (where u-boot
will be relocated). Top of SDRAM will always be:
CONFIG_SYS_SDRAM_BASE + gd->ram_size
anyway this can be wrong since SDRAM can be composed by more that one
bank in not-contiguous address space.
(CONFIG_SYS_SDRAM_BASE + gd->ram_size) can land to not existent SDRAM
addresses and can be very dangerous since it can potentially corrupt
real SDRAM (in most cases SDRAM is aliased so writing to some
not-existent address can write to real address).
Some arch use more than 2 banks but implementing all macros checks to
PHYS_SDRAM_* leads to very ugly code, so I think using 2nd bank is good
and does not generates bloated code
arch/arm/lib/board.c | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index 9f861cc..98634ab 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -333,7 +333,19 @@ void board_init_f(ulong bootflag)
gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE;
#endif
+#if defined(PHYS_SDRAM_2) && defined(PHYS_SDRAM_2_SIZE)
+ if (CONFIG_NR_DRAM_BANKS > 1 &&
+ (PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE) != PHYS_SDRAM_2)
+ addr = PHYS_SDRAM_2 + PHYS_SDRAM_2_SIZE;
+ else
+ addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size;
+#else
addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size;
+#endif
+
+
+
+
#ifdef CONFIG_LOGBUFFER
#ifndef CONFIG_ALT_LB_ADDR
--
1.7.0.4
More information about the U-Boot
mailing list