diff options
author | Steffen Trumtrar <s.trumtrar@pengutronix.de> | 2018-07-31 12:44:37 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-08-08 09:22:48 +0200 |
commit | ef7a2a150477ff55e0e7ba74b9d4e86a1482c497 (patch) | |
tree | dc7cf145baabb6181e942e81d0856497344b1cfb | |
parent | d916ae12bfdf05e3125e5ab2612ca0ff47f08e04 (diff) | |
download | barebox-ef7a2a150477ff55e0e7ba74b9d4e86a1482c497.tar.gz barebox-ef7a2a150477ff55e0e7ba74b9d4e86a1482c497.tar.xz |
scripts: socfpga_mkimage: add size feature for PBL barebox
Add the switch 's' to fixup the image size into the barebox header.
This is used by the Arria10 PBL code to know the complete image size.
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | scripts/socfpga_mkimage.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/scripts/socfpga_mkimage.c b/scripts/socfpga_mkimage.c index d7fe1b1b69..fedcfb5b6f 100644 --- a/scripts/socfpga_mkimage.c +++ b/scripts/socfpga_mkimage.c @@ -256,7 +256,7 @@ static int add_socfpga_header(void *buf, size_t size, unsigned start_addr, unsig static void usage(const char *prgname) { - fprintf(stderr, "usage: %s [-hb] [-v version] <infile> -o <outfile>\n", prgname); + fprintf(stderr, "usage: %s [-hbs] [-v version] <infile> -o <outfile>\n", prgname); } int main(int argc, char *argv[]) @@ -268,9 +268,11 @@ int main(int argc, char *argv[]) int fd; int max_image_size, min_image_size = 80; int addsize = 0, pad; + int fixup_size = 0; unsigned int version = 0; + int fixed_size = 0; - while ((opt = getopt(argc, argv, "o:hbv:")) != -1) { + while ((opt = getopt(argc, argv, "o:hbsv:")) != -1) { switch (opt) { case 'v': version = atoi(optarg); @@ -285,6 +287,9 @@ int main(int argc, char *argv[]) min_image_size = 0; addsize = 512; break; + case 's': + fixup_size = 1; + break; case 'h': usage(argv[0]); exit(0); @@ -349,10 +354,26 @@ int main(int argc, char *argv[]) exit(1); } + fixed_size = s.st_size; + close(fd); if (add_barebox_header) { + int barebox_size = 0; + int *image_size = buf + 0x2c; + memcpy(buf, bb_header, sizeof(bb_header)); + + if (fixup_size) { + fixed_size = htole32(fixed_size); + + barebox_size = *((uint32_t *)buf + (fixed_size + addsize + pad) / 4 - 1); + + /* size of barebox+pbl, header, size */ + fixed_size += (barebox_size + addsize + 4); + + *image_size = fixed_size; + } } ret = add_socfpga_header(buf, s.st_size + 4 + addsize + pad, addsize, |