[PATCH v5 20/23] FWU: synquacer: Generate dfu_alt_info from devicetree partition
Michal Simek
michal.simek at amd.com
Fri Jun 17 16:02:06 CEST 2022
On 6/9/22 14:30, Sughosh Ganu wrote:
> From: Masami Hiramatsu <masami.hiramatsu at linaro.org>
>
> Generate dfu_alt_info from the partition uuid information in the
> devicetree, and record the mapping of partition uuid and the
> index of dfu_alt_num.
>
> This could be a reference implementation of the automatic DFU
> generation for FWU multi-bank update for non GPT firmware
> platforms.
>
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu at linaro.org>
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> ---
> .../synquacer-sc2a11-developerbox-u-boot.dtsi | 3 +
> board/socionext/developerbox/Kconfig | 1 +
> board/socionext/developerbox/fwu_plat.c | 79 ++++----
> include/configs/synquacer.h | 6 +-
> include/fwu.h | 6 +
> lib/fwu_updates/Makefile | 1 +
> lib/fwu_updates/fwu_mtd.c | 173 ++++++++++++++++++
> 7 files changed, 221 insertions(+), 48 deletions(-)
> create mode 100644 lib/fwu_updates/fwu_mtd.c
>
> diff --git a/arch/arm/dts/synquacer-sc2a11-developerbox-u-boot.dtsi b/arch/arm/dts/synquacer-sc2a11-developerbox-u-boot.dtsi
> index ab4e3d1c2b..c7ec8a0321 100644
> --- a/arch/arm/dts/synquacer-sc2a11-developerbox-u-boot.dtsi
> +++ b/arch/arm/dts/synquacer-sc2a11-developerbox-u-boot.dtsi
> @@ -36,6 +36,7 @@
> compatible = "fixed-partitions";
> #address-cells = <1>;
> #size-cells = <1>;
> + uuid = "17e86d77-41f9-4fd7-87ec-a55df9842de5";
>
> partition at 0 {
> label = "BootStrap-BL1";
> @@ -88,10 +89,12 @@
> partition at 600000 {
> label = "FIP-Bank0";
> reg = <0x600000 0x400000>;
> + uuid = "5a66a702-99fd-4fef-a392-c26e261a2828";
> };
> partition at a00000 {
> label = "FIP-Bank1";
> reg = <0xa00000 0x400000>;
> + uuid = "a8f868a1-6e5c-4757-878d-ce63375ef2c0";
> };
> };
> };
> diff --git a/board/socionext/developerbox/Kconfig b/board/socionext/developerbox/Kconfig
> index 7df6750baf..ad2a284f13 100644
> --- a/board/socionext/developerbox/Kconfig
> +++ b/board/socionext/developerbox/Kconfig
> @@ -38,6 +38,7 @@ config FWU_MULTI_BANK_UPDATE
> select DM_SPI_FLASH
> select DM_FWU_MDATA
> select BOARD_LATE_INIT
> + select SET_DFU_ALT_INFO
>
> config FWU_NUM_BANKS
> default 2
> diff --git a/board/socionext/developerbox/fwu_plat.c b/board/socionext/developerbox/fwu_plat.c
> index fd6d0e3659..ff06eade7d 100644
> --- a/board/socionext/developerbox/fwu_plat.c
> +++ b/board/socionext/developerbox/fwu_plat.c
> @@ -10,8 +10,10 @@
> #include <fwu_mdata.h>
> #include <malloc.h>
> #include <memalign.h>
> +#include <mtd.h>
> #include <spi.h>
> #include <spi_flash.h>
> +#include <uuid.h>
>
> #include <linux/errno.h>
> #include <linux/types.h>
> @@ -94,6 +96,36 @@ static int sf_save_data(u32 offs, u32 size, void *data)
> return ret;
> }
>
> +#define DFU_ALT_BUF_LEN 256
> +#define DFU_ALT_NUM_MAX (CONFIG_FWU_NUM_IMAGES_PER_BANK * CONFIG_FWU_NUM_BANKS)
> +
> +/* Generate dfu_alt_info from partitions */
> +void set_dfu_alt_info(char *interface, char *devstr)
> +{
> + int ret;
> + struct mtd_info *mtd;
> + static char *buf = NULL;
> +
> + if (!buf) {
> + buf = malloc_cache_aligned(DFU_ALT_BUF_LEN);
> + memset(buf, 0, DFU_ALT_BUF_LEN);
> +
> + mtd_probe_devices();
> +
> + mtd = get_mtd_device_nm("nor1");
> + if (IS_ERR_OR_NULL(mtd))
> + return;
> +
> + ret = fwu_gen_alt_info_from_mtd(buf, DFU_ALT_BUF_LEN, mtd);
> + if (ret < 0) {
> + log_err("Error: Failed to generate dfu_alt_info. (%d)\n", ret);
> + return;
> + }
> + log_debug("Make dfu_alt_info: '%s'\n", buf);
> + }
> + env_set("dfu_alt_info", buf);
> +}
> +
> #define PLAT_METADATA_OFFSET 0x510000
> #define PLAT_METADATA_SIZE (sizeof(struct devbox_metadata))
>
> @@ -105,49 +137,7 @@ struct __packed devbox_metadata {
> int fwu_plat_get_alt_num(struct udevice __always_unused *dev,
> efi_guid_t *image_id, int *alt_num)
> {
> - struct fwu_image_bank_info *bank;
> - struct fwu_mdata *mdata;
> - int i, ret;
> -
> - ret = fwu_get_mdata(&mdata);
> - if (ret < 0)
> - return ret;
> -
> - /*
> - * DeveloperBox FWU expects Bank:Image = 1:1, and the dfu_alt_info
> - * only has the entries for banks. Thus the alt_no should be equal
> - * to the bank index number.
> - */
> - ret = -ENOENT;
> - for (i = 0; i < CONFIG_FWU_NUM_BANKS; i++) {
> - bank = &mdata->img_entry[0].img_bank_info[i];
> - if (guidcmp(image_id, &bank->image_uuid) == 0) {
> - *alt_num = i;
> - ret = 0;
> - break;
> - }
> - }
> -
> - free(mdata);
> -
> - return ret;
> -}
> -
> -/* This assumes that user doesn't change system default dfu_alt_info */
> -efi_status_t fill_image_type_guid_array(const efi_guid_t __always_unused
> - *default_guid,
> - efi_guid_t **part_guid_arr)
> -{
> - int i;
> -
> - *part_guid_arr = malloc(sizeof(efi_guid_t) * DEFAULT_DFU_ALT_NUM);
> - if (!*part_guid_arr)
> - return EFI_OUT_OF_RESOURCES;
> -
> - for (i = 0; i < DEFAULT_DFU_ALT_NUM; i++)
> - guidcpy((*part_guid_arr + i), &devbox_fip_image_type_guid);
> -
> - return EFI_SUCCESS;
> + return fwu_get_mtd_alt_num(image_id, alt_num, "nor1", 0);
> }
>
> int fwu_plat_get_update_index(u32 *update_idx)
> @@ -188,6 +178,9 @@ int board_late_init(void)
> {
> int ret;
>
> + /* Make mmc available for EFI */
> + run_command("mmc dev 0", 0);
> +
What is this for?
And I can't see any single note about in commit message.
Thanks,
Michal
More information about the U-Boot
mailing list