[PATCH v3 0/6] rockchip: add vendor-wide support for detecting U-Boot proper boot medium

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.
This is already supported on rk3399 and px30 but with duplicated code, so this patch series also factor out all of this into spl-boot-order of Rockchip platforms. Finally, let's invert the logic used to define the BOOT_DEVICE_ value in a different function so that /chosen/u-boot,spl-boot-device can be transparently added without any further work for existing and future SoCs.
While at it, let's do some cleanups for Rockchip platforms.
Tested on RK3399 Puma, PX30 Ringneck and (upcoming) RK3588 Jaguar.
Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- Changes in v3: - revamp spl_decode_boot_device to not necessitate hardcoded arrays, instead, the info is gotten from the inverted logic from spl_node_to_boot_device where the BOOT_DEVICE_* is set - add Rbs - Link to v2: https://lore.kernel.org/r/20231108-rk3588-spl-boot-dev-v2-0-e67e26202c85@the...
Changes in v2: - add factoring into spl-boot-order - rework rk3588 support to use the factored out function - add global data ptr cleanup - remove rk3128 main SoC file (useless content) - Link to v1: https://lore.kernel.org/r/20230502-rk3588-spl-boot-dev-v1-1-071722a85d2d@the...
--- Quentin Schulz (6): rockchip: rk3399: simplify logic for getting SPL boot medium DT node rockchip: px30: simplify logic for getting SPL boot medium DT node rockchip: factor out spl_perform_fixups into common spl-boot-order rockchip: find U-boot proper boot device by inverting the logic that sets it rockchip: remove unused global data ptr rockchip: rk3128: remove noop file
arch/arm/mach-rockchip/board.c | 3 - arch/arm/mach-rockchip/px30/px30.c | 49 --------------- arch/arm/mach-rockchip/rk3128/Makefile | 1 - arch/arm/mach-rockchip/rk3128/rk3128.c | 16 ----- arch/arm/mach-rockchip/rk3308/rk3308.c | 3 - arch/arm/mach-rockchip/rk3328/rk3328.c | 3 - arch/arm/mach-rockchip/rk3368/rk3368.c | 3 - arch/arm/mach-rockchip/rk3399/rk3399.c | 51 ---------------- arch/arm/mach-rockchip/rk3588/rk3588.c | 2 - arch/arm/mach-rockchip/spl-boot-order.c | 104 ++++++++++++++++++++++++++++++++ 10 files changed, 104 insertions(+), 131 deletions(-) --- base-commit: 106332d6cc583c4339e07020989d09b567900a59 change-id: 20230502-rk3588-spl-boot-dev-efa2777cc21b
Best regards,

From: Quentin Schulz quentin.schulz@theobroma-systems.com
In preparation of moving spl_perform_fixups to spl-boot-order.c, let's simplify the logic around mapping the BOOT_DEVICE_x enum index to a DT node by using an instantiated array of chars instead of creating a new data structure on the fly.
This will make it easier to only define the spl_boot_devices array in the appropriate SoC file in an upcoming commit.
Cc: Quentin Schulz foss+uboot@0leil.net Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- arch/arm/mach-rockchip/rk3399/rk3399.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 14565d2ed9f..60d95c81cd2 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -175,23 +175,27 @@ void board_debug_uart_init(void) #endif
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) +const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { + [BOOT_DEVICE_MMC2] = "/mmc@fe320000", + [BOOT_DEVICE_MMC1] = "/mmc@fe330000", + [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0", +}; + 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@fe320000" }, - { BOOT_DEVICE_MMC1, "/mmc@fe330000" }, - { BOOT_DEVICE_SPI, "/spi@ff1d0000/flash@0" }, - }; - - 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; + const char *spl_bootdevice_ofpath = NULL; + + if (boot_device < ARRAY_SIZE(spl_boot_devices)) + spl_bootdevice_ofpath = spl_boot_devices[boot_device]; + + if (spl_bootdevice_ofpath) + debug("%s: spl_bootdevice_id %x maps to '%s'\n", + __func__, boot_device, spl_bootdevice_ofpath); + else + debug("%s: failed to resolve spl_bootdevice_id %x\n", + __func__, boot_device); + + return spl_bootdevice_ofpath; }
void spl_perform_fixups(struct spl_image_info *spl_image)

On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
In preparation of moving spl_perform_fixups to spl-boot-order.c, let's simplify the logic around mapping the BOOT_DEVICE_x enum index to a DT node by using an instantiated array of chars instead of creating a new data structure on the fly.
This will make it easier to only define the spl_boot_devices array in the appropriate SoC file in an upcoming commit.
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/rk3399/rk3399.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 14565d2ed9f..60d95c81cd2 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -175,23 +175,27 @@ void board_debug_uart_init(void) #endif
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) +const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {
- [BOOT_DEVICE_MMC2] = "/mmc@fe320000",
- [BOOT_DEVICE_MMC1] = "/mmc@fe330000",
- [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0",
+};
- 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@fe320000" },
{ BOOT_DEVICE_MMC1, "/mmc@fe330000" },
{ BOOT_DEVICE_SPI, "/spi@ff1d0000/flash@0" },
- };
- 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;
const char *spl_bootdevice_ofpath = NULL;
if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
return spl_bootdevice_ofpath; }
void spl_perform_fixups(struct spl_image_info *spl_image)

