From: Ye Li <ye...@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...@nxp.com>
Signed-off-by: Alice Guo <alice....@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();
 

-- 
2.34.1

Reply via email to