
Andrew F. Davis's below patch will make malloc_base, limit, ptr not initualized in spl_init when we call spl_init in board_init_f. Add spl_early_init which can be called in board_init_f to fix this issue.
commit b3d2861eb20a795b99292b823c923935df26dfc6 Author: Andrew F. Davis afd@ti.com Date: Fri Jan 27 10:39:19 2017 -0600
spl: Remove overwrite of relocated malloc limit
Signed-off-by: Eddie Cai eddie.cai.linux@gmail.com --- common/spl/spl.c | 54 +++++++++++++++++++++++++++++++++------ include/asm-generic/global_data.h | 1 + include/spl.h | 12 ++++++++- 3 files changed, 58 insertions(+), 9 deletions(-)
diff --git a/common/spl/spl.c b/common/spl/spl.c index 766fb3d..26bc9ef 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -170,21 +170,19 @@ __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image) image_entry(); }
-int spl_init(void) +int spl_early_init(void) { int ret;
- debug("spl_init()\n"); -/* - * with CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN we set malloc_base and - * malloc_limit in spl_relocate_stack_gd - */ -#if defined(CONFIG_SYS_MALLOC_F_LEN) && \ - !defined(CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) + debug("spl_early_init()\n"); + +#if defined(CONFIG_SYS_MALLOC_F_LEN) #ifdef CONFIG_MALLOC_F_ADDR gd->malloc_base = CONFIG_MALLOC_F_ADDR; #endif +#ifdef CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN; +#endif gd->malloc_ptr = 0; #endif if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) { @@ -202,6 +200,46 @@ int spl_init(void) return ret; } } + gd->flags |= GD_FLG_SPL_EARLY_INIT; + + return 0; +} + +int spl_init(void) +{ + int ret; + + debug("spl_init()\n"); +/* + * with CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN we set malloc_base and + * malloc_limit in spl_relocate_stack_gd + */ + if (!(gd->flags & GD_FLG_SPL_EARLY_INIT)) { +#if defined(CONFIG_SYS_MALLOC_F_LEN) && \ + !defined(CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) +#ifdef CONFIG_MALLOC_F_ADDR + gd->malloc_base = CONFIG_MALLOC_F_ADDR; +#endif + gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN; + gd->malloc_ptr = 0; +#endif + + if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) { + ret = fdtdec_setup(); + if (ret) { + debug("fdtdec_setup() returned error %d\n", ret); + return ret; + } + } + if (IS_ENABLED(CONFIG_SPL_DM)) { + /* With CONFIG_SPL_OF_PLATDATA, bring in all devices */ + ret = dm_init_and_scan(!CONFIG_IS_ENABLED(OF_PLATDATA)); + if (ret) { + debug("dm_init_and_scan() returned error %d\n", ret); + return ret; + } + } + } gd->flags |= GD_FLG_SPL_INIT;
return 0; diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index e02863d..17ed3dc 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -127,5 +127,6 @@ typedef struct global_data { #define GD_FLG_SKIP_RELOC 0x00800 /* Don't relocate */ #define GD_FLG_RECORD 0x01000 /* Record console */ #define GD_FLG_ENV_DEFAULT 0x02000 /* Default variable flag */ +#define GD_FLG_SPL_EARLY_INIT 0x04000 /* Default variable flag */
#endif /* __ASM_GENERIC_GBL_DATA_H */ diff --git a/include/spl.h b/include/spl.h index bde4437..a89ac00 100644 --- a/include/spl.h +++ b/include/spl.h @@ -213,7 +213,7 @@ int spl_load_image_ext_os(struct spl_image_info *spl_image, struct blk_desc *block_dev, int partition);
/** - * spl_init() - Set up device tree and driver model in SPL if enabled + * spl_early_init() - Set up device tree and driver model in SPL if enabled * * Call this function in board_init_f() if you want to use device tree and * driver model early, before board_init_r() is called. This function will @@ -222,6 +222,16 @@ int spl_load_image_ext_os(struct spl_image_info *spl_image, * If this is not called, then driver model will be inactive in SPL's * board_init_f(), and no device tree will be available. */ +int spl_early_init(void); + +/** + * spl_init() - Set up device tree and driver model in SPL if enabled + * + * This function will be called from board_init_r() if not called earlier. + * + * If this is not called, then driver model will be inactive in SPL's + * board_init_f(), and no device tree will be available. + */ int spl_init(void);
#ifdef CONFIG_SPL_BOARD_INIT