From: Quentin Schulz quentin.schulz@theobroma-systems.com
In preparation of moving spl_perform_fixups to spl-boot-order.c, let's simplify the logic around mapping the BOOT_DEVICE_x enum index to a DT node by using an instantiated array of chars instead of creating a new data structure on the fly.
This will make it easier to only define the spl_boot_devices array in the appropriate SoC file in an upcoming commit.
Cc: Quentin Schulz foss+uboot@0leil.net Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- arch/arm/mach-rockchip/px30/px30.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 3bca25c609f..8937677d79e 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -445,22 +445,26 @@ void board_debug_uart_init(void) #endif /* CONFIG_DEBUG_UART_BOARD_INIT */
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) +const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { + [BOOT_DEVICE_MMC2] = "/mmc@ff370000", + [BOOT_DEVICE_MMC1] = "/mmc@ff390000", +}; + 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" }, - }; + const char *spl_bootdevice_ofpath = NULL; + + if (boot_device < ARRAY_SIZE(spl_boot_devices)) + spl_bootdevice_ofpath = spl_boot_devices[boot_device];
- 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; + if (spl_bootdevice_ofpath) + debug("%s: spl_bootdevice_id %x maps to '%s'\n", + __func__, boot_device, spl_bootdevice_ofpath); + else + debug("%s: failed to resolve spl_bootdevice_id %x\n", + __func__, boot_device);
- return NULL; + return spl_bootdevice_ofpath; }
void spl_perform_fixups(struct spl_image_info *spl_image)

On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
In preparation of moving spl_perform_fixups to spl-boot-order.c, let's simplify the logic around mapping the BOOT_DEVICE_x enum index to a DT node by using an instantiated array of chars instead of creating a new data structure on the fly.
This will make it easier to only define the spl_boot_devices array in the appropriate SoC file in an upcoming commit.
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 | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 3bca25c609f..8937677d79e 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -445,22 +445,26 @@ void board_debug_uart_init(void) #endif /* CONFIG_DEBUG_UART_BOARD_INIT */
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) +const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {
- [BOOT_DEVICE_MMC2] = "/mmc@ff370000",
- [BOOT_DEVICE_MMC1] = "/mmc@ff390000",
+};
- 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" },
- };
- const char *spl_bootdevice_ofpath = NULL;
- if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
- 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;
- if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
- else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
- return NULL;
return spl_bootdevice_ofpath; }
void spl_perform_fixups(struct spl_image_info *spl_image)

