[PATCH v3 6/6] tools: mkfwumdata: Remove dependency on fwu_mdata.h header

Sughosh Ganu sughosh.ganu at arm.com
Wed Feb 18 10:48:43 CET 2026


On Mon, Feb 16, 2026 at 02:35:36PM +0100, Kory Maincent wrote:
> The dependency on fwu_mdata.h creates unnecessary configuration
> requirements. To generate metadata V1, CONFIG_FWU_MDATA_V1 must be
> enabled, which in turn requires enabling FWU_MULTI_BANK_UPDATE,
> EFI_CAPSULE_ON_DISK, PARTITION_TYPE_GUID, and other unrelated configs.
> This is not suitable for a simple standalone tool.
> 
> Additionally, even with the "-v 1" option to generate V1 metadata, the
> tool will still include the firmware store description if
> CONFIG_FWU_MDATA_V1 is not enabled. This structure should only be
> present in metadata V2.
> 
> Replace the fwu_mdata.h dependency with the new fwumdata header to make
> the tool compatible with both V1 and V2 without requiring any defconfig
> changes. This also uses the access helper functions from the header to
> eliminate code duplication.
> 
> Signed-off-by: Kory Maincent <kory.maincent at bootlin.com>
> ---

Acked-by: Sughosh Ganu <sughosh.ganu at arm.com>
Tested-by: Sughosh Ganu <sughosh.ganu at arm.com>

-sughosh

