spl: record boot_device into spl_image and call
spl_perform_fixups On some boards, we want to give the board/architecture-specific code a chance to look at where the next image has been loaded from and perform fixups before starting the next image. This is of particular importance, when we probe multiple devices for bootable payloads and boot the first one found. This change adds the following: - we record the boot_device used into the spl_image structure - we provide an extension-point for boards/architectures that can perform late fixups depending on a fully populated spl_image structure (i.e. we'll know the final boot_device and have info on the image type and operating system to be booted). Change-Id: Iebca59a61979bc12eabe743c73dc2279e870e2ff Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com> Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com> Signed-off-by: Jason Zhu <jason.zhu@rock-chips.com>
This commit is contained in:
parent
7a4963852a
commit
6f678d2aa9
|
|
@ -77,6 +77,11 @@ int __weak bootz_setup(ulong image, ulong *start, ulong *end)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Weak default function for arch/board-specific fixups to the spl_image_info */
|
||||
void __weak spl_perform_fixups(struct spl_image_info *spl_image)
|
||||
{
|
||||
}
|
||||
|
||||
void spl_fixup_fdt(void)
|
||||
{
|
||||
#if defined(CONFIG_SPL_OF_LIBFDT) && defined(CONFIG_SYS_SPL_ARGS_ADDR)
|
||||
|
|
@ -377,8 +382,10 @@ static int boot_from_devices(struct spl_image_info *spl_image,
|
|||
else
|
||||
puts("SPL: Unsupported Boot Device!\n");
|
||||
#endif
|
||||
if (loader && !spl_load_image(spl_image, loader))
|
||||
if (loader && !spl_load_image(spl_image, loader)) {
|
||||
spl_image->boot_device = spl_boot_list[i];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
|
|
@ -468,6 +475,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
|||
#ifdef CONFIG_SYS_SPL_ARGS_ADDR
|
||||
spl_image.arg = (void *)CONFIG_SYS_SPL_ARGS_ADDR;
|
||||
#endif
|
||||
spl_image.boot_device = BOOT_DEVICE_NONE;
|
||||
board_boot_order(spl_boot_list);
|
||||
|
||||
if (boot_from_devices(&spl_image, spl_boot_list,
|
||||
|
|
@ -476,6 +484,8 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
|
|||
hang();
|
||||
}
|
||||
|
||||
spl_perform_fixups(&spl_image);
|
||||
|
||||
#ifdef CONFIG_CPU_V7M
|
||||
spl_image.entry_point |= 0x1;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ struct spl_image_info {
|
|||
#if CONFIG_IS_ENABLED(LOAD_FIT)
|
||||
void *fdt_addr;
|
||||
#endif
|
||||
u32 boot_device;
|
||||
u32 size;
|
||||
u32 flags;
|
||||
void *arg;
|
||||
|
|
@ -309,4 +310,10 @@ void spl_optee_entry(void *arg0, void *arg1, void *arg2, void *arg3);
|
|||
*/
|
||||
void board_return_to_bootrom(void);
|
||||
|
||||
/**
|
||||
* spl_perform_fixups() - arch/board-specific callback before processing
|
||||
* the boot-payload
|
||||
*/
|
||||
void spl_perform_fixups(struct spl_image_info *spl_image);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue