Skip to content

Commit

Permalink
tools: mtk_image: add an option to set device header offset
Browse files Browse the repository at this point in the history
This patch adds an option which allows setting the device header offset.
This is useful if this tool is used to generate ATF BL2 image of mt7622 for
SD cards.

Signed-off-by: Weijie Gao <[email protected]>
  • Loading branch information
hackpascal authored and trini committed Mar 20, 2021
1 parent 8ec9aa6 commit cfd48ec
Showing 1 changed file with 47 additions and 3 deletions.
50 changes: 47 additions & 3 deletions tools/mtk_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,13 @@ static const struct brom_img_type {
}
};

/* Indicates whether we're generating or verifying */
static bool img_gen;
static uint32_t img_size;

/* Image type selected by user */
static enum brlyt_img_type hdr_media;
static uint32_t hdr_offset;
static int use_lk_hdr;
static bool is_arm64_image;

Expand Down Expand Up @@ -275,6 +280,7 @@ static int mtk_brom_parse_imagename(const char *imagename)

/* User passed arguments from image name */
static const char *media = "";
static const char *hdr_offs = "";
static const char *nandinfo = "";
static const char *lk = "";
static const char *arm64_param = "";
Expand Down Expand Up @@ -317,6 +323,9 @@ static int mtk_brom_parse_imagename(const char *imagename)
if (!strcmp(key, "media"))
media = val;

if (!strcmp(key, "hdroffset"))
hdr_offs = val;

if (!strcmp(key, "nandinfo"))
nandinfo = val;

Expand Down Expand Up @@ -359,6 +368,10 @@ static int mtk_brom_parse_imagename(const char *imagename)
}
}

/* parse device header offset */
if (hdr_offs && hdr_offs[0])
hdr_offset = strtoul(hdr_offs, NULL, 0);

if (arm64_param && arm64_param[0] == '1')
is_arm64_image = true;

Expand Down Expand Up @@ -422,6 +435,7 @@ static int mtk_image_vrec_header(struct image_tool_params *params,
static int mtk_image_verify_gen_header(const uint8_t *ptr, int print)
{
union gen_boot_header *gbh = (union gen_boot_header *)ptr;
uint32_t gfh_offset, total_size, devh_size;
struct brom_layout_header *bh;
struct gfh_header *gfh;
const char *bootmedia;
Expand Down Expand Up @@ -453,7 +467,32 @@ static int mtk_image_verify_gen_header(const uint8_t *ptr, int print)
le32_to_cpu(bh->type) != BRLYT_TYPE_SDMMC))
return -1;

gfh = (struct gfh_header *)(ptr + le32_to_cpu(bh->header_size));
devh_size = sizeof(struct gen_device_header);

if (img_gen) {
gfh_offset = devh_size;
} else {
gfh_offset = le32_to_cpu(bh->header_size);

if (gfh_offset + sizeof(struct gfh_header) > img_size) {
/*
* This may happen if the hdr_offset used to generate
* this image is not zero.
* Since device header size is not fixed, we can't
* cover all possible cases.
* Assuming the image is valid only if the real
* device header size equals to devh_size.
*/
total_size = le32_to_cpu(bh->total_size);

if (total_size - gfh_offset > img_size - devh_size)
return -1;

gfh_offset = devh_size;
}
}

gfh = (struct gfh_header *)(ptr + gfh_offset);

if (strcmp(gfh->file_info.name, GFH_FILE_INFO_NAME))
return -1;
Expand Down Expand Up @@ -549,6 +588,8 @@ static int mtk_image_verify_header(unsigned char *ptr, int image_size,
if (le32_to_cpu(lk->magic) == LK_PART_MAGIC)
return 0;

img_size = image_size;

if (!strcmp((char *)ptr, NAND_BOOT_NAME))
return mtk_image_verify_nand_header(ptr, 0);
else
Expand Down Expand Up @@ -682,8 +723,8 @@ static void mtk_image_set_gen_header(void *ptr, off_t filesize,

/* BRLYT header */
put_brom_layout_header(&hdr->brlyt, hdr_media);
hdr->brlyt.header_size = cpu_to_le32(sizeof(struct gen_device_header));
hdr->brlyt.total_size = cpu_to_le32(filesize);
hdr->brlyt.header_size = cpu_to_le32(hdr_offset + sizeof(*hdr));
hdr->brlyt.total_size = cpu_to_le32(hdr_offset + filesize);
hdr->brlyt.header_size_2 = hdr->brlyt.header_size;
hdr->brlyt.total_size_2 = hdr->brlyt.total_size;

Expand Down Expand Up @@ -747,6 +788,9 @@ static void mtk_image_set_header(void *ptr, struct stat *sbuf, int ifd,
return;
}

img_gen = true;
img_size = sbuf->st_size;

if (hdr_media == BRLYT_TYPE_NAND || hdr_media == BRLYT_TYPE_SNAND)
mtk_image_set_nand_header(ptr, sbuf->st_size, params->addr);
else
Expand Down

0 comments on commit cfd48ec

Please sign in to comment.