[RESEND RFC PATCH 07/10] EFI: FMP: Add provision to update image's ImageTypeId in image descriptor

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Nov 26 13:43:40 CET 2021


On 11/25/21 08:12, Sughosh Ganu wrote:
> The FWU Multi Banks Update feature allows updating different types of
> updatable firmware images on the platform. These image types are
> identified using the ImageTypeId GUID value. Add support in the
> GetImageInfo function of the FMP protocol to get the GUID values for
> the individual images and populate these in the image descriptor for
> the corresponding images.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> ---
>   lib/efi_loader/efi_firmware.c | 76 ++++++++++++++++++++++++++++++++---
>   1 file changed, 71 insertions(+), 5 deletions(-)
>
> diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
> index a1b88dbfc2..a2b639b448 100644
> --- a/lib/efi_loader/efi_firmware.c
> +++ b/lib/efi_loader/efi_firmware.c
> @@ -10,6 +10,7 @@
>   #include <charset.h>
>   #include <dfu.h>
>   #include <efi_loader.h>
> +#include <fwu_metadata.h>
>   #include <image.h>
>   #include <signatures.h>
>
> @@ -106,7 +107,8 @@ efi_status_t EFIAPI efi_firmware_set_package_info_unsupported(
>    * @descriptor_size:		Pointer to descriptor size
>    * package_version:		Package version
>    * package_version_name:	Package version's name
> - * image_type:			Image type GUID
> + * guid_array:			Image type GUID array
> + * nparts:			Number of partions on the storage device
>    *
>    * Return information bout the current firmware image in @image_info.
>    * @image_info will consist of a number of descriptors.
> @@ -122,7 +124,7 @@ static efi_status_t efi_get_dfu_info(
>   	efi_uintn_t *descriptor_size,
>   	u32 *package_version,
>   	u16 **package_version_name,
> -	const efi_guid_t *image_type)
> +	const efi_guid_t *guid_array, u32 nparts)
>   {
>   	struct dfu_entity *dfu;
>   	size_t names_len, total_size;
> @@ -145,6 +147,19 @@ static efi_status_t efi_get_dfu_info(
>   		return EFI_SUCCESS;
>   	}
>
> +	if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) {

The concept of multiple banks is not related to the concept of multiple
GUIDs. So this if statement should be removed.

> +		/*
> +		 * For FWU multi bank updates, the number of partitions
> +		 * should at least be same as dfu partitions or less
> +		 */
> +		if (nparts > dfu_num) {
> +			log_err("Number of dfu alt no's less than partitions\n");
> +			dfu_free_entities();
> +
> +			return EFI_INVALID_PARAMETER;
> +		}
> +	}
> +
>   	total_size = sizeof(*image_info) * dfu_num + names_len;
>   	/*
>   	 * we will assume that sizeof(*image_info) * dfu_name
> @@ -172,7 +187,11 @@ static efi_status_t efi_get_dfu_info(
>   	next = name;
>   	list_for_each_entry(dfu, &dfu_list, list) {
>   		image_info[i].image_index = dfu->alt + 1;
> -		image_info[i].image_type_id = *image_type;
> +		if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE))

The number of GUIDs is not related to the number of banks.
Please, remove this test.

> +			image_info[i].image_type_id = guid_array[i];

The sequence of GUIDs in a capsule should not influence the update. The
design lacks a configuration defining which GUID maps to which DFU part.

Please, get rid of all DFU environment variables and describe the update
in a configuration file that you add to the capsule.

> +		else
> +			image_info[i].image_type_id = *guid_array;

Do you want to write the same image to multiple places? Why?

Best regards

Heirnich

> +
>   		image_info[i].image_id = dfu->alt;
>
>   		/* copy the DFU entity name */
> @@ -249,7 +268,9 @@ efi_status_t EFIAPI efi_firmware_fit_get_image_info(
>   	u32 *package_version,
>   	u16 **package_version_name)
>   {
> +	u32 nparts;
>   	efi_status_t ret;
> +	efi_guid_t *part_guid_arr;
>
>   	EFI_ENTRY("%p %p %p %p %p %p %p %p\n", this,
>   		  image_info_size, image_info,
> @@ -264,12 +285,24 @@ efi_status_t EFIAPI efi_firmware_fit_get_image_info(
>   	     !descriptor_size || !package_version || !package_version_name))
>   		return EFI_EXIT(EFI_INVALID_PARAMETER);
>
> +	part_guid_arr = malloc(sizeof(efi_guid_t));
> +	if (!part_guid_arr) {
> +		log_err("Unable to allocate memory for guid array\n");
> +		ret = EFI_OUT_OF_RESOURCES;
> +		goto out;
> +	}
> +
> +	guidcpy(part_guid_arr, &efi_firmware_image_type_uboot_fit);
> +	nparts = 1;
> +
>   	ret = efi_get_dfu_info(image_info_size, image_info,
>   			       descriptor_version, descriptor_count,
>   			       descriptor_size,
>   			       package_version, package_version_name,
> -			       &efi_firmware_image_type_uboot_fit);
> +			       part_guid_arr, nparts);
>
> +out:
> +	free(part_guid_arr);
>   	return EFI_EXIT(ret);
>   }
>
> @@ -358,7 +391,10 @@ efi_status_t EFIAPI efi_firmware_raw_get_image_info(
>   	u32 *package_version,
>   	u16 **package_version_name)
>   {
> +	u32 nparts;
> +	int status;
>   	efi_status_t ret = EFI_SUCCESS;
> +	efi_guid_t *part_guid_arr;
>
>   	EFI_ENTRY("%p %p %p %p %p %p %p %p\n", this,
>   		  image_info_size, image_info,
> @@ -373,12 +409,42 @@ efi_status_t EFIAPI efi_firmware_raw_get_image_info(
>   	     !descriptor_size || !package_version || !package_version_name))
>   		return EFI_EXIT(EFI_INVALID_PARAMETER);
>
> +	if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) {
> +		/*
> +		 * Read the ImageType GUID values. Populate the guid array
> +		 * with thesevalues. These are the values to be used in the
> +		 * capsule for ImageTypeId.
> +		 */
> +		status = fwu_fill_partition_guid_array(&part_guid_arr,
> +						       &nparts);
> +		if (status < 0) {
> +			log_err("Unable to get partiion guid's\n");
> +			if (status == -EIO)
> +				ret = EFI_DEVICE_ERROR;
> +			else if (status == -ENOMEM)
> +				ret = EFI_OUT_OF_RESOURCES;
> +			goto out;
> +		}
> +	} else {
> +		part_guid_arr = malloc(sizeof(efi_guid_t));
> +		if (!part_guid_arr) {
> +			log_err("Unable to allocate memory for guid array\n");
> +			ret = EFI_OUT_OF_RESOURCES;
> +			goto out;
> +		}
> +
> +		guidcpy(part_guid_arr, &efi_firmware_image_type_uboot_raw);
> +		nparts = 1;
> +	}
> +
>   	ret = efi_get_dfu_info(image_info_size, image_info,
>   			       descriptor_version, descriptor_count,
>   			       descriptor_size,
>   			       package_version, package_version_name,
> -			       &efi_firmware_image_type_uboot_raw);
> +			       part_guid_arr, nparts);
>
> +out:
> +	free(part_guid_arr);
>   	return EFI_EXIT(ret);
>   }
>
>



More information about the U-Boot mailing list