Re: [PATCH 1/7] rockchip: mkimage: Split size_and_off and size_and_nimage

Quentin Schulz via U-Boot <[email protected]> Thu, 6 Aug 2026 17:25:23 +0200
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <636c02a7-a7c5-473b-b5cf-2900fd1adae7__11275.4824383714$1786029954$gmane$org@0leil.net>
Hi Jonas,

On 8/6/26 3:09 PM, Jonas Karlman wrote:
> Hi Quentin,
> 
> On 8/6/2026 1:15 PM, Quentin Schulz wrote:
>> Hi Alexey,
>>
>> On 7/13/26 12:02 PM, Alexey Charkov wrote:
>>> From: Jonas Karlman <[email protected]>
>>>
>>> Split 32-bit size_and_off and size_and_nimage fields of the v2 image
>>> format header into their own 16-bit size, offset and num_images fields.
>>>
>>> Set num_images based on number of images passed by the datafile
>>> parameter and size based on the offset to the hash field to fix using a
>>> single init data file and no boot data file for the v2 image format.
>>>
>>
>> When you need to start listing things you do in a commit, it means it
>> needs to be split into multiple individual commits doing one thing at a
>> time. I appreciate this is taken from Jonas's tree but it's fine to
>> modify (well, from a maintainer's perspective at least :) ). Please list
>> between Jonas's and your Signed-off-by what you changed since Jonas's
>> version, in square brackets.
>>
>>> Signed-off-by: Jonas Karlman <[email protected]>
>>> Signed-off-by: Alexey Charkov <[email protected]>
>>> ---
>>>    tools/rkcommon.c | 44 ++++++++++++++++++++++++--------------------
>>>    1 file changed, 24 insertions(+), 20 deletions(-)
>>>
>>> diff --git a/tools/rkcommon.c b/tools/rkcommon.c
>>> index b39777fc0607..034896d57f80 100644
>>> --- a/tools/rkcommon.c
>>> +++ b/tools/rkcommon.c
>>> @@ -34,15 +34,16 @@ enum hash_type {
>>>    /**
>>>     * struct image_entry
>>>     *
>>> - * @size_and_off:	[31:16]image size;[15:0]image offset
>>> - * @address:	default as 0xFFFFFFFF
>>> + * @offset:	image offset (unit as 512 byte blocks)
>>> + * @size:	image size (unit as 512 byte blocks)
>>> + * @address:	load address (default as 0xFFFFFFFF)
>>
>> Can it be anything but 0xFFFFFFFF? It's not even configurable currently.
>>
>>>     * @flag:	no use
>>>     * @counter:	no use
>>>     * @hash:	hash of image
>>> - *
>>>     */
>>>    struct image_entry {
>>> -	uint32_t size_and_off;
>>> +	uint16_t offset;
>>> +	uint16_t size;
>>
>> Do we need to start __attribute__ ((__packed__))'ing the structure to
>> make sure there's no padding involved ever?
>>
>>>    	uint32_t address;
>>>    	uint32_t flag;
>>>    	uint32_t counter;
>>> @@ -56,16 +57,17 @@ struct image_entry {
>>>     * This is stored at SD card block 64 (where each block is 512 bytes)
>>>     *
>>>     * @magic:	Magic (must be RK_MAGIC_V2)
>>> - * @size_and_nimage:	[31:16]number of images;[15:0]
>>> - *			offset to hash field of header(unit as 4Byte)
>>> - * @boot_flag:	[3:0]hash type(0:none,1:sha256,2:sha512)
>>> - * @signature:	hash or signature for header info
>>> - *
>>> + * @size:	offset to hash field of header (unit as 4 bytes)
>>
>> I'm assuming we mean "unit as multiples of 4 bytes"? Is that correct?
>> Can we say that instead, I find it clearer.
>>
>>> + * @num_images:	number of images
>>
>> Can we improve this documentation as well? I'm assuming this is the
>> number of images stored in idbloader.img (so typically SPL + optionally
>> TPL + optionally VPL/boost?)
>>
>>> + * @boot_flag:	[3:0] hash type (0:none, 1:sha256, 2:sha512)
>>> + * @images:	images
>>
>> Not sure this is helping, either specify what those are or simply don't
>> comment.
>>
>>> + * @hash:	hash or signature for header info
>>>     */
>>>    struct header0_info_v2 {
>>>    	uint32_t magic;
>>>    	uint8_t reserved[4];
>>> -	uint32_t size_and_nimage;
>>> +	uint16_t size;
>>> +	uint16_t num_images;
>>
>> Do we need to start __attribute__ ((__packed__))'ing the structure to
>> make sure there's no padding involved ever?
>>
>> Side question, should we start using the proper expected endianness
>> here? e.g. __le16/__le32 instead of uint32_t and uint16_t? What do you
>> think?
>>
>>>    	uint32_t boot_flag;
>>>    	uint8_t reserved1[104];
>>>    	struct image_entry images[4];
>>> @@ -351,17 +353,18 @@ static void rkcommon_set_header0_v2(void *buf, struct image_tool_params *params)
>>>    	printf("Image Type:   Rockchip %s boot image\n",
>>>    		rkcommon_get_spl_hdr(params));
>>>    	memset(buf, '\0', RK_INIT_OFFSET * RK_BLK_SIZE);
>>> -	hdr->magic   = cpu_to_le32(RK_MAGIC_V2);
>>> -	hdr->size_and_nimage = cpu_to_le32((2 << 16) + 384);
>>> +	hdr->magic = cpu_to_le32(RK_MAGIC_V2);
>>
>> Please don't mix cosmetic changes as those and logic changes, in the
>> same commit. The whitespaces removal makes it harder to identify quickly
>> what is actually changed.
>>
>>>    	hdr->boot_flag = cpu_to_le32(HASH_SHA256);
>>>    	sector_offset = 4;
>>>    	image_size_array[0] = spl_params.init_size;
>>>    	image_size_array[1] = spl_params.boot_size;
>>>    
>>>    	for (i = 0; i < 2; i++) {
>>> +		if (!image_size_array[i])
>>> +			break;
>>>    		image_sector_count = image_size_array[i] / RK_BLK_SIZE;
>>> -		hdr->images[i].size_and_off = cpu_to_le32((image_sector_count
>>> -							<< 16) + sector_offset);
>>> +		hdr->images[i].offset = cpu_to_le16(sector_offset);
>>> +		hdr->images[i].size = cpu_to_le16(image_sector_count);
>>>    		hdr->images[i].address = 0xFFFFFFFF;
>>>    		hdr->images[i].counter = cpu_to_le32(i + 1);
>>>    		image_ptr = buf + sector_offset * RK_BLK_SIZE;
>>> @@ -370,6 +373,8 @@ static void rkcommon_set_header0_v2(void *buf, struct image_tool_params *params)
>>>    		sector_offset = sector_offset + image_sector_count;
>>>    	}
>>>    
>>> +	hdr->num_images = cpu_to_le16(i);
>>
>> Is it though? if image_size_array[i] is 0, it means nothing was passed
>> as the i+1th image to mkimage -T rksd/rkspi -d no?
>>
>>> +	hdr->size = cpu_to_le16(offsetof(typeof(*hdr), hash) / sizeof(uint32_t));
>>>    	do_sha256_hash(buf, (void *)hdr->hash - buf, hdr->hash);
>>>    }
>>>    
>>> @@ -516,10 +521,8 @@ void rkcommon_print_header(const void *buf, struct image_tool_params *params)
>>>    			return;
>>>    		}
>>>    
>>> -		init_size = header0_v2.images[0].size_and_off >> 16;
>>> -		init_size = init_size * RK_BLK_SIZE;
>>> -		boot_size = header0_v2.images[1].size_and_off >> 16;
>>> -		boot_size = boot_size * RK_BLK_SIZE;
>>> +		init_size = le16_to_cpu(header0_v2.images[0].size) * RK_BLK_SIZE;
>>> +		boot_size = le16_to_cpu(header0_v2.images[1].size) * RK_BLK_SIZE;
>>>    	} else {
>>>    		ret = rkcommon_parse_header(buf, &header0, &spl_info);
>>>    
>>> @@ -533,8 +536,9 @@ void rkcommon_print_header(const void *buf, struct image_tool_params *params)
>>>    		}
>>>    
>>>    		image_type = ret;
>>> -		init_size = header0.init_size * RK_BLK_SIZE;
>>> -		boot_size = header0.init_boot_size * RK_BLK_SIZE - init_size;
>>> +		init_size = le16_to_cpu(header0.init_size) * RK_BLK_SIZE;
>>> +		boot_size = le16_to_cpu(header0.init_boot_size) * RK_BLK_SIZE -
>>> +			    init_size;
>>>    
>>
>> I could identify multiple commits to be split out of this one:
>> - update documentation,
>> - whitespace around ->magic assignment,
>> - break the loop when image_size_array[i] is 0,
>> - properly translate init_size/boot_size into CPU endianness,
>> - split size_and_nimage u32 into two u16,
>> - split size_and_off u32 into two u16,
>> - programmatically set ->size,
>> - programmatically set ->num_images,
> 
> As stated to Alexey previously I have started re-working my old series
> to address your old review comments, current local version have:
> 
> b86f1ed33d9d WIP: rockchip: mkimage: Compare full string when matching imagename
> d849f5710a62 WIP: rockchip: mkimage: Print image-type for the v2 format
> 690bd184c62f WIP: rockchip: mkimage: use le16/le32_to_cpu when reading header fields
> 01e1ce9ccab4 WIP: rockchip: mkimage: static assert
> d5b2191eae34 WIP: rockchip: mkimage: split size_and_off in struct image_entry
> 0bbb7bf20348 WIP: rockchip: mkimage: split size_and_nimage in struct header0_info_v2
> 4f1cc2100120 WIP: rockchip: mkimage: Set header size based on offset to hash
> 2031ef00ddaa rockchip: mkimage: Split size_and_off and size_and_nimage
> deae586379d8 rockchip: mkimage: Print image information for all embedded images
> 15867436697d rockchip: mkimage: Print image information for all embedded images
> c5f38fe9aa85 rockchip: mkimage: Print boot0 and boot1 parameters
> c03eda77d517 WIP: rockchip: mkimage: Print hash algo and image hash value
> c28f75ab3d22 WIP: rockchip: mkimage: Print signature type
> 744b76c3e716 WIP: rockchip: mkimage: Extract and use rkcommon_get_aligned_filesize()
> e667ac1ff977 WIP: rockchip: mkimage: Extract and use rkcommon_get_header_size()
> 776f4b84625f rockchip: mkimage: Add option to change image offset alignment
> 403e40c9fe80 rockchip: mkimage: Add support for up to 4 input files
> 
> But I have not completed addressing all review comments yet, will be
> sending a v2 of my original series in a few days.
> 

Should I stop reviewing the rest of this series and wait for your v2 then?

Cheers,
Quentin