Reorganize and fix problems (returns) in the bootm command.
[platform/kernel/u-boot.git] / common / cmd_bootm.c
index 1cb0e43..45ab13a 100644 (file)
@@ -45,8 +45,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
- /*cmd_boot.c*/
- extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+/*cmd_boot.c*/
+extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
 #include <rtc.h>
@@ -756,8 +756,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 
                        if ((ntohl(hdr->ih_load) <  ((unsigned long)hdr + ntohl(hdr->ih_size) + sizeof(hdr))) &&
                           ((ntohl(hdr->ih_load) + ntohl(hdr->ih_size)) > (unsigned long)hdr)) {
-                               printf ("ERROR: Load address overwrites Flat Device Tree uImage\n");
-                               return;
+                               puts ("ERROR: Load address overwrites Flat Device Tree uImage\nMust RESET board to recover\n");
+                               do_reset (cmdtp, flag, argc, argv);
                        }
 
                        printf("   Verifying Checksum ... ");
@@ -766,34 +766,34 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                        header.ih_hcrc = 0;
 
                        if(checksum != crc32(0, (uchar *)&header, sizeof(image_header_t))) {
-                               printf("ERROR: Flat Device Tree header checksum is invalid\n");
-                               return;
+                               puts ("ERROR: Flat Device Tree header checksum is invalid\nMust RESET board to recover\n");
+                               do_reset (cmdtp, flag, argc, argv);
                        }
 
                        checksum = ntohl(hdr->ih_dcrc);
                        addr = (ulong)((uchar *)(hdr) + sizeof(image_header_t));
 
                        if(checksum != crc32(0, (uchar *)addr, ntohl(hdr->ih_size))) {
-                               printf("ERROR: Flat Device Tree checksum is invalid\n");
-                               return;
+                               puts ("ERROR: Flat Device Tree checksum is invalid\nMust RESET board to recover\n");
+                               do_reset (cmdtp, flag, argc, argv);
                        }
                        printf("OK\n");
 
                        if (ntohl(hdr->ih_type) != IH_TYPE_FLATDT) {
-                               printf ("ERROR: uImage not Flat Device Tree type\n");
-                               return;
+                               puts ("ERROR: uImage not Flat Device Tree type\nMust RESET board to recover\n");
+                               do_reset (cmdtp, flag, argc, argv);
                        }
                        if (ntohl(hdr->ih_comp) != IH_COMP_NONE) {
-                               printf("ERROR: uImage is not uncompressed\n");
-                               return;
+                               puts ("ERROR: uImage is not uncompressed\nMust RESET board to recover\n");
+                               do_reset (cmdtp, flag, argc, argv);
                        }
 #if defined(CONFIG_OF_LIBFDT)
                        if (fdt_check_header(of_flat_tree + sizeof(image_header_t)) != 0) {
 #else
                        if (*((ulong *)(of_flat_tree + sizeof(image_header_t))) != OF_DT_HEADER) {
 #endif
-                               printf ("ERROR: uImage data is not a flat device tree\n");
-                               return;
+                               puts ("ERROR: uImage data is not a flat device tree\nMust RESET board to recover\n");
+                               do_reset (cmdtp, flag, argc, argv);
                        }
 
                        memmove((void *)ntohl(hdr->ih_load),
@@ -801,8 +801,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                                ntohl(hdr->ih_size));
                        of_flat_tree = (char *)ntohl(hdr->ih_load);
                } else {
-                       printf ("Did not find a flat flat device tree at address %08lX\n", of_flat_tree);
-                       return;
+                       puts ("Did not find a flat flat device tree\nMust RESET board to recover\n");
+                       do_reset (cmdtp, flag, argc, argv);
                }
                printf ("   Booting using flat device tree at 0x%x\n",
                                of_flat_tree);
@@ -833,8 +833,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 #else
                if (((struct boot_param_header *)of_data)->magic != OF_DT_HEADER) {
 #endif
-                       printf ("ERROR: image is not a flat device tree\n");
-                       return;
+                       puts ("ERROR: image is not a flat device tree\nMust RESET board to recover\n");
+                       do_reset (cmdtp, flag, argc, argv);
                }
 
 #if defined(CONFIG_OF_LIBFDT)
@@ -842,8 +842,8 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
 #else
                if (((struct boot_param_header *)of_data)->totalsize != ntohl(len_ptr[2])) {
 #endif
-                       printf ("ERROR: flat device tree size does not agree with image\n");
-                       return;
+                       puts ("ERROR: flat device tree size does not agree with image\nMust RESET board to recover\n");
+                       do_reset (cmdtp, flag, argc, argv);
                }
        }
 #endif
@@ -916,15 +916,6 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                initrd_end = 0;
        }
 
