From patchwork Thu Jan 31 14:29:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [U-Boot] arm: fix bug on relocation address Date: Thu, 31 Jan 2013 04:29:02 -0000 From: Luca Ellero X-Patchwork-Id: 217194 Message-Id: <1359642542-18998-1-git-send-email-lroluk@gmail.com> To: u-boot@lists.denx.de Cc: Heiko Schocher 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 Cc: Albert Aribaud Cc: Heiko Schocher --- 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