On 03/15/2012 02:52 AM, Marek Vasut wrote: > From: Marek Vasut <marek.va...@gmail.com> > > This command boots Linux zImage from where the zImage is loaded to. Passing > initrd and fdt is supported. >
This is great! However, the initrd is still in the u-boot image format, right? If a raw initrd is supported, then we could get rid of flash-kernel on disk-based debian/ubuntu systems. The file size is known from the filesystem, but then needs to get to the bootz command somehow. Rob > Tested on i.MX28 based DENX M28EVK > Tested on PXA270 based Voipac PXA270. > > NOTE: This currently only supports ARM, but other architectures can be easily > added by defining bootz_setup(). > > Signed-off-by: Marek Vasut <marek.va...@gmail.com> > Cc: Tom Warren <twar...@nvidia.com> > Cc: albert.u.b...@aribaud.net > Cc: aflem...@gmail.com, > Cc: Simon Glass <s...@chromium.org>, > Cc: Stephen Warren <swar...@nvidia.com> > Cc: Nicolas Pitre <n...@fluxnic.net> > Cc: Wolfgang Denk <w...@denx.de> > Cc: Detlev Zundel <d...@denx.de> > --- > README | 8 +++ > arch/arm/lib/bootm.c | 30 ++++++++++ > common/cmd_bootm.c | 141 > +++++++++++++++++++++++++++++++++++++++++++--- > include/config_cmd_all.h | 1 + > 4 files changed, 171 insertions(+), 9 deletions(-) > > V2: Use CONFIG_BOOTZ_MAX_KERNEL_LMB_SIZE to reserve kernel LMB > V3: Compute the LMB size at runtime (obsoletes V2) > Move shared code to image.c/image.h > Sync with latest U-Boot > V4: Add all this into cmd_bootm. Therefore, this is part of cmd_bootm > (basically > it's stripped-down version). Also, separate out arm-specific component > into > arm-specific location. > V5: Staticize bootz_setup(), add information into README. > V6: Make cmd_bootz() static. > > diff --git a/README b/README > index 4021715..b273070 100644 > --- a/README > +++ b/README > @@ -3594,6 +3594,7 @@ go - start application at address 'addr' > run - run commands in an environment variable > bootm - boot application image from memory > bootp - boot image via network using BootP/TFTP protocol > +bootz - boot zImage from memory > tftpboot- boot image via network using TFTP protocol > and env variables "ipaddr" and "serverip" > (and eventually "gatewayip") > @@ -4414,6 +4415,13 @@ U-Boot supports the following image types: > useful when you configure U-Boot to use a real shell (hush) > as command interpreter. > > +Booting the Linux zImage: > +------------------------- > + > +On some platforms, it's possible to boot Linux zImage. This is done > +using the "bootz" command. The syntax of "bootz" command is the same > +as the syntax of "bootm" command. > + > > Standalone HOWTO: > ================= > diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c > index afa0093..ec46d76 100644 > --- a/arch/arm/lib/bootm.c > +++ b/arch/arm/lib/bootm.c > @@ -344,3 +344,33 @@ static ulong get_sp(void) > asm("mov %0, sp" : "=r"(ret) : ); > return ret; > } > + > +#ifdef CONFIG_CMD_BOOTZ > + > +struct zimage_header { > + uint32_t code[9]; > + uint32_t zi_magic; > + uint32_t zi_start; > + uint32_t zi_end; > +}; > + > +#define LINUX_ARM_ZIMAGE_MAGIC 0x016f2818 > + > +int bootz_setup(void *image, void **start, void **end) > +{ > + struct zimage_header *zi = (struct zimage_header *)image; > + > + if (zi->zi_magic != LINUX_ARM_ZIMAGE_MAGIC) { > + puts("Bad Linux ARM zImage magic!\n"); > + return 1; > + } > + > + *start = (void *)zi->zi_start; > + *end = (void *)zi->zi_end; > + > + debug("Kernel image @ 0x%08x [ 0x%08x - 0x%08x ]\n", > + (uint32_t)image, (uint32_t)*start, (uint32_t)*end); > + > + return 0; > +} > +#endif /* CONFIG_CMD_BOOTZ */ > diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c > index d5745b1..b49d4f7 100644 > --- a/common/cmd_bootm.c > +++ b/common/cmd_bootm.c > @@ -169,25 +169,25 @@ void arch_preboot_os(void) __attribute__((weak, > alias("__arch_preboot_os"))); > > #define IH_INITRD_ARCH IH_ARCH_DEFAULT > > -static void bootm_start_lmb(void) > -{ > #ifdef CONFIG_LMB > +static void boot_start_lmb(bootm_headers_t *images) > +{ > ulong mem_start; > phys_size_t mem_size; > > - lmb_init(&images.lmb); > + lmb_init(&images->lmb); > > mem_start = getenv_bootm_low(); > mem_size = getenv_bootm_size(); > > - lmb_add(&images.lmb, (phys_addr_t)mem_start, mem_size); > + lmb_add(&images->lmb, (phys_addr_t)mem_start, mem_size); > > - arch_lmb_reserve(&images.lmb); > - board_lmb_reserve(&images.lmb); > + arch_lmb_reserve(&images->lmb); > + board_lmb_reserve(&images->lmb); > +} > #else > -# define lmb_reserve(lmb, base, size) > +static inline void boot_start_lmb(bootm_headers_t *images) { } > #endif > -} > > static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const > argv[]) > { > @@ -197,7 +197,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[] > memset((void *)&images, 0, sizeof(images)); > images.verify = getenv_yesno("verify"); > > - bootm_start_lmb(); > + boot_start_lmb(&images); > > /* get kernel image header, start address and length */ > os_hdr = boot_get_kernel(cmdtp, flag, argc, argv, > @@ -1523,3 +1523,126 @@ static int do_bootm_integrity(int flag, int argc, > char * const argv[], > return 1; > } > #endif > + > +#ifdef CONFIG_CMD_BOOTZ > + > +static int __bootz_setup(void *image, void **start, void **end) > +{ > + /* Please define bootz_setup() for your platform */ > + > + puts("Your platform's zImage format isn't supported yet!\n"); > + return -1; > +} > +int bootz_setup(void *image, void **start, void **end) > + __attribute__((weak, alias("__bootz_setup"))); > + > +/* > + * zImage booting support > + */ > +static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc, > + char * const argv[], bootm_headers_t *images) > +{ > + int ret; > + void *zi_start, *zi_end; > + > + memset(images, 0, sizeof(bootm_headers_t)); > + > + boot_start_lmb(images); > + > + /* Setup Linux kernel zImage entry point */ > + if (argc < 2) { > + images->ep = load_addr; > + debug("* kernel: default image load address = 0x%08lx\n", > + load_addr); > + } else { > + images->ep = simple_strtoul(argv[1], NULL, 16); > + debug("* kernel: cmdline image address = 0x%08lx\n", > + images->ep); > + } > + > + ret = bootz_setup((void *)images->ep, &zi_start, &zi_end); > + if (ret != 0) > + return 1; > + > + lmb_reserve(&images->lmb, images->ep, zi_end - zi_start); > + > + /* 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 or invalid\n"); > + return 1; > + } > + > +#if defined(CONFIG_OF_LIBFDT) > + /* find flattened device tree */ > + ret = boot_get_fdt(flag, argc, argv, images, > + &images->ft_addr, &images->ft_len); > + if (ret) { > + puts("Could not find a valid device tree\n"); > + return 1; > + } > + > + set_working_fdt_addr(images->ft_addr); > +#endif > + > + return 0; > +} > + > +static int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const > argv[]) > +{ > + ulong iflag; > + bootm_headers_t images; > + > + if (bootz_start(cmdtp, flag, argc, argv, &images)) > + return 1; > + > + /* > + * We have reached the point of no return: we are going to > + * overwrite all exception vector code, so we cannot easily > + * recover from any failures any more... > + */ > + iflag = disable_interrupts(); > + > +#if defined(CONFIG_CMD_USB) > + /* > + * turn off USB to prevent the host controller from writing to the > + * SDRAM while Linux is booting. This could happen (at least for OHCI > + * controller), because the HCCA (Host Controller Communication Area) > + * lies within the SDRAM and the host controller writes continously to > + * this area (as busmaster!). The HccaFrameNumber is for example > + * updated every 1 ms within the HCCA structure in SDRAM! For more > + * details see the OpenHCI specification. > + */ > + usb_stop(); > +#endif > + > +#ifdef CONFIG_SILENT_CONSOLE > + fixup_silent_linux(); > +#endif > + arch_preboot_os(); > + > + do_bootm_linux(0, argc, argv, &images); > +#ifdef DEBUG > + puts("\n## Control returned to monitor - resetting...\n"); > +#endif > + do_reset(cmdtp, flag, argc, argv); > + > + return 1; > +} > + > +U_BOOT_CMD( > + bootz, CONFIG_SYS_MAXARGS, 1, do_bootz, > + "boot Linux zImage image from memory", > + "[addr [initrd] [fdt]]\n - boot Linux zImage stored in memory\n" > + "\tThe argument 'initrd' is optional and specifies the address\n" > + "\tof the initrd in memory.\n" > +#if defined(CONFIG_OF_LIBFDT) > + "\tWhen booting a Linux kernel which requires a flat device-tree\n" > + "\ta third argument is required which is the address of the\n" > + "\tdevice-tree blob. To boot that kernel without an initrd image,\n" > + "\tuse a '-' for the second argument. If you do not pass a third\n" > + "\ta bd_info struct will be passed instead\n" > +#endif > +); > +#endif /* CONFIG_CMD_BOOTZ */ > diff --git a/include/config_cmd_all.h b/include/config_cmd_all.h > index 9716f9c..2c6b829 100644 > --- a/include/config_cmd_all.h > +++ b/include/config_cmd_all.h > @@ -20,6 +20,7 @@ > #define CONFIG_CMD_BEDBUG /* Include BedBug Debugger */ > #define CONFIG_CMD_BMP /* BMP support */ > #define CONFIG_CMD_BOOTD /* bootd */ > +#define CONFIG_CMD_BOOTZ /* boot zImage */ > #define CONFIG_CMD_BSP /* Board Specific functions */ > #define CONFIG_CMD_CACHE /* icache, dcache */ > #define CONFIG_CMD_CDP /* Cisco Discovery Protocol */ _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot