]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - common/spl/spl.c
spl: Remove bogus GD_FLG_SPL_INIT check
[people/ms/u-boot.git] / common / spl / spl.c
index caaf135f9ad55c473737918e0d3d68db9a30d729..8b10bdfe77f0811100bba8fde1bfa1ab99fe0529 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;
 }
@@ -459,9 +486,6 @@ ulong spl_relocate_stack_gd(void)
 
 #ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
        if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
-               if (!(gd->flags & GD_FLG_SPL_INIT))
-                       panic_str("spl_init must be called before heap reloc");
-
                ptr -= CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;
                gd->malloc_base = ptr;
                gd->malloc_limit = CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN;