rockchip: rk3399: inject 'u-boot, spl-boot-device' for next-stage
authorPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Thu, 24 May 2018 15:15:52 +0000 (17:15 +0200)
committerPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Fri, 20 Jul 2018 23:55:26 +0000 (01:55 +0200)
This implements the new 'spl_perform_fixups' hook for RK3399-based
boards and injects the /chosen/u-boot,spl-boot-device with an ofpath
corresponding to the boot device used.

The intended usage is for the full U-Boot stage to evaluate this in
scripts and then adapt its boot-order when using distro-boot.

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Tested-by: Klaus Goger <klaus.goger@theobroma-systems.com>
arch/arm/mach-rockchip/rk3399-board-spl.c

index d4e9a161a4fcdcf4415f4bd8d76ab799556d8203..9b5dc418c3933b8ae424a58fbf1f937d122fba60 100644 (file)
@@ -57,6 +57,54 @@ u32 spl_boot_device(void)
        return boot_device;
 }
 
+const char *spl_decode_boot_device(u32 boot_device)
+{
+       int i;
+       static const struct {
+               u32 boot_device;
+               const char *ofpath;
+       } spl_boot_devices_tbl[] = {
+               { BOOT_DEVICE_MMC1, "/dwmmc@fe320000" },
+               { BOOT_DEVICE_MMC2, "/sdhci@fe330000" },
+               { BOOT_DEVICE_SPI, "/spi@ff1d0000" },
+       };
+
+       for (i = 0; i < ARRAY_SIZE(spl_boot_devices_tbl); ++i)
+               if (spl_boot_devices_tbl[i].boot_device == boot_device)
+                       return spl_boot_devices_tbl[i].ofpath;
+
+       return NULL;
+}
+
+void spl_perform_fixups(struct spl_image_info *spl_image)
+{
+       void *blob = spl_image->fdt_addr;
+       const char *boot_ofpath;
+       int chosen;
+
+       /*
+        * Inject the ofpath of the device the full U-Boot (or Linux in
+        * Falcon-mode) was booted from into the FDT, if a FDT has been
+        * loaded at the same time.
+        */
+       if (!blob)
+               return;
+
+       boot_ofpath = spl_decode_boot_device(spl_image->boot_device);
+       if (!boot_ofpath) {
+               pr_err("%s: could not map boot_device to ofpath\n", __func__);
+               return;
+       }
+
+       chosen = fdt_find_or_add_subnode(blob, 0, "chosen");
+       if (chosen < 0) {
+               pr_err("%s: could not find/create '/chosen'\n", __func__);
+               return;
+       }
+       fdt_setprop_string(blob, chosen,
+                          "u-boot,spl-boot-device", boot_ofpath);
+}
+
 #define TIMER_CHN10_BASE       0xff8680a0
 #define TIMER_END_COUNT_L      0x00
 #define TIMER_END_COUNT_H      0x04