bootm: refactor entry point code
[kernel/u-boot.git] / lib_ppc / bootm.c
index cbe5592..b08ee0d 100644 (file)
@@ -79,8 +79,8 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 
        ulong   cmd_start, cmd_end, bootmap_base;
        bd_t    *kbd;
-       ulong   ep = 0;
-       void    (*kernel)(bd_t *, ulong, ulong, ulong, ulong);
+       void    (*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,
+                         ulong r7, ulong r8, ulong r9);
        int     ret;
        ulong   of_size = 0;
        struct lmb *lmb = images->lmb;
@@ -89,6 +89,9 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        char    *of_flat_tree = NULL;
 #endif
 
+       kernel = (void (*)(bd_t *, ulong, ulong, ulong,
+                          ulong, ulong, ulong))images->ep;
+
        bootmap_base = getenv_bootm_low();
        bootm_size = getenv_bootm_size();
 
@@ -150,24 +153,6 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                set_clocks_in_mhz(kbd);
        }
 
-       /* find kernel entry point */
-       if (images->legacy_hdr_valid) {
-               ep = image_get_ep (&images->legacy_hdr_os_copy);
-#if defined(CONFIG_FIT)
-       } else if (images->fit_uname_os) {
-               ret = fit_image_get_entry (images->fit_hdr_os,
-                               images->fit_noffset_os, &ep);
-               if (ret) {
-                       puts ("Can't get entry point property!\n");
-                       goto error;
-               }
-#endif
-       } else {
-               puts ("Could not find kernel entry point!\n");
-               goto error;
-       }
-       kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))ep;
-
        /* find ramdisk */
        ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_PPC,
                        &rd_data_start, &rd_data_end);
@@ -282,14 +267,23 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        if (of_flat_tree) {     /* device tree; boot new style */
                /*
                 * Linux Kernel Parameters (passing device tree):
-                *   r3: pointer to the fdt, followed by the board info data
-                *   r4: physical pointer to the kernel itself
-                *   r5: NULL
-                *   r6: NULL
-                *   r7: NULL
+                *   r3: pointer to the fdt
+                *   r4: 0
+                *   r5: 0
+                *   r6: epapr magic
+                *   r7: size of IMA in bytes
+                *   r8: 0
+                *   r9: 0
                 */
+#if defined(CONFIG_85xx) || defined(CONFIG_440)
+ #define EPAPR_MAGIC   (0x45504150)
+#else
+ #define EPAPR_MAGIC   (0x65504150)
+#endif
+
                debug ("   Booting using OF flat tree...\n");
-               (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
+               (*kernel) ((bd_t *)of_flat_tree, 0, 0, EPAPR_MAGIC,
+                          CFG_BOOTMAPSZ, 0, 0);
                /* does not return */
        } else
 #endif
@@ -301,9 +295,12 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                 *   r5: initrd_end - unused if r4 is 0
                 *   r6: Start of command line string
                 *   r7: End   of command line string
+                *   r8: 0
+                *   r9: 0
                 */
                debug ("   Booting using board info...\n");
-               (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
+               (*kernel) (kbd, initrd_start, initrd_end,
+                          cmd_start, cmd_end, 0, 0);
                /* does not return */
        }
        return ;