+static void print_hdr_v2(struct imx_header *imx_hdr)
+{
+ imx_header_v2_t *hdr_v2 = &imx_hdr->header.hdr_v2;
+ flash_header_v2_t *fhdr_v2 = &hdr_v2->fhdr;
+ dcd_v2_t *dcd_v2 = &hdr_v2->dcd_table;
+ uint32_t size, version;
+
+ size = be16_to_cpu(dcd_v2->header.length) - 8;
+ if (size > (MAX_HW_CFG_SIZE_V2 * sizeof(dcd_addr_data_t))) {
+ fprintf(stderr,
+ "Error: Image corrupt DCD size %d exceed maximum %d\n",
+ (uint32_t)(size / sizeof(dcd_addr_data_t)),
+ MAX_HW_CFG_SIZE_V2);
+ exit(EXIT_FAILURE);
+ }
+
+ version = detect_imximage_version(imx_hdr);
+
+ printf("Image Type: Freescale IMX Boot Image\n");
+ printf("Image Ver: %x", version);
+ printf("%s\n", get_table_entry_name(imximage_versions, NULL, version));
+ printf("Data Size: ");
+ genimg_print_size(hdr_v2->boot_data.size);
+ printf("Load Address: %08x\n", (uint32_t)fhdr_v2->boot_data_ptr);
+ printf("Entry Point: %08x\n", (uint32_t)fhdr_v2->entry);
+ if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
+ (imximage_csf_size != UNDEFINED)) {
+ printf("HAB Blocks: %08x %08x %08x\n",
+ (uint32_t)fhdr_v2->self, 0,
+ hdr_v2->boot_data.size - imximage_ivt_offset -
+ imximage_csf_size);
+ }
+}
+
+static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,
+ char *name, int lineno, int fld, int dcd_len)
+{
+ int value;
+ static int cmd_ver_first = ~0;
+
+ switch (cmd) {
+ case CMD_IMAGE_VERSION:
+ imximage_version = get_cfg_value(token, name, lineno);
+ if (cmd_ver_first == 0) {
+ fprintf(stderr, "Error: %s[%d] - IMAGE_VERSION "
+ "command need be the first before other "
+ "valid command in the file\n", name, lineno);
+ exit(EXIT_FAILURE);
+ }
+ cmd_ver_first = 1;
+ set_hdr_func();
+ break;
+ case CMD_BOOT_FROM:
+ imximage_ivt_offset = get_table_entry_id(imximage_boot_offset,
+ "imximage boot option", token);
+ if (imximage_ivt_offset == -1) {
+ fprintf(stderr, "Error: %s[%d] -Invalid boot device"
+ "(%s)\n", name, lineno, token);
+ exit(EXIT_FAILURE);
+ }
+
+ imximage_init_loadsize =
+ get_table_entry_id(imximage_boot_loadsize,
+ "imximage boot option", token);
+
+ if (imximage_init_loadsize == -1) {
+ fprintf(stderr,
+ "Error: %s[%d] -Invalid boot device(%s)\n",
+ name, lineno, token);
+ exit(EXIT_FAILURE);
+ }
+
+ /*
+ * The SOC loads from the storage starting at address 0
+ * then ensures that the load size contains the offset
+ */
+ if (imximage_init_loadsize < imximage_ivt_offset)
+ imximage_init_loadsize = imximage_ivt_offset;
+ if (unlikely(cmd_ver_first != 1))
+ cmd_ver_first = 0;
+ break;
+ case CMD_BOOT_OFFSET:
+ imximage_ivt_offset = get_cfg_value(token, name, lineno);
+ if (unlikely(cmd_ver_first != 1))
+ cmd_ver_first = 0;
+ break;
+ case CMD_DATA:
+ value = get_cfg_value(token, name, lineno);
+ (*set_dcd_val)(imxhdr, name, lineno, fld, value, dcd_len);
+ if (unlikely(cmd_ver_first != 1))
+ cmd_ver_first = 0;
+ break;
+ case CMD_CSF:
+ if (imximage_version != 2) {
+ fprintf(stderr,
+ "Error: %s[%d] - CSF only supported for VERSION 2(%s)\n",
+ name, lineno, token);
+ exit(EXIT_FAILURE);
+ }
+ imximage_csf_size = get_cfg_value(token, name, lineno);
+ if (unlikely(cmd_ver_first != 1))
+ cmd_ver_first = 0;
+ break;
+ }
+}
+
+static void parse_cfg_fld(struct imx_header *imxhdr, int32_t *cmd,
+ char *token, char *name, int lineno, int fld, int *dcd_len)
+{
+ int value;
+
+ switch (fld) {
+ case CFG_COMMAND:
+ *cmd = get_table_entry_id(imximage_cmds,
+ "imximage commands", token);
+ if (*cmd < 0) {
+ fprintf(stderr, "Error: %s[%d] - Invalid command"
+ "(%s)\n", name, lineno, token);
+ exit(EXIT_FAILURE);
+ }
+ break;
+ case CFG_REG_SIZE:
+ parse_cfg_cmd(imxhdr, *cmd, token, name, lineno, fld, *dcd_len);
+ break;
+ case CFG_REG_ADDRESS:
+ case CFG_REG_VALUE:
+ if (*cmd != CMD_DATA)
+ return;
+
+ value = get_cfg_value(token, name, lineno);
+ (*set_dcd_val)(imxhdr, name, lineno, fld, value, *dcd_len);
+
+ if (fld == CFG_REG_VALUE) {
+ (*dcd_len)++;
+ if (*dcd_len > max_dcd_entries) {
+ fprintf(stderr, "Error: %s[%d] -"
+ "DCD table exceeds maximum size(%d)\n",
+ name, lineno, max_dcd_entries);
+ exit(EXIT_FAILURE);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+static uint32_t parse_cfg_file(struct imx_header *imxhdr, char *name)