summaryrefslogtreecommitdiff
path: root/arch/arm/mach-rockchip/rk3399
diff options
context:
space:
mode:
authorKever Yang <kever.yang@rock-chips.com>2019-07-22 14:59:36 +0300
committerKever Yang <kever.yang@rock-chips.com>2019-07-29 05:25:27 +0300
commit4238e526fa8e0721c6c8ef0144b2b9ae57663c82 (patch)
treec14a48c394dd0dc96ff4b19e62dfad71e58006be /arch/arm/mach-rockchip/rk3399
parent4a395788c407a49a00ab027e2e9cba3df6f3dabd (diff)
downloadu-boot-4238e526fa8e0721c6c8ef0144b2b9ae57663c82.tar.xz
rockchip: rk3399: move spl_perform_fixups() into soc file
Move the spl_perform_fixups() into rk3399.c so that we can use common spl board file later. Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
Diffstat (limited to 'arch/arm/mach-rockchip/rk3399')
-rw-r--r--arch/arm/mach-rockchip/rk3399/rk3399.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c
index 0f09ea5c49..dacbcf8fdf 100644
--- a/arch/arm/mach-rockchip/rk3399/rk3399.c
+++ b/arch/arm/mach-rockchip/rk3399/rk3399.c
@@ -146,3 +146,53 @@ void board_debug_uart_init(void)
#endif
}
#endif
+
+#ifdef CONFIG_SPL_BUILD
+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);
+}
+#endif