SPL: FIT: Enable SPL_FIT_LOAD in RAM based boot mode
authorMichal Simek <michal.simek@xilinx.com>
Thu, 28 Apr 2016 07:54:16 +0000 (09:54 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 24 May 2016 09:15:01 +0000 (11:15 +0200)
Support loading FIT in SPL for RAM bootmode.
CONFIG_SPL_LOAD_FIT_ADRESS points to address where FIT image is stored
in memory.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Lokesh Vutla <lokeshvutla@ti.com>
common/spl/spl.c

index caaf135f9ad55c473737918e0d3d68db9a30d729..bdde71691887f3f8d461b0b3e46bd3159468b940 100644 (file)
@@ -140,20 +140,47 @@ __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        image_entry();
 }
 
+#ifndef CONFIG_SPL_LOAD_FIT_ADDRESS
+# define CONFIG_SPL_LOAD_FIT_ADDRESS   0
+#endif
+
 #ifdef CONFIG_SPL_RAM_DEVICE
+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 *)(CONFIG_SPL_LOAD_FIT_ADDRESS + sector), count);
+       return count;
+}
+
 static int spl_ram_load_image(void)
 {
-       const struct image_header *header;
+       struct image_header *header;
 
-       /*
-        * Get the header.  It will point to an address defined by handoff
-        * which will tell where the image located inside the flash. For
-        * now, it will temporary fixed to address pointed by U-Boot.
-        */
-       header = (struct image_header *)
-               (CONFIG_SYS_TEXT_BASE - sizeof(struct image_header));
+       header = (struct image_header *)CONFIG_SPL_LOAD_FIT_ADDRESS;
 
-       spl_parse_image_header(header);
+       if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+           image_get_magic(header) == FDT_MAGIC) {
+               struct spl_load_info load;
+
+               debug("Found FIT\n");
+               load.bl_len = 1;
+               load.read = spl_ram_load_read;
+               spl_load_simple_fit(&load, 0, header);
+       } else {
+               debug("Legacy image\n");
+               /*
+                * Get the header.  It will point to an address defined by
+                * handoff which will tell where the image located inside
+                * the flash. For now, it will temporary fixed to address
+                * pointed by U-Boot.
+                */
+               header = (struct image_header *)
+                       (CONFIG_SYS_TEXT_BASE - sizeof(struct image_header));
+
+               spl_parse_image_header(header);
+       }
 
        return 0;
 }