From: Quentin Schulz Date: Wed, 30 Jul 2025 12:03:18 +0000 (+0200) Subject: rockchip: add /chosen/bootsource to U-Boot proper DT X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=28a87c8e9bc889a875b7b4b84d99ceb905d9d2d8;p=thirdparty%2Fu-boot.git rockchip: add /chosen/bootsource to U-Boot proper DT 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 --- diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 3dce9b30898..1bfd120adc4 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