X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=common%2Fcmd_bootm.c;h=e30d212b0c9be94ac7927cd47eae121969f059f1;hb=b13fb01a62708492cae4b33c4d6fa9ae127905f4;hp=44331ab17819033d3ae007e4a8404dde3c56f881;hpb=bdccc4fedcf9c5fc1f06e8f833d792198c9d04ae;p=kernel%2Fu-boot.git diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 44331ab..e30d212 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -116,6 +117,9 @@ static boot_os_Fcn do_bootm_linux; #else extern boot_os_Fcn do_bootm_linux; #endif +#ifdef CONFIG_SILENT_CONSOLE +static void fixup_silent_linux (void); +#endif static boot_os_Fcn do_bootm_netbsd; static boot_os_Fcn do_bootm_rtems; #if (CONFIG_COMMANDS & CFG_CMD_ELF) @@ -142,9 +146,10 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ulong addr; ulong data, len, checksum; ulong *len_ptr; + uint unc_len = 0x400000; int i, verify; char *name, *s; - int (*appl)(cmd_tbl_t *, int, int, char *[]); + int (*appl)(int, char *[]); image_header_t *hdr = &header; s = getenv ("verify"); @@ -200,7 +205,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) SHOW_BOOT_PROGRESS (3); /* for multi-file images we need the data part, too */ - print_image_hdr (hdr); + print_image_hdr ((image_header_t *)addr); data = addr + sizeof(image_header_t); len = ntohl(hdr->ih_size); @@ -233,6 +238,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) if (hdr->ih_arch != IH_CPU_I386) #elif defined(__mips__) if (hdr->ih_arch != IH_CPU_MIPS) +#elif defined(__nios__) + if (hdr->ih_arch != IH_CPU_NIOS) #else # error Unknown CPU type #endif @@ -244,17 +251,24 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) SHOW_BOOT_PROGRESS (5); switch (hdr->ih_type) { - case IH_TYPE_STANDALONE: name = "Standalone Application"; - break; - case IH_TYPE_KERNEL: name = "Kernel Image"; - break; - case IH_TYPE_MULTI: name = "Multi-File Image"; - len = ntohl(len_ptr[0]); - /* OS kernel is always the first image */ - data += 8; /* kernel_len + terminator */ - for (i=1; len_ptr[i]; ++i) - data += 4; - break; + case IH_TYPE_STANDALONE: + name = "Standalone Application"; + /* A second argument overwrites the load address */ + if (argc > 2) { + hdr->ih_load = simple_strtoul(argv[2], NULL, 16); + } + break; + case IH_TYPE_KERNEL: + name = "Kernel Image"; + break; + case IH_TYPE_MULTI: + name = "Multi-File Image"; + len = ntohl(len_ptr[0]); + /* OS kernel is always the first image */ + data += 8; /* kernel_len + terminator */ + for (i=1; len_ptr[i]; ++i) + data += 4; + break; default: printf ("Wrong Image Type for %s command\n", cmdtp->name); SHOW_BOOT_PROGRESS (-5); return 1; @@ -307,13 +321,26 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) break; case IH_COMP_GZIP: printf (" Uncompressing %s ... ", name); - if (gunzip ((void *)ntohl(hdr->ih_load), 0x400000, + if (gunzip ((void *)ntohl(hdr->ih_load), unc_len, (uchar *)data, (int *)&len) != 0) { printf ("GUNZIP ERROR - must RESET board to recover\n"); SHOW_BOOT_PROGRESS (-6); do_reset (cmdtp, flag, argc, argv); } break; +#ifdef CONFIG_BZIP2 + case IH_COMP_BZIP2: + printf (" Uncompressing %s ... ", name); + i = BZ2_bzBuffToBuffDecompress ((char*)ntohl(hdr->ih_load), + &unc_len, (char *)data, len, 0, 0); + if (i != BZ_OK) { + printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i); + SHOW_BOOT_PROGRESS (-6); + udelay(100000); + do_reset (cmdtp, flag, argc, argv); + } + break; +#endif /* CONFIG_BZIP2 */ default: if (iflag) enable_interrupts(); @@ -332,10 +359,14 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /* load (and uncompress), but don't start if "autostart" * is set to "no" */ - if (((s = getenv("autostart")) != NULL) && (strcmp(s,"no") == 0)) + if (((s = getenv("autostart")) != NULL) && (strcmp(s,"no") == 0)) { + char buf[32]; + sprintf(buf, "%lX", len); + setenv("filesize", buf); return 0; - appl = (int (*)(cmd_tbl_t *, int, int, char *[]))ntohl(hdr->ih_ep); - (*appl)(cmdtp, flag, argc-1, &argv[1]); + } + appl = (int (*)(int, char *[]))ntohl(hdr->ih_ep); + (*appl)(argc-1, &argv[1]); return 0; case IH_TYPE_KERNEL: case IH_TYPE_MULTI: @@ -353,6 +384,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) switch (hdr->ih_os) { default: /* handled by (original) Linux case */ case IH_OS_LINUX: +#ifdef CONFIG_SILENT_CONSOLE + fixup_silent_linux(); +#endif do_bootm_linux (cmdtp, flag, argc, argv, addr, len_ptr, verify); break; @@ -407,6 +441,40 @@ U_BOOT_CMD( " 'arg' can be the address of an initrd image\n" ); +#ifdef CONFIG_SILENT_CONSOLE +static void +fixup_silent_linux () +{ + DECLARE_GLOBAL_DATA_PTR; + char buf[256], *start, *end; + char *cmdline = getenv ("bootargs"); + + /* Only fix cmdline when requested */ + if (!(gd->flags & GD_FLG_SILENT)) + return; + + debug ("before silent fix-up: %s\n", cmdline); + if (cmdline) { + if ((start = strstr (cmdline, "console=")) != NULL) { + end = strchr (start, ' '); + strncpy (buf, cmdline, (start - cmdline + 8)); + if (end) + strcpy (buf + (start - cmdline + 8), end); + else + buf[start - cmdline + 8] = '\0'; + } else { + strcpy (buf, cmdline); + strcat (buf, " console="); + } + } else { + strcpy (buf, "console="); + } + + setenv ("bootargs", buf); + debug ("after silent fix-up: %s\n", buf); +} +#endif /* CONFIG_SILENT_CONSOLE */ + #ifdef CONFIG_PPC static void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, @@ -493,7 +561,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, /* convert all clock information to MHz */ kbd->bi_intfreq /= 1000000L; kbd->bi_busfreq /= 1000000L; -#if defined(CONFIG_8260) +#if defined(CONFIG_8260) || defined(CONFIG_MPC8560) kbd->bi_cpmfreq /= 1000000L; kbd->bi_brgfreq /= 1000000L; kbd->bi_sccfreq /= 1000000L; @@ -693,7 +761,7 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int flag, SHOW_BOOT_PROGRESS (15); -#ifdef CFG_INIT_RAM_LOCK +#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500) unlock_ram_in_cache(); #endif /* @@ -1206,6 +1274,13 @@ int gunzip(void *dst, int dstlen, unsigned char *src, int *lenp) return (0); } +#ifdef CONFIG_BZIP2 +void bz_internal_error(int errcode) +{ + printf ("BZIP2 internal error %d\n", errcode); +} +#endif /* CONFIG_BZIP2 */ + static void do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify) @@ -1269,4 +1344,3 @@ do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag, } #endif /* CONFIG_LYNXKDI */ -