spl: record boot_device into spl_image and call spl_perform_fixups
authorPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Thu, 24 May 2018 15:15:50 +0000 (17:15 +0200)
committerPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Fri, 20 Jul 2018 23:55:26 +0000 (01:55 +0200)
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>
common/spl/spl.c
include/spl.h

index a09ada37d72be5fae7d62a3453643361d953e0ed..a1e7b9fa914ef26fdd52bd28e5662200b52c161e 100644 (file)
@@ -80,6 +80,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)
@@ -445,8 +450,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;
@@ -498,6 +505,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,
@@ -506,6 +514,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
index 8454ea7ad4308dc0ea971da6c449505ee5fad4a7..86287874e1b433734ed2c900cee621a5c07e3268 100644 (file)
@@ -29,6 +29,7 @@ struct spl_image_info {
 #if CONFIG_IS_ENABLED(LOAD_FIT)
        void *fdt_addr;
 #endif
+       u32 boot_device;
        u32 size;
        u32 flags;
        void *arg;
@@ -296,4 +297,10 @@ void spl_invoke_atf(struct spl_image_info *spl_image);
  * 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