]> git.sur5r.net Git - u-boot/commitdiff
mkimage: Allow including a ramdisk in FIT auto mode
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Fri, 4 Nov 2016 13:22:15 +0000 (14:22 +0100)
committerTom Rini <trini@konsulko.com>
Sun, 6 Nov 2016 12:33:42 +0000 (07:33 -0500)
Adds -i option that allows specifying a ramdisk file to be added to the
FIT image when we are using the automatic FIT mode (no ITS file).

This makes adding Depthcharge support to LAVA much more convenient, as
no additional configuration files need to be kept around in the machine
that dispatches jobs to the boards.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Matt Hart <matthew.hart@linaro.org>
Cc: Neil Williams <codehelp@debian.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
doc/mkimage.1
tools/fit_image.c
tools/imagetool.h
tools/mkimage.c

index e883f07849a6208138b0a5ef7ccf4d80d14b1517..3dcdcedcefafe1346f7fc57c063a438f4b5d9015 100644 (file)
@@ -137,6 +137,10 @@ compilation is performed and the \-f flag should not be given.
 This can be used to sign images with additional keys after initial image
 creation.
 
+.TP
+.BI "\-i [" "ramdisk_file" "]"
+Appends the ramdisk file to the FIT.
+
 .TP
 .BI "\-k [" "key_directory" "]"
 Specifies the directory containing keys to use for signing. This directory
index 10fd6d4929374728732efd63e327cab36275766e..efd8a97a0b92723a01aae584cd9ce468c8e99735 100644 (file)
@@ -85,8 +85,15 @@ static int fit_calc_size(struct image_tool_params *params)
        size = imagetool_get_filesize(params, params->datafile);
        if (size < 0)
                return -1;
-
        total_size = size;
+
+       if (params->fit_ramdisk) {
+               size = imagetool_get_filesize(params, params->fit_ramdisk);
+               if (size < 0)
+                       return -1;
+               total_size += size;
+       }
+
        for (cont = params->content_head; cont; cont = cont->next) {
                size = imagetool_get_filesize(params, cont->fname);
                if (size < 0)
@@ -233,6 +240,20 @@ static int fit_write_images(struct image_tool_params *params, char *fdt)
                fdt_end_node(fdt);
        }
 
+       /* And a ramdisk file if available */
+       if (params->fit_ramdisk) {
+               fdt_begin_node(fdt, FIT_RAMDISK_PROP "@1");
+
+               fdt_property_string(fdt, "type", FIT_RAMDISK_PROP);
+               fdt_property_string(fdt, "os", genimg_get_os_short_name(params->os));
+
+               ret = fdt_property_file(params, fdt, "data", params->fit_ramdisk);
+               if (ret)
+                       return ret;
+
+               fdt_end_node(fdt);
+       }
+
        fdt_end_node(fdt);
 
        return 0;
@@ -272,15 +293,25 @@ static void fit_write_configs(struct image_tool_params *params, char *fdt)
                snprintf(str, sizeof(str), "%s@1", typename);
                fdt_property_string(fdt, typename, str);
 
+               if (params->fit_ramdisk)
+                       fdt_property_string(fdt, FIT_RAMDISK_PROP,
+                                           FIT_RAMDISK_PROP "@1");
+
                snprintf(str, sizeof(str), FIT_FDT_PROP "@%d", upto);
                fdt_property_string(fdt, FIT_FDT_PROP, str);
                fdt_end_node(fdt);
        }
+
        if (!upto) {
                fdt_begin_node(fdt, "conf@1");
                typename = genimg_get_type_short_name(params->fit_image_type);
                snprintf(str, sizeof(str), "%s@1", typename);
                fdt_property_string(fdt, typename, str);
+
+               if (params->fit_ramdisk)
+                       fdt_property_string(fdt, FIT_RAMDISK_PROP,
+                                           FIT_RAMDISK_PROP "@1");
+
                fdt_end_node(fdt);
        }
 
index 6c1a9d3760584bfe297acb737b1e173360b4b3e6..15c2a0c0e1c13b8124f260f9c1f6224f3014a51f 100644 (file)
@@ -70,6 +70,7 @@ struct image_tool_params {
        int orig_file_size;     /* Original size for file before padding */
        bool auto_its;          /* Automatically create the .its file */
        int fit_image_type;     /* Image type to put into the FIT */
+       char *fit_ramdisk;      /* Ramdisk file to include */
        struct content_info *content_head;      /* List of files to include */
        struct content_info *content_tail;
        bool external_data;     /* Store data outside the FIT */
index 0c6dba89a099a32ff97ccfe04906e9344b6b3ab9..49d5d1ed70a715f76033cb9aa1eb5e6a8ca4a63e 100644 (file)
@@ -88,12 +88,13 @@ static void usage(const char *msg)
                "          -x ==> set XIP (execute in place)\n",
                params.cmdname);
        fprintf(stderr,
-               "       %s [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b <dtb> [-b <dtb>]] fit-image\n"
+               "       %s [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b <dtb> [-b <dtb>]] [-i <ramdisk.cpio.gz>] fit-image\n"
                "           <dtb> file is used with -f auto, it may occur multiple times.\n",
                params.cmdname);
        fprintf(stderr,
                "          -D => set all options for device tree compiler\n"
-               "          -f => input filename for FIT source\n");
+               "          -f => input filename for FIT source\n"
+               "          -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"
@@ -141,7 +142,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:K:ln:p:O:rR:qsT:vVx")) != -1) {
+                            "a:A:b:c:C:d:D:e:Ef:Fk:i:K:ln:p:O:rR:qsT:vVx")) != -1) {
                switch (opt) {
                case 'a':
                        params.addr = strtoull(optarg, &ptr, 16);
@@ -207,6 +208,9 @@ static void process_args(int argc, char **argv)
                        params.type = IH_TYPE_FLATDT;
                        params.fflag = 1;
                        break;
+               case 'i':
+                       params.fit_ramdisk = optarg;
+                       break;
                case 'k':
                        params.keydir = optarg;
                        break;