bootm: refactor ramdisk locating code
authorKumar Gala <galak@kernel.crashing.org>
Fri, 15 Aug 2008 13:24:37 +0000 (08:24 -0500)
committerWolfgang Denk <wd@denx.de>
Tue, 26 Aug 2008 21:35:24 +0000 (23:35 +0200)
Move determing if we have a ramdisk and where its located into the
common code. Keep track of the ramdisk start and end in the
bootm_headers_t image struct.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
common/cmd_bootm.c
include/image.h
lib_arm/bootm.c
lib_avr32/bootm.c
lib_i386/bootm.c
lib_m68k/bootm.c
lib_mips/bootm.c
lib_ppc/bootm.c
lib_sparc/bootm.c

index 3f63b847f0b05605ebbb83352acc554737d87bda..56236b913240f8324b252ae287026ac9425db7ae 100644 (file)
@@ -116,6 +116,33 @@ void __board_lmb_reserve(struct lmb *lmb)
 }
 void board_lmb_reserve(struct lmb *lmb) __attribute__((weak, alias("__board_lmb_reserve")));
 
+#if defined(__ARM__)
+  #define IH_INITRD_ARCH IH_ARCH_ARM
+#elif defined(__avr32__)
+  #define IH_INITRD_ARCH IH_ARCH_AVR32
+#elif defined(__bfin__)
+  #define IH_INITRD_ARCH IH_ARCH_BLACKFIN
+#elif defined(__I386__)
+  #define IH_INITRD_ARCH IH_ARCH_I386
+#elif defined(__M68K__)
+  #define IH_INITRD_ARCH IH_ARCH_M68K
+#elif defined(__microblaze__)
+  #define IH_INITRD_ARCH IH_ARCH_MICROBLAZE
+#elif defined(__mips__)
+  #define IH_INITRD_ARCH IH_ARCH_MIPS
+#elif defined(__nios__)
+  #define IH_INITRD_ARCH IH_ARCH_NIOS
+#elif defined(__nios2__)
+  #define IH_INITRD_ARCH IH_ARCH_NIOS2
+#elif defined(__PPC__)
+  #define IH_INITRD_ARCH IH_ARCH_PPC
+#elif defined(__sh__)
+  #define IH_INITRD_ARCH IH_ARCH_SH
+#elif defined(__sparc__)
+  #define IH_INITRD_ARCH IH_ARCH_SPARC
+#else
+# error Unknown CPU type
+#endif
 
 /*******************************************************************/
 /* bootm - boot application image from image in memory */
@@ -133,6 +160,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        ulong           load_start, load_end;
        ulong           mem_start;
        phys_size_t     mem_size;
+       int             ret;
 
        struct lmb lmb;
 
@@ -222,6 +250,16 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                return 1;
        }
 
+       if (os == IH_OS_LINUX) {
+               /* find ramdisk */
+               ret = boot_get_ramdisk (argc, argv, &images, IH_INITRD_ARCH,
+                               &images.rd_start, &images.rd_end);
+               if (ret) {
+                       puts ("Ramdisk image is corrupt\n");
+                       return 1;
+               }
+       }
+
        image_start = (ulong)os_hdr;
        load_end = 0;
        type_name = genimg_get_type_name (type);
index e16c2534052c38fe8ddcbf64019ddbef34cba0b6..b8577a0b1219f9a1f6b7afba2bc4ba0b1dfe6757 100644 (file)
@@ -221,6 +221,8 @@ typedef struct bootm_headers {
 
        ulong           ep;             /* entry point of OS */
 
+       ulong           rd_start, rd_end;/* ramdisk start/end */
+
        int             verify;         /* getenv("verify")[0] != 'n' */
        struct lmb      *lmb;           /* for memory mgmt */
 } bootm_headers_t;
index 5660a503dc614d5fe3a7726364a0ccb320681340..f9f702fff75db015fe98677e929c710f5a9b490d 100644 (file)
@@ -61,7 +61,6 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                     bootm_headers_t *images)
 {
-       ulong   initrd_start, initrd_end;
        bd_t    *bd = gd->bd;
        char    *s;
        int     machid = bd->bi_arch_number;
@@ -80,11 +79,6 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                printf ("Using machid 0x%x from environment\n", machid);
        }
 
-       ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_ARM,
-                       &initrd_start, &initrd_end);
-       if (ret)
-               goto error;
-
        show_boot_progress (15);
 
        debug ("## Transferring control to Linux (at address %08lx) ...\n",
@@ -111,8 +105,8 @@ void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        setup_commandline_tag (bd, commandline);
 #endif
 #ifdef CONFIG_INITRD_TAG
-       if (initrd_start && initrd_end)
-               setup_initrd_tag (bd, initrd_start, initrd_end);
+       if (images->rd_start && images->rd_end)
+               setup_initrd_tag (bd, images->rd_start, images->rd_end);
 #endif
 #if defined (CONFIG_VFD) || defined (CONFIG_LCD)
        setup_videolfb_tag ((gd_t *) gd);
index 7beab9986897f497b4e2730b8873b01b36b0b448..762701fa26f4d2a2ec7b0d655b2dac3713e8a5fd 100644 (file)
@@ -176,7 +176,6 @@ static void setup_end_tag(struct tag *params)
 void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                    bootm_headers_t *images)
 {
-       ulong   initrd_start, initrd_end;
        void    (*theKernel)(int magic, void *tagtable);
        struct  tag *params, *params_start;
        char    *commandline = getenv("bootargs");
@@ -184,20 +183,15 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 
        theKernel = (void *)images->ep;
 
-       ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_AVR32,
-                       &initrd_start, &initrd_end);
-       if (ret)
-               goto error;
-
        show_boot_progress (15);
 
        params = params_start = (struct tag *)gd->bd->bi_boot_params;
        params = setup_start_tag(params);
        params = setup_memory_tags(params);