From: Quentin Schulz quentin.schulz@theobroma-systems.com
All SoCs are susceptible to wanting to know which storage medium was used to load U-Boot SPL. So instead of reimplementing the same functions in SoCs over and over again (here just rk3399 and px30 but rk3588 is coming), let's just put all this in common into spl-boot-order.c allowing to support a new SoC just by defining the spl_boot_devices array in the appropriate SoC file.
Cc: Quentin Schulz foss+uboot@0leil.net Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- arch/arm/mach-rockchip/px30/px30.c | 46 ------------------------------- arch/arm/mach-rockchip/rk3399/rk3399.c | 46 ------------------------------- arch/arm/mach-rockchip/spl-boot-order.c | 49 +++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 92 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 8937677d79e..7676adcb044 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -449,50 +449,4 @@ const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { [BOOT_DEVICE_MMC2] = "/mmc@ff370000", [BOOT_DEVICE_MMC1] = "/mmc@ff390000", }; - -const char *spl_decode_boot_device(u32 boot_device) -{ - const char *spl_bootdevice_ofpath = NULL; - - if (boot_device < ARRAY_SIZE(spl_boot_devices)) - spl_bootdevice_ofpath = spl_boot_devices[boot_device]; - - if (spl_bootdevice_ofpath) - debug("%s: spl_bootdevice_id %x maps to '%s'\n", - __func__, boot_device, spl_bootdevice_ofpath); - else - debug("%s: failed to resolve spl_bootdevice_id %x\n", - __func__, boot_device); - - return spl_bootdevice_ofpath; -} - -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 --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 60d95c81cd2..6929de5603c 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -181,52 +181,6 @@ const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0", };
-const char *spl_decode_boot_device(u32 boot_device) -{ - const char *spl_bootdevice_ofpath = NULL; - - if (boot_device < ARRAY_SIZE(spl_boot_devices)) - spl_bootdevice_ofpath = spl_boot_devices[boot_device]; - - if (spl_bootdevice_ofpath) - debug("%s: spl_bootdevice_id %x maps to '%s'\n", - __func__, boot_device, spl_bootdevice_ofpath); - else - debug("%s: failed to resolve spl_bootdevice_id %x\n", - __func__, boot_device); - - return spl_bootdevice_ofpath; -} - -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); -} - static void rk3399_force_power_on_reset(void) { ofnode node; diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 93b8e7de4d0..55d0976fb0a 100644 --- a/arch/arm/mach-rockchip/spl-boot-order.c +++ b/arch/arm/mach-rockchip/spl-boot-order.c @@ -5,6 +5,7 @@
#include <common.h> #include <dm.h> +#include <fdt_support.h> #include <log.h> #include <mmc.h> #include <spl.h> @@ -161,4 +162,52 @@ void board_boot_order(u32 *spl_boot_list) if (idx == 0) spl_boot_list[0] = spl_boot_device(); } + +__weak const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {}; + +const char *spl_decode_boot_device(u32 boot_device) +{ + const char *spl_bootdevice_ofpath = NULL; + + if (boot_device < ARRAY_SIZE(spl_boot_devices)) + spl_bootdevice_ofpath = spl_boot_devices[boot_device]; + + if (spl_bootdevice_ofpath) + debug("%s: spl_bootdevice_id %x maps to '%s'\n", + __func__, boot_device, spl_bootdevice_ofpath); + else + debug("%s: failed to resolve spl_bootdevice_id %x\n", + __func__, boot_device); + + return spl_bootdevice_ofpath; +} + +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

On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
All SoCs are susceptible to wanting to know which storage medium was used to load U-Boot SPL. So instead of reimplementing the same functions in SoCs over and over again (here just rk3399 and px30 but rk3588 is coming), let's just put all this in common into spl-boot-order.c allowing to support a new SoC just by defining the spl_boot_devices array in the appropriate SoC file.
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 | 46 ------------------------------- arch/arm/mach-rockchip/rk3399/rk3399.c | 46 ------------------------------- arch/arm/mach-rockchip/spl-boot-order.c | 49 +++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 92 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 8937677d79e..7676adcb044 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -449,50 +449,4 @@ const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { [BOOT_DEVICE_MMC2] = "/mmc@ff370000", [BOOT_DEVICE_MMC1] = "/mmc@ff390000", };
-const char *spl_decode_boot_device(u32 boot_device) -{
- const char *spl_bootdevice_ofpath = NULL;
- if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
- if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
- else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
- return spl_bootdevice_ofpath;
-}
-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 --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 60d95c81cd2..6929de5603c 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -181,52 +181,6 @@ const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0", };
-const char *spl_decode_boot_device(u32 boot_device) -{
- const char *spl_bootdevice_ofpath = NULL;
- if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
- if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
- else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
- return spl_bootdevice_ofpath;
-}
-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);
-}
- static void rk3399_force_power_on_reset(void) { ofnode node;
diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 93b8e7de4d0..55d0976fb0a 100644 --- a/arch/arm/mach-rockchip/spl-boot-order.c +++ b/arch/arm/mach-rockchip/spl-boot-order.c @@ -5,6 +5,7 @@
#include <common.h> #include <dm.h> +#include <fdt_support.h> #include <log.h> #include <mmc.h> #include <spl.h> @@ -161,4 +162,52 @@ void board_boot_order(u32 *spl_boot_list) if (idx == 0) spl_boot_list[0] = spl_boot_device(); }
+__weak const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {};
+const char *spl_decode_boot_device(u32 boot_device) +{
- const char *spl_bootdevice_ofpath = NULL;
- if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
- if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
- else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
- return spl_bootdevice_ofpath;
+}
+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

From: Quentin Schulz quentin.schulz@theobroma-systems.com
BOOT_DEVICE_* is set by spl_node_to_boot_device() depending on the block device number associated with the MMC device the SPL used to load U-Boot proper from. It is NOT related to the mmc alias in the Device Tree.
For SPI flashes, all SPI flashes will return BOOT_DEVICE_SPI so there's currently no way to know from which one the SPL loaded U-Boot proper from. Therefore, let's just find the first valid candidate in /chosen/u-boot,spl-boot-order that is a SPI flash and return that path. This is a best effort.
While the original implementation may have worked, using the exact same mechanism but in inverted fashion makes it less likely to have surprising corner-cases or side-effects.
A nice side-effect is that all existing and future Rockchip SoCs now automatically have their /chosen/u-boot,spl-boot-device set.
Cc: Quentin Schulz foss+uboot@0leil.net Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- arch/arm/mach-rockchip/px30/px30.c | 7 --- arch/arm/mach-rockchip/rk3399/rk3399.c | 6 --- arch/arm/mach-rockchip/spl-boot-order.c | 91 ++++++++++++++++++++++++++------- 3 files changed, 73 insertions(+), 31 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 7676adcb044..fc7456e680c 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -443,10 +443,3 @@ 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 * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { - [BOOT_DEVICE_MMC2] = "/mmc@ff370000", - [BOOT_DEVICE_MMC1] = "/mmc@ff390000", -}; -#endif diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 6929de5603c..801a4a6662e 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -175,12 +175,6 @@ void board_debug_uart_init(void) #endif
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) -const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = { - [BOOT_DEVICE_MMC2] = "/mmc@fe320000", - [BOOT_DEVICE_MMC1] = "/mmc@fe330000", - [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0", -}; - static void rk3399_force_power_on_reset(void) { ofnode node; diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 55d0976fb0a..f2cb17224e8 100644 --- a/arch/arm/mach-rockchip/spl-boot-order.c +++ b/arch/arm/mach-rockchip/spl-boot-order.c @@ -10,6 +10,7 @@ #include <mmc.h> #include <spl.h> #include <asm/global_data.h> +#include <dm/uclass-internal.h>
#if CONFIG_IS_ENABLED(OF_LIBFDT) /** @@ -163,30 +164,84 @@ void board_boot_order(u32 *spl_boot_list) spl_boot_list[0] = spl_boot_device(); }
-__weak const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {}; - -const char *spl_decode_boot_device(u32 boot_device) +int spl_decode_boot_device(u32 boot_device, char *buf, size_t buflen) { - const char *spl_bootdevice_ofpath = NULL; + struct udevice *dev; + int dev_num, ret; + + if (boot_device == BOOT_DEVICE_SPI) { + /* Revert spl_node_to_boot_device() logic to find appropriate SPI flash device */ + + /* + * Devices with multiple SPI flash devices will take the first SPI flash found in + * /chosen/u-boot,spl-boot-order. + */ + const void *blob = gd->fdt_blob; + int chosen_node = fdt_path_offset(blob, "/chosen"); + int elem; + int node; + const char *conf; + + if (chosen_node < 0) { + debug("%s: /chosen not found\n", __func__); + return -ENODEV; + } + + for (elem = 0; + (conf = fdt_stringlist_get(blob, chosen_node, + "u-boot,spl-boot-order", elem, NULL)); + elem++) { + const char *alias; + + /* Handle the case of 'same device the SPL was loaded from' */ + if (strncmp(conf, "same-as-spl", 11) == 0) { + conf = board_spl_was_booted_from(); + if (!conf) + continue; + } + + /* First check if the list element is an alias */ + alias = fdt_get_alias(blob, conf); + if (alias) + conf = alias; + + /* Try to resolve the config item (or alias) as a path */ + node = fdt_path_offset(blob, conf); + if (node < 0) { + debug("%s: could not find %s in FDT\n", __func__, conf); + continue; + } + + ret = uclass_find_device_by_of_offset(UCLASS_SPI_FLASH, node, &dev); + if (ret) { + debug("%s: could not find udevice for %s\n", __func__, conf); + continue; + }
- if (boot_device < ARRAY_SIZE(spl_boot_devices)) - spl_bootdevice_ofpath = spl_boot_devices[boot_device]; + return ofnode_get_path(dev_ofnode(dev), buf, buflen); + } + + return -ENODEV; + }
- if (spl_bootdevice_ofpath) - debug("%s: spl_bootdevice_id %x maps to '%s'\n", - __func__, boot_device, spl_bootdevice_ofpath); - else - debug("%s: failed to resolve spl_bootdevice_id %x\n", - __func__, boot_device); + dev_num = (boot_device == BOOT_DEVICE_MMC1) ? 0 : 1; + + ret = blk_find_device(UCLASS_MMC, dev_num, &dev); + if (ret) { + debug("%s: could not find blk device for MMC device %d: %d\n", + __func__, dev_num, ret); + return ret; + }
- return spl_bootdevice_ofpath; + dev = dev_get_parent(dev); + return ofnode_get_path(dev_ofnode(dev), buf, buflen); }
void spl_perform_fixups(struct spl_image_info *spl_image) { void *blob = spl_image->fdt_addr; - const char *boot_ofpath; - int chosen; + char boot_ofpath[512]; + int chosen, ret;
/* * Inject the ofpath of the device the full U-Boot (or Linux in @@ -196,9 +251,9 @@ void spl_perform_fixups(struct spl_image_info *spl_image) 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__); + 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; }

On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
BOOT_DEVICE_* is set by spl_node_to_boot_device() depending on the block device number associated with the MMC device the SPL used to load U-Boot proper from. It is NOT related to the mmc alias in the Device Tree.
For SPI flashes, all SPI flashes will return BOOT_DEVICE_SPI so there's currently no way to know from which one the SPL loaded U-Boot proper from. Therefore, let's just find the first valid candidate in /chosen/u-boot,spl-boot-order that is a SPI flash and return that path. This is a best effort.
While the original implementation may have worked, using the exact same mechanism but in inverted fashion makes it less likely to have surprising corner-cases or side-effects.
A nice side-effect is that all existing and future Rockchip SoCs now automatically have their /chosen/u-boot,spl-boot-device set.
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 | 7 --- arch/arm/mach-rockchip/rk3399/rk3399.c | 6 --- arch/arm/mach-rockchip/spl-boot-order.c | 91 ++++++++++++++++++++++++++------- 3 files changed, 73 insertions(+), 31 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 7676adcb044..fc7456e680c 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -443,10 +443,3 @@ 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 * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {
- [BOOT_DEVICE_MMC2] = "/mmc@ff370000",
- [BOOT_DEVICE_MMC1] = "/mmc@ff390000",
-}; -#endif diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 6929de5603c..801a4a6662e 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -175,12 +175,6 @@ void board_debug_uart_init(void) #endif
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) -const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {
- [BOOT_DEVICE_MMC2] = "/mmc@fe320000",
- [BOOT_DEVICE_MMC1] = "/mmc@fe330000",
- [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0",
-};
- static void rk3399_force_power_on_reset(void) { ofnode node;
diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 55d0976fb0a..f2cb17224e8 100644 --- a/arch/arm/mach-rockchip/spl-boot-order.c +++ b/arch/arm/mach-rockchip/spl-boot-order.c @@ -10,6 +10,7 @@ #include <mmc.h> #include <spl.h> #include <asm/global_data.h> +#include <dm/uclass-internal.h>
#if CONFIG_IS_ENABLED(OF_LIBFDT) /** @@ -163,30 +164,84 @@ void board_boot_order(u32 *spl_boot_list) spl_boot_list[0] = spl_boot_device(); }
-__weak const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {};
-const char *spl_decode_boot_device(u32 boot_device) +int spl_decode_boot_device(u32 boot_device, char *buf, size_t buflen) {
- const char *spl_bootdevice_ofpath = NULL;
- struct udevice *dev;
- int dev_num, ret;
- if (boot_device == BOOT_DEVICE_SPI) {
/* Revert spl_node_to_boot_device() logic to find appropriate SPI flash device */
/*
* Devices with multiple SPI flash devices will take the first SPI flash found in
* /chosen/u-boot,spl-boot-order.
*/
const void *blob = gd->fdt_blob;
int chosen_node = fdt_path_offset(blob, "/chosen");
int elem;
int node;
const char *conf;
if (chosen_node < 0) {
debug("%s: /chosen not found\n", __func__);
return -ENODEV;
}
for (elem = 0;
(conf = fdt_stringlist_get(blob, chosen_node,
"u-boot,spl-boot-order", elem, NULL));
elem++) {
const char *alias;
/* Handle the case of 'same device the SPL was loaded from' */
if (strncmp(conf, "same-as-spl", 11) == 0) {
conf = board_spl_was_booted_from();
if (!conf)
continue;
}
/* First check if the list element is an alias */
alias = fdt_get_alias(blob, conf);
if (alias)
conf = alias;
/* Try to resolve the config item (or alias) as a path */
node = fdt_path_offset(blob, conf);
if (node < 0) {
debug("%s: could not find %s in FDT\n", __func__, conf);
continue;
}
ret = uclass_find_device_by_of_offset(UCLASS_SPI_FLASH, node, &dev);
if (ret) {
debug("%s: could not find udevice for %s\n", __func__, conf);
continue;
}
- if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
return ofnode_get_path(dev_ofnode(dev), buf, buflen);
}
return -ENODEV;
- }
- if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
- else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
- dev_num = (boot_device == BOOT_DEVICE_MMC1) ? 0 : 1;
- ret = blk_find_device(UCLASS_MMC, dev_num, &dev);
- if (ret) {
debug("%s: could not find blk device for MMC device %d: %d\n",
__func__, dev_num, ret);
return ret;
- }
- return spl_bootdevice_ofpath;
dev = dev_get_parent(dev);
return ofnode_get_path(dev_ofnode(dev), buf, buflen); }
void spl_perform_fixups(struct spl_image_info *spl_image) { void *blob = spl_image->fdt_addr;
- const char *boot_ofpath;
- int chosen;
char boot_ofpath[512];
int chosen, ret;
/*
- Inject the ofpath of the device the full U-Boot (or Linux in
@@ -196,9 +251,9 @@ void spl_perform_fixups(struct spl_image_info *spl_image) 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__);
- ret = spl_decode_boot_device(spl_image->boot_device, boot_ofpath, sizeof(boot_ofpath));
- if (ret) {
return; }pr_err("%s: could not map boot_device to ofpath: %d\n", __func__, ret);

Hi Quentin,
On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
BOOT_DEVICE_* is set by spl_node_to_boot_device() depending on the block device number associated with the MMC device the SPL used to load U-Boot proper from. It is NOT related to the mmc alias in the Device Tree.
For SPI flashes, all SPI flashes will return BOOT_DEVICE_SPI so there's currently no way to know from which one the SPL loaded U-Boot proper from. Therefore, let's just find the first valid candidate in /chosen/u-boot,spl-boot-order that is a SPI flash and return that path. This is a best effort.
While the original implementation may have worked, using the exact same mechanism but in inverted fashion makes it less likely to have surprising corner-cases or side-effects.
A nice side-effect is that all existing and future Rockchip SoCs now automatically have their /chosen/u-boot,spl-boot-device set.
Error happen in some 32bit SoC:
+arch/arm/mach-rockchip/spl-boot-order.c: In function 'spl_perform_fixups': +arch/arm/mach-rockchip/spl-boot-order.c:242:31: error: 'struct spl_image_info' has no member named 'fdt_addr' + 242 | void *blob = spl_image->fdt_addr; + | ^~ +make[3]: *** [scripts/Makefile.build:257: spl/arch/arm/mach-rockchip/spl-boot-order.o] Error 1
Please add an option for this feature so that different SoC can have their choice.
Thanks, - Kever
Cc: Quentin Schulz foss+uboot@0leil.net Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com
arch/arm/mach-rockchip/px30/px30.c | 7 --- arch/arm/mach-rockchip/rk3399/rk3399.c | 6 --- arch/arm/mach-rockchip/spl-boot-order.c | 91 ++++++++++++++++++++++++++------- 3 files changed, 73 insertions(+), 31 deletions(-)
diff --git a/arch/arm/mach-rockchip/px30/px30.c b/arch/arm/mach-rockchip/px30/px30.c index 7676adcb044..fc7456e680c 100644 --- a/arch/arm/mach-rockchip/px30/px30.c +++ b/arch/arm/mach-rockchip/px30/px30.c @@ -443,10 +443,3 @@ 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 * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {
- [BOOT_DEVICE_MMC2] = "/mmc@ff370000",
- [BOOT_DEVICE_MMC1] = "/mmc@ff390000",
-}; -#endif diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 6929de5603c..801a4a6662e 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -175,12 +175,6 @@ void board_debug_uart_init(void) #endif
#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) -const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {
- [BOOT_DEVICE_MMC2] = "/mmc@fe320000",
- [BOOT_DEVICE_MMC1] = "/mmc@fe330000",
- [BOOT_DEVICE_SPI] = "/spi@ff1d0000/flash@0",
-};
- static void rk3399_force_power_on_reset(void) { ofnode node;
diff --git a/arch/arm/mach-rockchip/spl-boot-order.c b/arch/arm/mach-rockchip/spl-boot-order.c index 55d0976fb0a..f2cb17224e8 100644 --- a/arch/arm/mach-rockchip/spl-boot-order.c +++ b/arch/arm/mach-rockchip/spl-boot-order.c @@ -10,6 +10,7 @@ #include <mmc.h> #include <spl.h> #include <asm/global_data.h> +#include <dm/uclass-internal.h>
#if CONFIG_IS_ENABLED(OF_LIBFDT) /** @@ -163,30 +164,84 @@ void board_boot_order(u32 *spl_boot_list) spl_boot_list[0] = spl_boot_device(); }
-__weak const char * const spl_boot_devices[BOOT_DEVICE_NONE + 1] = {};
-const char *spl_decode_boot_device(u32 boot_device) +int spl_decode_boot_device(u32 boot_device, char *buf, size_t buflen) {
- const char *spl_bootdevice_ofpath = NULL;
- struct udevice *dev;
- int dev_num, ret;
- if (boot_device == BOOT_DEVICE_SPI) {
/* Revert spl_node_to_boot_device() logic to find appropriate SPI flash device */
/*
* Devices with multiple SPI flash devices will take the first SPI flash found in
* /chosen/u-boot,spl-boot-order.
*/
const void *blob = gd->fdt_blob;
int chosen_node = fdt_path_offset(blob, "/chosen");
int elem;
int node;
const char *conf;
if (chosen_node < 0) {
debug("%s: /chosen not found\n", __func__);
return -ENODEV;
}
for (elem = 0;
(conf = fdt_stringlist_get(blob, chosen_node,
"u-boot,spl-boot-order", elem, NULL));
elem++) {
const char *alias;
/* Handle the case of 'same device the SPL was loaded from' */
if (strncmp(conf, "same-as-spl", 11) == 0) {
conf = board_spl_was_booted_from();
if (!conf)
continue;
}
/* First check if the list element is an alias */
alias = fdt_get_alias(blob, conf);
if (alias)
conf = alias;
/* Try to resolve the config item (or alias) as a path */
node = fdt_path_offset(blob, conf);
if (node < 0) {
debug("%s: could not find %s in FDT\n", __func__, conf);
continue;
}
ret = uclass_find_device_by_of_offset(UCLASS_SPI_FLASH, node, &dev);
if (ret) {
debug("%s: could not find udevice for %s\n", __func__, conf);
continue;
}
- if (boot_device < ARRAY_SIZE(spl_boot_devices))
spl_bootdevice_ofpath = spl_boot_devices[boot_device];
return ofnode_get_path(dev_ofnode(dev), buf, buflen);
}
return -ENODEV;
- }
- if (spl_bootdevice_ofpath)
debug("%s: spl_bootdevice_id %x maps to '%s'\n",
__func__, boot_device, spl_bootdevice_ofpath);
- else
debug("%s: failed to resolve spl_bootdevice_id %x\n",
__func__, boot_device);
- dev_num = (boot_device == BOOT_DEVICE_MMC1) ? 0 : 1;
- ret = blk_find_device(UCLASS_MMC, dev_num, &dev);
- if (ret) {
debug("%s: could not find blk device for MMC device %d: %d\n",
__func__, dev_num, ret);
return ret;
- }
- return spl_bootdevice_ofpath;
dev = dev_get_parent(dev);
return ofnode_get_path(dev_ofnode(dev), buf, buflen); }
void spl_perform_fixups(struct spl_image_info *spl_image) { void *blob = spl_image->fdt_addr;
- const char *boot_ofpath;
- int chosen;
char boot_ofpath[512];
int chosen, ret;
/*
- Inject the ofpath of the device the full U-Boot (or Linux in
@@ -196,9 +251,9 @@ void spl_perform_fixups(struct spl_image_info *spl_image) 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__);
- ret = spl_decode_boot_device(spl_image->boot_device, boot_ofpath, sizeof(boot_ofpath));
- if (ret) {
return; }pr_err("%s: could not map boot_device to ofpath: %d\n", __func__, ret);

Hi Kever,
On 1/18/24 11:12, Kever Yang wrote:
Hi Quentin,
On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
BOOT_DEVICE_* is set by spl_node_to_boot_device() depending on the block device number associated with the MMC device the SPL used to load U-Boot proper from. It is NOT related to the mmc alias in the Device Tree.
For SPI flashes, all SPI flashes will return BOOT_DEVICE_SPI so there's currently no way to know from which one the SPL loaded U-Boot proper from. Therefore, let's just find the first valid candidate in /chosen/u-boot,spl-boot-order that is a SPI flash and return that path. This is a best effort.
While the original implementation may have worked, using the exact same mechanism but in inverted fashion makes it less likely to have surprising corner-cases or side-effects.
A nice side-effect is that all existing and future Rockchip SoCs now automatically have their /chosen/u-boot,spl-boot-device set.
Error happen in some 32bit SoC:
+arch/arm/mach-rockchip/spl-boot-order.c: In function 'spl_perform_fixups': +arch/arm/mach-rockchip/spl-boot-order.c:242:31: error: 'struct spl_image_info' has no member named 'fdt_addr' + 242 | void *blob = spl_image->fdt_addr; + | ^~ +make[3]: *** [scripts/Makefile.build:257: spl/arch/arm/mach-rockchip/spl-boot-order.o] Error 1
It'd be nice to say **which** boards aren't working so that I can reproduce locally :)
I eventually figured we have GitLab CI/CD for your maintainer branch/repo here: https://source.denx.de/u-boot/custodians/u-boot-rockchip/-/pipelines. This also helped me figure out this wasn't the only build failure and I could send another patch before you had the opportunity to tell me I had broken something else :)
Giving the link of the failed pipeline would really help, please think about it for next time :) Thanks!
For people interested in build-testing all Rockchip platforms locally, I used the following script:
""" #!/bin/sh
# Copy **some** TF-A binary in the parent directory of U-Boot git repo export BL31=../bl31.elf dd if=/dev/zero of=../zero.bin count=1 export ROCKCHIP_TPL=../zero.bin
for conf in $(git grep --files-with-matches ARCH_ROCKCHIP configs); do git clean -ffdx > /dev/null echo -n $conf= make $(basename "$conf") > /dev/null if grep -q -E "^CONFIG_ARM64=y" .config; then CROSS_COMPILE="aarch64-linux-gnu-" export TEE= else CROSS_COMPILE="arm-linux-gnu-" export TEE=../zero.bin fi LOG=$(mktemp) make KCFLAGS=-Werror CROSS_COMPILE="ccache $CROSS_COMPILE" -j$(nproc) > "$LOG" 2>&1 RET=$? echo $RET if [ "$RET" != 0 ]; then cat "$LOG" exit $RET fi done
exit 0 """
Cheers, Quentin

On Mon, Jan 22, 2024 at 11:49:23AM +0100, Quentin Schulz wrote:
Hi Kever,
On 1/18/24 11:12, Kever Yang wrote:
Hi Quentin,
On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
BOOT_DEVICE_* is set by spl_node_to_boot_device() depending on the block device number associated with the MMC device the SPL used to load U-Boot proper from. It is NOT related to the mmc alias in the Device Tree.
For SPI flashes, all SPI flashes will return BOOT_DEVICE_SPI so there's currently no way to know from which one the SPL loaded U-Boot proper from. Therefore, let's just find the first valid candidate in /chosen/u-boot,spl-boot-order that is a SPI flash and return that path. This is a best effort.
While the original implementation may have worked, using the exact same mechanism but in inverted fashion makes it less likely to have surprising corner-cases or side-effects.
A nice side-effect is that all existing and future Rockchip SoCs now automatically have their /chosen/u-boot,spl-boot-device set.
Error happen in some 32bit SoC:
+arch/arm/mach-rockchip/spl-boot-order.c: In function 'spl_perform_fixups': +arch/arm/mach-rockchip/spl-boot-order.c:242:31: error: 'struct spl_image_info' has no member named 'fdt_addr' + 242 | void *blob = spl_image->fdt_addr; + | ^~ +make[3]: *** [scripts/Makefile.build:257: spl/arch/arm/mach-rockchip/spl-boot-order.o] Error 1
It'd be nice to say **which** boards aren't working so that I can reproduce locally :)
I eventually figured we have GitLab CI/CD for your maintainer branch/repo here: https://source.denx.de/u-boot/custodians/u-boot-rockchip/-/pipelines. This also helped me figure out this wasn't the only build failure and I could send another patch before you had the opportunity to tell me I had broken something else :)
Giving the link of the failed pipeline would really help, please think about it for next time :) Thanks!
For people interested in build-testing all Rockchip platforms locally, I used the following script:
Please note that you can also build all of the rockchip platforms locally with: tools/buildman/buildman --allow-missing rk rv
It won't be bootable as it will fake all require blobs, but all platforms will be built. And buildman can be told a number of things to be built, but "rockchip" only catches the cases where the board vendor is "rockhip" rather than ARCH_ROCKCHIP, but "rk" and "rv" catch all of the rkXXXX and rvXXXX SoCs.

Hi Tom,
On 1/22/24 18:54, Tom Rini wrote:
On Mon, Jan 22, 2024 at 11:49:23AM +0100, Quentin Schulz wrote:
Hi Kever,
On 1/18/24 11:12, Kever Yang wrote:
Hi Quentin,
On 2024/1/18 01:22, Quentin Schulz wrote:
From: Quentin Schulz quentin.schulz@theobroma-systems.com
BOOT_DEVICE_* is set by spl_node_to_boot_device() depending on the block device number associated with the MMC device the SPL used to load U-Boot proper from. It is NOT related to the mmc alias in the Device Tree.
For SPI flashes, all SPI flashes will return BOOT_DEVICE_SPI so there's currently no way to know from which one the SPL loaded U-Boot proper from. Therefore, let's just find the first valid candidate in /chosen/u-boot,spl-boot-order that is a SPI flash and return that path. This is a best effort.
While the original implementation may have worked, using the exact same mechanism but in inverted fashion makes it less likely to have surprising corner-cases or side-effects.
A nice side-effect is that all existing and future Rockchip SoCs now automatically have their /chosen/u-boot,spl-boot-device set.
Error happen in some 32bit SoC:
+arch/arm/mach-rockchip/spl-boot-order.c: In function 'spl_perform_fixups': +arch/arm/mach-rockchip/spl-boot-order.c:242:31: error: 'struct spl_image_info' has no member named 'fdt_addr' + 242 | void *blob = spl_image->fdt_addr; + | ^~ +make[3]: *** [scripts/Makefile.build:257: spl/arch/arm/mach-rockchip/spl-boot-order.o] Error 1
It'd be nice to say **which** boards aren't working so that I can reproduce locally :)
I eventually figured we have GitLab CI/CD for your maintainer branch/repo here: https://source.denx.de/u-boot/custodians/u-boot-rockchip/-/pipelines. This also helped me figure out this wasn't the only build failure and I could send another patch before you had the opportunity to tell me I had broken something else :)
Giving the link of the failed pipeline would really help, please think about it for next time :) Thanks!
For people interested in build-testing all Rockchip platforms locally, I used the following script:
Please note that you can also build all of the rockchip platforms locally with: tools/buildman/buildman --allow-missing rk rv
It won't be bootable as it will fake all require blobs, but all platforms will be built. And buildman can be told a number of things to be built, but "rockchip" only catches the cases where the board vendor is "rockhip" rather than ARCH_ROCKCHIP, but "rk" and "rv" catch all of the rkXXXX and rvXXXX SoCs.
Ack, will be trying this one out, thanks for the heads up.
FYI, it was also missing "px30" among the terms to pass to buildman. Now I get 101 boards, the same as with my script :)
Cheers, Quentin

From: Quentin Schulz quentin.schulz@theobroma-systems.com
Remove leftover import and global data ptr from files since they aren't used anymore.
Cc: Quentin Schulz foss+uboot@0leil.net Reviewed-by: Kever Yang kever.yang@rock-chips.com Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- arch/arm/mach-rockchip/board.c | 3 --- arch/arm/mach-rockchip/rk3128/rk3128.c | 3 --- arch/arm/mach-rockchip/rk3308/rk3308.c | 3 --- arch/arm/mach-rockchip/rk3328/rk3328.c | 3 --- arch/arm/mach-rockchip/rk3368/rk3368.c | 3 --- arch/arm/mach-rockchip/rk3399/rk3399.c | 3 --- arch/arm/mach-rockchip/rk3588/rk3588.c | 2 -- 7 files changed, 20 deletions(-)
diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c index 57f08e0be0e..6a9d297e6ff 100644 --- a/arch/arm/mach-rockchip/board.c +++ b/arch/arm/mach-rockchip/board.c @@ -16,7 +16,6 @@ #include <syscon.h> #include <uuid.h> #include <asm/cache.h> -#include <asm/global_data.h> #include <asm/io.h> #include <asm/arch-rockchip/boot_mode.h> #include <asm/arch-rockchip/clock.h> @@ -24,8 +23,6 @@ #include <asm/arch-rockchip/misc.h> #include <power/regulator.h>
-DECLARE_GLOBAL_DATA_PTR; - #if defined(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) && defined(CONFIG_EFI_PARTITION)
#define DFU_ALT_BUF_LEN SZ_1K diff --git a/arch/arm/mach-rockchip/rk3128/rk3128.c b/arch/arm/mach-rockchip/rk3128/rk3128.c index 01dbfa75cb2..8f8f4951bae 100644 --- a/arch/arm/mach-rockchip/rk3128/rk3128.c +++ b/arch/arm/mach-rockchip/rk3128/rk3128.c @@ -4,9 +4,6 @@ */ #include <common.h> #include <init.h> -#include <asm/global_data.h> - -DECLARE_GLOBAL_DATA_PTR;
int arch_cpu_init(void) { diff --git a/arch/arm/mach-rockchip/rk3308/rk3308.c b/arch/arm/mach-rockchip/rk3308/rk3308.c index 5763604dc3e..6f121bf1304 100644 --- a/arch/arm/mach-rockchip/rk3308/rk3308.c +++ b/arch/arm/mach-rockchip/rk3308/rk3308.c @@ -5,7 +5,6 @@ #include <common.h> #include <init.h> #include <malloc.h> -#include <asm/global_data.h> #include <asm/io.h> #include <asm/arch/grf_rk3308.h> #include <asm/arch-rockchip/bootrom.h> @@ -14,8 +13,6 @@ #include <debug_uart.h> #include <linux/bitops.h>
-DECLARE_GLOBAL_DATA_PTR; - #include <asm/armv8/mmu.h> static struct mm_region rk3308_mem_map[] = { { diff --git a/arch/arm/mach-rockchip/rk3328/rk3328.c b/arch/arm/mach-rockchip/rk3328/rk3328.c index de17b886827..02821c9e51d 100644 --- a/arch/arm/mach-rockchip/rk3328/rk3328.c +++ b/arch/arm/mach-rockchip/rk3328/rk3328.c @@ -10,11 +10,8 @@ #include <asm/arch-rockchip/grf_rk3328.h> #include <asm/arch-rockchip/uart.h> #include <asm/armv8/mmu.h> -#include <asm/global_data.h> #include <asm/io.h>
-DECLARE_GLOBAL_DATA_PTR; - #define CRU_BASE 0xFF440000 #define GRF_BASE 0xFF100000 #define UART2_BASE 0xFF130000 diff --git a/arch/arm/mach-rockchip/rk3368/rk3368.c b/arch/arm/mach-rockchip/rk3368/rk3368.c index d0a6107e5e0..d009b8758e5 100644 --- a/arch/arm/mach-rockchip/rk3368/rk3368.c +++ b/arch/arm/mach-rockchip/rk3368/rk3368.c @@ -8,7 +8,6 @@ #include <init.h> #include <syscon.h> #include <asm/armv8/mmu.h> -#include <asm/global_data.h> #include <asm/io.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/clock.h> @@ -18,8 +17,6 @@ #include <linux/bitops.h> #include <linux/delay.h>
-DECLARE_GLOBAL_DATA_PTR; - #define IMEM_BASE 0xFF8C0000
/* Max MCU's SRAM value is 8K, begin at (IMEM_BASE + 4K) */ diff --git a/arch/arm/mach-rockchip/rk3399/rk3399.c b/arch/arm/mach-rockchip/rk3399/rk3399.c index 801a4a6662e..a1aa0e3e8b5 100644 --- a/arch/arm/mach-rockchip/rk3399/rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/rk3399.c @@ -11,7 +11,6 @@ #include <spl_gpio.h> #include <syscon.h> #include <asm/armv8/mmu.h> -#include <asm/global_data.h> #include <asm/io.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/clock.h> @@ -23,8 +22,6 @@ #include <linux/printk.h> #include <power/regulator.h>
-DECLARE_GLOBAL_DATA_PTR; - #define GRF_EMMCCORE_CON11 0xff77f02c #define GRF_BASE 0xff770000
diff --git a/arch/arm/mach-rockchip/rk3588/rk3588.c b/arch/arm/mach-rockchip/rk3588/rk3588.c index b1f535fad50..00e3da40d9a 100644 --- a/arch/arm/mach-rockchip/rk3588/rk3588.c +++ b/arch/arm/mach-rockchip/rk3588/rk3588.c @@ -12,8 +12,6 @@ #include <asm/arch-rockchip/hardware.h> #include <asm/arch-rockchip/ioc_rk3588.h>
-DECLARE_GLOBAL_DATA_PTR; - #define FIREWALL_DDR_BASE 0xfe030000 #define FW_DDR_MST5_REG 0x54 #define FW_DDR_MST13_REG 0x74

From: Quentin Schulz quentin.schulz@theobroma-systems.com
arch_cpu_init is already returning 0 in its weak definition in common/board_f.c so let's just remove the file entirely since nothing else is done in it.
Cc: Quentin Schulz foss+uboot@0leil.net Reviewed-by: Kever Yang kever.yang@rock-chips.com Signed-off-by: Quentin Schulz quentin.schulz@theobroma-systems.com --- arch/arm/mach-rockchip/rk3128/Makefile | 1 - arch/arm/mach-rockchip/rk3128/rk3128.c | 13 ------------- 2 files changed, 14 deletions(-)
diff --git a/arch/arm/mach-rockchip/rk3128/Makefile b/arch/arm/mach-rockchip/rk3128/Makefile index 50e11175423..8df1a60a348 100644 --- a/arch/arm/mach-rockchip/rk3128/Makefile +++ b/arch/arm/mach-rockchip/rk3128/Makefile @@ -4,6 +4,5 @@ # SPDX-License-Identifier: GPL-2.0+ #
-obj-y += rk3128.o obj-y += syscon_rk3128.o obj-y += clk_rk3128.o diff --git a/arch/arm/mach-rockchip/rk3128/rk3128.c b/arch/arm/mach-rockchip/rk3128/rk3128.c deleted file mode 100644 index 8f8f4951bae..00000000000 --- a/arch/arm/mach-rockchip/rk3128/rk3128.c +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (c) 2017 Rockchip Electronics Co., Ltd - */ -#include <common.h> -#include <init.h> - -int arch_cpu_init(void) -{ - /* We do some SoC one time setting here. */ - - return 0; -}
participants (4)
-
Kever Yang
-
Quentin Schulz
-
Quentin Schulz
-
Tom Rini