[U-Boot] [PATCH 1/2] board_init: Fix the logic to setup malloc_base

From: Fabio Estevam fabio.estevam@freescale.com
Prior to commit 5ba534d247d418 ("arm: Switch 32-bit ARM to using generic global_data setup") we used to have assembly code that configured the malloc_base address.
After this commit we use the board_init_f_mem() function in C to setup malloc_base address.
However the ifdef logic has a problem that prevents malloc_base to be configured in the SPL case.
This issue has been observed in a Congatec board, where we need to retrieve the manufacturing information from the SPI NOR (the SPI API calls malloc) prior to configuring the DRAM. In this case as malloc_base was not configured we always see malloc to fail.
Adjust the ifdef logic so that malloc_base is always configured when CONFIG_SYS_MALLOC_F is set.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com --- common/init/board_init.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/common/init/board_init.c b/common/init/board_init.c index e74b63b..1c6126d 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -50,8 +50,7 @@ ulong board_init_f_mem(ulong top) #endif arch_setup_gd(gd_ptr);
-#if defined(CONFIG_SYS_MALLOC_F) && \ - (!defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SYS_SPL_MALLOC_START)) +#if defined(CONFIG_SYS_MALLOC_F) top -= CONFIG_SYS_MALLOC_F_LEN; gd->malloc_base = top; #endif

From: Fabio Estevam fabio.estevam@freescale.com
Make clear that when the user selects CONFIG_SYS_SPL_MALLOC_START the full malloc will be used in SPL and also that this malloc pool can be used prior to configuring SPL.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com --- README | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/README b/README index ef8d437..4f3dd13 100644 --- a/README +++ b/README @@ -3568,6 +3568,8 @@ FIT uImage format:
CONFIG_SYS_SPL_MALLOC_START Starting address of the malloc pool used in SPL. + When this option is set the full malloc is used in SPL. + This malloc pool can be used prior to DRAM initialization.
CONFIG_SYS_SPL_MALLOC_SIZE The size of the malloc pool used in SPL.

Hi Fabio,
On 11 November 2015 at 15:15, Fabio Estevam festevam@gmail.com wrote:
From: Fabio Estevam fabio.estevam@freescale.com
Make clear that when the user selects CONFIG_SYS_SPL_MALLOC_START the full malloc will be used in SPL and also that this malloc pool can be used prior to configuring SPL.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com
README | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/README b/README index ef8d437..4f3dd13 100644 --- a/README +++ b/README @@ -3568,6 +3568,8 @@ FIT uImage format:
CONFIG_SYS_SPL_MALLOC_START Starting address of the malloc pool used in SPL.
When this option is set the full malloc is used in SPL.
This malloc pool can be used prior to DRAM initialization.
This is the 'full' malloc(). So I think you need to mention that this is set up by spl_init(), and before that, the simple malloc() can be used if CONFIG_SYS_MALLOC_F is defined.
There is great potential for confusion so I'd like the docs to be very clear.
CONFIG_SYS_SPL_MALLOC_SIZE The size of the malloc pool used in SPL.
-- 1.9.1
Regards, Simon

Hi Fabio,
On 11 November 2015 at 15:15, Fabio Estevam festevam@gmail.com wrote:
From: Fabio Estevam fabio.estevam@freescale.com
Prior to commit 5ba534d247d418 ("arm: Switch 32-bit ARM to using generic global_data setup") we used to have assembly code that configured the malloc_base address.
After this commit we use the board_init_f_mem() function in C to setup malloc_base address.
However the ifdef logic has a problem that prevents malloc_base to be configured in the SPL case.
Would you mind rewording this a bit to avoid confusion? The point here is that a deliberate choice was made to support only early malloc() or full malloc() in SPL, but not both. The point of your change is to allow both to be used, one after the other, in SPL.
This issue has been observed in a Congatec board, where we need to retrieve the manufacturing information from the SPI NOR (the SPI API calls malloc) prior to configuring the DRAM. In this case as malloc_base was not configured we always see malloc to fail.
Adjust the ifdef logic so that malloc_base is always configured when CONFIG_SYS_MALLOC_F is set.
Signed-off-by: Fabio Estevam fabio.estevam@freescale.com
common/init/board_init.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/common/init/board_init.c b/common/init/board_init.c index e74b63b..1c6126d 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -50,8 +50,7 @@ ulong board_init_f_mem(ulong top) #endif arch_setup_gd(gd_ptr);
-#if defined(CONFIG_SYS_MALLOC_F) && \
(!defined(CONFIG_SPL_BUILD) || !defined(CONFIG_SYS_SPL_MALLOC_START))
+#if defined(CONFIG_SYS_MALLOC_F) top -= CONFIG_SYS_MALLOC_F_LEN; gd->malloc_base = top;
#endif
1.9.1
Regards, Simon
participants (2)
-
Fabio Estevam
-
Simon Glass