dm: spl: Allow device tree/driver model in board_init_f()
Add an spl_init() function that does basic init such that board_init_f() can use simple malloc(), device tree and driver model. Each one is set up only if enabled for SPL. Note: We really should refactor SPL such that there is a single board_init_f() and rename the existing weak board_init_f() functions provided by boards, calling them from the single board_init_f(). Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
cb5f97f707
commit
070d00b8dc
@ -148,18 +148,12 @@ static void spl_ram_load_image(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void board_init_r(gd_t *dummy1, ulong dummy2)
|
int spl_init(void)
|
||||||
{
|
{
|
||||||
u32 boot_device;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
debug(">>spl:board_init_r()\n");
|
debug("spl_init()\n");
|
||||||
|
#if defined(CONFIG_SYS_MALLOC_F_LEN)
|
||||||
#if defined(CONFIG_SYS_SPL_MALLOC_START)
|
|
||||||
mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
|
|
||||||
CONFIG_SYS_SPL_MALLOC_SIZE);
|
|
||||||
gd->flags |= GD_FLG_FULL_MALLOC_INIT;
|
|
||||||
#elif defined(CONFIG_SYS_MALLOC_F_LEN)
|
|
||||||
gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
|
gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
|
||||||
gd->malloc_ptr = 0;
|
gd->malloc_ptr = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -168,17 +162,36 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
|||||||
ret = fdtdec_setup();
|
ret = fdtdec_setup();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
debug("fdtdec_setup() returned error %d\n", ret);
|
debug("fdtdec_setup() returned error %d\n", ret);
|
||||||
hang();
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (IS_ENABLED(CONFIG_SPL_DM)) {
|
if (IS_ENABLED(CONFIG_SPL_DM)) {
|
||||||
ret = dm_init_and_scan(true);
|
ret = dm_init_and_scan(true);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
debug("dm_init_and_scan() returned error %d\n", ret);
|
debug("dm_init_and_scan() returned error %d\n", ret);
|
||||||
hang();
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
gd->flags |= GD_FLG_SPL_INIT;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void board_init_r(gd_t *dummy1, ulong dummy2)
|
||||||
|
{
|
||||||
|
u32 boot_device;
|
||||||
|
|
||||||
|
debug(">>spl:board_init_r()\n");
|
||||||
|
|
||||||
|
#if defined(CONFIG_SYS_SPL_MALLOC_START)
|
||||||
|
mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
|
||||||
|
CONFIG_SYS_SPL_MALLOC_SIZE);
|
||||||
|
gd->flags |= GD_FLG_FULL_MALLOC_INIT;
|
||||||
|
#endif
|
||||||
|
if (!(gd->flags & GD_FLG_SPL_INIT)) {
|
||||||
|
if (spl_init())
|
||||||
|
hang();
|
||||||
|
}
|
||||||
#ifndef CONFIG_PPC
|
#ifndef CONFIG_PPC
|
||||||
/*
|
/*
|
||||||
* timer_init() does not exist on PPC systems. The timer is initialized
|
* timer_init() does not exist on PPC systems. The timer is initialized
|
||||||
|
@ -116,5 +116,6 @@ typedef struct global_data {
|
|||||||
#define GD_FLG_ENV_READY 0x00080 /* Env. imported into hash table */
|
#define GD_FLG_ENV_READY 0x00080 /* Env. imported into hash table */
|
||||||
#define GD_FLG_SERIAL_READY 0x00100 /* Pre-reloc serial console ready */
|
#define GD_FLG_SERIAL_READY 0x00100 /* Pre-reloc serial console ready */
|
||||||
#define GD_FLG_FULL_MALLOC_INIT 0x00200 /* Full malloc() is ready */
|
#define GD_FLG_FULL_MALLOC_INIT 0x00200 /* Full malloc() is ready */
|
||||||
|
#define GD_FLG_SPL_INIT 0x00400 /* spl_init() has been called */
|
||||||
|
|
||||||
#endif /* __ASM_GENERIC_GBL_DATA_H */
|
#endif /* __ASM_GENERIC_GBL_DATA_H */
|
||||||
|
@ -81,6 +81,18 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image);
|
|||||||
int spl_load_image_ext(block_dev_desc_t *block_dev, int partition, const char *filename);
|
int spl_load_image_ext(block_dev_desc_t *block_dev, int partition, const char *filename);
|
||||||
int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition);
|
int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spl_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
|
||||||
|
* 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
|
#ifdef CONFIG_SPL_BOARD_INIT
|
||||||
void spl_board_init(void);
|
void spl_board_init(void);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user