bootm: refactor ramdisk locating code
[oweals/u-boot.git] / lib_ppc / bootm.c
index cbe5592a94893215d77da2dc71984d11ac15e322..e6a6e4461d4b28cfb801bc5bf63f75a436266713 100644 (file)
@@ -73,14 +73,14 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        ulong   sp;
 
        ulong   initrd_start, initrd_end;
-       ulong   rd_data_start, rd_data_end, rd_len;
+       ulong   rd_len;
        ulong   size;
        phys_size_t bootm_size;
 
        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,31 +153,7 @@ 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);
-       if (ret)
-               goto error;
-
-       rd_len = rd_data_end - rd_data_start;
+       rd_len = images->rd_end - images->rd_start;
 
 #if defined(CONFIG_OF_LIBFDT)
        ret = boot_relocate_fdt (lmb, bootmap_base,
@@ -186,7 +165,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
         */
        if (of_size) {
                /* pass in dummy initrd info, we'll fix up later */
-               if (fdt_chosen(of_flat_tree, rd_data_start, rd_data_end, 0) < 0) {
+               if (fdt_chosen(of_flat_tree, images->rd_start, images->rd_end, 0) < 0) {
                        fdt_error ("/chosen node create failed");
                        goto error;
                }
@@ -236,7 +215,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        }
 #endif /* CONFIG_OF_LIBFDT */
 
-       ret = boot_ramdisk_high (lmb, rd_data_start, rd_len, &initrd_start, &initrd_end);
+       ret = boot_ramdisk_high (lmb, images->rd_start, rd_len, &initrd_start, &initrd_end);
        if (ret)
                goto error;
 
@@ -250,7 +229,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                /* Look for the dummy entry and delete it */
                for (j = 0; j < total; j++) {
                        fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
-                       if (addr == rd_data_start) {
+                       if (addr == images->rd_start) {
                                fdt_del_mem_rsv(of_flat_tree, j);
                                break;
                        }
@@ -282,14 +261,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 +289,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 ;