diff options
author | Ye.Li <B37916@freescale.com> | 2014-01-10 17:55:46 +0800 |
---|---|---|
committer | Ye.Li <B37916@freescale.com> | 2014-01-10 18:23:05 +0800 |
commit | 372f1e0c87e1e43b4d4dac7b05ddd077aff7d24e (patch) | |
tree | cc8f8e594ddd829873798fc0a134812e06ae6bac /common | |
parent | c089f6c136bf04dd813633a00bf47cd6e1a5bb30 (diff) | |
download | u-boot-imx-372f1e0c87e1e43b4d4dac7b05ddd077aff7d24e.zip u-boot-imx-372f1e0c87e1e43b4d4dac7b05ddd077aff7d24e.tar.gz u-boot-imx-372f1e0c87e1e43b4d4dac7b05ddd077aff7d24e.tar.bz2 |
ENGR00294746 ARM:imx6:sabresd/sabreauto/slevk Support android FDT embedded image
Since the "mkbootimg" tool can't use the "unused" fields of
bootimg header, Android will set the FDT info at the "second_addr"
and "second_size" fields.
To support this change, booti command was changed to use new fields.
The memory management(lmb) is added in booti, and the relocation of
DTB and ramdisk is disabled at default, to prevent relocating to
a high address which overlaps kernel's vmalloc area.
The kernel image which needs FDT accompanied is larger than old. So in
making boot.img, suggest to set "--base" parameter enough offset from
kernel entry "0x10008000" to keep ramdisk and DTB not be overwritten by
zImage decompression. For example "--base 0x14000000"
Signed-off-by: Ye.Li <B37916@freescale.com>
Diffstat (limited to 'common')
-rw-r--r-- | common/cmd_fastboot.c | 66 |
1 files changed, 47 insertions, 19 deletions
diff --git a/common/cmd_fastboot.c b/common/cmd_fastboot.c index 7d07978..ab512bb 100644 --- a/common/cmd_fastboot.c +++ b/common/cmd_fastboot.c @@ -2,7 +2,7 @@ * Copyright 2008 - 2009 (C) Wind River Systems, Inc. * Tom Rix <Tom.Rix@windriver.com> * - * Copyright (C) 2010-2013 Freescale Semiconductor, Inc. + * Copyright (C) 2010-2014 Freescale Semiconductor, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -1504,6 +1504,27 @@ static unsigned char boothdr[512] __aligned(ARCH_DMA_MINALIGN); #define ALIGN_SECTOR(n, pagesz) ((n + (pagesz - 1)) & (~(pagesz - 1))) +#ifdef CONFIG_LMB +static void boot_start_lmb(bootm_headers_t *images) +{ + ulong mem_start; + phys_size_t mem_size; + + 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); + + 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 + /* booti <addr> [ mmc0 | mmc1 [ <partition> ] ] */ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { @@ -1604,16 +1625,16 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #ifdef CONFIG_OF_LIBFDT /* load the dtb file */ - if (hdr->unused[0] && hdr->unused[1]) { + if (hdr->second_size && hdr->second_addr) { sector += ALIGN_SECTOR(hdr->ramdisk_size, hdr->page_size) / 512; if (mmc->block_dev.block_read(mmcc, sector, - (hdr->unused[0] / 512) + 1, - (void *)hdr->unused[1]) < 0) { + (hdr->second_size / 512) + 1, + (void *)hdr->second_addr) < 0) { printf("booti: mmc failed to dtb\n"); goto fail; } /* flush cache after read */ - flush_cache((ulong)hdr->unused[1], hdr->unused[0]); /* FIXME */ + flush_cache((ulong)hdr->second_addr, hdr->second_size); /* FIXME */ } #endif /*CONFIG_OF_LIBFDT*/ @@ -1640,9 +1661,9 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) raddr = kaddr + ALIGN_SECTOR(hdr->kernel_size, hdr->page_size); end = raddr + hdr->ramdisk_size; #ifdef CONFIG_OF_LIBFDT - if (hdr->unused[0]) { + if (hdr->second_size) { fdtaddr = raddr + ALIGN_SECTOR(hdr->ramdisk_size, hdr->page_size); - end = fdtaddr + hdr->unused[0]; + end = fdtaddr + hdr->second_size; } #endif /*CONFIG_OF_LIBFDT*/ if (kaddr != hdr->kernel_addr) { @@ -1671,17 +1692,17 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } #ifdef CONFIG_OF_LIBFDT - if (hdr->unused[0] && fdtaddr != hdr->unused[1]) { + if (hdr->second_size && fdtaddr != hdr->second_addr) { /*check overlap*/ - if (((hdr->unused[1] >= addr) && - (hdr->unused[1] <= end)) || - ((addr >= hdr->unused[1]) && - (addr <= hdr->unused[1] + hdr->unused[0]))) { + if (((hdr->second_addr >= addr) && + (hdr->second_addr <= end)) || + ((addr >= hdr->second_addr) && + (addr <= hdr->second_addr + hdr->second_size))) { printf("Fail: booti address overlap with FDT address\n"); return 1; } - memmove((void *) hdr->unused[1], - (void *)fdtaddr, hdr->unused[0]); + memmove((void *) hdr->second_addr, + (void *)fdtaddr, hdr->second_size); } #endif /*CONFIG_OF_LIBFDT*/ } @@ -1689,8 +1710,8 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) printf("kernel @ %08x (%d)\n", hdr->kernel_addr, hdr->kernel_size); printf("ramdisk @ %08x (%d)\n", hdr->ramdisk_addr, hdr->ramdisk_size); #ifdef CONFIG_OF_LIBFDT - if (hdr->unused[0]) - printf("fdt @ %08x (%d)\n", hdr->unused[1], hdr->unused[0]); + if (hdr->second_size) + printf("fdt @ %08x (%d)\n", hdr->second_addr, hdr->second_size); #endif /*CONFIG_OF_LIBFDT*/ #ifdef CONFIG_SECURE_BOOT @@ -1721,14 +1742,21 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #endif /*CONFIG_CMDLINE_TAG*/ memset(&images, 0, sizeof(images)); + + /*Setup lmb for memory reserve*/ + boot_start_lmb(&images); + images.ep = hdr->kernel_addr; images.rd_start = hdr->ramdisk_addr; images.rd_end = hdr->ramdisk_addr + hdr->ramdisk_size; + /*Reserve memory for kernel image*/ + lmb_reserve(&images.lmb, images.ep, hdr->kernel_size); + #ifdef CONFIG_OF_LIBFDT - /*use unused fields for fdt, unused[0] = fdt size, unused[1] = fdt addr*/ - images.ft_addr = (char *)(hdr->unused[1]); - images.ft_len = (ulong)(hdr->unused[0]); + /*use secondary fields for fdt, second_size= fdt size, second_addr= fdt addr*/ + images.ft_addr = (char *)(hdr->second_addr); + images.ft_len = (ulong)(hdr->second_size); #endif /*CONFIG_OF_LIBFDT*/ do_bootm_linux(0, 0, NULL, &images); |