-       if (initrd_start) {
+       if (images->rd_start) {
                params = setup_ramdisk_tag(params,
-                                          PHYSADDR(initrd_start),
-                                          PHYSADDR(initrd_end));
+                                          PHYSADDR(images->rd_start),
+                                          PHYSADDR(images->rd_end));
        }
        params = setup_commandline_tag(params, commandline);
        params = setup_clock_tags(params);
index 452eef73bdaf91106b52eef7603e6662996d3e60..8c0b225a1771325aba3721318648582c58a8ab1b 100644 (file)
@@ -36,7 +36,6 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
 {
        void            *base_ptr;
        ulong           os_data, os_len;
-       ulong           initrd_start, initrd_end;
        image_header_t  *hdr;
        int             ret;
 #if defined(CONFIG_FIT)
@@ -44,11 +43,6 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        size_t          len;
 #endif
 
-       ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_I386,
-                       &initrd_start, &initrd_end);
-       if (ret)
-               goto error;
-
        if (images->legacy_hdr_valid) {
                hdr = images->legacy_hdr_os;
                if (image_check_type (hdr, IH_TYPE_MULTI)) {
@@ -76,7 +70,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        }
 
        base_ptr = load_zimage ((void*)os_data, os_len,
-                       initrd_start, initrd_end - initrd_start, 0);
+                       images->rd_start, images->rd_end - images->rd_start, 0);
 
        if (NULL == base_ptr) {
                printf ("## Kernel loading failed ...\n");
index fe658fea0c94ee06d099a4b143bb7e53bad93233..241721dad769fd2304a604ea332aa6f93f1559d5 100644 (file)
@@ -50,7 +50,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
 {
        ulong sp;
 
-       ulong rd_data_start, rd_data_end, rd_len;
+       ulong rd_len;
        ulong initrd_start, initrd_end;
        int ret;
 
@@ -95,14 +95,8 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag,
 
        kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))images->ep;
 
-       /* find ramdisk */
-       ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_M68K,
-                       &rd_data_start, &rd_data_end);
-       if (ret)
-               goto error;
-
-       rd_len = rd_data_end - rd_data_start;
-       ret = boot_ramdisk_high (lmb, rd_data_start, rd_len,
+       rd_len = images->rd_end - images->rd_start;
+       ret = boot_ramdisk_high (lmb, images->rd_start, rd_len,
                        &initrd_start, &initrd_end);
        if (ret)
                goto error;
index 7df6ce66a59ed329cf6bef23d6ddb734c0876a9e..9869c33372e925abd4f1bca8d28bf1487440ea9e 100644 (file)
@@ -48,7 +48,6 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
                     bootm_headers_t *images)
 {
-       ulong   initrd_start, initrd_end;
        void    (*theKernel) (int, char **, char **, int *);
        char    *commandline = getenv ("bootargs");
        char    env_buf[12];
@@ -58,11 +57,6 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
        /* find kernel entry point */
        theKernel = (void (*)(int, char **, char **, int *))images->ep;
 
-       ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_MIPS,
-                       &initrd_start, &initrd_end);
-       if (ret)
-               goto error;
-
        show_boot_progress (15);
 
 #ifdef DEBUG
@@ -82,10 +76,10 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
 
        linux_env_set ("memsize", env_buf);
 
-       sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (initrd_start));
-       linux_env_set ("initrd_start", env_buf);
+       sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (images->rd_start));
+       linux_env_set ("images->rd_start", env_buf);
 
-       sprintf (env_buf, "0x%X", (uint) (initrd_end - initrd_start));
+       sprintf (env_buf, "0x%X", (uint) (images->rd_end - images->rd_start));
        linux_env_set ("initrd_size", env_buf);
 
        sprintf (env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart));
index b08ee0dc4d0cdb0fc4744eb6de2316b233ea73a4..e6a6e4461d4b28cfb801bc5bf63f75a436266713 100644 (file)
@@ -73,7 +73,7 @@ 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;
 
@@ -153,13 +153,7 @@ do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                set_clocks_in_mhz(kbd);
        }
 
-       /* 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,
@@ -171,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;
                }
@@ -221,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;
 
@@ -235,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;
                        }
index ac15396f69d5ee78a030b0fd9054e54656fa229b..71d34baaddf3cac0a5a4849ae12e6530c79e0457 100644 (file)
@@ -89,7 +89,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
        char *bootargs;
        ulong load;
        ulong initrd_start, initrd_end;
-       ulong rd_data_start, rd_data_end, rd_len;
+       ulong rd_len;
        unsigned int data, len, checksum;
        unsigned int initrd_addr, kernend;
        void (*kernel) (struct linux_romvec *, void *);
@@ -139,19 +139,8 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
         * extracted and is writeable.
         */
 
-       /*
-        * Are we going to use an initrd image?
-        */
-       ret = boot_get_ramdisk(argc, argv, images, IH_ARCH_SPARC,
-                              &rd_data_start, &rd_data_end);
-       if (ret) {
-               /* RAM disk found but was corrupt */
-               puts("RAM Disk corrupt\n");
-               goto error;
-       }
-
        /* Calc length of RAM disk, if zero no ramdisk available */
-       rd_len = rd_data_end - rd_data_start;
+       rd_len = images->rd_end - images->rd_start;
 
        if (rd_len) {
 
@@ -161,7 +150,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
                 */
                lmb_reserve(lmb, CFG_RELOC_MONITOR_BASE, CFG_RAM_END);
 
-               ret = boot_ramdisk_high(lmb, rd_data_start, rd_len,
+               ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
                                        &initrd_start, &initrd_end);
                if (ret) {
                        puts("### Failed to relocate RAM disk\n");