This patch moves the falcon mode handling logic out of
spl_nor_load_image to spl_nor_load_image_os, this allows for cleaner
handling for fallback to U-Boot in case falcon mode fails.

Signed-off-by: Anshul Dalal <ansh...@ti.com>
---
 common/spl/spl_nor.c | 103 ++++++++++++++++++++++++-------------------
 1 file changed, 58 insertions(+), 45 deletions(-)

diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
index 1021d933999..e95a75336f2 100644
--- a/common/spl/spl_nor.c
+++ b/common/spl/spl_nor.c
@@ -25,66 +25,79 @@ unsigned long __weak spl_nor_get_uboot_base(void)
        return CFG_SYS_UBOOT_BASE;
 }
 
-static int spl_nor_load_image(struct spl_image_info *spl_image,
-                             struct spl_boot_device *bootdev)
+#if CONFIG_IS_ENABLED(OS_BOOT)
+static int spl_nor_load_image_os(struct spl_image_info *spl_image,
+                                struct spl_boot_device *bootdev)
 {
-       struct spl_load_info load;
-
        /*
-        * Loading of the payload to SDRAM is done with skipping of
-        * the mkimage header in this SPL NOR driver
+        * Load Linux from its location in NOR flash to its defined
+        * location in SDRAM
         */
-       spl_image->flags |= SPL_COPY_PAYLOAD_ONLY;
+       const struct legacy_img_hdr *header =
+               (const struct legacy_img_hdr *)CONFIG_SYS_OS_BASE;
+       struct spl_load_info load;
 
-#if CONFIG_IS_ENABLED(OS_BOOT)
-       if (!spl_start_uboot()) {
-               /*
-                * Load Linux from its location in NOR flash to its defined
-                * location in SDRAM
-                */
-               const struct legacy_img_hdr *header =
-                       (const struct legacy_img_hdr *)CONFIG_SYS_OS_BASE;
 #ifdef CONFIG_SPL_LOAD_FIT
-               if (image_get_magic(header) == FDT_MAGIC) {
-                       int ret;
+       if (image_get_magic(header) == FDT_MAGIC) {
+               int ret;
 
-                       debug("Found FIT\n");
-                       spl_load_init(&load, spl_nor_load_read, NULL, 1);
+               debug("Found FIT\n");
+               spl_load_init(&load, spl_nor_load_read, NULL, 1);
 
-                       ret = spl_load_simple_fit(spl_image, &load,
-                                                 CONFIG_SYS_OS_BASE,
-                                                 (void *)header);
+               ret = spl_load_simple_fit(spl_image, &load, CONFIG_SYS_OS_BASE,
+                                         (void *)header);
 
 #if defined CONFIG_SPL_PAYLOAD_ARGS_ADDR && defined CONFIG_CMD_SPL_NOR_OFS
-                       memcpy((void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR,
-                              (void *)CONFIG_CMD_SPL_NOR_OFS,
-                              CONFIG_CMD_SPL_WRITE_SIZE);
+               memcpy((void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR,
+                      (void *)CONFIG_CMD_SPL_NOR_OFS,
+                      CONFIG_CMD_SPL_WRITE_SIZE);
 #endif
-                       return ret;
-               }
+               return ret;
+       }
 #endif
-               if (image_get_os(header) == IH_OS_LINUX) {
-                       /* happy - was a Linux */
-                       int ret;
-
-                       ret = spl_parse_image_header(spl_image, bootdev, 
header);
-                       if (ret)
-                               return ret;
-
-                       memcpy((void *)spl_image->load_addr,
-                              (void *)(CONFIG_SYS_OS_BASE +
-                                       sizeof(struct legacy_img_hdr)),
-                              spl_image->size);
+       if (image_get_os(header) != IH_OS_LINUX) {
+               return -EINVAL;
+       }
+
+       /* happy - was a Linux */
+       int ret;
+
+       ret = spl_parse_image_header(spl_image, bootdev, header);
+       if (ret)
+               return ret;
+
+       memcpy((void *)spl_image->load_addr,
+              (void *)(CONFIG_SYS_OS_BASE + sizeof(struct legacy_img_hdr)),
+              spl_image->size);
+
 #ifdef CONFIG_SPL_PAYLOAD_ARGS_ADDR
-                       spl_image->arg = (void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR;
+       spl_image->arg = (void *)CONFIG_SPL_PAYLOAD_ARGS_ADDR;
 #endif
 
+       return 0;
+}
+#endif
+
+static int spl_nor_load_image(struct spl_image_info *spl_image,
+                             struct spl_boot_device *bootdev)
+{
+       int err;
+       struct spl_load_info load;
+
+       /*
+        * Loading of the payload to SDRAM is done with skipping of
+        * the mkimage header in this SPL NOR driver
+        */
+       spl_image->flags |= SPL_COPY_PAYLOAD_ONLY;
+
+#if CONFIG_IS_ENABLED(OS_BOOT)
+       if (!spl_start_uboot()) {
+               err = spl_nor_load_image_os(spl_image, bootdev);
+               if (!err)
                        return 0;
-               } else {
-                       puts("The Expected Linux image was not found.\n"
-                            "Please check your NOR configuration.\n"
-                            "Trying to start u-boot now...\n");
-               }
+
+               printf("%s: Failed in falcon boot: %d, fallback to U-Boot",
+                      __func__, err);
        }
 #endif
 
-- 
2.51.0

Reply via email to