[U-Boot] [PATCH v4 0/4] mpc8313: ids8313 board updates

- introduce CONFIG_IMAGE_FORMAT_LEGACY for enabling booting legacy image format. Disable this per default if CONFIG_FIT_SIGNATURE is defined. As the ids8313 board needs legacy image format and uses CONFIG_FIT_SIGNATURE, enable legacy image format for the ids8313 board
- add CONFIG_SYS_GENERIC_BOARD to the ids8313 board, therefore fdtdec_get_int() is moved out of lib/fdtdec.c as lib/fdtdec.c is only compiled if CONFIG_OF_CONTROL is defined, but defining this for the ids8313 board leads in conjunction with CONFIG_SYS_GENERIC_BOARD in booting error:
No valid FDT found - please append one to U-Boot binary, use u-boot-dtb.bin or define CONFIG_OF_EMBED. For sandbox, use -d <file.dtb>
So move the common used function fdtdec_get_int() out of lib/fdtdec.c into lib/fdtdec_common.c
Cc: Simon Glass sjg@chromium.org Cc: Kim Phillips kim.phillips@freescale.com Cc: Wolfgang Denk wd@denx.de Cc: Tom Rini trini@ti.com Cc: Michael Conrad Michael.Conrad@ids.de
Tested this patchset on the ids8313 board, MAKEALL for powerpc and arm adds no compiler errors/warnings.
While testing this patchset on the ids8313 board, I found, that current U-Boot compiles fine with eldk 5.5, but if erasing the sectors where U-Boot resists in the NOR flash, u-boot commands are not longer working :-(
$ powerpc-linux-gcc -v Using built-in specs. COLLECT_GCC=powerpc-linux-gcc COLLECT_LTO_WRAPPER=/opt/eldk-5.5/powerpc/sysroots/i686-eldk-linux/usr/libexec/powerpc-linux/gcc/powerpc-linux/4.8.1/lto-wrapper Target: powerpc-linux [...] Thread model: posix gcc version 4.8.1 (GCC) $
This problem does not pop up with eldk 5.4 or 5.3 !
Digged a little bit in it, and found that some (not all!) fmt strings are loaded from flash addresses not from ram addresses ...
gdb shows: Program received signal SIGTRAP, Trace/breakpoint trap. printf (fmt=0xfff5ad34 '\377' <repeats 200 times>..., fmt@entry=0x7fdad34 "parse_stream, end_trigger=%d\n") at /home/hs/ids/u-boot/common/console.c:479 ^^^^^^^^^^ addr in nor flash not in ram 479 { (gdb) bt #0 printf (fmt=0xfff5ad34 '\377' <repeats 200 times>..., fmt@entry=0x7fdad34 "parse_stream, end_trigger=%d\n") at /home/hs/ids/u-boot/common/console.c:479 #1 0x07f88c4c in parse_stream (end_trigger=10, input=0x775fe00, ctx=0x775fd60, dest=0x775fd7c) at /home/hs/ids/u-boot/common/hush.c:2942
this leads, if flash is erased, in a crash ... try to find out more ...
This problem seems a toolchain problem, as I tried older U-Boot versions with eldk 5.5 on this board, and all versions break ... I have no other mpc83xx board handy ... can somebody try this scenario on a mpc83xx based board? Kim?
Current U-Boot does work fine on a mpc52xx based board compiled with eldk 5.5, so it seems a mpc83xx specific problem?
Heiko Schocher (4): bootm: make use of legacy image format configurable mpc8313, signed fit: enable legacy image format on ids8313 board lib, fdt: move fdtdec_get_int() out of lib/fdtdec.c mpc8313: add CONFIG_SYS_GENERIC_BOARD to ids8313 board
README | 18 ++++++++++++++++++ common/cmd_bootm.c | 14 ++++++++++++++ common/cmd_disk.c | 4 ++++ common/cmd_fdc.c | 4 ++++ common/cmd_fpga.c | 2 ++ common/cmd_nand.c | 4 ++++ common/cmd_source.c | 4 ++++ common/cmd_ximg.c | 7 ++++++- common/image-fdt.c | 10 ++++++++-- common/image.c | 23 ++++++++++++++++------- doc/uImage.FIT/signature.txt | 3 +++ include/config_fallbacks.h | 8 ++++++++ include/configs/ids8313.h | 4 +++- include/configs/zynq-common.h | 1 + include/image.h | 2 ++ lib/Makefile | 1 + lib/fdtdec.c | 36 ------------------------------------ lib/fdtdec_common.c | 33 +++++++++++++++++++++++++++++++++ tools/fdtdec.c | 1 + 19 files changed, 132 insertions(+), 47 deletions(-) create mode 100644 lib/fdtdec_common.c

make the use of legacy image format configurable through the config define CONFIG_IMAGE_FORMAT_LEGACY.
When relying on signed FIT images with required signature check the legacy image format should be disabled. Therefore introduce this new define and enable legacy image format if CONFIG_FIT_SIGNATURE is not set. If CONFIG_FIT_SIGNATURE is set disable per default the legacy image format.
Signed-off-by: Heiko Schocher hs@denx.de Cc: Simon Glass sjg@chromium.org Cc: Lars Steubesand lars.steubesand@philips.com Cc: Mike Pearce mike@kaew.be Cc: Wolfgang Denk wd@denx.de Cc: Tom Rini trini@ti.com Cc: Michal Simek monstr@monstr.eu
--- - changes for v2: - make the legacy image format configurable through the define CONFIG_IMAGE_FORMAT_LEGACY.
Default: if not CONFIG_FIT_SIGNATURE is defined it is enabled, else disabled.
Disable it with CONFIG_DISABLE_IMAGE_LEGACY if CONFIG_FIT_SIGNATURE is not defined. - changes for v3: - enable legacy image format for zync as default, as Michak suggested.
- changes for v4: move changes for default settings in include/config_defaults.h to include/config_fallbacks.h, so board settings are considered as Lars Steubesand suggested. --- README | 18 ++++++++++++++++++ common/cmd_bootm.c | 14 ++++++++++++++ common/cmd_disk.c | 4 ++++ common/cmd_fdc.c | 4 ++++ common/cmd_fpga.c | 2 ++ common/cmd_nand.c | 4 ++++ common/cmd_source.c | 4 ++++ common/cmd_ximg.c | 7 ++++++- common/image-fdt.c | 10 ++++++++-- common/image.c | 23 ++++++++++++++++------- doc/uImage.FIT/signature.txt | 3 +++ include/config_fallbacks.h | 8 ++++++++ include/configs/zynq-common.h | 1 + include/image.h | 2 ++ 14 files changed, 94 insertions(+), 10 deletions(-)
diff --git a/README b/README index ace7091..795486d 100644 --- a/README +++ b/README @@ -3157,6 +3157,19 @@ FIT uImage format: -150 common/cmd_nand.c Incorrect FIT image format 151 common/cmd_nand.c FIT image format OK
+- legacy image format: + CONFIG_IMAGE_FORMAT_LEGACY + enables the legacy image format support in U-Boot. + + Default: + enabled if CONFIG_FIT_SIGNATURE is not defined. + + CONFIG_DISABLE_IMAGE_LEGACY + disable the legacy image format + + This define is introduced, as the legacy image format is + enabled per default for backward compatibility. + - FIT image support: CONFIG_FIT Enable support for the FIT uImage format. @@ -3173,6 +3186,11 @@ FIT uImage format: using a hash signed and verified using RSA. See doc/uImage.FIT/signature.txt for more details.
+ WARNING: When relying on signed FIT images with required + signature check the legacy image format is default + disabled. If a board need legacy image format support + enable this through CONFIG_IMAGE_FORMAT_LEGACY + - Standalone program support: CONFIG_STANDALONE_LOAD_ADDR
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index e683af3..21d0234 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -233,6 +233,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
/* get image parameters */ switch (genimg_get_format(os_hdr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: images.os.type = image_get_type(os_hdr); images.os.comp = image_get_comp(os_hdr); @@ -241,6 +242,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, images.os.end = image_get_image_end(os_hdr); images.os.load = image_get_load(os_hdr); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: if (fit_image_get_type(images.fit_hdr_os, @@ -838,6 +840,7 @@ int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd) return 0; }
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY) /** * image_get_kernel - verify legacy format kernel image * @img_addr: in RAM address of the legacy format image to be verified @@ -888,6 +891,7 @@ static image_header_t *image_get_kernel(ulong img_addr, int verify) } return hdr; } +#endif
/** * boot_get_kernel - find kernel image @@ -905,7 +909,9 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], bootm_headers_t *images, ulong *os_data, ulong *os_len) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) image_header_t *hdr; +#endif ulong img_addr; const void *buf; #if defined(CONFIG_FIT) @@ -943,6 +949,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, *os_data = *os_len = 0; buf = map_sysmem(img_addr, 0); switch (genimg_get_format(buf)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: printf("## Booting kernel from Legacy Image at %08lx ...\n", img_addr); @@ -985,6 +992,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, images->legacy_hdr_valid = 1; bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: os_noffset = fit_image_load(images, FIT_KERNEL_PROP, @@ -1114,6 +1122,7 @@ static int image_info(ulong addr) printf("\n## Checking Image at %08lx ...\n", addr);
switch (genimg_get_format(hdr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: puts(" Legacy image found\n"); if (!image_check_magic(hdr)) { @@ -1135,6 +1144,7 @@ static int image_info(ulong addr) } puts("OK\n"); return 0; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: puts(" FIT image found\n"); @@ -1194,6 +1204,7 @@ static int do_imls_nor(void) goto next_sector;
switch (genimg_get_format(hdr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: if (!image_check_hcrc(hdr)) goto next_sector; @@ -1208,6 +1219,7 @@ static int do_imls_nor(void) puts("OK\n"); } break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: if (!fit_check_format(hdr)) @@ -1342,12 +1354,14 @@ static int do_imls_nand(void) }
switch (genimg_get_format(buffer)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: header = (const image_header_t *)buffer;
len = image_get_image_size(header); nand_imls_legacyimage(nand, nand_dev, off, len); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: len = fit_get_size(buffer); diff --git a/common/cmd_disk.c b/common/cmd_disk.c index 3e457f6..8a1fda9 100644 --- a/common/cmd_disk.c +++ b/common/cmd_disk.c @@ -17,7 +17,9 @@ int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc, ulong addr = CONFIG_SYS_LOAD_ADDR; ulong cnt; disk_partition_t info; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) image_header_t *hdr; +#endif block_dev_desc_t *dev_desc;
#if defined(CONFIG_FIT) @@ -62,6 +64,7 @@ int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc, bootstage_mark(BOOTSTAGE_ID_IDE_PART_READ);
switch (genimg_get_format((void *) addr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: hdr = (image_header_t *) addr;
@@ -78,6 +81,7 @@ int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc,
cnt = image_get_image_size(hdr); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: fit_hdr = (const void *) addr; diff --git a/common/cmd_fdc.c b/common/cmd_fdc.c index 1cfb656..5766b56 100644 --- a/common/cmd_fdc.c +++ b/common/cmd_fdc.c @@ -635,7 +635,9 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type; FDC_COMMAND_STRUCT *pCMD = &cmd; unsigned long addr,imsize; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) image_header_t *hdr; /* used for fdc boot */ +#endif unsigned char boot_drive; int i,nrofblk; #if defined(CONFIG_FIT) @@ -689,12 +691,14 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) }
switch (genimg_get_format ((void *)addr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: hdr = (image_header_t *)addr; image_print_contents (hdr);
imsize = image_get_image_size (hdr); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: fit_hdr = (const void *)addr; diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c index 010cd24..f8c5e10 100644 --- a/common/cmd_fpga.c +++ b/common/cmd_fpga.c @@ -155,6 +155,7 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
case FPGA_LOADMK: switch (genimg_get_format(fpga_data)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: { image_header_t *hdr = @@ -182,6 +183,7 @@ int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) rc = fpga_load(dev, (void *)data, data_size); } break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: { diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 04ab0f1..5c3ad12 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -904,7 +904,9 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand, int r; char *s; size_t cnt; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) image_header_t *hdr; +#endif #if defined(CONFIG_FIT) const void *fit_hdr = NULL; #endif @@ -930,6 +932,7 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand, bootstage_mark(BOOTSTAGE_ID_NAND_HDR_READ);
switch (genimg_get_format ((void *)addr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: hdr = (image_header_t *)addr;
@@ -938,6 +941,7 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
cnt = image_get_image_size (hdr); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: fit_hdr = (const void *)addr; diff --git a/common/cmd_source.c b/common/cmd_source.c index 54ffd16..f3e9e60 100644 --- a/common/cmd_source.c +++ b/common/cmd_source.c @@ -29,7 +29,9 @@ int source (ulong addr, const char *fit_uname) { ulong len; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) const image_header_t *hdr; +#endif ulong *data; int verify; void *buf; @@ -44,6 +46,7 @@ source (ulong addr, const char *fit_uname)
buf = map_sysmem(addr, 0); switch (genimg_get_format(buf)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: hdr = buf;
@@ -84,6 +87,7 @@ source (ulong addr, const char *fit_uname) */ while (*data++); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: if (fit_uname == NULL) { diff --git a/common/cmd_ximg.c b/common/cmd_ximg.c index 65a8319..813543a 100644 --- a/common/cmd_ximg.c +++ b/common/cmd_ximg.c @@ -32,10 +32,13 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) { ulong addr = load_addr; ulong dest = 0; - ulong data, len, count; + ulong data, len; int verify; int part = 0; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) + ulong count; image_header_t *hdr = NULL; +#endif #if defined(CONFIG_FIT) const char *uname = NULL; const void* fit_hdr; @@ -64,6 +67,7 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) }
switch (genimg_get_format((void *)addr)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY:
printf("## Copying part %d from legacy image " @@ -114,6 +118,7 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
image_multi_getimg(hdr, part, &data, &len); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: if (uname == NULL) { diff --git a/common/image-fdt.c b/common/image-fdt.c index 5d64009..ac4563f 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -29,6 +29,7 @@ static void fdt_error(const char *msg) puts(" - must RESET the board to recover.\n"); }
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY) static const image_header_t *image_get_fdt(ulong fdt_addr) { const image_header_t *fdt_hdr = map_sysmem(fdt_addr, 0); @@ -61,6 +62,7 @@ static const image_header_t *image_get_fdt(ulong fdt_addr) } return fdt_hdr; } +#endif
/** * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable @@ -220,11 +222,13 @@ error: int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch, bootm_headers_t *images, char **of_flat_tree, ulong *of_size) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) const image_header_t *fdt_hdr; + ulong load, load_end; + ulong image_start, image_data, image_end; +#endif ulong fdt_addr; char *fdt_blob = NULL; - ulong image_start, image_data, image_end; - ulong load, load_end; void *buf; #if defined(CONFIG_FIT) const char *fit_uname_config = images->fit_uname_cfg; @@ -298,6 +302,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch, */ buf = map_sysmem(fdt_addr, 0); switch (genimg_get_format(buf)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: /* verify fdt_addr points to a valid image header */ printf("## Flattened Device Tree from Legacy Image at %08lx\n", @@ -337,6 +342,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
fdt_addr = load; break; +#endif case IMAGE_FORMAT_FIT: /* * This case will catch both: new uImage format diff --git a/common/image.c b/common/image.c index fcc5a9c..79dafdf 100644 --- a/common/image.c +++ b/common/image.c @@ -44,8 +44,10 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
DECLARE_GLOBAL_DATA_PTR;
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY) static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, int verify); +#endif #else #include "mkimage.h" #include <u-boot/md5.h> @@ -329,6 +331,7 @@ void image_print_contents(const void *ptr)
#ifndef USE_HOSTCC +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) /** * image_get_ramdisk - get and verify ramdisk image * @rd_addr: ramdisk image start address @@ -390,6 +393,7 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
return rd_hdr; } +#endif #endif /* !USE_HOSTCC */
/*****************************************************************************/ @@ -653,20 +657,19 @@ int genimg_get_comp_id(const char *name) */ int genimg_get_format(const void *img_addr) { - ulong format = IMAGE_FORMAT_INVALID; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) const image_header_t *hdr;
hdr = (const image_header_t *)img_addr; if (image_check_magic(hdr)) - format = IMAGE_FORMAT_LEGACY; + return IMAGE_FORMAT_LEGACY; +#endif #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) - else { - if (fdt_check_header(img_addr) == 0) - format = IMAGE_FORMAT_FIT; - } + if (fdt_check_header(img_addr) == 0) + return IMAGE_FORMAT_FIT; #endif
- return format; + return IMAGE_FORMAT_INVALID; }
/** @@ -708,12 +711,14 @@ ulong genimg_get_image(ulong img_addr)
/* get data size */ switch (genimg_get_format(buf)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: d_size = image_get_data_size(buf); debug(" Legacy format image found at 0x%08lx, " "size 0x%08lx\n", ram_addr, d_size); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: d_size = fit_get_size(buf) - h_size; @@ -789,7 +794,9 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, { ulong rd_addr, rd_load; ulong rd_data, rd_len; +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) const image_header_t *rd_hdr; +#endif void *buf; #ifdef CONFIG_SUPPORT_RAW_INITRD char *end; @@ -872,6 +879,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, */ buf = map_sysmem(rd_addr, 0); switch (genimg_get_format(buf)) { +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) case IMAGE_FORMAT_LEGACY: printf("## Loading init Ramdisk from Legacy " "Image at %08lx ...\n", rd_addr); @@ -887,6 +895,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, rd_len = image_get_data_size(rd_hdr); rd_load = image_get_load(rd_hdr); break; +#endif #if defined(CONFIG_FIT) case IMAGE_FORMAT_FIT: rd_noffset = fit_image_load(images, FIT_RAMDISK_PROP, diff --git a/doc/uImage.FIT/signature.txt b/doc/uImage.FIT/signature.txt index 9502037..672dc35 100644 --- a/doc/uImage.FIT/signature.txt +++ b/doc/uImage.FIT/signature.txt @@ -328,6 +328,9 @@ be enabled: CONFIG_FIT_SIGNATURE - enable signing and verfication in FITs CONFIG_RSA - enable RSA algorithm for signing
+WARNING: When relying on signed FIT images with required signature check +the legacy image format is default disabled by not defining +CONFIG_IMAGE_FORMAT_LEGACY
Testing ------- diff --git a/include/config_fallbacks.h b/include/config_fallbacks.h index b304a41..76818f6 100644 --- a/include/config_fallbacks.h +++ b/include/config_fallbacks.h @@ -83,4 +83,12 @@ #define CONFIG_SYS_HZ 1000 #endif
+#ifndef CONFIG_FIT_SIGNATURE +#define CONFIG_IMAGE_FORMAT_LEGACY +#endif + +#ifdef CONFIG_DISABLE_IMAGE_LEGACY +#undef CONFIG_IMAGE_FORMAT_LEGACY +#endif + #endif /* __CONFIG_FALLBACKS_H */ diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h index 731e69b..0631947 100644 --- a/include/configs/zynq-common.h +++ b/include/configs/zynq-common.h @@ -198,6 +198,7 @@ /* FIT support */ #define CONFIG_FIT #define CONFIG_FIT_VERBOSE 1 /* enable fit_format_{error,warning}() */ +#define CONFIG_IMAGE_FORMAT_LEGACY /* enable also legacy image format */
/* FDT support */ #define CONFIG_OF_CONTROL diff --git a/include/image.h b/include/image.h index b278778..cde58a6 100644 --- a/include/image.h +++ b/include/image.h @@ -411,7 +411,9 @@ enum fit_load_op { #ifndef USE_HOSTCC /* Image format types, returned by _get_format() routine */ #define IMAGE_FORMAT_INVALID 0x00 +#if defined(CONFIG_IMAGE_FORMAT_LEGACY) #define IMAGE_FORMAT_LEGACY 0x01 /* legacy image_header based format */ +#endif #define IMAGE_FORMAT_FIT 0x02 /* new, libfdt based format */
int genimg_get_format(const void *img_addr);

Hi Heiko,
On 19 May 2014 20:49, Heiko Schocher hs@denx.de wrote:
make the use of legacy image format configurable through the config define CONFIG_IMAGE_FORMAT_LEGACY.
When relying on signed FIT images with required signature check the legacy image format should be disabled. Therefore introduce this new define and enable legacy image format if CONFIG_FIT_SIGNATURE is not set. If CONFIG_FIT_SIGNATURE is set disable per default the legacy image format.
Signed-off-by: Heiko Schocher hs@denx.de Cc: Simon Glass sjg@chromium.org Cc: Lars Steubesand lars.steubesand@philips.com Cc: Mike Pearce mike@kaew.be Cc: Wolfgang Denk wd@denx.de Cc: Tom Rini trini@ti.com Cc: Michal Simek monstr@monstr.eu
changes for v2:
make the legacy image format configurable through the define CONFIG_IMAGE_FORMAT_LEGACY.
Default: if not CONFIG_FIT_SIGNATURE is defined it is enabled, else disabled.
Disable it with CONFIG_DISABLE_IMAGE_LEGACY if CONFIG_FIT_SIGNATURE is not defined.
changes for v3:
- enable legacy image format for zync as default, as Michak suggested.
changes for v4: move changes for default settings in include/config_defaults.h to include/config_fallbacks.h, so board settings are considered as Lars Steubesand suggested.
README | 18 ++++++++++++++++++ common/cmd_bootm.c | 14 ++++++++++++++ common/cmd_disk.c | 4 ++++ common/cmd_fdc.c | 4 ++++ common/cmd_fpga.c | 2 ++ common/cmd_nand.c | 4 ++++ common/cmd_source.c | 4 ++++ common/cmd_ximg.c | 7 ++++++- common/image-fdt.c | 10 ++++++++-- common/image.c | 23 ++++++++++++++++------- doc/uImage.FIT/signature.txt | 3 +++ include/config_fallbacks.h | 8 ++++++++ include/configs/zynq-common.h | 1 + include/image.h | 2 ++ 14 files changed, 94 insertions(+), 10 deletions(-)
It all looks good to me except for one nit below.
diff --git a/common/cmd_ximg.c b/common/cmd_ximg.c index 65a8319..813543a 100644 --- a/common/cmd_ximg.c +++ b/common/cmd_ximg.c @@ -32,10 +32,13 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) { ulong addr = load_addr; ulong dest = 0;
ulong data, len, count;
ulong data, len; int verify; int part = 0;
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
ulong count; image_header_t *hdr = NULL;
This is also used with CONFIG_BZIP2 (see lower in this function). This change causes a build error in sandbox, for example.
I notice also that it causes a useful reduction in U-Boot size.
Regards, Simon

Hello Simon,
Am 24.05.2014 02:04, schrieb Simon Glass:
Hi Heiko,
On 19 May 2014 20:49, Heiko Schocherhs@denx.de wrote:
make the use of legacy image format configurable through the config define CONFIG_IMAGE_FORMAT_LEGACY.
When relying on signed FIT images with required signature check the legacy image format should be disabled. Therefore introduce this new define and enable legacy image format if CONFIG_FIT_SIGNATURE is not set. If CONFIG_FIT_SIGNATURE is set disable per default the legacy image format.
Signed-off-by: Heiko Schocherhs@denx.de Cc: Simon Glasssjg@chromium.org Cc: Lars Steubesandlars.steubesand@philips.com Cc: Mike Pearcemike@kaew.be Cc: Wolfgang Denkwd@denx.de Cc: Tom Rinitrini@ti.com Cc: Michal Simekmonstr@monstr.eu
changes for v2:
make the legacy image format configurable through the define CONFIG_IMAGE_FORMAT_LEGACY.
Default: if not CONFIG_FIT_SIGNATURE is defined it is enabled, else disabled.
Disable it with CONFIG_DISABLE_IMAGE_LEGACY if CONFIG_FIT_SIGNATURE is not defined.
changes for v3:
- enable legacy image format for zync as default, as Michak suggested.
changes for v4: move changes for default settings in include/config_defaults.h to include/config_fallbacks.h, so board settings are considered as Lars Steubesand suggested.
README | 18 ++++++++++++++++++ common/cmd_bootm.c | 14 ++++++++++++++ common/cmd_disk.c | 4 ++++ common/cmd_fdc.c | 4 ++++ common/cmd_fpga.c | 2 ++ common/cmd_nand.c | 4 ++++ common/cmd_source.c | 4 ++++ common/cmd_ximg.c | 7 ++++++- common/image-fdt.c | 10 ++++++++-- common/image.c | 23 ++++++++++++++++------- doc/uImage.FIT/signature.txt | 3 +++ include/config_fallbacks.h | 8 ++++++++ include/configs/zynq-common.h | 1 + include/image.h | 2 ++ 14 files changed, 94 insertions(+), 10 deletions(-)
It all looks good to me except for one nit below.
diff --git a/common/cmd_ximg.c b/common/cmd_ximg.c index 65a8319..813543a 100644 --- a/common/cmd_ximg.c +++ b/common/cmd_ximg.c @@ -32,10 +32,13 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) { ulong addr = load_addr; ulong dest = 0;
ulong data, len, count;
ulong data, len; int verify; int part = 0;
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
ulong count; image_header_t *hdr = NULL;
This is also used with CONFIG_BZIP2 (see lower in this function). This change causes a build error in sandbox, for example.
Fixed, thanks!
I notice also that it causes a useful reduction in U-Boot size.
Yes.
bye, Heiko

Enable legacy image format with CONFIG_IMAGE_FORMAT_LEGACY on the ids8313 board, as it uses signed FIT images for booting Linux and need the legacy image format.
Signed-off-by: Heiko Schocher hs@denx.de Cc: Simon Glass sjg@chromium.org Cc: Kim Phillips kim.phillips@freescale.com Cc: Michael Conrad Michael.Conrad@ids.de
--- - changes for v2: - enable (not disable) the legacy image format for this board - changes for v3: none - changes for v4: none --- include/configs/ids8313.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/ids8313.h b/include/configs/ids8313.h index c1b3b63..1de5750 100644 --- a/include/configs/ids8313.h +++ b/include/configs/ids8313.h @@ -576,6 +576,7 @@
#define CONFIG_FIT #define CONFIG_FIT_SIGNATURE +#define CONFIG_IMAGE_FORMAT_LEGACY #define CONFIG_CMD_FDT #define CONFIG_CMD_HASH #define CONFIG_RSA

move fdtdec_get_int() out of lib/fdtdec.c into lib/fdtdec_common.c as this function is also used, if CONFIG_OF_CONTROL is not used. Poped up on the ids8313 board using signed FIT images, and activating CONFIG_SYS_GENERIC_BOARD. Without this patch it shows on boot:
No valid FDT found - please append one to U-Boot binary, use u-boot-dtb.bin or define CONFIG_OF_EMBED. For sandbox, use -d <file.dtb>
With this patch, it boots again with CONFIG_SYS_GENERIC_BOARD enabled.
Signed-off-by: Heiko Schocher hs@denx.de Cc: Simon Glass sjg@chromium.org Cc: Tom Rini trini@ti.com
--- - changes for v2: - remove fdtdec_get_int() in lib/fdtdec.c - only one fdtdec_get_int() implementation Tested on the ids8313 board (on host and target side) - changes for v3: use fdt_getprop() instead fdt_getprop_w() so we avoid a cast as Simon suggested. - changes for v4: none --- lib/Makefile | 1 + lib/fdtdec.c | 36 ------------------------------------ lib/fdtdec_common.c | 33 +++++++++++++++++++++++++++++++++ tools/fdtdec.c | 1 + 4 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 lib/fdtdec_common.c
diff --git a/lib/Makefile b/lib/Makefile index a4999e2..d3135c9 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -23,6 +23,7 @@ obj-$(CONFIG_USB_TTY) += circbuf.o obj-y += crc7.o obj-y += crc8.o obj-y += crc16.o +obj-y += fdtdec_common.o obj-$(CONFIG_OF_CONTROL) += fdtdec.o obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o obj-$(CONFIG_GZIP) += gunzip.o diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 8ecb80f..21d5e85 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -109,24 +109,6 @@ fdt_addr_t fdtdec_get_addr(const void *blob, int node, return fdtdec_get_addr_size(blob, node, prop_name, NULL); }
-s32 fdtdec_get_int(const void *blob, int node, const char *prop_name, - s32 default_val) -{ - const s32 *cell; - int len; - - debug("%s: %s: ", __func__, prop_name); - cell = fdt_getprop(blob, node, prop_name, &len); - if (cell && len >= sizeof(s32)) { - s32 val = fdt32_to_cpu(cell[0]); - - debug("%#x (%d)\n", val, val); - return val; - } - debug("(not found)\n"); - return default_val; -} - uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name, uint64_t default_val) { @@ -646,22 +628,4 @@ int fdtdec_read_fmap_entry(const void *blob, int node, const char *name,
return 0; } -#else -#include "libfdt.h" -#include "fdt_support.h" - -int fdtdec_get_int(const void *blob, int node, const char *prop_name, - int default_val) -{ - const int *cell; - int len; - - cell = fdt_getprop_w((void *)blob, node, prop_name, &len); - if (cell && len >= sizeof(int)) { - int val = fdt32_to_cpu(cell[0]); - - return val; - } - return default_val; -} #endif diff --git a/lib/fdtdec_common.c b/lib/fdtdec_common.c new file mode 100644 index 0000000..bca787b --- /dev/null +++ b/lib/fdtdec_common.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014 + * Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on lib/fdtdec.c: + * Copyright (c) 2011 The Chromium OS Authors. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef USE_HOSTCC +#include <common.h> +#include <libfdt.h> +#include <fdtdec.h> +#else +#include "libfdt.h" +#include "fdt_support.h" +#endif + +int fdtdec_get_int(const void *blob, int node, const char *prop_name, + int default_val) +{ + const int *cell; + int len; + + cell = fdt_getprop(blob, node, prop_name, &len); + if (cell && len >= sizeof(int)) { + int val = fdt32_to_cpu(cell[0]); + + return val; + } + return default_val; +} diff --git a/tools/fdtdec.c b/tools/fdtdec.c index f1c2256..9987f83 100644 --- a/tools/fdtdec.c +++ b/tools/fdtdec.c @@ -1 +1,2 @@ +#include "../lib/fdtdec_common.c" #include "../lib/fdtdec.c"

- add CONFIG_SYS_GENERIC_BOARD - remove CONFIG_OF_CONTROL to boot again
Signed-off-by: Heiko Schocher hs@denx.de Acked-by: Kim Phillips kim.phillips@freescale.com Cc: Simon Glass sjg@chromium.org
--- - changes for v2: - added acked-by from Kim - changes for v3: none - changes for v4: none --- include/configs/ids8313.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/include/configs/ids8313.h b/include/configs/ids8313.h index 1de5750..3e55247 100644 --- a/include/configs/ids8313.h +++ b/include/configs/ids8313.h @@ -19,6 +19,8 @@ #define CONFIG_MPC8313 #define CONFIG_IDS8313
+#define CONFIG_SYS_GENERIC_BOARD + #define CONFIG_FSL_ELBC
#define CONFIG_MISC_INIT_R @@ -582,6 +584,5 @@ #define CONFIG_RSA #define CONFIG_SHA1 #define CONFIG_SHA256 -#define CONFIG_OF_CONTROL
#endif /* __CONFIG_H */
participants (2)
-
Heiko Schocher
-
Simon Glass