[U-Boot] [PATCH v2 5/6] spl: support using full malloc with SYS_MALLOC_F_LEN
Simon Goldschmidt
simon.k.r.goldschmidt at gmail.com
Fri Mar 22 19:57:43 UTC 2019
Some platforms (like socfpga A10) need a big hep before SDRAM is available
(e.g. because FAT is used). For such platforms, simple_malloc is often not
a good option as it does not support freeing memory. These platforms often
use the non-Kconfig defines CONFIG_SYS_SPL_MALLOC_START (and its SIZE).
This patch allows enabling CONFIG_SPL_SYS_MALLOC_F_LEN while leaving
CONFIG_SPL_SYS_MALLOC_SIMPLE disabled. In this case, the full malloc heap
is made available as early as the simple_malloc heap would be normally.
This way, platforms can drop the non-Kconfig options to set up the full
heap and rely on the same automatically calculated heap allocation used
for simple heap.
Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
---
Changes in v2:
- use if() instead of #if
- adapt documentation to using CONFIG_SPL_SYS_MALLOC_F_LEN for
full-featured heap as well
- ensure SPL_CLEAR_BSS_F is set when using SYS_MALLOC_F_LEN for full
featured heap (or else, the heap status stored in bss will be overwritten
between board_init_f and board_init_r)
Kconfig | 24 ++++++++++++++++--------
README | 15 +++++++++++----
common/spl/spl.c | 10 ++++++++--
drivers/core/Kconfig | 33 ++++++++++++++++-----------------
4 files changed, 51 insertions(+), 31 deletions(-)
diff --git a/Kconfig b/Kconfig
index 305b265ed7..e4165692d1 100644
--- a/Kconfig
+++ b/Kconfig
@@ -155,22 +155,30 @@ config SYS_MALLOC_LEN
config SPL_SYS_MALLOC_F_LEN
hex "Size of malloc() pool in SPL before relocation"
depends on SYS_MALLOC_F
+ depends on SPL_SYS_MALLOC_SIMPLE || SPL_CLEAR_BSS_F
default SYS_MALLOC_F_LEN
help
- Before relocation, memory is very limited on many platforms. Still,
- we can provide a small malloc() pool if needed. Driver model in
- particular needs this to operate, so that it can allocate the
- initial serial device and any others that are needed.
+ Before relocation (before calling board_init_r, that is), memory is
+ very limited on many platforms. Still, we can provide a small
+ malloc() pool if needed. Driver model in particular needs this to
+ operate, so that it can allocate the initial serial device and any
+ others that are needed.
+ This option controls the size of this initial malloc() pool by
+ default.
config TPL_SYS_MALLOC_F_LEN
hex "Size of malloc() pool in TPL before relocation"
depends on SYS_MALLOC_F
+ depends on TPL_SYS_MALLOC_SIMPLE || SPL_CLEAR_BSS_F
default SYS_MALLOC_F_LEN
help
- Before relocation, memory is very limited on many platforms. Still,
- we can provide a small malloc() pool if needed. Driver model in
- particular needs this to operate, so that it can allocate the
- initial serial device and any others that are needed.
+ Before relocation (before calling board_init_r, that is), memory is
+ very limited on many platforms. Still, we can provide a small
+ malloc() pool if needed. Driver model in particular needs this to
+ operate, so that it can allocate the initial serial device and any
+ others that are needed.
+ This option controls the size of this initial malloc() pool by
+ default.
menuconfig EXPERT
bool "Configure standard U-Boot features (expert users)"
diff --git a/README b/README
index 6525b81e3f..abe2e22a3c 100644
--- a/README
+++ b/README
@@ -2477,13 +2477,19 @@ FIT uImage format:
CONFIG_SPL_STACK.
CONFIG_SYS_SPL_MALLOC_START
- Starting address of the malloc pool used in SPL.
+ This is one way of providing the starting address of the malloc
+ pool used in SPL. If CONFIG_SPL_SYS_MALLOC_SIMPLE isn't set,
+ the full-featured heap will be used and it will allocate its
+ memory from the initial stack if CONFIG_SPL_SYS_MALLOC_F_LEN is
+ != 0. If you need it to use a dedicated area, use this option
+ to set an absolute address for the initial heap.
When this option is set the full malloc is used in SPL and
it is set up by spl_init() and before that, the simple malloc()
- can be used if CONFIG_SYS_MALLOC_F is defined.
+ can still be used if CONFIG_SPL_SYS_MALLOC_F_LEN is defined.
CONFIG_SYS_SPL_MALLOC_SIZE
- The size of the malloc pool used in SPL.
+ The size of the malloc pool used in SPL if
+ CONFIG_SYS_SPL_MALLOC_START is set.
CONFIG_SPL_OS_BOOT
Enable booting directly to an OS from SPL.
@@ -2758,7 +2764,8 @@ Configuration Settings:
- CONFIG_SYS_MALLOC_SIMPLE
Provides a simple and small malloc() and calloc() for those
boards which do not use the full malloc in SPL (which is
- enabled with CONFIG_SYS_SPL_MALLOC_START).
+ enabled by default with CONFIG_SYS_SPL_MALLOC_START or
+ CONFIG_SPL_SYS_MALLOC_F_LEN).
- CONFIG_SYS_NONCACHED_MEMORY:
Size of non-cached memory area. This area of memory will be
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 88d4b8a9bf..dec06c6e07 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -383,8 +383,14 @@ static int spl_common_init(bool setup_malloc)
#ifdef CONFIG_MALLOC_F_ADDR
gd->malloc_base = CONFIG_MALLOC_F_ADDR;
#endif
- gd->malloc_limit = CONFIG_VAL(SYS_MALLOC_F_LEN);
- gd->malloc_ptr = 0;
+ if (CONFIG_IS_ENABLED(SYS_MALLOC_SIMPLE)) {
+ gd->malloc_limit = CONFIG_VAL(SYS_MALLOC_F_LEN);
+ gd->malloc_ptr = 0;
+ } else {
+ mem_malloc_init(gd->malloc_base,
+ CONFIG_VAL(SYS_MALLOC_F_LEN));
+ gd->flags |= GD_FLG_FULL_MALLOC_INIT;
+ }
}
#endif
ret = bootstage_init(true);
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index ddf2fb3fb8..297c19383f 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -12,28 +12,27 @@ config SPL_DM
bool "Enable Driver Model for SPL"
depends on DM && SPL
help
- Enable driver model in SPL. You will need to provide a
- suitable malloc() implementation. If you are not using the
- full malloc() enabled by CONFIG_SYS_SPL_MALLOC_START,
- consider using CONFIG_SYS_MALLOC_SIMPLE. In that case you
- must provide CONFIG_SPL_SYS_MALLOC_F_LEN to set the size.
- In most cases driver model will only allocate a few uclasses
- and devices in SPL, so 1KB should be enable. See
- CONFIG_SPL_SYS_MALLOC_F_LEN for more details on how to enable it.
+ Enable driver model in SPL. You will need to provide a suitable
+ malloc() implementation. In most cases driver model will only
+ allocate a few uclasses and devices in SPL wihout freeing them, so
+ 1KB should be enough.
+ If full malloc() (default if CONFIG_SYS_SPL_MALLOC_START or
+ CONFIG_SPL_SYS_MALLOC_F_LEN are set) is too big for your board,
+ consider using CONFIG_SPL_SYS_MALLOC_SIMPLE (see help of that option
+ or CONFIG_SPL_SYS_MALLOC_F_LEN for more info).
config TPL_DM
bool "Enable Driver Model for TPL"
depends on DM && TPL
help
- Enable driver model in TPL. You will need to provide a
- suitable malloc() implementation. If you are not using the
- full malloc() enabled by CONFIG_SYS_SPL_MALLOC_START,
- consider using CONFIG_SYS_MALLOC_SIMPLE. In that case you
- must provide CONFIG_SPL_SYS_MALLOC_F_LEN to set the size.
- In most cases driver model will only allocate a few uclasses
- and devices in SPL, so 1KB should be enough. See
- CONFIG_SPL_SYS_MALLOC_F_LEN for more details on how to enable it.
- Disable this for very small implementations.
+ Enable driver model in TPL. You will need to provide a suitable
+ malloc() implementation. In most cases driver model will only
+ allocate a few uclasses and devices in TPL wihout freeing them, so
+ 1KB should be enough.
+ If full malloc() (default if CONFIG_SYS_SPL_MALLOC_START or
+ CONFIG_TPL_SYS_MALLOC_F_LEN are set) is too big for your board,
+ consider using CONFIG_TPL_SYS_MALLOC_SIMPLE (see help of that option
+ or CONFIG_TPL_SYS_MALLOC_F_LEN for more info).
config DM_WARN
bool "Enable warnings in driver model"
--
2.17.1
More information about the U-Boot
mailing list