[v3] rockchip: Reconfigure the malloc based to point to system memory

Message ID 1443871501-20964-1-git-send-email-sjoerd.simons@collabora.co.uk
State Accepted
Commit b1f492ca9e0c090209824ff36456d4f131843190
Headers show

Commit Message

Sjoerd Simons Oct. 3, 2015, 11:25 a.m.
When malloc_base initially gets setup in the SPL it is based on the
current (early) stack pointer, which for rockchip is pointing into SRAM.
This means simple memory allocations happen in SRAM space, which is
somewhat unfortunate. Specifically a bounce buffer for the mmc allocated
in SRAM space seems to cause the mmc engine to stall/fail causing
timeouts and a failure to load the main u-boot image.

To resolve this, reconfigure the malloc_base to start at the relocated
stack pointer after DRAM  has been setup.

For reference, things did work fine on rockchip before 596380db was
merged to fix memalign_simple due to a combination of rockchip SDRAM
starting at address 0 and the dw_mmc driver not checking errors from
bounce_buffer_start. As a result, when a bounce buffer needed to be
allocated mem_align simple would fail and return NULL. The mmc driver
ignored the error and happily continued with the bounce buffer address
being set to 0, which just happened to work fine..

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Simon Glass <sjg@chromium.org>

---
A better fix for this issue would be to reconfigure the
malloc_base in spl_relocate_stack_gd following the same steps as is done
for the initial setup (for which Hans de Goede already posted some
patches). However at this point in the release cycle i preferred to do a
minimal rockchip only fix (so those boards become bootable again) for
this issue to minimize the potential impact on other boards.

Changes in v3:
- Fixing coding style for the comment block

Changes in v2:
- Also gd->malloc_ptr to 0 to not waste any potential space

 arch/arm/mach-rockchip/board-spl.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Simon Glass Oct. 3, 2015, 12:40 p.m. | #1
On 3 October 2015 at 12:25, Sjoerd Simons <sjoerd.simons@collabora.co.uk> wrote:
>
> When malloc_base initially gets setup in the SPL it is based on the
> current (early) stack pointer, which for rockchip is pointing into SRAM.
> This means simple memory allocations happen in SRAM space, which is
> somewhat unfortunate. Specifically a bounce buffer for the mmc allocated
> in SRAM space seems to cause the mmc engine to stall/fail causing
> timeouts and a failure to load the main u-boot image.
>
> To resolve this, reconfigure the malloc_base to start at the relocated
> stack pointer after DRAM  has been setup.
>
> For reference, things did work fine on rockchip before 596380db was
> merged to fix memalign_simple due to a combination of rockchip SDRAM
> starting at address 0 and the dw_mmc driver not checking errors from
> bounce_buffer_start. As a result, when a bounce buffer needed to be
> allocated mem_align simple would fail and return NULL. The mmc driver
> ignored the error and happily continued with the bounce buffer address
> being set to 0, which just happened to work fine..
>
> Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
> Acked-by: Simon Glass <sjg@chromium.org>
>
> ---
> A better fix for this issue would be to reconfigure the
> malloc_base in spl_relocate_stack_gd following the same steps as is done
> for the initial setup (for which Hans de Goede already posted some
> patches). However at this point in the release cycle i preferred to do a
> minimal rockchip only fix (so those boards become bootable again) for
> this issue to minimize the potential impact on other boards.
>
> Changes in v3:
> - Fixing coding style for the comment block
>
> Changes in v2:
> - Also gd->malloc_ptr to 0 to not waste any potential space
>
>  arch/arm/mach-rockchip/board-spl.c | 7 +++++++
>  1 file changed, 7 insertions(+)

Applied to u-boot-rockchip, thanks!

Patch

diff --git a/arch/arm/mach-rockchip/board-spl.c b/arch/arm/mach-rockchip/board-spl.c
index a241d96..28c3949 100644
--- a/arch/arm/mach-rockchip/board-spl.c
+++ b/arch/arm/mach-rockchip/board-spl.c
@@ -217,6 +217,13 @@  void board_init_f(ulong dummy)
 		debug("DRAM init failed: %d\n", ret);
 		return;
 	}
+
+	/*
+	 * Now that DRAM is initialized setup base pointer for simple malloc
+	 * into RAM.
+	 */
+	gd->malloc_base = CONFIG_SPL_STACK_R_ADDR;
+	gd->malloc_ptr = 0;
 }
 
 static int setup_led(void)