]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - tools/fit_image.c
tpm: Move the I2C TPM code into one file
[karo-tx-uboot.git] / tools / fit_image.c
index 3ececf913ff4c4fe2c1c2457f3f5b5ccbfa195fb..eb2a25eeac6aebcd7ae764ff8a593d18cc482528 100644 (file)
@@ -155,6 +155,97 @@ err_system:
        return -1;
 }
 
+/**
+ * fit_image_extract - extract a FIT component image
+ * @fit: pointer to the FIT format image header
+ * @image_noffset: offset of the component image node
+ * @file_name: name of the file to store the FIT sub-image
+ *
+ * returns:
+ *     zero in case of success or a negative value if fail.
+ */
+static int fit_image_extract(
+       const void *fit,
+       int image_noffset,
+       const char *file_name)
+{
+       const void *file_data;
+       size_t file_size = 0;
+
+       /* get the "data" property of component at offset "image_noffset" */
+       fit_image_get_data(fit, image_noffset, &file_data, &file_size);
+
+       /* save the "file_data" into the file specified by "file_name" */
+       return imagetool_save_subimage(file_name, (ulong) file_data, file_size);
+}
+
+/**
+ * fit_extract_contents - retrieve a sub-image component from the FIT image
+ * @ptr: pointer to the FIT format image header
+ * @params: command line parameters
+ *
+ * returns:
+ *     zero in case of success or a negative value if fail.
+ */
+static int fit_extract_contents(void *ptr, struct image_tool_params *params)
+{
+       int images_noffset;
+       int noffset;
+       int ndepth;
+       const void *fit = ptr;
+       int count = 0;
+       const char *p;
+
+       /* Indent string is defined in header image.h */
+       p = IMAGE_INDENT_STRING;
+
+       if (!fit_check_format(fit)) {
+               printf("Bad FIT image format\n");
+               return -1;
+       }
+
+       /* Find images parent node offset */
+       images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
+       if (images_noffset < 0) {
+               printf("Can't find images parent node '%s' (%s)\n",
+                      FIT_IMAGES_PATH, fdt_strerror(images_noffset));
+               return -1;
+       }
+
+       /* Avoid any overrun */
+       count = fit_get_subimage_count(fit, images_noffset);
+       if ((params->pflag < 0) || (count <= params->pflag)) {
+               printf("No such component at '%d'\n", params->pflag);
+               return -1;
+       }
+
+       /* Process its subnodes, extract the desired component from image */
+       for (ndepth = 0, count = 0,
+               noffset = fdt_next_node(fit, images_noffset, &ndepth);
+               (noffset >= 0) && (ndepth > 0);
+               noffset = fdt_next_node(fit, noffset, &ndepth)) {
+               if (ndepth == 1) {
+                       /*
+                        * Direct child node of the images parent node,
+                        * i.e. component image node.
+                        */
+                       if (params->pflag == count) {
+                               printf("Extracted:\n%s Image %u (%s)\n", p,
+                                      count, fit_get_name(fit, noffset, NULL));
+
+                               fit_image_print(fit, noffset, p);
+
+                               return fit_image_extract(fit, noffset,
+                                               params->outfile);
+                       }
+
+                       count++;
+               }
+       }
+
+       return 0;
+}
+
 static int fit_check_params(struct image_tool_params *params)
 {
        return  ((params->dflag && (params->fflag || params->lflag)) ||
@@ -162,19 +253,17 @@ static int fit_check_params(struct image_tool_params *params)
                (params->lflag && (params->dflag || params->fflag)));
 }
 
-static struct image_type_params fitimage_params = {
-       .name = "FIT Image support",
-       .header_size = sizeof(image_header_t),
-       .hdr = (void*)&header,
-       .verify_header = fit_verify_header,
-       .print_header = fit_print_contents,
-       .check_image_type = fit_check_image_types,
-       .fflag_handle = fit_handle_file,
-       .set_header = NULL,     /* FIT images use DTB header */
-       .check_params = fit_check_params,
-};
-
-void init_fit_image_type (void)
-{
-       register_image_type(&fitimage_params);
-}
+U_BOOT_IMAGE_TYPE(
+       fitimage,
+       "FIT Image support",
+       sizeof(image_header_t),
+       (void *)&header,
+       fit_check_params,
+       fit_verify_header,
+       fit_print_contents,
+       NULL,
+       fit_extract_contents,
+       fit_check_image_types,
+       fit_handle_file,
+       NULL /* FIT images use DTB header */
+);