]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - tools/kwbimage.c
gpio: remove gpiolib.c and define remaining functions as static inline in asm/gpio.h
[karo-tx-uboot.git] / tools / kwbimage.c
index 1120e9b3729024fc851ddba5a3410dcc92cf29d1..66f459ad6b1c7f2b65eb612349e6a2e647c8238e 100644 (file)
@@ -12,6 +12,7 @@
  */
 
 #include "imagetool.h"
+#include <limits.h>
 #include <image.h>
 #include <stdint.h>
 #include "kwbimage.h"
@@ -324,7 +325,7 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
        main_hdr = image;
 
        /* Fill in the main header */
-       main_hdr->blocksize = payloadsz + sizeof(uint32_t);
+       main_hdr->blocksize = payloadsz + sizeof(uint32_t) - headersz;
        main_hdr->srcaddr   = headersz;
        main_hdr->ext       = has_ext;
        main_hdr->destaddr  = params->addr;
@@ -396,13 +397,20 @@ static size_t image_headersz_v1(struct image_tool_params *params,
 
                ret = stat(binarye->binary.file, &s);
                if (ret < 0) {
-                       char *cwd = get_current_dir_name();
+                       char cwd[PATH_MAX];
+                       char *dir = cwd;
+
+                       memset(cwd, 0, sizeof(cwd));
+                       if (!getcwd(cwd, sizeof(cwd))) {
+                               dir = "current working directory";
+                               perror("getcwd() failed");
+                       }
+
                        fprintf(stderr,
                                "Didn't find the file '%s' in '%s' which is mandatory to generate the image\n"
                                "This file generally contains the DDR3 training code, and should be extracted from an existing bootable\n"
                                "image for your board. See 'kwbimage -x' to extract it from an existing image.\n",
-                               binarye->binary.file, cwd);
-                       free(cwd);
+                               binarye->binary.file, dir);
                        return 0;
                }
 
@@ -546,13 +554,14 @@ static int image_create_config_parse_oneline(char *line,
                el->version = atoi(value);
        } else if (!strcmp(keyword, "BOOT_FROM")) {
                char *value = strtok_r(NULL, deliminiters, &saveptr);
-               el->type = IMAGE_CFG_BOOT_FROM;
-               el->bootfrom = image_boot_mode_id(value);
-               if (el->bootfrom < 0) {
+               int ret = image_boot_mode_id(value);
+               if (ret < 0) {
                        fprintf(stderr,
                                "Invalid boot media '%s'\n", value);
                        return -1;
                }
+               el->type = IMAGE_CFG_BOOT_FROM;
+               el->bootfrom = ret;
        } else if (!strcmp(keyword, "NAND_BLKSZ")) {
                char *value = strtok_r(NULL, deliminiters, &saveptr);
                el->type = IMAGE_CFG_NAND_BLKSZ;
@@ -564,13 +573,14 @@ static int image_create_config_parse_oneline(char *line,
                        strtoul(value, NULL, 16);
        } else if (!strcmp(keyword, "NAND_ECC_MODE")) {
                char *value = strtok_r(NULL, deliminiters, &saveptr);
-               el->type = IMAGE_CFG_NAND_ECC_MODE;
-               el->nandeccmode = image_nand_ecc_mode_id(value);
-               if (el->nandeccmode < 0) {
+               int ret = image_nand_ecc_mode_id(value);
+               if (ret < 0) {
                        fprintf(stderr,
                                "Invalid NAND ECC mode '%s'\n", value);
                        return -1;
                }
+               el->type = IMAGE_CFG_NAND_ECC_MODE;
+               el->nandeccmode = ret;
        } else if (!strcmp(keyword, "NAND_PAGE_SIZE")) {
                char *value = strtok_r(NULL, deliminiters, &saveptr);
                el->type = IMAGE_CFG_NAND_PAGESZ;
@@ -720,7 +730,7 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
        FILE *fcfg;
        void *image = NULL;
        int version;
-       size_t headersz;
+       size_t headersz = 0;
        uint32_t checksum;
        int ret;
        int size;
@@ -752,14 +762,25 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
        }
 
        version = image_get_version();
-       /* Fallback to version 0 is no version is provided in the cfg file */
-       if (version == -1)
-               version = 0;
-
-       if (version == 0)
+       switch (version) {
+               /*
+                * Fallback to version 0 if no version is provided in the
+                * cfg file
+                */
+       case -1:
+       case 0:
                image = image_create_v0(&headersz, params, sbuf->st_size);
-       else if (version == 1)
+               break;
+
+       case 1:
                image = image_create_v1(&headersz, params, sbuf->st_size);
+               break;
+
+       default:
+               fprintf(stderr, "Unsupported version %d\n", version);
+               free(image_cfg);
+               exit(EXIT_FAILURE);
+       }
 
        if (!image) {
                fprintf(stderr, "Could not create image\n");
@@ -792,8 +813,8 @@ static void kwbimage_print_header(const void *ptr)
 
        printf("Image Type:   MVEBU Boot from %s Image\n",
               image_boot_mode_name(mhdr->blockid));
-       printf("Data Size:    ");
        printf("Image version:%d\n", image_version((void *)ptr));
+       printf("Data Size:    ");
        genimg_print_size(mhdr->blocksize - sizeof(uint32_t));
        printf("Load Address: %08x\n", mhdr->destaddr);
        printf("Entry Point:  %08x\n", mhdr->execaddr);
@@ -816,7 +837,8 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size,
 
        main_hdr = (void *)ptr;
        checksum = image_checksum8(ptr,
-                                  sizeof(struct main_hdr_v0));
+                                  sizeof(struct main_hdr_v0)
+                                  - sizeof(uint8_t));
        if (checksum != main_hdr->checksum)
                return -FDT_ERR_BADSTRUCTURE;
 
@@ -824,7 +846,8 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size,
        if (image_version((void *)ptr) == 0) {
                ext_hdr = (void *)ptr + sizeof(struct main_hdr_v0);
                checksum = image_checksum8(ext_hdr,
-                                          sizeof(struct ext_hdr_v0));
+                                          sizeof(struct ext_hdr_v0)
+                                          - sizeof(uint8_t));
                if (checksum != ext_hdr->checksum)
                        return -FDT_ERR_BADSTRUCTURE;
        }
@@ -882,19 +905,17 @@ static int kwbimage_check_params(struct image_tool_params *params)
 /*
  * kwbimage type parameters definition
  */
-static struct image_type_params kwbimage_params = {
-       .name           = "Marvell MVEBU Boot Image support",
-       .header_size    = 0,            /* no fixed header size */
-       .hdr            = NULL,
-       .vrec_header    = kwbimage_generate,
-       .check_image_type = kwbimage_check_image_types,
-       .verify_header  = kwbimage_verify_header,
-       .print_header   = kwbimage_print_header,
-       .set_header     = kwbimage_set_header,
-       .check_params   = kwbimage_check_params,
-};
-
-void init_kwb_image_type (void)
-{
-       register_image_type(&kwbimage_params);
-}
+U_BOOT_IMAGE_TYPE(
+       kwbimage,
+       "Marvell MVEBU Boot Image support",
+       0,
+       NULL,
+       kwbimage_check_params,
+       kwbimage_verify_header,
+       kwbimage_print_header,
+       kwbimage_set_header,
+       NULL,
+       kwbimage_check_image_types,
+       NULL,
+       kwbimage_generate
+);