Merge git://git.denx.de/u-boot-fsl-qoriq
[platform/kernel/u-boot.git] / tools / imximage.c
index 615a64e..0c43196 100644 (file)
@@ -281,7 +281,6 @@ static void set_dcd_rst_v2(struct imx_header *imxhdr, uint32_t dcd_len,
                        d = (struct dcd_v2_cmd *)(((char *)d) + len);
 
                len = (char *)d - (char *)&dcd_v2->header;
-
                dcd_v2->header.tag = DCD_HEADER_TAG;
                dcd_v2->header.length = cpu_to_be16(len);
                dcd_v2->header.version = DCD_VERSION;
@@ -301,8 +300,7 @@ static void set_imx_hdr_v1(struct imx_header *imxhdr, uint32_t dcd_len,
        /* Set magic number */
        fhdr_v1->app_code_barker = APP_CODE_BARKER;
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       hdr_base = entry_point - 4096;
+       hdr_base = entry_point - imximage_init_loadsize + flash_offset;
        fhdr_v1->app_dest_ptr = hdr_base - flash_offset;
        fhdr_v1->app_code_jump_vector = entry_point;
 
@@ -501,10 +499,19 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
                printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry);
                if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) &&
                    (imximage_csf_size != UNDEFINED)) {
+                       uint16_t dcdlen;
+                       int offs;
+
+                       dcdlen = hdr_v2->data.dcd_table.header.length;
+                       offs = (char *)&hdr_v2->data.dcd_table
+                               - (char *)hdr_v2;
+
                        printf("HAB Blocks:   %08x %08x %08x\n",
                               (uint32_t)fhdr_v2->self, 0,
                               hdr_v2->boot_data.size - imximage_ivt_offset -
                               imximage_csf_size);
+                       printf("DCD Blocks:   00910000 %08x %08x\n",
+                              offs, be16_to_cpu(dcdlen));
                }
        } else {
                imx_header_v2_t *next_hdr_v2;
@@ -533,12 +540,19 @@ static void print_hdr_v2(struct imx_header *imx_hdr)
 
 static void copy_plugin_code(struct imx_header *imxhdr, char *plugin_file)
 {
-       int ifd = -1;
+       int ifd;
        struct stat sbuf;
        char *plugin_buf = imxhdr->header.hdr_v2.data.plugin_code;
        char *ptr;
 
        ifd = open(plugin_file, O_RDONLY|O_BINARY);
+       if (ifd < 0) {
+               fprintf(stderr, "Can't open %s: %s\n",
+                       plugin_file,
+                       strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
        if (fstat(ifd, &sbuf) < 0) {
                fprintf(stderr, "Can't stat %s: %s\n",
                        plugin_file,
@@ -818,18 +832,19 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
        /* Parse dcd configuration file */
        dcd_len = parse_cfg_file(imxhdr, params->imagename);
 
-       if (imximage_version == IMXIMAGE_V2) {
+       if (imximage_version == IMXIMAGE_V1)
+               header_size = sizeof(flash_header_v1_t);
+       else {
                header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
                if (!plugin_image)
                        header_size += sizeof(dcd_v2_t);
                else
                        header_size += MAX_PLUGIN_CODE_SIZE;
-
-               if (imximage_init_loadsize < imximage_ivt_offset + header_size)
-                               imximage_init_loadsize = imximage_ivt_offset +
-                                       header_size;
        }
 
+       if (imximage_init_loadsize < imximage_ivt_offset + header_size)
+                       imximage_init_loadsize = imximage_ivt_offset + header_size;
+
        /* Set the imx header */
        (*set_imx_hdr)(imxhdr, dcd_len, params->ep, imximage_ivt_offset);
 
@@ -898,23 +913,21 @@ static int imximage_generate(struct image_tool_params *params,
        /* Parse dcd configuration file */
        parse_cfg_file(&imximage_header, params->imagename);
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       if (imximage_version == IMXIMAGE_V1) {
-               alloc_len = 4096;
-               header_size = 4096;
-       } else {
+       if (imximage_version == IMXIMAGE_V1)
+               header_size = sizeof(imx_header_v1_t);
+       else {
                header_size = sizeof(flash_header_v2_t) + sizeof(boot_data_t);
                if (!plugin_image)
                        header_size += sizeof(dcd_v2_t);
                else
                        header_size += MAX_PLUGIN_CODE_SIZE;
-
-               if (imximage_init_loadsize < imximage_ivt_offset + header_size)
-                               imximage_init_loadsize = imximage_ivt_offset +
-                                       header_size;
-               alloc_len = imximage_init_loadsize - imximage_ivt_offset;
        }
 
+       if (imximage_init_loadsize < imximage_ivt_offset + header_size)
+                       imximage_init_loadsize = imximage_ivt_offset + header_size;
+
+       alloc_len = imximage_init_loadsize - imximage_ivt_offset;
+
        if (alloc_len < header_size) {
                fprintf(stderr, "%s: header error\n",
                        params->cmdname);
@@ -944,11 +957,7 @@ static int imximage_generate(struct image_tool_params *params,
 
        pad_len = ROUND(sbuf.st_size, 4096) - sbuf.st_size;
 
-       /* TODO: check i.MX image V1 handling, for now use 'old' style */
-       if (imximage_version == IMXIMAGE_V1)
-               return 0;
-       else
-               return pad_len;
+       return pad_len;
 }