]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - lib_sparc/bootm.c
Merge branch 'master' of git://git.denx.de/u-boot-ppc4xx
[karo-tx-uboot.git] / lib_sparc / bootm.c
index 8900b2e5814061aaaa4241c6e6ec57b00a07aca8..c62cf57d80b25584187c777c09d595d342714b25 100644 (file)
 #include <asm/byteorder.h>
 #include <asm/prom.h>
 #include <asm/cache.h>
+#include <image.h>
 
 #define PRINT_KERNEL_HEADER
 
 extern image_header_t header;
 extern void srmmu_init_cpu(unsigned int entry);
 extern void prepare_bootargs(char *bootargs);
-extern int do_reset(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]);
 
 #ifdef CONFIG_USB_UHCI
 extern int usb_lowlevel_stop(void);
@@ -82,49 +82,35 @@ struct __attribute__ ((packed)) {
 /* temporary initrd image holder */
 image_header_t ihdr;
 
+void arch_lmb_reserve(struct lmb *lmb)
+{
+       /* Reserve the space used by PROM and stack. This is done
+        * to avoid that the RAM image is copied over stack or
+        * PROM.
+        */
+       lmb_reserve(lmb, CONFIG_SYS_RELOC_MONITOR_BASE, CONFIG_SYS_RAM_END);
+}
+
 /* boot the linux kernel */
-void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
-                   bootm_headers_t * images)
+int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t * images)
 {
        char *bootargs;
-       ulong ep, 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 *);
-       struct lmb *lmb = images->lmb;
+       struct lmb *lmb = &images->lmb;
        int ret;
 
-       if (images->legacy_hdr_valid) {
-               ep = image_get_ep(images->legacy_hdr_os);
-               load = image_get_load(images->legacy_hdr_os);
-#if defined(CONFIG_FIT)
-       } else if (images->fit_uname_os) {
-               int 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;
-               }
-
-               ret = fit_image_get_load(images->fit_hdr_os,
-                                        images->fit_noffset_os, &load);
-               if (ret) {
-                       puts("Can't get load address property!\n");
-                       goto error;
-               }
-#endif
-       } else {
-               puts("Could not find kernel entry point!\n");
-               goto error;
-       }
+       if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
+               return 1;
 
        /* Get virtual address of kernel start */
-       linux_hdr = (void *)load;
+       linux_hdr = (void *)images->os.load;
 
        /* */
-       kernel = (void (*)(struct linux_romvec *, void *))ep;
+       kernel = (void (*)(struct linux_romvec *, void *))images->ep;
 
        /* check for a SPARC kernel */
        if ((linux_hdr->hdr[0] != 'H') ||
@@ -147,29 +133,11 @@ 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) {
-
-               /* Reserve the space used by PROM and stack. This is done
-                * to avoid that the RAM image is copied over stack or
-                * PROM.
-                */
-               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");
@@ -182,7 +150,7 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
                 * Set INITRD Image address relative to RAM Start
                 */
                linux_hdr->hdr_input.ver_0203.sparc_ramdisk_image =
-                   initrd_start - CFG_RAM_BASE;
+                   initrd_start - CONFIG_SYS_RAM_BASE;
                linux_hdr->hdr_input.ver_0203.sparc_ramdisk_size = rd_len;
                /* Clear READ ONLY flag if set to non-zero */
                linux_hdr->hdr_input.ver_0203.root_flags = 1;
@@ -204,9 +172,6 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
        bootargs = getenv("bootargs");
        prepare_bootargs(bootargs);
 
-       if (!images->autostart)
-               return;
-
        /* turn on mmu & setup context table & page table for process 0 (kernel) */
        srmmu_init_cpu((unsigned int)kernel);
 
@@ -214,13 +179,11 @@ void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[],
         * From now on the only code in u-boot that will be
         * executed is the PROM code.
         */
-       kernel(kernel_arg_promvec, (void *)ep);
+       kernel(kernel_arg_promvec, (void *)images->ep);
 
        /* It will never come to this... */
        while (1) ;
 
       error:
-       if (images->autostart)
-               do_reset(cmdtp, flag, argc, argv);
-       return;
+       return 1;
 }