diff mbox series

[3/7] rockchip: px30: insert u-boot, spl-boot-device into U-Boot device tree

Message ID 20220922121228.3243467-4-foss+uboot@0leil.net
State Superseded
Delegated to: Kever Yang
Headers show
Series add support for Theobroma Systems PX30-��Q7 (Ringneck) with Haikou devkit | expand

Commit Message

Quentin Schulz Sept. 22, 2022, 12:12 p.m. UTC
From: Quentin Schulz <quentin.schulz@theobroma-systems.com>

It is possible to boot U-Boot proper from a different storage medium
than the one used by the BOOTROM to load the SPL. This information is
stored in the u-boot,spl-boot-device Device Tree property and is
accessible from U-Boot proper so that it has knowledge at runtime where
it was loaded from.

Let's add support for this feature for px30.

Cc: Quentin Schulz <foss+uboot@0leil.net>
Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
---
 arch/arm/mach-rockchip/px30/px30.c | 50 ++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

Comments

Kever Yang Sept. 24, 2022, 7:59 a.m. UTC | #1
On 2022/9/22 20:12, Quentin Schulz wrote:
> From: Quentin Schulz <quentin.schulz@theobroma-systems.com>
>
> It is possible to boot U-Boot proper from a different storage medium
> than the one used by the BOOTROM to load the SPL. This information is
> stored in the u-boot,spl-boot-device Device Tree property and is
> accessible from U-Boot proper so that it has knowledge at runtime where
> it was loaded from.
>
> Let's add support for this feature for px30.
>
> Cc: Quentin Schulz <foss+uboot@0leil.net>
> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>

Thanks,
- Kever
> ---
>   arch/arm/mach-rockchip/px30/px30.c | 50 ++++++++++++++++++++++++++++++
>   1 file changed, 50 insertions(+)
>
> diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c
> index 481b50235e..5f26128d01 100644
> --- a/arch/arm/mach-rockchip/px30/px30.c
> +++ b/arch/arm/mach-rockchip/px30/px30.c
> @@ -6,6 +6,7 @@
>   #include <clk.h>
>   #include <dm.h>
>   #include <init.h>
> +#include <spl.h>
>   #include <asm/armv8/mmu.h>
>   #include <asm/io.h>
>   #include <asm/arch-rockchip/bootrom.h>
> @@ -427,3 +428,52 @@ void board_debug_uart_init(void)
>   #endif /* CONFIG_DEBUG_UART_BASE && CONFIG_DEBUG_UART_BASE == ... */
>   }
>   #endif /* CONFIG_DEBUG_UART_BOARD_INIT */
> +
> +#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_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_MMC2, "/mmc@ff370000" },
> +		{ BOOT_DEVICE_MMC1, "/mmc@ff390000" },
> +	};
> +
> +	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
diff mbox series

Patch

diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c
index 481b50235e..5f26128d01 100644
--- a/arch/arm/mach-rockchip/px30/px30.c
+++ b/arch/arm/mach-rockchip/px30/px30.c
@@ -6,6 +6,7 @@ 
 #include <clk.h>
 #include <dm.h>
 #include <init.h>
+#include <spl.h>
 #include <asm/armv8/mmu.h>
 #include <asm/io.h>
 #include <asm/arch-rockchip/bootrom.h>
@@ -427,3 +428,52 @@  void board_debug_uart_init(void)
 #endif /* CONFIG_DEBUG_UART_BASE && CONFIG_DEBUG_UART_BASE == ... */
 }
 #endif /* CONFIG_DEBUG_UART_BOARD_INIT */
+
+#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_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_MMC2, "/mmc@ff370000" },
+		{ BOOT_DEVICE_MMC1, "/mmc@ff390000" },
+	};
+
+	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