-       debug ("## Transferring control to Linux (at address %08lx) ...\n",
-               (ulong)kernel);
-
-       show_boot_progress (15);
-
-#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
-       unlock_ram_in_cache();
-#endif
-
 #if defined(CONFIG_OF_LIBFDT)
        /* move of_flat_tree if needed */
        if (of_data) {
@@ -953,19 +944,19 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                 * if the user wants it (the logic is in the subroutines).
                 */
                if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) {
-                               printf("Failed creating the /chosen node (0x%08X), aborting.\n", of_flat_tree);
-                               return;
+                       puts ("ERROR: Failed creating the /chosen node, aborting.\nMust RESET board to recover\n");
+                       do_reset (cmdtp, flag, argc, argv);
                }
 #ifdef CONFIG_OF_HAS_UBOOT_ENV
                if (fdt_env(of_flat_tree) < 0) {
-                               printf("Failed creating the /u-boot-env node, aborting.\n");
-                               return;
+                       puts ("ERROR: Failed creating the /u-boot-env node, aborting.\nMust RESET board to recover\n");
+                       do_reset (cmdtp, flag, argc, argv);
                }
 #endif
 #ifdef CONFIG_OF_HAS_BD_T
                if (fdt_bd_t(of_flat_tree) < 0) {
-                               printf("Failed creating the /bd_t node, aborting.\n");
-                               return;
+                       puts ("ERROR: Failed creating the /bd_t node, aborting.\nMust RESET board to recover\n");
+                       do_reset (cmdtp, flag, argc, argv);
                }
 #endif
        }
@@ -990,55 +981,62 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                memmove ((void *)of_start, (void *)of_data, of_len);
        }
 #endif
-
-       /*
-        * Linux Kernel Parameters (passing board info data):
-        *   r3: ptr to board info data
-        *   r4: initrd_start or 0 if no initrd
-        *   r5: initrd_end - unused if r4 is 0
-        *   r6: Start of command line string
-        *   r7: End   of command line string
-        */
-#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
-       if (!of_flat_tree)      /* no device tree; boot old style */
-#endif
-               (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
-               /* does not return */
-
-#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
-       /*
-        * Linux Kernel Parameters (passing device tree):
-        *   r3: ptr to OF flat tree, followed by the board info data
-        *   r4: physical pointer to the kernel itself
-        *   r5: NULL
-        *   r6: NULL
-        *   r7: NULL
-        */
 #if defined(CONFIG_OF_FLAT_TREE)
        ft_setup(of_flat_tree, kbd, initrd_start, initrd_end);
        /* ft_dump_blob(of_flat_tree); */
 #endif
 #if defined(CONFIG_OF_LIBFDT)
        if (fdt_chosen(of_flat_tree, initrd_start, initrd_end, 0) < 0) {
-               printf("Failed creating the /chosen node (0x%08X), aborting.\n", of_flat_tree);
-               return;
+               puts ("ERROR: Failed to create the /chosen node, aborting.\nMust RESET board to recover\n");
+               do_reset (cmdtp, flag, argc, argv);
        }
 #ifdef CONFIG_OF_HAS_UBOOT_ENV
        if (fdt_env(of_flat_tree) < 0) {
-               printf("Failed creating the /u-boot-env node, aborting.\n");
-               return;
+               puts ("ERROR: Failed to create the /u-boot-env node, aborting.\nMust RESET board to recover\n");
+               do_reset (cmdtp, flag, argc, argv);
        }
 #endif
 #ifdef CONFIG_OF_HAS_BD_T
        if (fdt_bd_t(of_flat_tree) < 0) {
-               printf("Failed creating the /bd_t node, aborting.\n");
-               return;
+               puts ("ERROR: Failed to create the /bd_t node, aborting.\nMust RESET board to recover\n");
+               do_reset (cmdtp, flag, argc, argv);
        }
 #endif
 #endif /* if defined(CONFIG_OF_LIBFDT) */
 
-       (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
+       debug ("## Transferring control to Linux (at address %08lx) ...\n",
+               (ulong)kernel);
+
+       show_boot_progress (15);
+
+#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500)
+       unlock_ram_in_cache();
 #endif
+
+#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
+       if (of_flat_tree) {     /* device tree; boot new style */
+               /*
+                * Linux Kernel Parameters (passing device tree):
+                *   r3: ptr to flattened device tree, followed by the board info data
+                *   r4: physical pointer to the kernel itself
+                *   r5: NULL
+                *   r6: NULL
+                *   r7: NULL
+                */
+               (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
+               /* does not return */
+       }
+#endif
+       /*
+        * Linux Kernel Parameters (passing board info data):
+        *   r3: ptr to board info data
+        *   r4: initrd_start or 0 if no initrd
+        *   r5: initrd_end - unused if r4 is 0
+        *   r6: Start of command line string
+        *   r7: End   of command line string
+        */
+       (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
+       /* does not return */
 }
 #endif /* CONFIG_PPC */