> 
> Change in v2:
> - Fix mdata->desc_offset value.
> ---
>  tools/fwumdata_src/mkfwumdata.c | 96 ++++++++---------------------------------
>  1 file changed, 17 insertions(+), 79 deletions(-)
> 
> diff --git a/tools/fwumdata_src/mkfwumdata.c b/tools/fwumdata_src/mkfwumdata.c
> index 8b25539fd57..b8b60473b91 100644
> --- a/tools/fwumdata_src/mkfwumdata.c
> +++ b/tools/fwumdata_src/mkfwumdata.c
> @@ -17,26 +17,7 @@
>  #include <u-boot/crc.h>
>  #include <uuid/uuid.h>
>  
> -typedef uint8_t u8;
> -typedef int16_t s16;
> -typedef uint16_t u16;
> -typedef uint32_t u32;
> -typedef uint64_t u64;
> -
> -#undef CONFIG_FWU_NUM_BANKS
> -#undef CONFIG_FWU_NUM_IMAGES_PER_BANK
> -
> -/* This will dynamically allocate the fwu_mdata */
> -#define CONFIG_FWU_NUM_BANKS		0
> -#define CONFIG_FWU_NUM_IMAGES_PER_BANK	0
> -
> -/* version 2 supports maximum of 4 banks */
> -#define MAX_BANKS_V2			4
> -
> -#define BANK_INVALID			(u8)0xFF
> -#define BANK_ACCEPTED			(u8)0xFC
> -
> -#include <fwu_mdata.h>
> +#include "fwumdata.h"
>  
>  static const char *opts_short = "b:i:a:p:v:V:gh";
>  
> @@ -116,6 +97,7 @@ static struct fwu_mdata_object *fwu_alloc_mdata(size_t images, size_t banks,
>  			 sizeof(struct fwu_image_bank_info) * banks) * images;
>  	} else {
>  		mobj->size = sizeof(struct fwu_mdata) +
> +			sizeof(struct fwu_mdata_ext) +
>  			sizeof(struct fwu_fw_store_desc) +
>  			(sizeof(struct fwu_image_entry) +
>  			 sizeof(struct fwu_image_bank_info) * banks) * images;
> @@ -146,50 +128,6 @@ alloc_err:
>  	return NULL;
>  }
>  
> -static struct fwu_image_entry *
> -fwu_get_image(struct fwu_mdata_object *mobj, size_t idx)
> -{
> -	size_t offset;
> -
> -	if (mobj->version == 1) {
> -		offset = sizeof(struct fwu_mdata) +
> -			(sizeof(struct fwu_image_entry) +
> -			 sizeof(struct fwu_image_bank_info) * mobj->banks) *
> -			idx;
> -	} else {
> -		offset = sizeof(struct fwu_mdata) +
> -			sizeof(struct fwu_fw_store_desc) +
> -			(sizeof(struct fwu_image_entry) +
> -			 sizeof(struct fwu_image_bank_info) * mobj->banks) *
> -			idx;
> -	}
> -
> -	return (struct fwu_image_entry *)((char *)mobj->mdata + offset);
> -}
> -
> -static struct fwu_image_bank_info *
> -fwu_get_bank(struct fwu_mdata_object *mobj, size_t img_idx, size_t bnk_idx)
> -{
> -	size_t offset;
> -
> -	if (mobj->version == 1) {
> -		offset = sizeof(struct fwu_mdata) +
> -			(sizeof(struct fwu_image_entry) +
> -			 sizeof(struct fwu_image_bank_info) * mobj->banks) *
> -			img_idx + sizeof(struct fwu_image_entry) +
> -			sizeof(struct fwu_image_bank_info) * bnk_idx;
> -	} else {
> -		offset = sizeof(struct fwu_mdata) +
> -			sizeof(struct fwu_fw_store_desc) +
> -			(sizeof(struct fwu_image_entry) +
> -			 sizeof(struct fwu_image_bank_info) * mobj->banks) *
> -			img_idx + sizeof(struct fwu_image_entry) +
> -			sizeof(struct fwu_image_bank_info) * bnk_idx;
> -	}
> -
> -	return (struct fwu_image_bank_info *)((char *)mobj->mdata + offset);
> -}
> -
>  /**
>   * convert_uuid_to_guid() - convert UUID to GUID
>   * @buf:	UUID binary
> @@ -239,11 +177,13 @@ static int
>  fwu_parse_fill_image_uuid(struct fwu_mdata_object *mobj,
>  			  size_t idx, char *uuids)
>  {
> -	struct fwu_image_entry *image = fwu_get_image(mobj, idx);
>  	struct fwu_image_bank_info *bank;
> +	struct fwu_image_entry *image;
>  	char *p = uuids, *uuid;
>  	int i;
>  
> +	image = fwu_get_image_entry(mobj->mdata, mobj->version,
> +				    mobj->banks, idx);
>  	if (!image)
>  		return -ENOENT;
>  
> @@ -266,7 +206,8 @@ fwu_parse_fill_image_uuid(struct fwu_mdata_object *mobj,
>  
>  	/* Fill bank image-UUID */
>  	for (i = 0; i < mobj->banks; i++) {
> -		bank = fwu_get_bank(mobj, idx, i);
> +		bank = fwu_get_bank_info(mobj->mdata, mobj->version,
> +					 mobj->banks, idx, i);
>  		if (!bank)
>  			return -ENOENT;
>  		bank->accepted = 1;
> @@ -281,25 +222,22 @@ fwu_parse_fill_image_uuid(struct fwu_mdata_object *mobj,
>  	return 0;
>  }
>  
> -#if defined(CONFIG_FWU_MDATA_V1)
> -static void fwu_fill_version_specific_mdata(struct fwu_mdata_object *mobj)
> -{
> -}
> -#else
>  static void fwu_fill_version_specific_mdata(struct fwu_mdata_object *mobj)
>  {
>  	int i;
>  	struct fwu_fw_store_desc *fw_desc;
> -	struct fwu_mdata *mdata = mobj->mdata;
> +	struct fwu_mdata_ext *mdata_ext;
>  
> -	mdata->metadata_size = mobj->size;
> -	mdata->desc_offset = sizeof(struct fwu_mdata);
> +	mdata_ext = fwu_get_fw_mdata_ext(mobj->mdata);
> +	mdata_ext->metadata_size = mobj->size;
> +	mdata_ext->desc_offset = sizeof(struct fwu_mdata) +
> +				 sizeof(struct fwu_mdata_ext);
>  
>  	for (i = 0; i < MAX_BANKS_V2; i++)
> -		mdata->bank_state[i] = i < mobj->banks ?
> -			BANK_ACCEPTED : BANK_INVALID;
> +		mdata_ext->bank_state[i] = i < mobj->banks ?
> +			FWU_BANK_ACCEPTED : FWU_BANK_INVALID;
>  
> -	fw_desc = (struct fwu_fw_store_desc *)((u8 *)mdata + sizeof(*mdata));
> +	fw_desc = fwu_get_fw_desc(mobj->mdata);
>  	fw_desc->num_banks = mobj->banks;
>  	fw_desc->num_images = mobj->images;
>  	fw_desc->img_entry_size = sizeof(struct fwu_image_entry) +
> @@ -307,7 +245,6 @@ static void fwu_fill_version_specific_mdata(struct fwu_mdata_object *mobj)
>  	fw_desc->bank_info_entry_size =
>  		sizeof(struct fwu_image_bank_info);
>  }
> -#endif /* CONFIG_FWU_MDATA_V1 */
>  
>  /* Caller must ensure that @uuids[] has @mobj->images entries. */
>  static int fwu_parse_fill_uuids(struct fwu_mdata_object *mobj, char *uuids[])
> @@ -320,7 +257,8 @@ static int fwu_parse_fill_uuids(struct fwu_mdata_object *mobj, char *uuids[])
>  	mdata->active_index = active_bank;
>  	mdata->previous_active_index = previous_bank;
>  
> -	fwu_fill_version_specific_mdata(mobj);
> +	if (mdata->version == 2)
> +		fwu_fill_version_specific_mdata(mobj);
>  
>  	for (i = 0; i < mobj->images; i++) {
>  		ret = fwu_parse_fill_image_uuid(mobj, i, uuids[i]);
> 
> -- 
> 2.43.0
> 

-sughosh


More information about the U-Boot mailing list