]> git.sur5r.net Git - u-boot/commitdiff
malloc_simple: Add support for switching to DRAM heap
authorHans de Goede <hdegoede@redhat.com>
Sun, 13 Sep 2015 13:04:17 +0000 (15:04 +0200)
committerHans de Goede <hdegoede@redhat.com>
Tue, 20 Oct 2015 16:40:27 +0000 (18:40 +0200)
malloc_simple uses a part of the stack as heap, initially it uses
SYS_MALLOC_F_LEN bytes which typically is quite small as the initial
stacks sits in SRAM and we do not have that much SRAM to work with.

When DRAM becomes available we may switch the stack from SRAM to DRAM
to give use more room. This commit adds support for also switching to
a new bigger malloc_simple heap located in the new stack.

Note that this requires spl_init to be called before spl_relocate_stack_gd
which in practice means that spl_init must be called from board_init_f.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
Acked-by: Simon Glass <sjg@chromium.org>
Kconfig
common/spl/spl.c

diff --git a/Kconfig b/Kconfig
index b4ad610f613037a6176196af1928671868772f50..44b144f1c2a0aa609deaec7526da2a8c224b7799 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -142,6 +142,16 @@ config SPL_STACK_R_ADDR
          Specify the address in SDRAM for the SPL stack. This will be set up
          before board_init_r() is called.
 
+config SPL_STACK_R_MALLOC_SIMPLE_LEN
+       depends on SPL_STACK_R && SPL_SYS_MALLOC_SIMPLE
+       hex "Size of malloc_simple heap after switching to DRAM SPL stack"
+       default 0x100000
+       help
+         Specify the amount of the stack to use as memory pool for
+         malloc_simple after switching the stack to DRAM. This may be set
+         to give board_init_r() a larger heap then the initial heap in
+         SRAM which is limited to SYS_MALLOC_F_LEN bytes.
+
 config TPL
        bool
        depends on SPL && SUPPORT_TPL
index b09a6268e623c3f4b23b69c80c68687ea48ec131..4b319d6739d2f735430cd5f7d539f30085811047 100644 (file)
@@ -347,6 +347,18 @@ ulong spl_relocate_stack_gd(void)
        memcpy(new_gd, (void *)gd, sizeof(gd_t));
        gd = new_gd;
 
+#ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
+       if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
+               if (!(gd->flags & GD_FLG_SPL_INIT))
+                       panic("spl_init must be called before heap reloc");
+
+               ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
+               gd->malloc_base = ptr;
+               gd->malloc_limit = CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
+               gd->malloc_ptr = 0;
+       }
+#endif
+
        return ptr;
 #else
        return 0;