On Wed, 2019-06-26 at 09:51 +0200, Sascha Hauer wrote: > On Wed, Jun 26, 2019 at 06:58:48AM +0200, Rouven Czerwinski wrote: > > quiet_cmd_kwb_image = KWB $@ > > cmd_kwb_image = scripts/kwbimage -p $< $(OPTS_$(@F)) -o $@ > > diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c > > index a7f1421..7169bf7 100644 > > --- a/scripts/imx/imx-image.c > > +++ b/scripts/imx/imx-image.c > > @@ -315,6 +315,17 @@ static size_t add_header_v2(const struct > > config_data *data, void *buf) > > uint32_t loadaddr = data->image_load_addr; > > uint32_t imagesize = data->load_size; > > > > + if (data->cpu_type == IMX_CPU_IMX8MQ) { > > + /* > > + * If singing is enabled on IMX8MQ, the linker script > > reserves a > > Make sure singing is not enabled without a speaker connected ;) > > > + * CSF_LEN aligned section directly after the PBL, > > + * only load and sign this area of the data. > > + */ > > + imagesize = roundup(data->pbl_code_size + HEADER_LEN, > > 0x4); > > + if (data->csf) > > + imagesize = roundup(imagesize, 0x1000); > > + } > > + > > buf += offset; > > hdr = buf; > > > > @@ -333,14 +344,22 @@ static size_t add_header_v2(const struct > > config_data *data, void *buf) > > hdr->self = loadaddr + offset; > > > > hdr->boot_data.start = loadaddr; > > - if (data->max_load_size && imagesize > data->max_load_size) > > + if (!data->csf && data->max_load_size > > + && imagesize > data->max_load_size) > > hdr->boot_data.size = data->max_load_size; > > else > > hdr->boot_data.size = imagesize; > > > > - if (data->csf) { > > + if (data->sign_image) { > > hdr->csf = loadaddr + imagesize; > > hdr->boot_data.size += CSF_LEN; > > + } else if (data->cpu_type == IMX_CPU_IMX8MQ && data->csf) { > > + /* > > + * For i.MX8 the CSF space is added via the linker > > script, so > > + * the CSF length needs to be added if HABV4 is enabled > > but > > + * signing is not. > > + */ > > + hdr->boot_data.size += CSF_LEN; > > } > > > > hdr->dcd_header.tag = TAG_DCD_HEADER; > > @@ -546,6 +565,7 @@ static int hab_sign(struct config_data *data) > > char *cst; > > void *buf; > > size_t csf_space = CSF_LEN; > > + unsigned int offset = 0; > > > > cst = getenv("CST"); > > if (!cst) > > @@ -620,6 +640,9 @@ static int hab_sign(struct config_data *data) > > return -errno; > > } > > > > + printf("--- CSF START ---\n"); > > + printf("%s\n", data->csf); > > + printf("--- CSF END ---\n"); > > fwrite(data->csf, 1, strlen(data->csf) + 1, f); > > > > pclose(f); > > @@ -672,13 +695,36 @@ static int hab_sign(struct config_data *data) > > return -errno; > > } > > > > - outfd = open(data->outfile, O_WRONLY | O_APPEND); > > + /* > > + * For i.MX8, write into the reserved CSF section > > + */ > > + if (data->cpu_type == IMX_CPU_IMX8MQ) > > + outfd = open(data->outfile, O_WRONLY); > > + else > > + outfd = open(data->outfile, O_WRONLY | O_APPEND); > > + > > if (outfd < 0) { > > fprintf(stderr, "Cannot open %s for writing: %s\n", > > data->outfile, > > strerror(errno)); > > exit(1); > > } > > > > + if (data->cpu_type == IMX_CPU_IMX8MQ) { > > + /* > > + * For i.MX8 insert the CSF data into the reserved CSF > > area > > + * right behind the PBL > > + */ > > + offset = roundup(data->header_gap + data->pbl_code_size > > + > > + HEADER_LEN, 0x1000); > > + if (data->signed_hdmi_firmware_file) > > + offset += PLUGIN_HDMI_SIZE; > > + > > + if (lseek(outfd, offset, SEEK_SET) < 0) { > > + perror("lseek"); > > + exit(1); > > + } > > + } > > + > > ret = xwrite(outfd, buf, csf_space); > > if (ret < 0) { > > fprintf(stderr, "write failed: %s\n", strerror(errno)); > > @@ -743,7 +789,6 @@ int main(int argc, char *argv[]) > > int outfd; > > int dcd_only = 0; > > int now = 0; > > - int sign_image = 0; > > int i, header_copies; > > int add_barebox_header; > > uint32_t barebox_image_size = 0; > > @@ -760,7 +805,7 @@ int main(int argc, char *argv[]) > > > > prgname = argv[0]; > > > > - while ((opt = getopt(argc, argv, "c:hf:o:bduse")) != -1) { > > + while ((opt = getopt(argc, argv, "c:hf:o:p:bduse")) != -1) { > > I'm missing the hunk for the usage() function ;) > > > switch (opt) { > > case 'c': > > configfile = optarg; > > @@ -771,6 +816,9 @@ int main(int argc, char *argv[]) > > case 'o': > > data.outfile = optarg; > > break; > > + case 'p': > > + data.pbl_code_size = strtoul(optarg, NULL, 0); > > + break; > > case 'b': > > add_barebox_header = 1; > > break; > > @@ -778,7 +826,7 @@ int main(int argc, char *argv[]) > > dcd_only = 1; > > break; > > case 's': > > - sign_image = 1; > > + data.sign_image = 1; > > Storing sign_image in struct config_data could be an extra patch to > make > this one a bit smaller. > > > break; > > case 'u': > > create_usb_image = 1; > > @@ -832,14 +880,12 @@ int main(int argc, char *argv[]) > > if (ret) > > exit(1); > > > > - if (data.max_load_size && (sign_image || data.encrypt_image)) { > > + if (data.max_load_size && (data.encrypt_image || data.csf) > > + && data.cpu_type != IMX_CPU_IMX8MQ) { > > fprintf(stderr, "Specifying max_load_size is > > incompatible with HAB signing/encrypting\n"); > > exit(1); > > } > > > > - if (!sign_image) > > - data.csf = NULL; > > Why is this no longer necessary with this patch? Was it unnecessary > before aswell? Then this might be worth an extra patch. No. I'm now using data->csf and data->sign_image to distinguish the case where HABv4 is enabled, but signing is not. Since the CSF space is always added if HABv4 is enabled, imx-image needs to correctly set boot_data.size, otherwise the piggy_data can't be correctly located later. I'll split this out and put the information into the commit message. Greetings, Rouven Czerwinski -- Pengutronix e.K. | | Industrial Linux Solutions | https://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox