[PATCH] mkimage: fit_image: Make fit header and data align to 512
Heinrich Schuchardt
xypron.glpk at gmx.de
Fri Mar 13 03:07:09 CET 2020
Am March 13, 2020 1:50:41 AM UTC schrieb Kever Yang <kever.yang at rock-chips.com>:
>The image is usually stored in block device like emmc, SD card, make
>the
>offset of image data aligned to block(512 byte) can avoid data copy
>during boot process.
>eg. SPL boot from FIT image with external data:
>- SPL read the first block of FIT image, and then parse the header;
>- SPL read image data separately;
>- The first image offset is the base_offset which is the header size;
>- The second image offset is just after the first image;
>- If the offset of imge does not aligned, SPL will do memcpy;
>The header size is a ramdon number, which is very possible not aligned,
>so
>add align for FIT header and image data for better performance.
>
>SPI device do not need to enable this feature.
>
>Signed-off-by: Kever Yang <kever.yang at rock-chips.com>
>---
>
> doc/uImage.FIT/source_file_format.txt | 5 +++++
> tools/fit_image.c | 16 +++++++++++-----
> tools/imagetool.h | 1 +
> tools/mkimage.c | 8 ++++++--
> 4 files changed, 23 insertions(+), 7 deletions(-)
>
>diff --git a/doc/uImage.FIT/source_file_format.txt
>b/doc/uImage.FIT/source_file_format.txt
>index 18d2aedcb7..50679c4b24 100644
>--- a/doc/uImage.FIT/source_file_format.txt
>+++ b/doc/uImage.FIT/source_file_format.txt
>@@ -304,6 +304,11 @@ Normal kernel FIT image has data embedded within
>FIT structure. U-Boot image
>for SPL boot has external data. Existence of 'data-offset' can be used
>to
> identify which format is used.
>
>+For FIT image with external data, it would be better to align each
>blob of data
>+to block(512 byte) for block device, so that we don't need to do the
>copy when
>+read the image data in SPL. Pass '-B' to mkimage to align the FIT
>structure and
>+data to 512 byte.
>+
> 9) Examples
> -----------
>
>diff --git a/tools/fit_image.c b/tools/fit_image.c
>index 6aa4b1c733..4aeaf39536 100644
>--- a/tools/fit_image.c
>+++ b/tools/fit_image.c
>@@ -431,7 +431,7 @@ static int fit_extract_data(struct
>image_tool_params *params, const char *fname)
> fit_size = fdt_totalsize(fdt);
>
> /* Allocate space to hold the image data we will extract */
>- buf = malloc(fit_size);
>+ buf = malloc(fit_size + 2048);
Please, provide a comment in the code explaining why extra space for 4 times the block size is needed.
> if (!buf) {
> ret = -ENOMEM;
> goto err_munmap;
>@@ -471,17 +471,23 @@ static int fit_extract_data(struct
>image_tool_params *params, const char *fname)
> buf_ptr);
> }
> fdt_setprop_u32(fdt, node, FIT_DATA_SIZE_PROP, len);
>-
>- buf_ptr += (len + 3) & ~3;
>+ if (params->bflag)
>+ buf_ptr += (len + 511) & ~511;
Please, use a constant defining the block size.
Isn't there an ALIGN macro for rounding up?
>+ else
>+ buf_ptr += (len + 3) & ~3;
> }
>
> /* Pack the FDT and place the data after it */
> fdt_pack(fdt);
>
>+ new_size = fdt_totalsize(fdt);
>+ if (params->bflag)
>+ new_size = (new_size + 511) & ~511;
Same here.
Best regards
Heinrich
>+ else
>+ new_size = (new_size + 3) & ~3;
>+ fdt_set_totalsize(fdt, new_size);
> debug("Size reduced from %x to %x\n", fit_size, fdt_totalsize(fdt));
> debug("External data size %x\n", buf_ptr);
>- new_size = fdt_totalsize(fdt);
>- new_size = (new_size + 3) & ~3;
> munmap(fdt, sbuf.st_size);
>
> if (ftruncate(fd, new_size)) {
>diff --git a/tools/imagetool.h b/tools/imagetool.h
>index e1c778b0df..e098cb41cc 100644
>--- a/tools/imagetool.h
>+++ b/tools/imagetool.h
>@@ -40,6 +40,7 @@ struct content_info {
> * type specific functions
> */
> struct image_tool_params {
>+ int bflag;
> int dflag;
> int eflag;
> int fflag;
>diff --git a/tools/mkimage.c b/tools/mkimage.c
>index 5f51d2cc89..03b357f869 100644
>--- a/tools/mkimage.c
>+++ b/tools/mkimage.c
>@@ -97,8 +97,9 @@ static void usage(const char *msg)
> " -i => input filename for ramdisk file\n");
> #ifdef CONFIG_FIT_SIGNATURE
> fprintf(stderr,
>- "Signing / verified boot options: [-E] [-k keydir] [-K dtb] [ -c
><comment>] [-p addr] [-r] [-N engine]\n"
>+ "Signing / verified boot options: [-E] [-B] [-k keydir] [-K dtb] [
>-c <comment>] [-p addr] [-r] [-N engine]\n"
> " -E => place data outside of the FIT structure\n"
>+ " -B => truncate FIT structure and header to block\n"
> " -k => set directory containing private keys\n"
> " -K => write public keys to this .dtb file\n"
> " -c => add comment in signature node\n"
>@@ -143,7 +144,7 @@ static void process_args(int argc, char **argv)
> int opt;
>
> while ((opt = getopt(argc, argv,
>- "a:A:b:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qsT:vVx")) != -1) {
>+ "a:A:b:B:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qsT:vVx")) != -1) {
> switch (opt) {
> case 'a':
> params.addr = strtoull(optarg, &ptr, 16);
>@@ -168,6 +169,9 @@ static void process_args(int argc, char **argv)
> exit(EXIT_FAILURE);
> }
> break;
>+ case 'B':
>+ params.bflag = optarg;
>+ break;
> case 'c':
> params.comment = optarg;
> break;
More information about the U-Boot
mailing list