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 <[email protected]> --- (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

