In some cases, using the "external data" feature is impossible or
undesirable, but one may still want (or need) the FIT image to have a
certain alignment. Also, given the current 'mkimage -h' output,

  -B => align size in hex for FIT structure and header

it is quite unexpected for -B to be effectively ignored without -E.

Signed-off-by: Rasmus Villemoes <rasmus.villem...@prevas.dk>
---
 tools/fit_image.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/tools/fit_image.c b/tools/fit_image.c
index 9fe69ea0d9..2f5b25098a 100644
--- a/tools/fit_image.c
+++ b/tools/fit_image.c
@@ -712,6 +712,42 @@ err:
        return ret;
 }
 
+/**
+ * fit_align() - Ensure FIT image has certain alignment
+ *
+ * This takes a normal FIT file (with embedded data) and increases its
+ * size so that it is a multiple of params->bl_len.
+ */
+static int fit_align(struct image_tool_params *params, const char *fname)
+{
+       int fit_size, new_size;
+       int fd;
+       struct stat sbuf;
+       void *fdt;
+       int ret = 0;
+       int align_size;
+
+       align_size = params->bl_len;
+       fd = mmap_fdt(params->cmdname, fname, 0, &fdt, &sbuf, false, false);
+       if (fd < 0)
+               return -EIO;
+
+       fit_size = fdt_totalsize(fdt);
+       new_size = ALIGN(fit_size, align_size);
+       fdt_set_totalsize(fdt, new_size);
+       debug("Size extended from from %x to %x\n", fit_size, new_size);
+       munmap(fdt, sbuf.st_size);
+
+       if (ftruncate(fd, new_size)) {
+               debug("%s: Failed to truncate file: %s\n", __func__,
+                     strerror(errno));
+               ret = -EIO;
+       }
+
+       close(fd);
+       return ret;
+}
+
 /**
  * fit_handle_file - main FIT file processing function
  *
@@ -817,6 +853,10 @@ static int fit_handle_file(struct image_tool_params 
*params)
                ret = fit_extract_data(params, tmpfile);
                if (ret)
                        goto err_system;
+       } else if (params->bl_len) {
+               ret = fit_align(params, tmpfile);
+               if (ret)
+                       goto err_system;
        }
 
        if (rename (tmpfile, params->imagefile) == -1) {
-- 
2.37.2

Reply via email to