[PATCH v3 15/15] rockchip: Support legacy images when booting from RAM
Simon Glass
sjg at chromium.org
Tue Jul 7 17:31:13 CEST 2026
The ramboot loader used for maskrom-mode USB boot only handles FIT
payloads, but the maskrom usb472 image contains a legacy image on
32-bit boards without OP-TEE, since the FIT template requires either
TF-A or OP-TEE. Such boards print 'Trying to boot from RAM' and then
hang.
Use the binman payload symbols to locate a legacy image placed
directly after SPL and load it with spl_load(). This allows boards
like the Luckfox Pico Mini and the Omega4 to run U-Boot entirely from
RAM in maskrom mode
Signed-off-by: Simon Glass <sjg at chromium.org>
---
(no changes since v1)
arch/arm/mach-rockchip/spl.c | 53 +++++++++++++++++++++++-------------
1 file changed, 34 insertions(+), 19 deletions(-)
diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c
index e989c148079..1322fc000b0 100644
--- a/arch/arm/mach-rockchip/spl.c
+++ b/arch/arm/mach-rockchip/spl.c
@@ -14,6 +14,7 @@
#include <mapmem.h>
#include <ram.h>
#include <spl.h>
+#include <spl_load.h>
#include <asm/arch-rockchip/bootrom.h>
#include <asm/arch-rockchip/timer.h>
#include <asm/global_data.h>
@@ -153,15 +154,14 @@ void spl_board_prepare_for_boot(void)
cleanup_before_linux();
}
-#if CONFIG_IS_ENABLED(RAM_DEVICE) && IS_ENABLED(CONFIG_SPL_LOAD_FIT)
+#if CONFIG_IS_ENABLED(RAM_DEVICE)
binman_sym_declare_optional(ulong, payload, image_pos);
binman_sym_declare_optional(ulong, payload, size);
static ulong ramboot_load_read(struct spl_load_info *load, ulong sector,
ulong count, void *buf)
{
- ulong addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT,
- CONFIG_SPL_LOAD_FIT_ADDRESS);
+ ulong addr = (ulong)load->priv;
memcpy(buf, map_sysmem(addr + sector, 0), count);
return count;
@@ -170,29 +170,44 @@ static ulong ramboot_load_read(struct spl_load_info *load, ulong sector,
static int ramboot_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
{
- struct legacy_img_hdr *header;
- ulong addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT,
- CONFIG_SPL_LOAD_FIT_ADDRESS);
ulong image_pos = binman_sym(ulong, payload, image_pos);
ulong size = binman_sym(ulong, payload, size);
+ struct legacy_img_hdr *header;
+ struct spl_load_info load;
+
+ if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) {
+ ulong addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT,
+ CONFIG_SPL_LOAD_FIT_ADDRESS);
+
+ if (addr == CFG_SYS_SDRAM_BASE || addr == CONFIG_SPL_TEXT_BASE)
+ return -ENODEV;
+
+ if (image_pos != BINMAN_SYM_MISSING &&
+ size != BINMAN_SYM_MISSING) {
+ header = map_sysmem(image_pos, 0);
+ if (image_get_magic(header) == FDT_MAGIC) {
+ memmove(map_sysmem(addr, 0), header, size);
+ memset(header, 0, sizeof(*header));
+ }
+ }
- if (addr == CFG_SYS_SDRAM_BASE || addr == CONFIG_SPL_TEXT_BASE)
- return -ENODEV;
-
- if (image_pos != BINMAN_SYM_MISSING && size != BINMAN_SYM_MISSING) {
- header = map_sysmem(image_pos, 0);
+ header = map_sysmem(addr, 0);
if (image_get_magic(header) == FDT_MAGIC) {
- memmove(map_sysmem(addr, 0), header, size);
- memset(header, 0, sizeof(*header));
+ spl_load_init(&load, ramboot_load_read,
+ map_sysmem(addr, 0), 1);
+ return spl_load_simple_fit(spl_image, &load, 0,
+ header);
}
}
- header = map_sysmem(addr, 0);
- if (image_get_magic(header) == FDT_MAGIC) {
- struct spl_load_info load;
-
- spl_load_init(&load, ramboot_load_read, NULL, 1);
- return spl_load_simple_fit(spl_image, &load, 0, header);
+ /* Fall back to a legacy image placed directly after SPL */
+ if (image_pos != BINMAN_SYM_MISSING && size != BINMAN_SYM_MISSING) {
+ header = map_sysmem(image_pos, 0);
+ if (image_get_magic(header) == IH_MAGIC) {
+ spl_load_init(&load, ramboot_load_read,
+ map_sysmem(image_pos, 0), 1);
+ return spl_load(spl_image, bootdev, &load, size, 0);
+ }
}
return -ENODEV;
--
2.43.0
More information about the U-Boot
mailing list