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).
Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com>
diff --git a/common/spl/spl.c b/common/spl/spl.c
index a09ada3..a1e7b9f 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -80,6 +80,11 @@
}
#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)
@@ -445,8 +450,10 @@
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;
@@ -498,6 +505,7 @@
#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,
@@ -506,6 +514,8 @@
hang();
}
+ spl_perform_fixups(&spl_image);
+
#ifdef CONFIG_CPU_V7M
spl_image.entry_point |= 0x1;
#endif
diff --git a/include/spl.h b/include/spl.h
index 8454ea7..8628787 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -29,6 +29,7 @@
#if CONFIG_IS_ENABLED(LOAD_FIT)
void *fdt_addr;
#endif
+ u32 boot_device;
u32 size;
u32 flags;
void *arg;
@@ -296,4 +297,10 @@
* can implement 'board_return_to_bootrom'.
*/
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