]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mkimage: fit: spl: Add an optional static offset for external data
authorTeddy Reed <teddy.reed@gmail.com>
Fri, 10 Jun 2016 02:38:02 +0000 (19:38 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 24 Jun 2016 21:23:06 +0000 (17:23 -0400)
When building a FIT with external data (-E), U-Boot proper may require
absolute positioning for executing the external firmware. To acheive this
use the (-p) switch, which will replace the amended 'data-offset' with
'data-position' indicating the absolute position of external data.

It is considered an error if the requested absolute position overlaps with the
initial data required for the compact FIT.

Signed-off-by: Teddy Reed <teddy.reed@gmail.com>
doc/mkimage.1
doc/uImage.FIT/source_file_format.txt
tools/fit_image.c
tools/imagetool.h
tools/mkimage.c

index 4b3a2552550c1ccd17423c64e34daed017bcedbc..ffa7d60156f6ee60795b6bee6e859c2830447b44 100644 (file)
@@ -151,6 +151,12 @@ the corresponding public key is written into this file for for run-time
 verification. Typically the file here is the device tree binary used by
 CONFIG_OF_CONTROL in U-Boot.
 
+.TP
+.BI "\-p [" "external position" "]"
+Place external data at a static external position. See \-E. Instead of writing
+a 'data-offset' property defining the offset from the end of the FIT, \-p will
+use 'data-position' as the absolute position from the base of the FIT.
+
 .TP
 .BI "\-r
 Specifies that keys used to sign the FIT are required. This means that they
index 3f5418045e5b6e203a8172a42d1399b6de2c61cd..91aa89a77ecb9f4e284021023404b5cfcbc59a9e 100644 (file)
@@ -282,6 +282,9 @@ In this case the 'data' property is omitted. Instead you can use:
     aligned to a 4-byte boundary.
   - data-size : size of the data in bytes
 
+The 'data-offset' property can be substituted with 'data-position', which
+defines an absolute position or address as the offset. This is helpful when
+booting U-Boot proper before performing relocation.
 
 9) Examples
 -----------
index 0551572b04576971d4fd4af4e9085b89d5715964..76a6de4579718e2f6329a55e2d46f4fc46cd1807 100644 (file)
@@ -416,7 +416,13 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
                        ret = -EPERM;
                        goto err_munmap;
                }
-               fdt_setprop_u32(fdt, node, "data-offset", buf_ptr);
+               if (params->external_offset > 0) {
+                       /* An external offset positions the data absolutely. */
+                       fdt_setprop_u32(fdt, node, "data-position",
+                                       params->external_offset + buf_ptr);
+               } else {
+                       fdt_setprop_u32(fdt, node, "data-offset", buf_ptr);
+               }
                fdt_setprop_u32(fdt, node, "data-size", len);
 
                buf_ptr += (len + 3) & ~3;
@@ -437,6 +443,17 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
                ret = -EIO;
                goto err;
        }
+
+       /* Check if an offset for the external data was set. */
+       if (params->external_offset > 0) {
+               if (params->external_offset < new_size) {
+                       debug("External offset %x overlaps FIT length %x",
+                             params->external_offset, new_size);
+                       ret = -EINVAL;
+                       goto err;
+               }
+               new_size = params->external_offset;
+       }
        if (lseek(fd, new_size, SEEK_SET) < 0) {
                debug("%s: Failed to seek to end of file: %s\n", __func__,
                      strerror(errno));
index a3ed0f43d6afa21caa6d8755536b17d8a3f27ba2..1f2161cf615dbd156dca0d9c56ce7e8f8355f275 100644 (file)
@@ -74,6 +74,7 @@ struct image_tool_params {
        struct content_info *content_tail;
        bool external_data;     /* Store data outside the FIT */
        bool quiet;             /* Don't output text in normal operation */
+       unsigned int external_offset;   /* Add padding to external data */
 };
 
 /*
index aefe22f19b219a7d339dbfdc6f92ca1afe8b1831..ff3024a8f172c8557bfaa02612d995bdcdd04f2d 100644 (file)
@@ -93,11 +93,13 @@ static void usage(const char *msg)
                "          -f => input filename for FIT source\n");
 #ifdef CONFIG_FIT_SIGNATURE
        fprintf(stderr,
-               "Signing / verified boot options: [-k keydir] [-K dtb] [ -c <comment>] [-r]\n"
+               "Signing / verified boot options: [-E] [-k keydir] [-K dtb] [ -c <comment>] [-p addr] [-r]\n"
+               "          -E => place data outside of the FIT structure\n"
                "          -k => set directory containing private keys\n"
                "          -K => write public keys to this .dtb file\n"
                "          -c => add comment in signature node\n"
                "          -F => re-sign existing FIT image\n"
+               "          -p => place external data at a static position\n"
                "          -r => mark keys used as 'required' in dtb\n");
 #else
        fprintf(stderr,
@@ -136,7 +138,7 @@ static void process_args(int argc, char **argv)
        int opt;
 
        while ((opt = getopt(argc, argv,
-                            "a:A:b:cC:d:D:e:Ef:Fk:K:ln:O:rR:qsT:vVx")) != -1) {
+                            "a:A:b:cC:d:D:e:Ef:Fk:K:ln:p:O:rR:qsT:vVx")) != -1) {
                switch (opt) {
                case 'a':
                        params.addr = strtoull(optarg, &ptr, 16);
@@ -216,6 +218,13 @@ static void process_args(int argc, char **argv)
                        if (params.os < 0)
                                usage("Invalid operating system");
                        break;
+               case 'p':
+                       params.external_offset = strtoull(optarg, &ptr, 16);
+                       if (*ptr) {
+                               fprintf(stderr, "%s: invalid offset size %s\n",
+                                       params.cmdname, optarg);
+                               exit(EXIT_FAILURE);
+                       }
                case 'q':
                        params.quiet = 1;
                        break;