X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib_sparc%2Fbootm.c;h=c62cf57d80b25584187c777c09d595d342714b25;hb=5bc7cbc15b1890682c0b279f708914518bd25f8d;hp=b1a3d98c155dfb56611a3d5e1685f2ece1aff815;hpb=3216ca9692ff80d7c638723ef448f3d36301d9e7;p=u-boot diff --git a/lib_sparc/bootm.c b/lib_sparc/bootm.c index b1a3d98c15..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,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; @@ -211,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; }