]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mkimage: allow internalization of data-position
authorLars Feyaerts <lars@bitbiz.be>
Mon, 2 Oct 2023 08:00:14 +0000 (10:00 +0200)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 14:35:24 +0000 (10:35 -0400)
Make it possible for data that was externalized using a static external
position (-p) to be internalized. Enables the ability to convert
existing FIT images built with -p to be converted to a FIT image where the
data is internal, to be converted to a FIT image where the data is
external relative to the end of the FIT (-E) or change the initial
static external position to a different static external position (-p).

Removing the original external-data-related properties ensures that
they're not present after conversion. Without this, they would still be
present in the resulting FIT even if the FIT has been, for example,
internalized.

Signed-off-by: Lars Feyaerts <lars@bitbiz.be>
Reviewed-by: Simon Glass <sjg@chromium.org>
doc/mkimage.1
tools/fit_image.c

index 76c7859bb0388c255eca8cb2afa4cb26b04929e2..d0a038a880ab1e05ff691d2528046ae8ef1b6ad9 100644 (file)
@@ -860,6 +860,25 @@ verify signatures is added to u\-boot.dtb with required = "conf" property.
        \-K u\-boot.dtb -r kernel.itb
 .EE
 .RE
+.P
+Convert an existing FIT image from any of the three types of data storage
+(internal, external data-offset or external data-position) to another type
+of data storage.
+.RS
+.P
+.EX
+\fB// convert FIT from internal data to data-position
+\fBmkimage -p 0x20000 -F internal_data.itb
+.EE
+.EX
+\fB// convert FIT from data-position to data-offset
+\fBmkimage -E -F external_data-position.itb
+.EE
+.EX
+\fB// convert FIT from data-offset to internal data
+\fBmkimage -F external_data-offset.itb
+.EE
+.RE
 .
 .SH SEE ALSO
 .BR dtc (1),
index 9fe69ea0d9f8e682be6980b7a8dacf03d07f8238..10f36e9342234f9e407b56e60b9787fb0a24e919 100644 (file)
@@ -616,6 +616,8 @@ err:
 static int fit_import_data(struct image_tool_params *params, const char *fname)
 {
        void *fdt, *old_fdt;
+       void *data = NULL;
+       const char *ext_data_prop = NULL;
        int fit_size, new_size, size, data_base;
        int fd;
        struct stat sbuf;
@@ -659,14 +661,28 @@ static int fit_import_data(struct image_tool_params *params, const char *fname)
                int buf_ptr;
                int len;
 
-               buf_ptr = fdtdec_get_int(fdt, node, "data-offset", -1);
-               len = fdtdec_get_int(fdt, node, "data-size", -1);
-               if (buf_ptr == -1 || len == -1)
+               /*
+                * FIT_DATA_OFFSET_PROP and FIT_DATA_POSITION_PROP are never both present,
+                *  but if they are, prefer FIT_DATA_OFFSET_PROP as it was there first
+                */
+               buf_ptr = fdtdec_get_int(fdt, node, FIT_DATA_POSITION_PROP, -1);
+               if (buf_ptr != -1) {
+                       ext_data_prop = FIT_DATA_POSITION_PROP;
+                       data = old_fdt + buf_ptr;
+               }
+               buf_ptr = fdtdec_get_int(fdt, node, FIT_DATA_OFFSET_PROP, -1);
+               if (buf_ptr != -1) {
+                       ext_data_prop = FIT_DATA_OFFSET_PROP;
+                       data = old_fdt + data_base + buf_ptr;
+               }
+               len = fdtdec_get_int(fdt, node, FIT_DATA_SIZE_PROP, -1);
+               if (!data || len == -1)
                        continue;
                debug("Importing data size %x\n", len);
 
-               ret = fdt_setprop(fdt, node, "data",
-                                 old_fdt + data_base + buf_ptr, len);
+               ret = fdt_setprop(fdt, node, FIT_DATA_PROP, data, len);
+               ret = fdt_delprop(fdt, node, ext_data_prop);
+
                if (ret) {
                        debug("%s: Failed to write property: %s\n", __func__,
                              fdt_strerror(ret));