diff mbox series

[RFC,v3,3/9] FWU: stm32mp1: Add helper functions for accessing FWU metadata

Message ID 20220119185548.16730-4-sughosh.ganu@linaro.org
State New
Headers show
Series FWU: Add support for FWU Multi Bank Update feature | expand

Commit Message

Sughosh Ganu Jan. 19, 2022, 6:55 p.m. UTC
Add helper functions needed for accessing the FWU metadata which
contains information on the updatable images. These functions have
been added for the STM32MP157C-DK2 board which has the updatable
images on the uSD card, formatted as GPT partitions.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
---

Changes since V2:
* Change the implementation of fwu_plat_get_alt_num to get the devnum
  in the function before calling gpt_plat_get_alt_num

 board/st/stm32mp1/stm32mp1.c        | 176 ++++++++++++++++++++++++++++
 include/fwu.h                       |   5 +
 lib/fwu_updates/fwu_mdata_gpt_blk.c |   7 +-
 3 files changed, 185 insertions(+), 3 deletions(-)

Comments

Heinrich Schuchardt Jan. 20, 2022, 10:59 a.m. UTC | #1
On 1/19/22 19:55, Sughosh Ganu wrote:
> Add helper functions needed for accessing the FWU metadata which
> contains information on the updatable images. These functions have
> been added for the STM32MP157C-DK2 board which has the updatable
> images on the uSD card, formatted as GPT partitions.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>

It is unclear why you are creating platform specific code here.

All of this metadata can be put into the control devicetree? If not
create a driver class for it.

Unfortunately you don't provide any design document.


Best regards

Heinrich


