[PATCH u-boot-mvebu v2 17/41] tools: kwbimage: Add support for DATA command also for v1 images

Stefan Roese sr at denx.de
Wed Jul 21 11:35:09 CEST 2021


On 19.07.21 14:20, Marek Behún wrote:
> From: Pali Rohár <pali at kernel.org>
> 
> The DATA command is already supported by mkimage for v0 images, but not
> for v1 images.
> 
> BootROM code which executes v1 images also supports DATA command via an
> optional extended v1 header OPT_HDR_V1_REGISTER_TYPE.
> 
> Implement support for DATA command for v1 images.
> 
> Signed-off-by: Pali Rohár <pali at kernel.org>
> Reviewed-by: Marek Behún <marek.behun at nic.cz>
> Reviewed-by: Chris Packham <judge.packham at gmail.com>
> Tested-by: Chris Packham <judge.packham at gmail.com>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   tools/kwbimage.c | 32 +++++++++++++++++++++++++++++++-
>   tools/kwbimage.h | 27 +++++++++++++++++++++++++++
>   2 files changed, 58 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/kwbimage.c b/tools/kwbimage.c
> index 74a77412d7..b585f49180 100644
> --- a/tools/kwbimage.c
> +++ b/tools/kwbimage.c
> @@ -933,6 +933,7 @@ static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
>   static size_t image_headersz_v1(int *hasext)
>   {
>   	struct image_cfg_element *binarye;
> +	unsigned int count;
>   	size_t headersz;
>   	int cfgi;
>   
> @@ -942,6 +943,10 @@ static size_t image_headersz_v1(int *hasext)
>   	 */
>   	headersz = sizeof(struct main_hdr_v1);
>   
> +	count = image_count_options(IMAGE_CFG_DATA);
> +	if (count > 0)
> +		headersz += sizeof(struct register_set_hdr_v1) + 8 * count + 4;
> +
>   	for (cfgi = 0; cfgi < cfgn; cfgi++) {
>   		int ret;
>   		struct stat s;
> @@ -1188,6 +1193,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
>   {
>   	struct image_cfg_element *e;
>   	struct main_hdr_v1 *main_hdr;
> +	struct register_set_hdr_v1 *register_set_hdr;
>   #if defined(CONFIG_KWB_SECURE)
>   	struct secure_hdr_v1 *secure_hdr = NULL;
>   #endif
> @@ -1195,7 +1201,7 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
>   	uint8_t *image, *cur;
>   	int hasext = 0;
>   	uint8_t *next_ext = NULL;
> -	int cfgi;
> +	int cfgi, datai, size;
>   
>   	/*
>   	 * Calculate the size of the header and the size of the
> @@ -1279,6 +1285,30 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
>   	}
>   #endif
>   
> +	datai = 0;
> +	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)
> +			continue;
> +		register_set_hdr->data[datai].entry.address =
> +			cpu_to_le32(e->regdata.raddr);
> +		register_set_hdr->data[datai].entry.value =
> +			cpu_to_le32(e->regdata.rdata);
> +		datai++;
> +	}
> +	if (datai != 0) {
> +		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;
> +		/* Set delay to the smallest possible value 1ms. */
> +		register_set_hdr->data[datai].last_entry.delay = 1;
> +		cur += size;
> +		*next_ext = 1;
> +		next_ext = &register_set_hdr->data[datai].last_entry.next;
> +	}
> +
>   	for (cfgi = 0; cfgi < cfgn; cfgi++) {
>   		e = &image_cfg[cfgi];
>   		if (e->type != IMAGE_CFG_BINARY)
> diff --git a/tools/kwbimage.h b/tools/kwbimage.h
> index cab3d95d13..9f86da46e8 100644
> --- a/tools/kwbimage.h
> +++ b/tools/kwbimage.h
> @@ -148,6 +148,33 @@ struct secure_hdr_v1 {
>   	uint16_t reserved5;		/* 0x25E2 - 0x25E3 */
>   };
>   
> +/*
> + * Structure of register set
> + */
> +struct register_set_hdr_v1 {
> +	uint8_t  headertype;		/* 0x0 */
> +	uint8_t  headersz_msb;		/* 0x1 */
> +	uint16_t headersz_lsb;		/* 0x2 - 0x3 */
> +	union {
> +		struct {
> +			uint32_t address;	/* 0x4+8*N - 0x7+8*N */
> +			uint32_t value;		/* 0x8+8*N - 0xB+8*N */
> +		} entry;
> +		struct {
> +			uint8_t  next;		/* 0xC+8*N */
> +			uint8_t  delay;		/* 0xD+8*N */
> +			uint16_t reserved;	/* 0xE+8*N - 0xF+8*N */
> +		} last_entry;
> +	} data[];
> +};
> +
> +/*
> + * Value 0 in register_set_hdr_v1 delay field is special.
> + * Instead of delay it setup SDRAM Controller.
> + */
> +#define REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP 0
> +#define REGISTER_SET_HDR_OPT_DELAY_MS(val) ((val) ?: 1)
> +
>   /*
>    * Various values for the opt_hdr_v1->headertype field, describing the
>    * different types of optional headers. The "secure" header contains
> 


Viele Grüße,
Stefan

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list