Message ID | 20210719122104.29698-19-marek.behun@nic.cz |
---|---|
State | Superseded |
Delegated to: | Stefan Roese |
Headers | show |
Series | kwboot / kwbimage improvements reducing image size | expand |
On 19.07.21 14:20, Marek Behún wrote: > From: Pali Rohár <pali@kernel.org> > > This command is supported only by v1 images and specifies a milliseconds > delay after executing some set of DATA commands. The special string value > SDRAM_SETUP instructs BootROM to setup SDRAM controller instead of > executing delay. SDRAM_SETUP may be specified only once and after the > last DATA command. > > Signed-off-by: Pali Rohár <pali@kernel.org> > Reviewed-by: Marek Behún <marek.behun@nic.cz> > Reviewed-by: Chris Packham <judge.packham@gmail.com> > Tested-by: Chris Packham <judge.packham@gmail.com> Reviewed-by: Stefan Roese <sr@denx.de> Thanks, Stefan > --- > tools/kwbimage.c | 24 +++++++++++++++++++++++- > 1 file changed, 23 insertions(+), 1 deletion(-) > > diff --git a/tools/kwbimage.c b/tools/kwbimage.c > index b585f49180..469e5b55f2 100644 > --- a/tools/kwbimage.c > +++ b/tools/kwbimage.c > @@ -104,6 +104,7 @@ enum image_cfg_type { > IMAGE_CFG_NAND_PAGESZ, > IMAGE_CFG_BINARY, > IMAGE_CFG_DATA, > + IMAGE_CFG_DATA_DELAY, > IMAGE_CFG_BAUDRATE, > IMAGE_CFG_DEBUG, > IMAGE_CFG_KAK, > @@ -131,6 +132,7 @@ static const char * const id_strs[] = { > [IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE", > [IMAGE_CFG_BINARY] = "BINARY", > [IMAGE_CFG_DATA] = "DATA", > + [IMAGE_CFG_DATA_DELAY] = "DATA_DELAY", > [IMAGE_CFG_BAUDRATE] = "BAUDRATE", > [IMAGE_CFG_DEBUG] = "DEBUG", > [IMAGE_CFG_KAK] = "KAK", > @@ -162,6 +164,7 @@ struct image_cfg_element { > unsigned int nandeccmode; > unsigned int nandpagesz; > struct ext_hdr_v0_reg regdata; > + unsigned int regdata_delay; > unsigned int baudrate; > unsigned int debug; > const char *key_name; > @@ -1289,8 +1292,21 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, > register_set_hdr = (struct register_set_hdr_v1 *)cur; > for (cfgi = 0; cfgi < cfgn; cfgi++) { > e = &image_cfg[cfgi]; > - if (e->type != IMAGE_CFG_DATA) > + if (e->type != IMAGE_CFG_DATA && > + e->type != IMAGE_CFG_DATA_DELAY) > continue; > + if (e->type == IMAGE_CFG_DATA_DELAY) { > + size = sizeof(struct register_set_hdr_v1) + 8 * datai + 4; > + register_set_hdr->headertype = OPT_HDR_V1_REGISTER_TYPE; > + register_set_hdr->headersz_lsb = cpu_to_le16(size & 0xFFFF); > + register_set_hdr->headersz_msb = size >> 16; > + register_set_hdr->data[datai].last_entry.delay = e->regdata_delay; > + cur += size; > + *next_ext = 1; > + next_ext = ®ister_set_hdr->data[datai].last_entry.next; > + datai = 0; > + continue; > + } > register_set_hdr->data[datai].entry.address = > cpu_to_le32(e->regdata.raddr); > register_set_hdr->data[datai].entry.value = > @@ -1429,6 +1445,12 @@ static int image_create_config_parse_oneline(char *line, > el->regdata.raddr = strtoul(value1, NULL, 16); > el->regdata.rdata = strtoul(value2, NULL, 16); > break; > + case IMAGE_CFG_DATA_DELAY: > + if (!strcmp(value1, "SDRAM_SETUP")) > + el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP; > + else > + el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_MS(strtoul(value1, NULL, 10)); > + break; > case IMAGE_CFG_BAUDRATE: > el->baudrate = strtoul(value1, NULL, 10); > break; > Viele Grüße, Stefan
diff --git a/tools/kwbimage.c b/tools/kwbimage.c index b585f49180..469e5b55f2 100644 --- a/tools/kwbimage.c +++ b/tools/kwbimage.c @@ -104,6 +104,7 @@ enum image_cfg_type { IMAGE_CFG_NAND_PAGESZ, IMAGE_CFG_BINARY, IMAGE_CFG_DATA, + IMAGE_CFG_DATA_DELAY, IMAGE_CFG_BAUDRATE, IMAGE_CFG_DEBUG, IMAGE_CFG_KAK, @@ -131,6 +132,7 @@ static const char * const id_strs[] = { [IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE", [IMAGE_CFG_BINARY] = "BINARY", [IMAGE_CFG_DATA] = "DATA", + [IMAGE_CFG_DATA_DELAY] = "DATA_DELAY", [IMAGE_CFG_BAUDRATE] = "BAUDRATE", [IMAGE_CFG_DEBUG] = "DEBUG", [IMAGE_CFG_KAK] = "KAK", @@ -162,6 +164,7 @@ struct image_cfg_element { unsigned int nandeccmode; unsigned int nandpagesz; struct ext_hdr_v0_reg regdata; + unsigned int regdata_delay; unsigned int baudrate; unsigned int debug; const char *key_name; @@ -1289,8 +1292,21 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, register_set_hdr = (struct register_set_hdr_v1 *)cur; for (cfgi = 0; cfgi < cfgn; cfgi++) { e = &image_cfg[cfgi]; - if (e->type != IMAGE_CFG_DATA) + if (e->type != IMAGE_CFG_DATA && + e->type != IMAGE_CFG_DATA_DELAY) continue; + if (e->type == IMAGE_CFG_DATA_DELAY) { + size = sizeof(struct register_set_hdr_v1) + 8 * datai + 4; + register_set_hdr->headertype = OPT_HDR_V1_REGISTER_TYPE; + register_set_hdr->headersz_lsb = cpu_to_le16(size & 0xFFFF); + register_set_hdr->headersz_msb = size >> 16; + register_set_hdr->data[datai].last_entry.delay = e->regdata_delay; + cur += size; + *next_ext = 1; + next_ext = ®ister_set_hdr->data[datai].last_entry.next; + datai = 0; + continue; + } register_set_hdr->data[datai].entry.address = cpu_to_le32(e->regdata.raddr); register_set_hdr->data[datai].entry.value = @@ -1429,6 +1445,12 @@ static int image_create_config_parse_oneline(char *line, el->regdata.raddr = strtoul(value1, NULL, 16); el->regdata.rdata = strtoul(value2, NULL, 16); break; + case IMAGE_CFG_DATA_DELAY: + if (!strcmp(value1, "SDRAM_SETUP")) + el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP; + else + el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_MS(strtoul(value1, NULL, 10)); + break; case IMAGE_CFG_BAUDRATE: el->baudrate = strtoul(value1, NULL, 10); break;