> ---
>
> Changes since V2:
> * Change the implementation of fwu_plat_get_alt_num to get the devnum
>    in the function before calling gpt_plat_get_alt_num
>
>   board/st/stm32mp1/stm32mp1.c        | 176 ++++++++++++++++++++++++++++
>   include/fwu.h                       |   5 +
>   lib/fwu_updates/fwu_mdata_gpt_blk.c |   7 +-
>   3 files changed, 185 insertions(+), 3 deletions(-)
>
> diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
> index 84592677e4..66cbe3f798 100644
> --- a/board/st/stm32mp1/stm32mp1.c
> +++ b/board/st/stm32mp1/stm32mp1.c
> @@ -7,10 +7,13 @@
>
>   #include <common.h>
>   #include <adc.h>
> +#include <blk.h>
>   #include <bootm.h>
>   #include <clk.h>
>   #include <config.h>
> +#include <dfu.h>
>   #include <dm.h>
> +#include <efi_loader.h>
>   #include <env.h>
>   #include <env_internal.h>
>   #include <fdt_support.h>
> @@ -23,9 +26,11 @@
>   #include <log.h>
>   #include <malloc.h>
>   #include <misc.h>
> +#include <mmc.h>
>   #include <mtd_node.h>
>   #include <net.h>
>   #include <netdev.h>
> +#include <part.h>
>   #include <phy.h>
>   #include <remoteproc.h>
>   #include <reset.h>
> @@ -938,3 +943,174 @@ static void board_copro_image_process(ulong fw_image, size_t fw_size)
>   }
>
>   U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
> +
> +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
> +#include <fwu.h>
> +#include <fwu_mdata.h>
> +
> +static int gpt_plat_get_alt_num(int dev_num, void *identifier)
> +{
> +	int i;
> +	int ret = -1;
> +	u32 part;
> +	int alt_num = dfu_get_alt_number();
> +	struct dfu_entity *dfu;
> +
> +	part = *(u32 *)identifier;
> +	dfu_init_env_entities(NULL, NULL);
> +
> +	for (i = 0; i < alt_num; i++) {
> +		dfu = dfu_get_entity(i);
> +
> +		if (!dfu)
> +			continue;
> +
> +		/*
> +		 * Currently, Multi Bank update
> +		 * feature is being supported
> +		 * only on GPT partitioned
> +		 * MMC/SD devices.
> +		 */
> +		if (dfu->dev_type != DFU_DEV_MMC)
> +			continue;
> +
> +		if (dfu->layout == DFU_RAW_ADDR &&
> +		    dfu->data.mmc.dev_num == dev_num &&
> +		    dfu->data.mmc.part == part) {
> +			ret = dfu->alt;
> +			break;
> +		}
> +	}
> +
> +	dfu_free_entities();
> +
> +	return ret;
> +}
> +
> +int fwu_plat_get_alt_num(void *identifier)
> +{
> +	int ret;
> +	struct blk_desc *desc;
> +
> +	ret = fwu_plat_get_blk_desc(&desc);
> +	if (ret < 0) {
> +		log_err("Block device not found\n");
> +		return -ENODEV;
> +	}
> +
> +	return gpt_plat_get_alt_num(desc->devnum, identifier);
> +}
> +
> +static int plat_fill_gpt_partition_guids(struct blk_desc *desc,
> +					 efi_guid_t **part_guid_arr)
> +{
> +	int i, ret = 0;
> +	u32 part;
> +	struct dfu_entity *dfu;
> +	struct disk_partition info;
> +	efi_guid_t part_type_guid;
> +	int alt_num = dfu_get_alt_number();
> +
> +	dfu_init_env_entities(NULL, NULL);
> +
> +	for (i = 0, part = 1; i < alt_num; i++) {
> +		dfu = dfu_get_entity(i);
> +
> +		if (!dfu)
> +			continue;
> +
> +		/*
> +		 * Currently, Multi Bank update
> +		 * feature is being supported
> +		 * only on GPT partitioned
> +		 * MMC/SD devices.
> +		 */
> +		if (dfu->dev_type != DFU_DEV_MMC)
> +			continue;
> +
> +		if (part_get_info(desc, part, &info)) {
> +			part++;
> +			continue;
> +		}
> +
> +		uuid_str_to_bin(info.type_guid, part_type_guid.b,
> +				UUID_STR_FORMAT_GUID);
> +		guidcpy((*part_guid_arr + i), &part_type_guid);
> +		part++;
> +	}
> +
> +	dfu_free_entities();
> +
> +	return ret;
> +}
> +
> +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr)
> +{
> +	int ret;
> +	struct blk_desc *desc;
> +
> +	ret = fwu_plat_get_blk_desc(&desc);
> +	if (ret < 0) {
> +		log_err("Block device not found\n");
> +		return -ENODEV;
> +	}
> +
> +	return plat_fill_gpt_partition_guids(desc, part_guid_arr);
> +}
> +
> +int fwu_plat_get_update_index(u32 *update_idx)
> +{
> +	int ret;
> +	u32 active_idx;
> +
> +	ret = fwu_get_active_index(&active_idx);
> +
> +	if (ret < 0)
> +		return -1;
> +
> +	*update_idx = active_idx ^= 0x1;
> +
> +	return ret;
> +}
> +
> +int fwu_plat_get_blk_desc(struct blk_desc **desc)
> +{
> +	int ret;
> +	struct mmc *mmc;
> +	struct udevice *dev;
> +
> +	/*
> +	 * Initial support is being added for the DK2
> +	 * platform
> +	 */
> +	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> +	    (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> +		ret = uclass_get_device(UCLASS_MMC, 0, &dev);
> +		if (ret)
> +			return -1;
> +
> +		mmc = mmc_get_mmc_dev(dev);
> +		if (!mmc)
> +			return -1;
> +
> +		if (mmc_init(mmc))
> +			return -1;
> +
> +		*desc = mmc_get_blk_desc(mmc);
> +		if (!*desc)
> +			return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +struct fwu_mdata_ops *get_plat_fwu_mdata_ops(void)
> +{
> +	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> +	    (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> +		return &fwu_gpt_blk_ops;
> +	}
> +
> +	return NULL;
> +}
> +#endif /* CONFIG_FWU_MULTI_BANK_UPDATE */
> diff --git a/include/fwu.h b/include/fwu.h
> index 12f7eecdb0..b23a93ac40 100644
> --- a/include/fwu.h
> +++ b/include/fwu.h
> @@ -59,4 +59,9 @@ int fwu_revert_boot_index(void);
>   int fwu_accept_image(efi_guid_t *img_type_id, u32 bank);
>   int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank);
>
> +int fwu_plat_get_update_index(u32 *update_idx);
> +int fwu_plat_get_blk_desc(struct blk_desc **desc);
> +int fwu_plat_get_alt_num(void *identifier);
> +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr);
> +
>   #endif /* _FWU_H_ */
> diff --git a/lib/fwu_updates/fwu_mdata_gpt_blk.c b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> index cb47ddf4a7..796b08e76f 100644
> --- a/lib/fwu_updates/fwu_mdata_gpt_blk.c
> +++ b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> @@ -37,6 +37,7 @@ static int gpt_get_mdata_partitions(struct blk_desc *desc,
>   	struct disk_partition info;
>   	const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
>
> +	mdata_parts = 0;
>   	for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
>   		if (part_get_info(desc, i, &info))
>   			continue;
> @@ -324,7 +325,7 @@ out:
>   int fwu_gpt_get_active_index(u32 *active_idx)
>   {
>   	int ret;
> -	struct fwu_mdata *mdata;
> +	struct fwu_mdata *mdata = NULL;
>
>   	ret = gpt_get_mdata(&mdata);
>   	if (ret < 0) {
> @@ -355,7 +356,7 @@ static int gpt_get_image_alt_num(struct blk_desc *desc,
>   {
>   	int ret, i;
>   	u32 part;
> -	struct fwu_mdata *mdata;
> +	struct fwu_mdata *mdata = NULL;
>   	struct fwu_image_entry *img_entry;
>   	struct fwu_image_bank_info *img_bank_info;
>   	struct disk_partition info;
> @@ -459,7 +460,7 @@ static int fwu_gpt_set_clear_image_accept(efi_guid_t *img_type_id,
>   	void *buf;
>   	int ret, i;
>   	u32 nimages;
> -	struct fwu_mdata *mdata;
> +	struct fwu_mdata *mdata = NULL;
>   	struct fwu_image_entry *img_entry;
>   	struct fwu_image_bank_info *img_bank_info;
>
Sughosh Ganu Jan. 21, 2022, 10:05 a.m. UTC | #2
On Thu, 20 Jan 2022 at 16:29, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 1/19/22 19:55, Sughosh Ganu wrote:
> > Add helper functions needed for accessing the FWU metadata which
> > contains information on the updatable images. These functions have
> > been added for the STM32MP157C-DK2 board which has the updatable
> > images on the uSD card, formatted as GPT partitions.
> >
> > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
>
> It is unclear why you are creating platform specific code here.

This is primarily code that will be dependent on the platform. For
e.g. the number of banks of firmware is a decision of the platform.
So, there is a function, fwu_plat_get_update_index which will return
the bank number which should be used for updating the firmware images.
Similarly for getting the DFU alt_num. This will depend on things like
the device that the platform uses for storing the firmware images.
There aren't too many functions defined here. I will cover this aspect
in the documentation patch which you have asked for.

>
> All of this metadata can be put into the control devicetree? If not
> create a driver class for it.

Creating a driver class for accessing the metadata seems like a decent
solution to me. I will work on this.

-sughosh

>
> Unfortunately you don't provide any design document.
>
>
> Best regards
>
> Heinrich
>
>
> > ---
> >
> > Changes since V2:
> > * Change the implementation of fwu_plat_get_alt_num to get the devnum
> >    in the function before calling gpt_plat_get_alt_num
> >
> >   board/st/stm32mp1/stm32mp1.c        | 176 ++++++++++++++++++++++++++++
> >   include/fwu.h                       |   5 +
> >   lib/fwu_updates/fwu_mdata_gpt_blk.c |   7 +-
> >   3 files changed, 185 insertions(+), 3 deletions(-)
> >
> > diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
> > index 84592677e4..66cbe3f798 100644
> > --- a/board/st/stm32mp1/stm32mp1.c
> > +++ b/board/st/stm32mp1/stm32mp1.c
> > @@ -7,10 +7,13 @@
> >
> >   #include <common.h>
> >   #include <adc.h>
> > +#include <blk.h>
> >   #include <bootm.h>
> >   #include <clk.h>
> >   #include <config.h>
> > +#include <dfu.h>
> >   #include <dm.h>
> > +#include <efi_loader.h>
> >   #include <env.h>
> >   #include <env_internal.h>
> >   #include <fdt_support.h>
> > @@ -23,9 +26,11 @@
> >   #include <log.h>
> >   #include <malloc.h>
> >   #include <misc.h>
> > +#include <mmc.h>
> >   #include <mtd_node.h>
> >   #include <net.h>
> >   #include <netdev.h>
> > +#include <part.h>
> >   #include <phy.h>
> >   #include <remoteproc.h>
> >   #include <reset.h>
> > @@ -938,3 +943,174 @@ static void board_copro_image_process(ulong fw_image, size_t fw_size)
> >   }
> >
> >   U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
> > +
> > +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
> > +#include <fwu.h>
> > +#include <fwu_mdata.h>
> > +
> > +static int gpt_plat_get_alt_num(int dev_num, void *identifier)
> > +{
> > +     int i;
> > +     int ret = -1;
> > +     u32 part;
> > +     int alt_num = dfu_get_alt_number();
> > +     struct dfu_entity *dfu;
> > +
> > +     part = *(u32 *)identifier;
> > +     dfu_init_env_entities(NULL, NULL);
> > +
> > +     for (i = 0; i < alt_num; i++) {
> > +             dfu = dfu_get_entity(i);
> > +
> > +             if (!dfu)
> > +                     continue;
> > +
> > +             /*
> > +              * Currently, Multi Bank update
> > +              * feature is being supported
> > +              * only on GPT partitioned
> > +              * MMC/SD devices.
> > +              */
> > +             if (dfu->dev_type != DFU_DEV_MMC)
> > +                     continue;
> > +
> > +             if (dfu->layout == DFU_RAW_ADDR &&
> > +                 dfu->data.mmc.dev_num == dev_num &&
> > +                 dfu->data.mmc.part == part) {
> > +                     ret = dfu->alt;
> > +                     break;
> > +             }
> > +     }
> > +
> > +     dfu_free_entities();
> > +
> > +     return ret;
> > +}
> > +
> > +int fwu_plat_get_alt_num(void *identifier)
> > +{
> > +     int ret;
> > +     struct blk_desc *desc;
> > +
> > +     ret = fwu_plat_get_blk_desc(&desc);
> > +     if (ret < 0) {
> > +             log_err("Block device not found\n");
> > +             return -ENODEV;
> > +     }
> > +
> > +     return gpt_plat_get_alt_num(desc->devnum, identifier);
> > +}
> > +
> > +static int plat_fill_gpt_partition_guids(struct blk_desc *desc,
> > +                                      efi_guid_t **part_guid_arr)
> > +{
> > +     int i, ret = 0;
> > +     u32 part;
> > +     struct dfu_entity *dfu;
> > +     struct disk_partition info;
> > +     efi_guid_t part_type_guid;
> > +     int alt_num = dfu_get_alt_number();
> > +
> > +     dfu_init_env_entities(NULL, NULL);
> > +
> > +     for (i = 0, part = 1; i < alt_num; i++) {
> > +             dfu = dfu_get_entity(i);
> > +
> > +             if (!dfu)
> > +                     continue;
> > +
> > +             /*
> > +              * Currently, Multi Bank update
> > +              * feature is being supported
> > +              * only on GPT partitioned
> > +              * MMC/SD devices.
> > +              */
> > +             if (dfu->dev_type != DFU_DEV_MMC)
> > +                     continue;
> > +
> > +             if (part_get_info(desc, part, &info)) {
> > +                     part++;
> > +                     continue;
> > +             }
> > +
> > +             uuid_str_to_bin(info.type_guid, part_type_guid.b,
> > +                             UUID_STR_FORMAT_GUID);
> > +             guidcpy((*part_guid_arr + i), &part_type_guid);
> > +             part++;
> > +     }
> > +
> > +     dfu_free_entities();
> > +
> > +     return ret;
> > +}
> > +
> > +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr)
> > +{
> > +     int ret;
> > +     struct blk_desc *desc;
> > +
> > +     ret = fwu_plat_get_blk_desc(&desc);
> > +     if (ret < 0) {
> > +             log_err("Block device not found\n");
> > +             return -ENODEV;
> > +     }
> > +
> > +     return plat_fill_gpt_partition_guids(desc, part_guid_arr);
> > +}
> > +
> > +int fwu_plat_get_update_index(u32 *update_idx)
> > +{
> > +     int ret;
> > +     u32 active_idx;
> > +
> > +     ret = fwu_get_active_index(&active_idx);
> > +
> > +     if (ret < 0)
> > +             return -1;
> > +
> > +     *update_idx = active_idx ^= 0x1;
> > +
> > +     return ret;
> > +}
> > +
> > +int fwu_plat_get_blk_desc(struct blk_desc **desc)
> > +{
> > +     int ret;
> > +     struct mmc *mmc;
> > +     struct udevice *dev;
> > +
> > +     /*
> > +      * Initial support is being added for the DK2
> > +      * platform
> > +      */
> > +     if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> > +         (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> > +             ret = uclass_get_device(UCLASS_MMC, 0, &dev);
> > +             if (ret)
> > +                     return -1;
> > +
> > +             mmc = mmc_get_mmc_dev(dev);
> > +             if (!mmc)
> > +                     return -1;
> > +
> > +             if (mmc_init(mmc))
> > +                     return -1;
> > +
> > +             *desc = mmc_get_blk_desc(mmc);
> > +             if (!*desc)
> > +                     return -1;
> > +     }
> > +
> > +     return 0;
> > +}
> > +
> > +struct fwu_mdata_ops *get_plat_fwu_mdata_ops(void)
> > +{
> > +     if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> > +         (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> > +             return &fwu_gpt_blk_ops;
> > +     }
> > +
> > +     return NULL;
> > +}
> > +#endif /* CONFIG_FWU_MULTI_BANK_UPDATE */
> > diff --git a/include/fwu.h b/include/fwu.h
> > index 12f7eecdb0..b23a93ac40 100644
> > --- a/include/fwu.h
> > +++ b/include/fwu.h
> > @@ -59,4 +59,9 @@ int fwu_revert_boot_index(void);
> >   int fwu_accept_image(efi_guid_t *img_type_id, u32 bank);
> >   int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank);
> >
> > +int fwu_plat_get_update_index(u32 *update_idx);
> > +int fwu_plat_get_blk_desc(struct blk_desc **desc);
> > +int fwu_plat_get_alt_num(void *identifier);
> > +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr);
> > +
> >   #endif /* _FWU_H_ */
> > diff --git a/lib/fwu_updates/fwu_mdata_gpt_blk.c b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> > index cb47ddf4a7..796b08e76f 100644
> > --- a/lib/fwu_updates/fwu_mdata_gpt_blk.c
> > +++ b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> > @@ -37,6 +37,7 @@ static int gpt_get_mdata_partitions(struct blk_desc *desc,
> >       struct disk_partition info;
> >       const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
> >
> > +     mdata_parts = 0;
> >       for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
> >               if (part_get_info(desc, i, &info))
> >                       continue;
> > @@ -324,7 +325,7 @@ out:
> >   int fwu_gpt_get_active_index(u32 *active_idx)
> >   {
> >       int ret;
> > -     struct fwu_mdata *mdata;
> > +     struct fwu_mdata *mdata = NULL;
> >
> >       ret = gpt_get_mdata(&mdata);
> >       if (ret < 0) {
> > @@ -355,7 +356,7 @@ static int gpt_get_image_alt_num(struct blk_desc *desc,
> >   {
> >       int ret, i;
> >       u32 part;
> > -     struct fwu_mdata *mdata;
> > +     struct fwu_mdata *mdata = NULL;
> >       struct fwu_image_entry *img_entry;
> >       struct fwu_image_bank_info *img_bank_info;
> >       struct disk_partition info;
> > @@ -459,7 +460,7 @@ static int fwu_gpt_set_clear_image_accept(efi_guid_t *img_type_id,
> >       void *buf;
> >       int ret, i;
> >       u32 nimages;
> > -     struct fwu_mdata *mdata;
> > +     struct fwu_mdata *mdata = NULL;
> >       struct fwu_image_entry *img_entry;
> >       struct fwu_image_bank_info *img_bank_info;
> >
>
Ilias Apalodimas Jan. 21, 2022, 11:52 a.m. UTC | #3
Hi Sughosh, 

[...]
>  }
>  
>  U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
> +
> +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
> +#include <fwu.h>
> +#include <fwu_mdata.h>
> +
> +static int gpt_plat_get_alt_num(int dev_num, void *identifier)
> +{
> +	int i;
> +	int ret = -1;
> +	u32 part;
> +	int alt_num = dfu_get_alt_number();
> +	struct dfu_entity *dfu;
> +
> +	part = *(u32 *)identifier;
> +	dfu_init_env_entities(NULL, NULL);
> +
> +	for (i = 0; i < alt_num; i++) {
> +		dfu = dfu_get_entity(i);
> +
> +		if (!dfu)
> +			continue;
> +
> +		/*
> +		 * Currently, Multi Bank update
> +		 * feature is being supported
> +		 * only on GPT partitioned
> +		 * MMC/SD devices.
> +		 */
> +		if (dfu->dev_type != DFU_DEV_MMC)
> +			continue;

And that's fine.  But can you add a pr_warn or something on this check?  So
if anyone tries to implement this on a non-sd card can get a clear
indication of what's not working?

> +
> +		if (dfu->layout == DFU_RAW_ADDR &&
> +		    dfu->data.mmc.dev_num == dev_num &&
> +		    dfu->data.mmc.part == part) {
> +			ret = dfu->alt;
> +			break;
> +		}
> +	}
> +
> +	dfu_free_entities();
> +
> +	return ret;
> +}
> +
> +int fwu_plat_get_alt_num(void *identifier)
> +{
> +	int ret;
> +	struct blk_desc *desc;
> +
> +	ret = fwu_plat_get_blk_desc(&desc);
> +	if (ret < 0) {
> +		log_err("Block device not found\n");
> +		return -ENODEV;
> +	}
> +
> +	return gpt_plat_get_alt_num(desc->devnum, identifier);
> +}
> +
> +static int plat_fill_gpt_partition_guids(struct blk_desc *desc,
> +					 efi_guid_t **part_guid_arr)
> +{
> +	int i, ret = 0;
> +	u32 part;
> +	struct dfu_entity *dfu;
> +	struct disk_partition info;
> +	efi_guid_t part_type_guid;
> +	int alt_num = dfu_get_alt_number();
> +
> +	dfu_init_env_entities(NULL, NULL);
> +
> +	for (i = 0, part = 1; i < alt_num; i++) {
> +		dfu = dfu_get_entity(i);
> +
> +		if (!dfu)
> +			continue;
> +
> +		/*
> +		 * Currently, Multi Bank update
> +		 * feature is being supported
> +		 * only on GPT partitioned
> +		 * MMC/SD devices.
> +		 */
> +		if (dfu->dev_type != DFU_DEV_MMC)

ditto 

> +			continue;
> +
> +		if (part_get_info(desc, part, &info)) {
> +			part++;
> +			continue;
> +		}
> +
> +		uuid_str_to_bin(info.type_guid, part_type_guid.b,
> +				UUID_STR_FORMAT_GUID);
> +		guidcpy((*part_guid_arr + i), &part_type_guid);
> +		part++;
> +	}
> +
> +	dfu_free_entities();
> +
> +	return ret;
> +}
> +
> +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr)
> +{
> +	int ret;
> +	struct blk_desc *desc;
> +
> +	ret = fwu_plat_get_blk_desc(&desc);
> +	if (ret < 0) {
> +		log_err("Block device not found\n");
> +		return -ENODEV;
> +	}
> +
> +	return plat_fill_gpt_partition_guids(desc, part_guid_arr);
> +}
> +
> +int fwu_plat_get_update_index(u32 *update_idx)
> +{
> +	int ret;
> +	u32 active_idx;
> +
> +	ret = fwu_get_active_index(&active_idx);
> +
> +	if (ret < 0)
> +		return -1;
> +
> +	*update_idx = active_idx ^= 0x1;
> +
> +	return ret;
> +}
> +
> +int fwu_plat_get_blk_desc(struct blk_desc **desc)
> +{
> +	int ret;
> +	struct mmc *mmc;
> +	struct udevice *dev;
> +
> +	/*
> +	 * Initial support is being added for the DK2
> +	 * platform
> +	 */
> +	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> +	    (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> +		ret = uclass_get_device(UCLASS_MMC, 0, &dev);
> +		if (ret)
> +			return -1;
> +
> +		mmc = mmc_get_mmc_dev(dev);
> +		if (!mmc)
> +			return -1;
> +
> +		if (mmc_init(mmc))
> +			return -1;
> +
> +		*desc = mmc_get_blk_desc(mmc);
> +		if (!*desc)
> +			return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +struct fwu_mdata_ops *get_plat_fwu_mdata_ops(void)
> +{
> +	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> +	    (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> +		return &fwu_gpt_blk_ops;
> +	}
> +
> +	return NULL;
> +}
> +#endif /* CONFIG_FWU_MULTI_BANK_UPDATE */
> diff --git a/include/fwu.h b/include/fwu.h
> index 12f7eecdb0..b23a93ac40 100644
> --- a/include/fwu.h
> +++ b/include/fwu.h
> @@ -59,4 +59,9 @@ int fwu_revert_boot_index(void);
>  int fwu_accept_image(efi_guid_t *img_type_id, u32 bank);
>  int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank);
>  
> +int fwu_plat_get_update_index(u32 *update_idx);
> +int fwu_plat_get_blk_desc(struct blk_desc **desc);
> +int fwu_plat_get_alt_num(void *identifier);
> +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr);
> +
>  #endif /* _FWU_H_ */
> diff --git a/lib/fwu_updates/fwu_mdata_gpt_blk.c b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> index cb47ddf4a7..796b08e76f 100644
> --- a/lib/fwu_updates/fwu_mdata_gpt_blk.c
> +++ b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> @@ -37,6 +37,7 @@ static int gpt_get_mdata_partitions(struct blk_desc *desc,
>  	struct disk_partition info;
>  	const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
>  
> +	mdata_parts = 0;
>  	for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
>  		if (part_get_info(desc, i, &info))
>  			continue;
> @@ -324,7 +325,7 @@ out:
>  int fwu_gpt_get_active_index(u32 *active_idx)
>  {
>  	int ret;
> -	struct fwu_mdata *mdata;
> +	struct fwu_mdata *mdata = NULL;

Should these be part of the original patch?

>  
>  	ret = gpt_get_mdata(&mdata);
>  	if (ret < 0) {
> @@ -355,7 +356,7 @@ static int gpt_get_image_alt_num(struct blk_desc *desc,
>  {
>  	int ret, i;
>  	u32 part;
> -	struct fwu_mdata *mdata;
> +	struct fwu_mdata *mdata = NULL;
>  	struct fwu_image_entry *img_entry;
>  	struct fwu_image_bank_info *img_bank_info;
>  	struct disk_partition info;
> @@ -459,7 +460,7 @@ static int fwu_gpt_set_clear_image_accept(efi_guid_t *img_type_id,
>  	void *buf;
>  	int ret, i;
>  	u32 nimages;
> -	struct fwu_mdata *mdata;
> +	struct fwu_mdata *mdata = NULL;
>  	struct fwu_image_entry *img_entry;
>  	struct fwu_image_bank_info *img_bank_info;
>  
> -- 
> 2.17.1
>
Masami Hiramatsu Jan. 24, 2022, 2:46 a.m. UTC | #4
Hi Sughosh,

BTW, I can't find the definition of CONFIG_FWU_NUM_IMAGES_PER_BANK and
CONFIG_FWU_NUM_BANKS for this platform.
Is it really possible to build this platform with FWU_MULTI_BANK_UPDATE?

Thank you,

2022年1月20日(木) 3:56 Sughosh Ganu <sughosh.ganu@linaro.org>:

>
> Add helper functions needed for accessing the FWU metadata which
> contains information on the updatable images. These functions have
> been added for the STM32MP157C-DK2 board which has the updatable
> images on the uSD card, formatted as GPT partitions.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> ---
>
> Changes since V2:
> * Change the implementation of fwu_plat_get_alt_num to get the devnum
>   in the function before calling gpt_plat_get_alt_num
>
>  board/st/stm32mp1/stm32mp1.c        | 176 ++++++++++++++++++++++++++++
>  include/fwu.h                       |   5 +
>  lib/fwu_updates/fwu_mdata_gpt_blk.c |   7 +-
>  3 files changed, 185 insertions(+), 3 deletions(-)
>
> diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
> index 84592677e4..66cbe3f798 100644
> --- a/board/st/stm32mp1/stm32mp1.c
> +++ b/board/st/stm32mp1/stm32mp1.c
> @@ -7,10 +7,13 @@
>
>  #include <common.h>
>  #include <adc.h>
> +#include <blk.h>
>  #include <bootm.h>
>  #include <clk.h>
>  #include <config.h>
> +#include <dfu.h>
>  #include <dm.h>
> +#include <efi_loader.h>
>  #include <env.h>
>  #include <env_internal.h>
>  #include <fdt_support.h>
> @@ -23,9 +26,11 @@
>  #include <log.h>
>  #include <malloc.h>
>  #include <misc.h>
> +#include <mmc.h>
>  #include <mtd_node.h>
>  #include <net.h>
>  #include <netdev.h>
> +#include <part.h>
>  #include <phy.h>
>  #include <remoteproc.h>
>  #include <reset.h>
> @@ -938,3 +943,174 @@ static void board_copro_image_process(ulong fw_image, size_t fw_size)
>  }
>
>  U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
> +
> +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
> +#include <fwu.h>
> +#include <fwu_mdata.h>
> +
> +static int gpt_plat_get_alt_num(int dev_num, void *identifier)
> +{
> +       int i;
> +       int ret = -1;
> +       u32 part;
> +       int alt_num = dfu_get_alt_number();
> +       struct dfu_entity *dfu;
> +
> +       part = *(u32 *)identifier;
> +       dfu_init_env_entities(NULL, NULL);
> +
> +       for (i = 0; i < alt_num; i++) {
> +               dfu = dfu_get_entity(i);
> +
> +               if (!dfu)
> +                       continue;
> +
> +               /*
> +                * Currently, Multi Bank update
> +                * feature is being supported
> +                * only on GPT partitioned
> +                * MMC/SD devices.
> +                */
> +               if (dfu->dev_type != DFU_DEV_MMC)
> +                       continue;
> +
> +               if (dfu->layout == DFU_RAW_ADDR &&
> +                   dfu->data.mmc.dev_num == dev_num &&
> +                   dfu->data.mmc.part == part) {
> +                       ret = dfu->alt;
> +                       break;
> +               }
> +       }
> +
> +       dfu_free_entities();
> +
> +       return ret;
> +}
> +
> +int fwu_plat_get_alt_num(void *identifier)
> +{
> +       int ret;
> +       struct blk_desc *desc;
> +
> +       ret = fwu_plat_get_blk_desc(&desc);
> +       if (ret < 0) {
> +               log_err("Block device not found\n");
> +               return -ENODEV;
> +       }
> +
> +       return gpt_plat_get_alt_num(desc->devnum, identifier);
> +}
> +
> +static int plat_fill_gpt_partition_guids(struct blk_desc *desc,
> +                                        efi_guid_t **part_guid_arr)
> +{
> +       int i, ret = 0;
> +       u32 part;
> +       struct dfu_entity *dfu;
> +       struct disk_partition info;
> +       efi_guid_t part_type_guid;
> +       int alt_num = dfu_get_alt_number();
> +
> +       dfu_init_env_entities(NULL, NULL);
> +
> +       for (i = 0, part = 1; i < alt_num; i++) {
> +               dfu = dfu_get_entity(i);
> +
> +               if (!dfu)
> +                       continue;
> +
> +               /*
> +                * Currently, Multi Bank update
> +                * feature is being supported
> +                * only on GPT partitioned
> +                * MMC/SD devices.
> +                */
> +               if (dfu->dev_type != DFU_DEV_MMC)
> +                       continue;
> +
> +               if (part_get_info(desc, part, &info)) {
> +                       part++;
> +                       continue;
> +               }
> +
> +               uuid_str_to_bin(info.type_guid, part_type_guid.b,
> +                               UUID_STR_FORMAT_GUID);
> +               guidcpy((*part_guid_arr + i), &part_type_guid);
> +               part++;
> +       }
> +
> +       dfu_free_entities();
> +
> +       return ret;
> +}
> +
> +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr)
> +{
> +       int ret;
> +       struct blk_desc *desc;
> +
> +       ret = fwu_plat_get_blk_desc(&desc);
> +       if (ret < 0) {
> +               log_err("Block device not found\n");
> +               return -ENODEV;
> +       }
> +
> +       return plat_fill_gpt_partition_guids(desc, part_guid_arr);
> +}
> +
> +int fwu_plat_get_update_index(u32 *update_idx)
> +{
> +       int ret;
> +       u32 active_idx;
> +
> +       ret = fwu_get_active_index(&active_idx);
> +
> +       if (ret < 0)
> +               return -1;
> +
> +       *update_idx = active_idx ^= 0x1;
> +
> +       return ret;
> +}
> +
> +int fwu_plat_get_blk_desc(struct blk_desc **desc)
> +{
> +       int ret;
> +       struct mmc *mmc;
> +       struct udevice *dev;
> +
> +       /*
> +        * Initial support is being added for the DK2
> +        * platform
> +        */
> +       if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> +           (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> +               ret = uclass_get_device(UCLASS_MMC, 0, &dev);
> +               if (ret)
> +                       return -1;
> +
> +               mmc = mmc_get_mmc_dev(dev);
> +               if (!mmc)
> +                       return -1;
> +
> +               if (mmc_init(mmc))
> +                       return -1;
> +
> +               *desc = mmc_get_blk_desc(mmc);
> +               if (!*desc)
> +                       return -1;
> +       }
> +
> +       return 0;
> +}
> +
> +struct fwu_mdata_ops *get_plat_fwu_mdata_ops(void)
> +{
> +       if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> +           (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> +               return &fwu_gpt_blk_ops;
> +       }
> +
> +       return NULL;
> +}
> +#endif /* CONFIG_FWU_MULTI_BANK_UPDATE */
> diff --git a/include/fwu.h b/include/fwu.h
> index 12f7eecdb0..b23a93ac40 100644
> --- a/include/fwu.h
> +++ b/include/fwu.h
> @@ -59,4 +59,9 @@ int fwu_revert_boot_index(void);
>  int fwu_accept_image(efi_guid_t *img_type_id, u32 bank);
>  int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank);
>
> +int fwu_plat_get_update_index(u32 *update_idx);
> +int fwu_plat_get_blk_desc(struct blk_desc **desc);
> +int fwu_plat_get_alt_num(void *identifier);
> +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr);
> +
>  #endif /* _FWU_H_ */
> diff --git a/lib/fwu_updates/fwu_mdata_gpt_blk.c b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> index cb47ddf4a7..796b08e76f 100644
> --- a/lib/fwu_updates/fwu_mdata_gpt_blk.c
> +++ b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> @@ -37,6 +37,7 @@ static int gpt_get_mdata_partitions(struct blk_desc *desc,
>         struct disk_partition info;
>         const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
>
> +       mdata_parts = 0;
>         for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
>                 if (part_get_info(desc, i, &info))
>                         continue;
> @@ -324,7 +325,7 @@ out:
>  int fwu_gpt_get_active_index(u32 *active_idx)
>  {
>         int ret;
> -       struct fwu_mdata *mdata;
> +       struct fwu_mdata *mdata = NULL;
>
>         ret = gpt_get_mdata(&mdata);
>         if (ret < 0) {
> @@ -355,7 +356,7 @@ static int gpt_get_image_alt_num(struct blk_desc *desc,
>  {
>         int ret, i;
>         u32 part;
> -       struct fwu_mdata *mdata;
> +       struct fwu_mdata *mdata = NULL;
>         struct fwu_image_entry *img_entry;
>         struct fwu_image_bank_info *img_bank_info;
>         struct disk_partition info;
> @@ -459,7 +460,7 @@ static int fwu_gpt_set_clear_image_accept(efi_guid_t *img_type_id,
>         void *buf;
>         int ret, i;
>         u32 nimages;
> -       struct fwu_mdata *mdata;
> +       struct fwu_mdata *mdata = NULL;
>         struct fwu_image_entry *img_entry;
>         struct fwu_image_bank_info *img_bank_info;
>
> --
> 2.17.1
>


--
Masami Hiramatsu
Sughosh Ganu Jan. 24, 2022, 7:17 a.m. UTC | #5
hi Masami,

On Mon, 24 Jan 2022 at 08:16, Masami Hiramatsu
<masami.hiramatsu@linaro.org> wrote:
>
> Hi Sughosh,
>
> BTW, I can't find the definition of CONFIG_FWU_NUM_IMAGES_PER_BANK and
> CONFIG_FWU_NUM_BANKS for this platform.
> Is it really possible to build this platform with FWU_MULTI_BANK_UPDATE?

Yes, I have actually tested my code :). The reason I did not add that
particular patch to this series is that the number of images per bank
and number of banks might change on a case by case basis. It is
expected that the user will set these to the values that she is using
on the platform.

-sughosh

>
> Thank you,
>
> 2022年1月20日(木) 3:56 Sughosh Ganu <sughosh.ganu@linaro.org>:
>
> >
> > Add helper functions needed for accessing the FWU metadata which
> > contains information on the updatable images. These functions have
> > been added for the STM32MP157C-DK2 board which has the updatable
> > images on the uSD card, formatted as GPT partitions.
> >
> > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > ---
> >
> > Changes since V2:
> > * Change the implementation of fwu_plat_get_alt_num to get the devnum
> >   in the function before calling gpt_plat_get_alt_num
> >
> >  board/st/stm32mp1/stm32mp1.c        | 176 ++++++++++++++++++++++++++++
> >  include/fwu.h                       |   5 +
> >  lib/fwu_updates/fwu_mdata_gpt_blk.c |   7 +-
> >  3 files changed, 185 insertions(+), 3 deletions(-)
> >
> > diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
> > index 84592677e4..66cbe3f798 100644
> > --- a/board/st/stm32mp1/stm32mp1.c
> > +++ b/board/st/stm32mp1/stm32mp1.c
> > @@ -7,10 +7,13 @@
> >
> >  #include <common.h>
> >  #include <adc.h>
> > +#include <blk.h>
> >  #include <bootm.h>
> >  #include <clk.h>
> >  #include <config.h>
> > +#include <dfu.h>
> >  #include <dm.h>
> > +#include <efi_loader.h>
> >  #include <env.h>
> >  #include <env_internal.h>
> >  #include <fdt_support.h>
> > @@ -23,9 +26,11 @@
> >  #include <log.h>
> >  #include <malloc.h>
> >  #include <misc.h>
> > +#include <mmc.h>
> >  #include <mtd_node.h>
> >  #include <net.h>
> >  #include <netdev.h>
> > +#include <part.h>
> >  #include <phy.h>
> >  #include <remoteproc.h>
> >  #include <reset.h>
> > @@ -938,3 +943,174 @@ static void board_copro_image_process(ulong fw_image, size_t fw_size)
> >  }
> >
> >  U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
> > +
> > +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
> > +#include <fwu.h>
> > +#include <fwu_mdata.h>
> > +
> > +static int gpt_plat_get_alt_num(int dev_num, void *identifier)
> > +{
> > +       int i;
> > +       int ret = -1;
> > +       u32 part;
> > +       int alt_num = dfu_get_alt_number();
> > +       struct dfu_entity *dfu;
> > +
> > +       part = *(u32 *)identifier;
> > +       dfu_init_env_entities(NULL, NULL);
> > +
> > +       for (i = 0; i < alt_num; i++) {
> > +               dfu = dfu_get_entity(i);
> > +
> > +               if (!dfu)
> > +                       continue;
> > +
> > +               /*
> > +                * Currently, Multi Bank update
> > +                * feature is being supported
> > +                * only on GPT partitioned
> > +                * MMC/SD devices.
> > +                */
> > +               if (dfu->dev_type != DFU_DEV_MMC)
> > +                       continue;
> > +
> > +               if (dfu->layout == DFU_RAW_ADDR &&
> > +                   dfu->data.mmc.dev_num == dev_num &&
> > +                   dfu->data.mmc.part == part) {
> > +                       ret = dfu->alt;
> > +                       break;
> > +               }
> > +       }
> > +
> > +       dfu_free_entities();
> > +
> > +       return ret;
> > +}
> > +
> > +int fwu_plat_get_alt_num(void *identifier)
> > +{
> > +       int ret;
> > +       struct blk_desc *desc;
> > +
> > +       ret = fwu_plat_get_blk_desc(&desc);
> > +       if (ret < 0) {
> > +               log_err("Block device not found\n");
> > +               return -ENODEV;
> > +       }
> > +
> > +       return gpt_plat_get_alt_num(desc->devnum, identifier);
> > +}
> > +
> > +static int plat_fill_gpt_partition_guids(struct blk_desc *desc,
> > +                                        efi_guid_t **part_guid_arr)
> > +{
> > +       int i, ret = 0;
> > +       u32 part;
> > +       struct dfu_entity *dfu;
> > +       struct disk_partition info;
> > +       efi_guid_t part_type_guid;
> > +       int alt_num = dfu_get_alt_number();
> > +
> > +       dfu_init_env_entities(NULL, NULL);
> > +
> > +       for (i = 0, part = 1; i < alt_num; i++) {
> > +               dfu = dfu_get_entity(i);
> > +
> > +               if (!dfu)
> > +                       continue;
> > +
> > +               /*
> > +                * Currently, Multi Bank update
> > +                * feature is being supported
> > +                * only on GPT partitioned
> > +                * MMC/SD devices.
> > +                */
> > +               if (dfu->dev_type != DFU_DEV_MMC)
> > +                       continue;
> > +
> > +               if (part_get_info(desc, part, &info)) {
> > +                       part++;
> > +                       continue;
> > +               }
> > +
> > +               uuid_str_to_bin(info.type_guid, part_type_guid.b,
> > +                               UUID_STR_FORMAT_GUID);
> > +               guidcpy((*part_guid_arr + i), &part_type_guid);
> > +               part++;
> > +       }
> > +
> > +       dfu_free_entities();
> > +
> > +       return ret;
> > +}
> > +
> > +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr)
> > +{
> > +       int ret;
> > +       struct blk_desc *desc;
> > +
> > +       ret = fwu_plat_get_blk_desc(&desc);
> > +       if (ret < 0) {
> > +               log_err("Block device not found\n");
> > +               return -ENODEV;
> > +       }
> > +
> > +       return plat_fill_gpt_partition_guids(desc, part_guid_arr);
> > +}
> > +
> > +int fwu_plat_get_update_index(u32 *update_idx)
> > +{
> > +       int ret;
> > +       u32 active_idx;
> > +
> > +       ret = fwu_get_active_index(&active_idx);
> > +
> > +       if (ret < 0)
> > +               return -1;
> > +
> > +       *update_idx = active_idx ^= 0x1;
> > +
> > +       return ret;
> > +}
> > +
> > +int fwu_plat_get_blk_desc(struct blk_desc **desc)
> > +{
> > +       int ret;
> > +       struct mmc *mmc;
> > +       struct udevice *dev;
> > +
> > +       /*
> > +        * Initial support is being added for the DK2
> > +        * platform
> > +        */
> > +       if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> > +           (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> > +               ret = uclass_get_device(UCLASS_MMC, 0, &dev);
> > +               if (ret)
> > +                       return -1;
> > +
> > +               mmc = mmc_get_mmc_dev(dev);
> > +               if (!mmc)
> > +                       return -1;
> > +
> > +               if (mmc_init(mmc))
> > +                       return -1;
> > +
> > +               *desc = mmc_get_blk_desc(mmc);
> > +               if (!*desc)
> > +                       return -1;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> > +struct fwu_mdata_ops *get_plat_fwu_mdata_ops(void)
> > +{
> > +       if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
> > +           (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
> > +               return &fwu_gpt_blk_ops;
> > +       }
> > +
> > +       return NULL;
> > +}
> > +#endif /* CONFIG_FWU_MULTI_BANK_UPDATE */
> > diff --git a/include/fwu.h b/include/fwu.h
> > index 12f7eecdb0..b23a93ac40 100644
> > --- a/include/fwu.h
> > +++ b/include/fwu.h
> > @@ -59,4 +59,9 @@ int fwu_revert_boot_index(void);
> >  int fwu_accept_image(efi_guid_t *img_type_id, u32 bank);
> >  int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank);
> >
> > +int fwu_plat_get_update_index(u32 *update_idx);
> > +int fwu_plat_get_blk_desc(struct blk_desc **desc);
> > +int fwu_plat_get_alt_num(void *identifier);
> > +int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr);
> > +
> >  #endif /* _FWU_H_ */
> > diff --git a/lib/fwu_updates/fwu_mdata_gpt_blk.c b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> > index cb47ddf4a7..796b08e76f 100644
> > --- a/lib/fwu_updates/fwu_mdata_gpt_blk.c
> > +++ b/lib/fwu_updates/fwu_mdata_gpt_blk.c
> > @@ -37,6 +37,7 @@ static int gpt_get_mdata_partitions(struct blk_desc *desc,
> >         struct disk_partition info;
> >         const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
> >
> > +       mdata_parts = 0;
> >         for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
> >                 if (part_get_info(desc, i, &info))
> >                         continue;
> > @@ -324,7 +325,7 @@ out:
> >  int fwu_gpt_get_active_index(u32 *active_idx)
> >  {
> >         int ret;
> > -       struct fwu_mdata *mdata;
> > +       struct fwu_mdata *mdata = NULL;
> >
> >         ret = gpt_get_mdata(&mdata);
> >         if (ret < 0) {
> > @@ -355,7 +356,7 @@ static int gpt_get_image_alt_num(struct blk_desc *desc,
> >  {
> >         int ret, i;
> >         u32 part;
> > -       struct fwu_mdata *mdata;
> > +       struct fwu_mdata *mdata = NULL;
> >         struct fwu_image_entry *img_entry;
> >         struct fwu_image_bank_info *img_bank_info;
> >         struct disk_partition info;
> > @@ -459,7 +460,7 @@ static int fwu_gpt_set_clear_image_accept(efi_guid_t *img_type_id,
> >         void *buf;
> >         int ret, i;
> >         u32 nimages;
> > -       struct fwu_mdata *mdata;
> > +       struct fwu_mdata *mdata = NULL;
> >         struct fwu_image_entry *img_entry;
> >         struct fwu_image_bank_info *img_bank_info;
> >
> > --
> > 2.17.1
> >
>
>
> --
> Masami Hiramatsu
diff mbox series

Patch

diff --git a/board/st/stm32mp1/stm32mp1.c b/board/st/stm32mp1/stm32mp1.c
index 84592677e4..66cbe3f798 100644
--- a/board/st/stm32mp1/stm32mp1.c
+++ b/board/st/stm32mp1/stm32mp1.c
@@ -7,10 +7,13 @@ 
 
 #include <common.h>
 #include <adc.h>
+#include <blk.h>
 #include <bootm.h>
 #include <clk.h>
 #include <config.h>
+#include <dfu.h>
 #include <dm.h>
+#include <efi_loader.h>
 #include <env.h>
 #include <env_internal.h>
 #include <fdt_support.h>
@@ -23,9 +26,11 @@ 
 #include <log.h>
 #include <malloc.h>
 #include <misc.h>
+#include <mmc.h>
 #include <mtd_node.h>
 #include <net.h>
 #include <netdev.h>
+#include <part.h>
 #include <phy.h>
 #include <remoteproc.h>
 #include <reset.h>
@@ -938,3 +943,174 @@  static void board_copro_image_process(ulong fw_image, size_t fw_size)
 }
 
 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
+
+#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
+#include <fwu.h>
+#include <fwu_mdata.h>
+
+static int gpt_plat_get_alt_num(int dev_num, void *identifier)
+{
+	int i;
+	int ret = -1;
+	u32 part;
+	int alt_num = dfu_get_alt_number();
+	struct dfu_entity *dfu;
+
+	part = *(u32 *)identifier;
+	dfu_init_env_entities(NULL, NULL);
+
+	for (i = 0; i < alt_num; i++) {
+		dfu = dfu_get_entity(i);
+
+		if (!dfu)
+			continue;
+
+		/*
+		 * Currently, Multi Bank update
+		 * feature is being supported
+		 * only on GPT partitioned
+		 * MMC/SD devices.
+		 */
+		if (dfu->dev_type != DFU_DEV_MMC)
+			continue;
+
+		if (dfu->layout == DFU_RAW_ADDR &&
+		    dfu->data.mmc.dev_num == dev_num &&
+		    dfu->data.mmc.part == part) {
+			ret = dfu->alt;
+			break;
+		}
+	}
+
+	dfu_free_entities();
+
+	return ret;
+}
+
+int fwu_plat_get_alt_num(void *identifier)
+{
+	int ret;
+	struct blk_desc *desc;
+
+	ret = fwu_plat_get_blk_desc(&desc);
+	if (ret < 0) {
+		log_err("Block device not found\n");
+		return -ENODEV;
+	}
+
+	return gpt_plat_get_alt_num(desc->devnum, identifier);
+}
+
+static int plat_fill_gpt_partition_guids(struct blk_desc *desc,
+					 efi_guid_t **part_guid_arr)
+{
+	int i, ret = 0;
+	u32 part;
+	struct dfu_entity *dfu;
+	struct disk_partition info;
+	efi_guid_t part_type_guid;
+	int alt_num = dfu_get_alt_number();
+
+	dfu_init_env_entities(NULL, NULL);
+
+	for (i = 0, part = 1; i < alt_num; i++) {
+		dfu = dfu_get_entity(i);
+
+		if (!dfu)
+			continue;
+
+		/*
+		 * Currently, Multi Bank update
+		 * feature is being supported
+		 * only on GPT partitioned
+		 * MMC/SD devices.
+		 */
+		if (dfu->dev_type != DFU_DEV_MMC)
+			continue;
+
+		if (part_get_info(desc, part, &info)) {
+			part++;
+			continue;
+		}
+
+		uuid_str_to_bin(info.type_guid, part_type_guid.b,
+				UUID_STR_FORMAT_GUID);
+		guidcpy((*part_guid_arr + i), &part_type_guid);
+		part++;
+	}
+
+	dfu_free_entities();
+
+	return ret;
+}
+
+int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr)
+{
+	int ret;
+	struct blk_desc *desc;
+
+	ret = fwu_plat_get_blk_desc(&desc);
+	if (ret < 0) {
+		log_err("Block device not found\n");
+		return -ENODEV;
+	}
+
+	return plat_fill_gpt_partition_guids(desc, part_guid_arr);
+}
+
+int fwu_plat_get_update_index(u32 *update_idx)
+{
+	int ret;
+	u32 active_idx;
+
+	ret = fwu_get_active_index(&active_idx);
+
+	if (ret < 0)
+		return -1;
+
+	*update_idx = active_idx ^= 0x1;
+
+	return ret;
+}
+
+int fwu_plat_get_blk_desc(struct blk_desc **desc)
+{
+	int ret;
+	struct mmc *mmc;
+	struct udevice *dev;
+
+	/*
+	 * Initial support is being added for the DK2
+	 * platform
+	 */
+	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
+	    (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
+		ret = uclass_get_device(UCLASS_MMC, 0, &dev);
+		if (ret)
+			return -1;
+
+		mmc = mmc_get_mmc_dev(dev);
+		if (!mmc)
+			return -1;
+
+		if (mmc_init(mmc))
+			return -1;
+
+		*desc = mmc_get_blk_desc(mmc);
+		if (!*desc)
+			return -1;
+	}
+
+	return 0;
+}
+
+struct fwu_mdata_ops *get_plat_fwu_mdata_ops(void)
+{
+	if (CONFIG_IS_ENABLED(TARGET_ST_STM32MP15x) &&
+	    (of_machine_is_compatible("st,stm32mp157c-dk2"))) {
+		return &fwu_gpt_blk_ops;
+	}
+
+	return NULL;
+}
+#endif /* CONFIG_FWU_MULTI_BANK_UPDATE */
diff --git a/include/fwu.h b/include/fwu.h
index 12f7eecdb0..b23a93ac40 100644
--- a/include/fwu.h
+++ b/include/fwu.h
@@ -59,4 +59,9 @@  int fwu_revert_boot_index(void);
 int fwu_accept_image(efi_guid_t *img_type_id, u32 bank);
 int fwu_clear_accept_image(efi_guid_t *img_type_id, u32 bank);
 
+int fwu_plat_get_update_index(u32 *update_idx);
+int fwu_plat_get_blk_desc(struct blk_desc **desc);
+int fwu_plat_get_alt_num(void *identifier);
+int fwu_plat_fill_partition_guids(efi_guid_t **part_guid_arr);
+
 #endif /* _FWU_H_ */
diff --git a/lib/fwu_updates/fwu_mdata_gpt_blk.c b/lib/fwu_updates/fwu_mdata_gpt_blk.c
index cb47ddf4a7..796b08e76f 100644
--- a/lib/fwu_updates/fwu_mdata_gpt_blk.c
+++ b/lib/fwu_updates/fwu_mdata_gpt_blk.c
@@ -37,6 +37,7 @@  static int gpt_get_mdata_partitions(struct blk_desc *desc,
 	struct disk_partition info;
 	const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
 
+	mdata_parts = 0;
 	for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
 		if (part_get_info(desc, i, &info))
 			continue;
@@ -324,7 +325,7 @@  out:
 int fwu_gpt_get_active_index(u32 *active_idx)
 {
 	int ret;
-	struct fwu_mdata *mdata;
+	struct fwu_mdata *mdata = NULL;
 
 	ret = gpt_get_mdata(&mdata);
 	if (ret < 0) {
@@ -355,7 +356,7 @@  static int gpt_get_image_alt_num(struct blk_desc *desc,
 {
 	int ret, i;
 	u32 part;
-	struct fwu_mdata *mdata;
+	struct fwu_mdata *mdata = NULL;
 	struct fwu_image_entry *img_entry;
 	struct fwu_image_bank_info *img_bank_info;
 	struct disk_partition info;
@@ -459,7 +460,7 @@  static int fwu_gpt_set_clear_image_accept(efi_guid_t *img_type_id,
 	void *buf;
 	int ret, i;
 	u32 nimages;
-	struct fwu_mdata *mdata;
+	struct fwu_mdata *mdata = NULL;
 	struct fwu_image_entry *img_entry;
 	struct fwu_image_bank_info *img_bank_info;