summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorSteffen Trumtrar <s.trumtrar@pengutronix.de>2018-07-31 12:44:37 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-08-08 09:22:48 +0200
commitef7a2a150477ff55e0e7ba74b9d4e86a1482c497 (patch)
treedc7cf145baabb6181e942e81d0856497344b1cfb /scripts
parentd916ae12bfdf05e3125e5ab2612ca0ff47f08e04 (diff)
downloadbarebox-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>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/socfpga_mkimage.c25
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,