X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib_sparc%2Fbootm.c;h=c62cf57d80b25584187c777c09d595d342714b25;hb=091dc9f6adaf572b067ae91af92c4e7db33d7903;hp=ac15396f69d5ee78a030b0fd9054e54656fa229b;hpb=c160a9544743e80e8889edb2275538e7764ce334;p=u-boot diff --git a/lib_sparc/bootm.c b/lib_sparc/bootm.c index ac15396f69..c62cf57d80 100644 --- a/lib_sparc/bootm.c +++ b/lib_sparc/bootm.c @@ -27,13 +27,13 @@ #include #include #include +#include #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,38 +82,32 @@ 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 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) { - load = image_get_load(images->legacy_hdr_os); -#if defined(CONFIG_FIT) - } else if (images->fit_uname_os) { - 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 *))images->ep; @@ -139,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"); @@ -174,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; @@ -203,12 +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: - do_reset(cmdtp, flag, argc, argv); - return; + return 1; }