
From: Ye Li ye.li@nxp.com
For some debug case, we have preloaded the full boot image to RAM device. Add the support that SPL can load the u-boot-atf container from the RAM device.
Signed-off-by: Ye Li ye.li@nxp.com Signed-off-by: Alice Guo alice.guo@nxp.com --- arch/arm/mach-imx/image-container.c | 22 ++++++++++++++++++++++ common/spl/spl_ram.c | 34 ++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/arch/arm/mach-imx/image-container.c b/arch/arm/mach-imx/image-container.c index 54ae7721888dbc93fdaba8e5aedc52c4506bb1c1..27dc162f2517b6d75b0ed95510c09385f7cbc859 100644 --- a/arch/arm/mach-imx/image-container.c +++ b/arch/arm/mach-imx/image-container.c @@ -21,6 +21,7 @@ #define NAND_DEV 2 #define QSPI_NOR_DEV 3 #define ROM_API_DEV 4 +#define RAM_DEV 5
/* The unit of second image offset number which provision by the fuse bits */ #define SND_IMG_OFF_UNIT (0x100000UL) @@ -148,6 +149,11 @@ static int get_dev_container_size(void *dev, int dev_type, unsigned long offset, } #endif
+#ifdef CONFIG_SPL_RAM_SUPPORT + if (dev_type == RAM_DEV) + memcpy(buf, (const void *)offset, CONTAINER_HDR_ALIGNMENT); +#endif + ret = get_container_size((ulong)buf, header_length);
free(buf); @@ -222,6 +228,8 @@ static unsigned long get_boot_device_offset(void *dev, int dev_type) CONTAINER_HDR_NAND_OFFSET; } else if (dev_type == QSPI_NOR_DEV) { offset = CONTAINER_HDR_QSPI_OFFSET + 0x08000000; + } else if (dev_type == RAM_DEV) { + offset = (unsigned long)dev + CONTAINER_HDR_MMCSD_OFFSET; } else { printf("Not supported dev_type: %d\n", dev_type); } @@ -382,3 +390,17 @@ ulong spl_romapi_get_uboot_base(u32 image_offset, u32 rom_bt_dev) return end; } #endif + +#ifdef CONFIG_SPL_RAM_SUPPORT +unsigned long spl_ram_get_uboot_base(void) +{ + ulong end; + + end = get_imageset_end((void *)CONFIG_SPL_LOAD_FIT_ADDRESS, RAM_DEV); + end = ROUND(end, SZ_1K); + + printf("Load image from RAM 0x%lx\n", end); + + return end; +} +#endif diff --git a/common/spl/spl_ram.c b/common/spl/spl_ram.c index 71b7a8374bbbf534e1b2c28e02205af035fcfd8b..c3a1df59e3f3bcc19a6cdff21ec66a4bd4df7b93 100644 --- a/common/spl/spl_ram.c +++ b/common/spl/spl_ram.c @@ -16,24 +16,25 @@ #include <spl.h> #include <linux/libfdt.h>
-static ulong spl_ram_load_read(struct spl_load_info *load, ulong sector, - ulong count, void *buf) +unsigned long __weak spl_ram_get_uboot_base(void) { ulong addr = 0;
- debug("%s: sector %lx, count %lx, buf %lx\n", - __func__, sector, count, (ulong)buf); - if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) { addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT, CONFIG_SPL_LOAD_FIT_ADDRESS); } - addr += sector; - if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) - addr += image_load_offset;
- memcpy(buf, (void *)addr, count); + return addr; +} + +static ulong spl_ram_load_read(struct spl_load_info *load, ulong sector, + ulong count, void *buf) +{ + debug("%s: sector %lx, count %lx, buf %lx\n", + __func__, sector, count, (ulong)buf);
+ memcpy(buf, (void *)(sector), count); return count; }
@@ -44,10 +45,7 @@ static int spl_ram_load_image(struct spl_image_info *spl_image, ulong addr = 0; int ret;
- if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) { - addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT, - CONFIG_SPL_LOAD_FIT_ADDRESS); - } + header = (struct legacy_img_hdr *)spl_ram_get_uboot_base();
if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) { ret = image_pre_load(addr); @@ -70,7 +68,15 @@ static int spl_ram_load_image(struct spl_image_info *spl_image,
debug("Found FIT\n"); spl_load_init(&load, spl_ram_load_read, NULL, 1); - ret = spl_load_simple_fit(spl_image, &load, 0, header); + ret = spl_load_simple_fit(spl_image, &load, (ulong)header, header); + } else if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) { + struct spl_load_info load; + + memset(&load, 0, sizeof(load)); + load.bl_len = 1; + load.read = spl_ram_load_read; + + ret = spl_load_imx_container(spl_image, &load, (ulong)header); } else { ulong u_boot_pos = spl_get_image_pos();