diff mbox series

[u-boot-mvebu,v2,18/41] tools: kwbimage: Add support for a new DATA_DELAY command

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

Commit Message

Marek Behún July 19, 2021, 12:20 p.m. UTC
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>
---
 tools/kwbimage.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

Comments

Stefan Roese July 21, 2021, 9:35 a.m. UTC | #1
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 = &register_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 mbox series

Patch

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 = &register_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;