[PATCH RFC] rockchip: add /chosen/bootsource to U-Boot proper DT

Quentin Schulz foss+uboot at 0leil.net
Wed Jul 30 14:03:18 CEST 2025


From: Quentin Schulz <quentin.schulz at cherry.de>

U-Boot typically can be loaded from different storage media, such as
eMMC, SD card, SPI flash, but also from non-persistent media such as USB
(via proprietary protocols loading directly into SRAM, or fastboot, DFU,
 etc..), JTAG, ...

This information is usually reported by the BootROM via some proprietary
mechanism (some specific address in registers/DRAM for example). For
Rockchip, that information is stored in a register
(BROM_BOOTSOURCE_ID_ADDR).

While we already have the information about which medium was used to
load U-Boot proper from SPL (via /chosen/u-boot,spl-boot-device), this
new property represents the medium used to load U-Boot first phase
(depending on configuration, can be VPL/TPL/SPL) which absolutely may
differ from the one used to load U-Boot proper!

It would be useful to know which medium was used to load the first phase
of U-Boot, for example to check fallback mechanisms (proper loaded from
a different medium than first phase) are actually working.

For now, this only applies to Rockchip's U-Boot proper DT but could be
applied to the kernel's as well and possibly for other architectures or
vendors.

Signed-off-by: Quentin Schulz <quentin.schulz at cherry.de>
---
I have a board (RK3399 Puma) running U-Boot which currently has 9 boot
scenarios (eMMC/SD/SPI-NOR for the first phase, eMMC/SD/SPI-NOR for the
next phases; not counting USB loading yet, which would make it a few
more). I cannot force the BootROM of this board to select a specific
device aside from erasing the other media.

The only way to identify which device was used for the first phase is to
parse U-Boot first phase console output or add some custom logic for my
board. To validate that a new version of the bootloader works, including
the fallback mechanisms, I need to make sure the BootROM loads the first
phase from the expected device otherwise I may have false positives.
This would be useful for automated testing.

Patches pending in the devicetree-spec[1] and dt-schema[2], hence the
RFC here.

[1] https://lore.kernel.org/devicetree-spec/20250505-bootsource-v2-1-5a315d9bff26@cherry.de/
[2] https://github.com/devicetree-org/dt-schema/pull/169
---
 arch/arm/mach-rockchip/spl-boot-order.c | 34 ++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c
index 3dce9b30898d49a86ec1963846ffdddea521e201..1bfd120adc46d4c847fc81112033bcf193be96d3 100644
--- a/arch/arm/mach-rockchip/spl-boot-order.c
+++ b/arch/arm/mach-rockchip/spl-boot-order.c
@@ -242,30 +242,38 @@ int spl_decode_boot_device(u32 boot_device, char *buf, size_t buflen)
 
 void spl_perform_fixups(struct spl_image_info *spl_image)
 {
+	const char *bootrom_ofpath = board_spl_was_booted_from();
 	void *blob = spl_image_fdt_addr(spl_image);
 	char boot_ofpath[512];
 	int chosen, ret;
 
-	/*
-	 * 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;
 
-	ret = spl_decode_boot_device(spl_image->boot_device, boot_ofpath, sizeof(boot_ofpath));
-	if (ret) {
-		pr_err("%s: could not map boot_device to ofpath: %d\n", __func__, ret);
-		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);
+
+	/*
+	 * Inject the ofpath of the device the full U-Boot (or Linux in
+	 * Falcon-mode) was booted from into the FDT.
+	 */
+	ret = spl_decode_boot_device(spl_image->boot_device, boot_ofpath, sizeof(boot_ofpath));
+	if (ret)
+		pr_err("%s: could not map boot_device to ofpath: %d\n", __func__, ret);
+	else
+		fdt_setprop_string(blob, chosen,
+				   "u-boot,spl-boot-device", boot_ofpath);
+
+	/*
+	 * Inject the ofpath of the device the BootROM loaded the very first
+	 * stage from into the FDT.
+	 */
+	if (!bootrom_ofpath)
+		pr_err("%s: could not map BootROM boot device to ofpath\n", __func__);
+	else
+		fdt_setprop_string(blob, chosen, "bootsource", bootrom_ofpath);
 }
 #endif

---
base-commit: a8f20bb6650df56d2600cda2c66f9349df9e49c8
change-id: 20250730-dt-chosen-bootsource-f3c8ddde2001

Best regards,
-- 
Quentin Schulz <quentin.schulz at cherry.de>



More information about the U-Boot mailing list