diff mbox series

[RFC,1/6] capsule: Add Image GUIDs for platforms using capsule updates

Message ID 20220324123901.429472-2-sughosh.ganu@linaro.org
State New
Headers show
Series efi: capsule: Image GUID usage cleanup | expand

Commit Message

Sughosh Ganu March 24, 2022, 12:38 p.m. UTC
Currently, all platforms that enable capsule updates do so using
either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
Management Protocol(FMP) instance used on the platform. However, this
means that all platforms that enable a particular FMP instance have
the same GUID value for all the updatable images, either the FIT image
GUID or the raw image GUID, and that an image for some platform can be
updated on any other platform which uses the same FMP instance. Another
issue with this implementation is that the ESRT table shows the same
GUID value for all images on the platform and also across platforms,
which is not in compliance with the UEFI specification.

Fix this by defining image GUID values and firmware names for
individual images per platform. The GetImageInfo FMP hook would then
populate these values in the image descriptor array.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
---
 .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
 .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
 board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
 board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
 board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
 board/kontron/sl28/sl28.c                     | 14 +++++++++++
 board/sandbox/sandbox.c                       | 17 ++++++++++++++
 board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
 board/xilinx/common/board.h                   | 18 +++++++++++++++
 board/xilinx/zynq/board.c                     | 18 +++++++++++++++
 board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
 include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
 include/configs/imx8mp_rsb3720.h              | 10 ++++++++
 include/configs/kontron-sl-mx8mm.h            |  6 +++++
 include/configs/kontron_pitx_imx8m.h          |  6 +++++
 include/configs/kontron_sl28.h                |  6 +++++
 include/configs/qemu-arm.h                    | 10 ++++++++
 include/configs/sandbox.h                     | 10 ++++++++
 include/configs/synquacer.h                   | 14 +++++++++++
 include/efi_loader.h                          | 15 ++++++++++++
 20 files changed, 280 insertions(+), 1 deletion(-)

Comments

Michal Simek March 24, 2022, 1:36 p.m. UTC | #1
On 3/24/22 13:38, Sughosh Ganu wrote:
> Currently, all platforms that enable capsule updates do so using
> either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> Management Protocol(FMP) instance used on the platform. However, this
> means that all platforms that enable a particular FMP instance have
> the same GUID value for all the updatable images, either the FIT image
> GUID or the raw image GUID, and that an image for some platform can be
> updated on any other platform which uses the same FMP instance. Another
> issue with this implementation is that the ESRT table shows the same
> GUID value for all images on the platform and also across platforms,
> which is not in compliance with the UEFI specification.
> 
> Fix this by defining image GUID values and firmware names for
> individual images per platform. The GetImageInfo FMP hook would then
> populate these values in the image descriptor array.
> 
> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> ---
>   .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
>   .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
>   board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
>   board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
>   board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
>   board/kontron/sl28/sl28.c                     | 14 +++++++++++
>   board/sandbox/sandbox.c                       | 17 ++++++++++++++
>   board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
>   board/xilinx/common/board.h                   | 18 +++++++++++++++
>   board/xilinx/zynq/board.c                     | 18 +++++++++++++++
>   board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
>   include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
>   include/configs/imx8mp_rsb3720.h              | 10 ++++++++
>   include/configs/kontron-sl-mx8mm.h            |  6 +++++
>   include/configs/kontron_pitx_imx8m.h          |  6 +++++
>   include/configs/kontron_sl28.h                |  6 +++++
>   include/configs/qemu-arm.h                    | 10 ++++++++
>   include/configs/sandbox.h                     | 10 ++++++++
>   include/configs/synquacer.h                   | 14 +++++++++++
>   include/efi_loader.h                          | 15 ++++++++++++
>   20 files changed, 280 insertions(+), 1 deletion(-)
> 
> diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> index 16566092bd..6b534660fe 100644
> --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> @@ -6,6 +6,8 @@
>   
>   #include <common.h>
>   #include <dwc3-uboot.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <errno.h>
>   #include <miiphy.h>
>   #include <netdev.h>
> @@ -21,6 +23,7 @@
>   #include <asm/arch/clock.h>
>   #include <asm/mach-imx/dma.h>
>   #include <linux/delay.h>
> +#include <linux/kernel.h>
>   #include <power/pmic.h>
>   
>   DECLARE_GLOBAL_DATA_PTR;
> @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
>   }
>   #endif
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> +		.image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> +		.image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> +#endif
> +		.fw_name = u"IMX8MP-RSB3720-FIT"
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
> +
>   int board_early_init_f(void)
>   {
>   	struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> index 7e2d88f449..ec73d75db3 100644
> --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> @@ -5,6 +5,8 @@
>    */
>   
>   #include <common.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <env.h>
>   #include <extension_board.h>
>   #include <hang.h>
> @@ -21,11 +23,27 @@
>   #include <asm/mach-imx/gpio.h>
>   #include <asm/mach-imx/mxc_i2c.h>
>   #include <asm/sections.h>
> +#include <linux/kernel.h>
>   
>   #include "ddr/ddr.h"
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> +		.image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> +		.image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> +#endif
> +		.fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   int board_phys_sdram_size(phys_size_t *size)
>   {
>   	struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> index 16d5a97167..99872ce0b8 100644
> --- a/board/emulation/qemu-arm/qemu-arm.c
> +++ b/board/emulation/qemu-arm/qemu-arm.c
> @@ -6,15 +6,35 @@
>   #include <common.h>
>   #include <cpu_func.h>
>   #include <dm.h>
> +#include <efi.h>
> +#include <efi_loader.h>
> +#include <efi_loader.h>
>   #include <fdtdec.h>
>   #include <init.h>
>   #include <log.h>
>   #include <virtio_types.h>
>   #include <virtio.h>
>   
> +#include <linux/kernel.h>
> +
>   #ifdef CONFIG_ARM64
>   #include <asm/armv8/mmu.h>
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> +		.image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> +		.image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> +#endif
> +		.fw_name = u"Qemu-Arm-UBOOT",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   static struct mm_region qemu_arm64_mem_map[] = {
>   	{
>   		/* Flash */
> diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> index d655fe099b..c3af951b14 100644
> --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> @@ -2,6 +2,8 @@
>   
>   #include "pitx_misc.h"
>   #include <common.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <init.h>
>   #include <mmc.h>
>   #include <miiphy.h>
> @@ -12,7 +14,7 @@
>   #include <asm/mach-imx/gpio.h>
>   #include <asm/mach-imx/iomux-v3.h>
>   #include <linux/delay.h>
> -
> +#include <linux/kernel.h>
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
>   	IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
>   };
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +		.image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> +		.fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   int board_early_init_f(void)
>   {
>   	struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> index 48376cb826..4d25618895 100644
> --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> @@ -6,12 +6,26 @@
>   #include <asm/arch/imx-regs.h>
>   #include <asm/global_data.h>
>   #include <asm/io.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <fdt_support.h>
>   #include <linux/errno.h>
> +#include <linux/kernel.h>
>   #include <net.h>
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +		.image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> +		.fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   int board_phys_sdram_size(phys_size_t *size)
>   {
>   	u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> index 3c48a9141d..a4985df4ea 100644
> --- a/board/kontron/sl28/sl28.c
> +++ b/board/kontron/sl28/sl28.c
> @@ -3,11 +3,14 @@
>   #include <common.h>
>   #include <dm.h>
>   #include <malloc.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <errno.h>
>   #include <fsl_ddr.h>
>   #include <fdt_support.h>
>   #include <asm/global_data.h>
>   #include <linux/libfdt.h>
> +#include <linux/kernel.h>
>   #include <env_internal.h>
>   #include <asm/arch-fsl-layerscape/soc.h>
>   #include <asm/arch-fsl-layerscape/fsl_icid.h>
> @@ -23,6 +26,17 @@
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +		.image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> +		.fw_name = u"KONTRON-SL28-FIT",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   int board_early_init_f(void)
>   {
>   	fsl_lsch3_early_init_f();
> diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> index 5d9a945d64..8b0f3de1ea 100644
> --- a/board/sandbox/sandbox.c
> +++ b/board/sandbox/sandbox.c
> @@ -7,6 +7,8 @@
>   #include <cpu_func.h>
>   #include <cros_ec.h>
>   #include <dm.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <env_internal.h>
>   #include <init.h>
>   #include <led.h>
> @@ -25,6 +27,21 @@
>    */
>   gd_t *gd;
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +		.image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> +		.fw_name = u"SANDBOX-UBOOT",
> +	},
> +	{
> +		.image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> +		.fw_name = u"SANDBOX-UBOOT-ENV",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   #if !CONFIG_IS_ENABLED(OF_PLATDATA)
>   /*
>    * Add a simple GPIO device (don't use with of-platdata as it interferes with
> diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> index 9552bfcdc3..4df26f4019 100644
> --- a/board/socionext/developerbox/developerbox.c
> +++ b/board/socionext/developerbox/developerbox.c
> @@ -10,10 +10,33 @@
>   #include <asm/global_data.h>
>   #include <asm/io.h>
>   #include <common.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>   #include <env_internal.h>
>   #include <fdt_support.h>
>   #include <log.h>
>   
> +#include <linux/kernel.h>
> +
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +	{
> +		.image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> +		.fw_name = u"DEVELOPERBOX-UBOOT",
> +	},
> +	{
> +		.image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> +		.fw_name = u"DEVELOPERBOX-FIP",
> +	},
> +	{
> +		.image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> +		.fw_name = u"DEVELOPERBOX-OPTEE",
> +	},
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>   static struct mm_region sc2a11_mem_map[] = {
>   	{
>   		.virt = 0x0UL,
> diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> index 69e642429b..9bcac14946 100644
> --- a/board/xilinx/common/board.h
> +++ b/board/xilinx/common/board.h
> @@ -7,6 +7,24 @@
>   #ifndef _BOARD_XILINX_COMMON_BOARD_H
>   #define _BOARD_XILINX_COMMON_BOARD_H
>   
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define ZYNQ_BOOT_IMAGE_GUID \
> +	EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> +		 0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> +
> +#define ZYNQ_UBOOT_IMAGE_GUID \
> +	EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> +		 0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> +
> +#define ZYNQMP_BOOT_IMAGE_GUID \
> +	EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> +		 0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> +
> +#define ZYNQMP_UBOOT_IMAGE_GUID \
> +	EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> +		 0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */

I can't see any benefit to have it defined here for all.
Directly in board or in include/configs/* seems to be better option.

M
Masami Hiramatsu March 24, 2022, 1:44 p.m. UTC | #2
Hi Sughosh,

2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
>
> Currently, all platforms that enable capsule updates do so using
> either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> Management Protocol(FMP) instance used on the platform. However, this
> means that all platforms that enable a particular FMP instance have
> the same GUID value for all the updatable images, either the FIT image
> GUID or the raw image GUID, and that an image for some platform can be
> updated on any other platform which uses the same FMP instance. Another
> issue with this implementation is that the ESRT table shows the same
> GUID value for all images on the platform and also across platforms,
> which is not in compliance with the UEFI specification.
>
> Fix this by defining image GUID values and firmware names for
> individual images per platform. The GetImageInfo FMP hook would then
> populate these values in the image descriptor array.

OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
platforms, correct?
I think you should explain that those GUIDs (fw_images[] entries) must
be corresponding to the dfu_alt_info entries, in the same order.
Without that, it is hard to understand why the next patch ([2/6]) works :-)

Thank you,

>
> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> ---
>  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
>  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
>  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
>  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
>  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
>  board/kontron/sl28/sl28.c                     | 14 +++++++++++
>  board/sandbox/sandbox.c                       | 17 ++++++++++++++
>  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
>  board/xilinx/common/board.h                   | 18 +++++++++++++++
>  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
>  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
>  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
>  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
>  include/configs/kontron-sl-mx8mm.h            |  6 +++++
>  include/configs/kontron_pitx_imx8m.h          |  6 +++++
>  include/configs/kontron_sl28.h                |  6 +++++
>  include/configs/qemu-arm.h                    | 10 ++++++++
>  include/configs/sandbox.h                     | 10 ++++++++
>  include/configs/synquacer.h                   | 14 +++++++++++
>  include/efi_loader.h                          | 15 ++++++++++++
>  20 files changed, 280 insertions(+), 1 deletion(-)
>
> diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> index 16566092bd..6b534660fe 100644
> --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> @@ -6,6 +6,8 @@
>
>  #include <common.h>
>  #include <dwc3-uboot.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <errno.h>
>  #include <miiphy.h>
>  #include <netdev.h>
> @@ -21,6 +23,7 @@
>  #include <asm/arch/clock.h>
>  #include <asm/mach-imx/dma.h>
>  #include <linux/delay.h>
> +#include <linux/kernel.h>
>  #include <power/pmic.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
> @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
>  }
>  #endif
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> +#endif
> +               .fw_name = u"IMX8MP-RSB3720-FIT"
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
> +
>  int board_early_init_f(void)
>  {
>         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> index 7e2d88f449..ec73d75db3 100644
> --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> @@ -5,6 +5,8 @@
>   */
>
>  #include <common.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <env.h>
>  #include <extension_board.h>
>  #include <hang.h>
> @@ -21,11 +23,27 @@
>  #include <asm/mach-imx/gpio.h>
>  #include <asm/mach-imx/mxc_i2c.h>
>  #include <asm/sections.h>
> +#include <linux/kernel.h>
>
>  #include "ddr/ddr.h"
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> +#endif
> +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  int board_phys_sdram_size(phys_size_t *size)
>  {
>         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> index 16d5a97167..99872ce0b8 100644
> --- a/board/emulation/qemu-arm/qemu-arm.c
> +++ b/board/emulation/qemu-arm/qemu-arm.c
> @@ -6,15 +6,35 @@
>  #include <common.h>
>  #include <cpu_func.h>
>  #include <dm.h>
> +#include <efi.h>
> +#include <efi_loader.h>
> +#include <efi_loader.h>
>  #include <fdtdec.h>
>  #include <init.h>
>  #include <log.h>
>  #include <virtio_types.h>
>  #include <virtio.h>
>
> +#include <linux/kernel.h>
> +
>  #ifdef CONFIG_ARM64
>  #include <asm/armv8/mmu.h>
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> +#endif
> +               .fw_name = u"Qemu-Arm-UBOOT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  static struct mm_region qemu_arm64_mem_map[] = {
>         {
>                 /* Flash */
> diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> index d655fe099b..c3af951b14 100644
> --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> @@ -2,6 +2,8 @@
>
>  #include "pitx_misc.h"
>  #include <common.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <init.h>
>  #include <mmc.h>
>  #include <miiphy.h>
> @@ -12,7 +14,7 @@
>  #include <asm/mach-imx/gpio.h>
>  #include <asm/mach-imx/iomux-v3.h>
>  #include <linux/delay.h>
> -
> +#include <linux/kernel.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
>         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
>  };
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  int board_early_init_f(void)
>  {
>         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> index 48376cb826..4d25618895 100644
> --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> @@ -6,12 +6,26 @@
>  #include <asm/arch/imx-regs.h>
>  #include <asm/global_data.h>
>  #include <asm/io.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <fdt_support.h>
>  #include <linux/errno.h>
> +#include <linux/kernel.h>
>  #include <net.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  int board_phys_sdram_size(phys_size_t *size)
>  {
>         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> index 3c48a9141d..a4985df4ea 100644
> --- a/board/kontron/sl28/sl28.c
> +++ b/board/kontron/sl28/sl28.c
> @@ -3,11 +3,14 @@
>  #include <common.h>
>  #include <dm.h>
>  #include <malloc.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <errno.h>
>  #include <fsl_ddr.h>
>  #include <fdt_support.h>
>  #include <asm/global_data.h>
>  #include <linux/libfdt.h>
> +#include <linux/kernel.h>
>  #include <env_internal.h>
>  #include <asm/arch-fsl-layerscape/soc.h>
>  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> @@ -23,6 +26,17 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> +               .fw_name = u"KONTRON-SL28-FIT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  int board_early_init_f(void)
>  {
>         fsl_lsch3_early_init_f();
> diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> index 5d9a945d64..8b0f3de1ea 100644
> --- a/board/sandbox/sandbox.c
> +++ b/board/sandbox/sandbox.c
> @@ -7,6 +7,8 @@
>  #include <cpu_func.h>
>  #include <cros_ec.h>
>  #include <dm.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <env_internal.h>
>  #include <init.h>
>  #include <led.h>
> @@ -25,6 +27,21 @@
>   */
>  gd_t *gd;
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> +               .fw_name = u"SANDBOX-UBOOT",
> +       },
> +       {
> +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> +               .fw_name = u"SANDBOX-UBOOT-ENV",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
>  /*
>   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> index 9552bfcdc3..4df26f4019 100644
> --- a/board/socionext/developerbox/developerbox.c
> +++ b/board/socionext/developerbox/developerbox.c
> @@ -10,10 +10,33 @@
>  #include <asm/global_data.h>
>  #include <asm/io.h>
>  #include <common.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <env_internal.h>
>  #include <fdt_support.h>
>  #include <log.h>
>
> +#include <linux/kernel.h>
> +
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> +               .fw_name = u"DEVELOPERBOX-UBOOT",
> +       },
> +       {
> +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> +               .fw_name = u"DEVELOPERBOX-FIP",
> +       },
> +       {
> +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> +               .fw_name = u"DEVELOPERBOX-OPTEE",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  static struct mm_region sc2a11_mem_map[] = {
>         {
>                 .virt = 0x0UL,
> diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> index 69e642429b..9bcac14946 100644
> --- a/board/xilinx/common/board.h
> +++ b/board/xilinx/common/board.h
> @@ -7,6 +7,24 @@
>  #ifndef _BOARD_XILINX_COMMON_BOARD_H
>  #define _BOARD_XILINX_COMMON_BOARD_H
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define ZYNQ_BOOT_IMAGE_GUID \
> +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> +
> +#define ZYNQ_UBOOT_IMAGE_GUID \
> +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> +
> +#define ZYNQMP_BOOT_IMAGE_GUID \
> +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> +
> +#define ZYNQMP_UBOOT_IMAGE_GUID \
> +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  int board_late_init_xilinx(void);
>
>  int xilinx_read_eeprom(void);
> diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> index 26ef048835..0aa51a3e6d 100644
> --- a/board/xilinx/zynq/board.c
> +++ b/board/xilinx/zynq/board.c
> @@ -8,6 +8,8 @@
>  #include <init.h>
>  #include <log.h>
>  #include <dm/uclass.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <env.h>
>  #include <env_internal.h>
>  #include <fdtdec.h>
> @@ -21,10 +23,26 @@
>  #include <asm/global_data.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/sys_proto.h>
> +#include <linux/kernel.h>
>  #include "../common/board.h"
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> +       },
> +       {
> +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> +               .fw_name = u"ZYNQ-UBOOT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
>  void board_debug_uart_init(void)
>  {
> diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> index 70b3c81f12..b232f7ac4f 100644
> --- a/board/xilinx/zynqmp/zynqmp.c
> +++ b/board/xilinx/zynqmp/zynqmp.c
> @@ -9,6 +9,8 @@
>  #include <cpu_func.h>
>  #include <debug_uart.h>
>  #include <dfu.h>
> +#include <efi.h>
> +#include <efi_loader.h>
>  #include <env.h>
>  #include <env_internal.h>
>  #include <init.h>
> @@ -40,6 +42,7 @@
>  #include <linux/bitops.h>
>  #include <linux/delay.h>
>  #include <linux/sizes.h>
> +#include <linux/kernel.h>
>  #include "../common/board.h"
>
>  #include "pm_cfg_obj.h"
> @@ -54,6 +57,21 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +struct efi_fw_images fw_images[] = {
> +       {
> +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> +       },
> +       {
> +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> +               .fw_name = u"ZYNQMP-UBOOT",
> +       },
> +};
> +
> +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
>  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
>
> diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> index 7e6be6050c..35df2e755e 100644
> --- a/include/configs/imx8mm-cl-iot-gate.h
> +++ b/include/configs/imx8mm-cl-iot-gate.h
> @@ -31,6 +31,16 @@
>
>  #endif
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> +
> +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  #if CONFIG_IS_ENABLED(CMD_MMC)
>  # define BOOT_TARGET_MMC(func) \
>         func(MMC, mmc, 2)      \
> diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> index ac4a7d0cb3..a5a845c2da 100644
> --- a/include/configs/imx8mp_rsb3720.h
> +++ b/include/configs/imx8mp_rsb3720.h
> @@ -21,6 +21,16 @@
>  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
>  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> +
> +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> +
>  #ifdef CONFIG_SPL_BUILD
>  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
>  #define CONFIG_SPL_STACK               0x960000
> diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> index 788ae77cd3..aff1b90010 100644
> --- a/include/configs/kontron-sl-mx8mm.h
> +++ b/include/configs/kontron-sl-mx8mm.h
> @@ -38,6 +38,12 @@
>  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
>  #endif
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  #ifndef CONFIG_SPL_BUILD
>  #define BOOT_TARGET_DEVICES(func) \
>         func(MMC, mmc, 1) \
> diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> index 0f96b905ab..678364e367 100644
> --- a/include/configs/kontron_pitx_imx8m.h
> +++ b/include/configs/kontron_pitx_imx8m.h
> @@ -14,6 +14,12 @@
>  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
>  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  #ifdef CONFIG_SPL_BUILD
>  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
>  #define CONFIG_SPL_STACK               0x187FF0
> diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> index 448749a7f8..97d0d365f6 100644
> --- a/include/configs/kontron_sl28.h
> +++ b/include/configs/kontron_sl28.h
> @@ -57,6 +57,12 @@
>  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
>  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define KONTRON_SL28_FIT_IMAGE_GUID \
> +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  /* environment */
>  /* see include/configs/ti_armv7_common.h */
>  #define ENV_MEM_LAYOUT_SETTINGS \
> diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> index d45f606860..2f2abc746d 100644
> --- a/include/configs/qemu-arm.h
> +++ b/include/configs/qemu-arm.h
> @@ -17,6 +17,16 @@
>
>  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> +
> +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
>
>  /* Environment options */
> diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> index 75efbf3448..d06c3de2e0 100644
> --- a/include/configs/sandbox.h
> +++ b/include/configs/sandbox.h
> @@ -14,6 +14,16 @@
>
>  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define SANDBOX_UBOOT_IMAGE_GUID \
> +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> +
> +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  /* Size of our emulated memory */
>  #define SB_CONCAT(x, y) x ## y
>  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> index 8dd092fc59..07e1f56e3d 100644
> --- a/include/configs/synquacer.h
> +++ b/include/configs/synquacer.h
> @@ -51,6 +51,20 @@
>                         "fip.bin raw 180000 78000;"                     \
>                         "optee.bin raw 500000 100000\0"
>
> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> +
> +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> +
> +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
>  /* Distro boot settings */
>  #ifndef CONFIG_SPL_BUILD
>  #ifdef CONFIG_CMD_USB
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index af36639ec6..1965b5a28f 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
>
>  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
>
> +/**
> + * struct efi_fw_images - List of firmware images updatable through capsule
> + *                        update
> + *
> + * This structure gives information about the firmware images on the platform
> + * which can be updated through the capsule update mechanism
> + *
> + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> + * @fw_name:           Name of the firmware image
> + */
> +struct efi_fw_images {
> +       efi_guid_t image_type_id;
> +       const u16 *fw_name;
> +};
> +
>  /**
>   * Install the ESRT system table.
>   *
> --
> 2.25.1
>
Sughosh Ganu March 24, 2022, 2:40 p.m. UTC | #3
hi Masami,

On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
<masami.hiramatsu@linaro.org> wrote:
>
> Hi Sughosh,
>
> 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> >
> > Currently, all platforms that enable capsule updates do so using
> > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > Management Protocol(FMP) instance used on the platform. However, this
> > means that all platforms that enable a particular FMP instance have
> > the same GUID value for all the updatable images, either the FIT image
> > GUID or the raw image GUID, and that an image for some platform can be
> > updated on any other platform which uses the same FMP instance. Another
> > issue with this implementation is that the ESRT table shows the same
> > GUID value for all images on the platform and also across platforms,
> > which is not in compliance with the UEFI specification.
> >
> > Fix this by defining image GUID values and firmware names for
> > individual images per platform. The GetImageInfo FMP hook would then
> > populate these values in the image descriptor array.
>
> OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> platforms, correct?

No, I have generated the fw_images array based on the information that
I found in the dfu_alt_info variable for the platform. But this is not
correlated to the dfu_alt_info variable. If you think that the array
should have more/different entries for your platform, please let me
know, and I will change it.

> I think you should explain that those GUIDs (fw_images[] entries) must
> be corresponding to the dfu_alt_info entries, in the same order.

The dfu_alt_info can have more entries than the firmware images that
are updatable through capsule update. One example is the ST platforms
which have additional entries in the dfu_alt_info. The image
descriptor array should only contain entries of images which are
updatable through capsule update, since the same information is also
used for generating the ESRT. Which is why I have changed the logic to
populate the image descriptors through the fw_images array rather than
the dfu_alt_info.

-sughosh

> Without that, it is hard to understand why the next patch ([2/6]) works :-)
>
> Thank you,
>
> >
> > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > ---
> >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> >  include/configs/kontron_sl28.h                |  6 +++++
> >  include/configs/qemu-arm.h                    | 10 ++++++++
> >  include/configs/sandbox.h                     | 10 ++++++++
> >  include/configs/synquacer.h                   | 14 +++++++++++
> >  include/efi_loader.h                          | 15 ++++++++++++
> >  20 files changed, 280 insertions(+), 1 deletion(-)
> >
> > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > index 16566092bd..6b534660fe 100644
> > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > @@ -6,6 +6,8 @@
> >
> >  #include <common.h>
> >  #include <dwc3-uboot.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <errno.h>
> >  #include <miiphy.h>
> >  #include <netdev.h>
> > @@ -21,6 +23,7 @@
> >  #include <asm/arch/clock.h>
> >  #include <asm/mach-imx/dma.h>
> >  #include <linux/delay.h>
> > +#include <linux/kernel.h>
> >  #include <power/pmic.h>
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> >  }
> >  #endif
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > +#endif
> > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> > +
> >  int board_early_init_f(void)
> >  {
> >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > index 7e2d88f449..ec73d75db3 100644
> > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > @@ -5,6 +5,8 @@
> >   */
> >
> >  #include <common.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <env.h>
> >  #include <extension_board.h>
> >  #include <hang.h>
> > @@ -21,11 +23,27 @@
> >  #include <asm/mach-imx/gpio.h>
> >  #include <asm/mach-imx/mxc_i2c.h>
> >  #include <asm/sections.h>
> > +#include <linux/kernel.h>
> >
> >  #include "ddr/ddr.h"
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > +#endif
> > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  int board_phys_sdram_size(phys_size_t *size)
> >  {
> >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > index 16d5a97167..99872ce0b8 100644
> > --- a/board/emulation/qemu-arm/qemu-arm.c
> > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > @@ -6,15 +6,35 @@
> >  #include <common.h>
> >  #include <cpu_func.h>
> >  #include <dm.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> > +#include <efi_loader.h>
> >  #include <fdtdec.h>
> >  #include <init.h>
> >  #include <log.h>
> >  #include <virtio_types.h>
> >  #include <virtio.h>
> >
> > +#include <linux/kernel.h>
> > +
> >  #ifdef CONFIG_ARM64
> >  #include <asm/armv8/mmu.h>
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > +#endif
> > +               .fw_name = u"Qemu-Arm-UBOOT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  static struct mm_region qemu_arm64_mem_map[] = {
> >         {
> >                 /* Flash */
> > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > index d655fe099b..c3af951b14 100644
> > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > @@ -2,6 +2,8 @@
> >
> >  #include "pitx_misc.h"
> >  #include <common.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <init.h>
> >  #include <mmc.h>
> >  #include <miiphy.h>
> > @@ -12,7 +14,7 @@
> >  #include <asm/mach-imx/gpio.h>
> >  #include <asm/mach-imx/iomux-v3.h>
> >  #include <linux/delay.h>
> > -
> > +#include <linux/kernel.h>
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> >  };
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  int board_early_init_f(void)
> >  {
> >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > index 48376cb826..4d25618895 100644
> > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > @@ -6,12 +6,26 @@
> >  #include <asm/arch/imx-regs.h>
> >  #include <asm/global_data.h>
> >  #include <asm/io.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <fdt_support.h>
> >  #include <linux/errno.h>
> > +#include <linux/kernel.h>
> >  #include <net.h>
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  int board_phys_sdram_size(phys_size_t *size)
> >  {
> >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > index 3c48a9141d..a4985df4ea 100644
> > --- a/board/kontron/sl28/sl28.c
> > +++ b/board/kontron/sl28/sl28.c
> > @@ -3,11 +3,14 @@
> >  #include <common.h>
> >  #include <dm.h>
> >  #include <malloc.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <errno.h>
> >  #include <fsl_ddr.h>
> >  #include <fdt_support.h>
> >  #include <asm/global_data.h>
> >  #include <linux/libfdt.h>
> > +#include <linux/kernel.h>
> >  #include <env_internal.h>
> >  #include <asm/arch-fsl-layerscape/soc.h>
> >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > @@ -23,6 +26,17 @@
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > +               .fw_name = u"KONTRON-SL28-FIT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  int board_early_init_f(void)
> >  {
> >         fsl_lsch3_early_init_f();
> > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > index 5d9a945d64..8b0f3de1ea 100644
> > --- a/board/sandbox/sandbox.c
> > +++ b/board/sandbox/sandbox.c
> > @@ -7,6 +7,8 @@
> >  #include <cpu_func.h>
> >  #include <cros_ec.h>
> >  #include <dm.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <env_internal.h>
> >  #include <init.h>
> >  #include <led.h>
> > @@ -25,6 +27,21 @@
> >   */
> >  gd_t *gd;
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > +               .fw_name = u"SANDBOX-UBOOT",
> > +       },
> > +       {
> > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> >  /*
> >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > index 9552bfcdc3..4df26f4019 100644
> > --- a/board/socionext/developerbox/developerbox.c
> > +++ b/board/socionext/developerbox/developerbox.c
> > @@ -10,10 +10,33 @@
> >  #include <asm/global_data.h>
> >  #include <asm/io.h>
> >  #include <common.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <env_internal.h>
> >  #include <fdt_support.h>
> >  #include <log.h>
> >
> > +#include <linux/kernel.h>
> > +
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > +       },
> > +       {
> > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > +               .fw_name = u"DEVELOPERBOX-FIP",
> > +       },
> > +       {
> > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  static struct mm_region sc2a11_mem_map[] = {
> >         {
> >                 .virt = 0x0UL,
> > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > index 69e642429b..9bcac14946 100644
> > --- a/board/xilinx/common/board.h
> > +++ b/board/xilinx/common/board.h
> > @@ -7,6 +7,24 @@
> >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> >  #define _BOARD_XILINX_COMMON_BOARD_H
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define ZYNQ_BOOT_IMAGE_GUID \
> > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > +
> > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > +
> > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > +
> > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  int board_late_init_xilinx(void);
> >
> >  int xilinx_read_eeprom(void);
> > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > index 26ef048835..0aa51a3e6d 100644
> > --- a/board/xilinx/zynq/board.c
> > +++ b/board/xilinx/zynq/board.c
> > @@ -8,6 +8,8 @@
> >  #include <init.h>
> >  #include <log.h>
> >  #include <dm/uclass.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <env.h>
> >  #include <env_internal.h>
> >  #include <fdtdec.h>
> > @@ -21,10 +23,26 @@
> >  #include <asm/global_data.h>
> >  #include <asm/arch/hardware.h>
> >  #include <asm/arch/sys_proto.h>
> > +#include <linux/kernel.h>
> >  #include "../common/board.h"
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > +       },
> > +       {
> > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > +               .fw_name = u"ZYNQ-UBOOT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> >  void board_debug_uart_init(void)
> >  {
> > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > index 70b3c81f12..b232f7ac4f 100644
> > --- a/board/xilinx/zynqmp/zynqmp.c
> > +++ b/board/xilinx/zynqmp/zynqmp.c
> > @@ -9,6 +9,8 @@
> >  #include <cpu_func.h>
> >  #include <debug_uart.h>
> >  #include <dfu.h>
> > +#include <efi.h>
> > +#include <efi_loader.h>
> >  #include <env.h>
> >  #include <env_internal.h>
> >  #include <init.h>
> > @@ -40,6 +42,7 @@
> >  #include <linux/bitops.h>
> >  #include <linux/delay.h>
> >  #include <linux/sizes.h>
> > +#include <linux/kernel.h>
> >  #include "../common/board.h"
> >
> >  #include "pm_cfg_obj.h"
> > @@ -54,6 +57,21 @@
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +struct efi_fw_images fw_images[] = {
> > +       {
> > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > +       },
> > +       {
> > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > +               .fw_name = u"ZYNQMP-UBOOT",
> > +       },
> > +};
> > +
> > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> >
> > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > index 7e6be6050c..35df2e755e 100644
> > --- a/include/configs/imx8mm-cl-iot-gate.h
> > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > @@ -31,6 +31,16 @@
> >
> >  #endif
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > +
> > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  #if CONFIG_IS_ENABLED(CMD_MMC)
> >  # define BOOT_TARGET_MMC(func) \
> >         func(MMC, mmc, 2)      \
> > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > index ac4a7d0cb3..a5a845c2da 100644
> > --- a/include/configs/imx8mp_rsb3720.h
> > +++ b/include/configs/imx8mp_rsb3720.h
> > @@ -21,6 +21,16 @@
> >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > +
> > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > +
> >  #ifdef CONFIG_SPL_BUILD
> >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> >  #define CONFIG_SPL_STACK               0x960000
> > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > index 788ae77cd3..aff1b90010 100644
> > --- a/include/configs/kontron-sl-mx8mm.h
> > +++ b/include/configs/kontron-sl-mx8mm.h
> > @@ -38,6 +38,12 @@
> >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> >  #endif
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  #ifndef CONFIG_SPL_BUILD
> >  #define BOOT_TARGET_DEVICES(func) \
> >         func(MMC, mmc, 1) \
> > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > index 0f96b905ab..678364e367 100644
> > --- a/include/configs/kontron_pitx_imx8m.h
> > +++ b/include/configs/kontron_pitx_imx8m.h
> > @@ -14,6 +14,12 @@
> >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  #ifdef CONFIG_SPL_BUILD
> >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> >  #define CONFIG_SPL_STACK               0x187FF0
> > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > index 448749a7f8..97d0d365f6 100644
> > --- a/include/configs/kontron_sl28.h
> > +++ b/include/configs/kontron_sl28.h
> > @@ -57,6 +57,12 @@
> >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  /* environment */
> >  /* see include/configs/ti_armv7_common.h */
> >  #define ENV_MEM_LAYOUT_SETTINGS \
> > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > index d45f606860..2f2abc746d 100644
> > --- a/include/configs/qemu-arm.h
> > +++ b/include/configs/qemu-arm.h
> > @@ -17,6 +17,16 @@
> >
> >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > +
> > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> >
> >  /* Environment options */
> > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > index 75efbf3448..d06c3de2e0 100644
> > --- a/include/configs/sandbox.h
> > +++ b/include/configs/sandbox.h
> > @@ -14,6 +14,16 @@
> >
> >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > +
> > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  /* Size of our emulated memory */
> >  #define SB_CONCAT(x, y) x ## y
> >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > index 8dd092fc59..07e1f56e3d 100644
> > --- a/include/configs/synquacer.h
> > +++ b/include/configs/synquacer.h
> > @@ -51,6 +51,20 @@
> >                         "fip.bin raw 180000 78000;"                     \
> >                         "optee.bin raw 500000 100000\0"
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > +
> > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > +
> > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > +
> >  /* Distro boot settings */
> >  #ifndef CONFIG_SPL_BUILD
> >  #ifdef CONFIG_CMD_USB
> > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > index af36639ec6..1965b5a28f 100644
> > --- a/include/efi_loader.h
> > +++ b/include/efi_loader.h
> > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> >
> >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> >
> > +/**
> > + * struct efi_fw_images - List of firmware images updatable through capsule
> > + *                        update
> > + *
> > + * This structure gives information about the firmware images on the platform
> > + * which can be updated through the capsule update mechanism
> > + *
> > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > + * @fw_name:           Name of the firmware image
> > + */
> > +struct efi_fw_images {
> > +       efi_guid_t image_type_id;
> > +       const u16 *fw_name;
> > +};
> > +
> >  /**
> >   * Install the ESRT system table.
> >   *
> > --
> > 2.25.1
> >
>
>
> --
> Masami Hiramatsu
Sughosh Ganu March 24, 2022, 2:44 p.m. UTC | #4
On Thu, 24 Mar 2022 at 19:55, Michal Simek <michal.simek@xilinx.com> wrote:
>
>
>
> On 3/24/22 13:38, Sughosh Ganu wrote:
> > Currently, all platforms that enable capsule updates do so using
> > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > Management Protocol(FMP) instance used on the platform. However, this
> > means that all platforms that enable a particular FMP instance have
> > the same GUID value for all the updatable images, either the FIT image
> > GUID or the raw image GUID, and that an image for some platform can be
> > updated on any other platform which uses the same FMP instance. Another
> > issue with this implementation is that the ESRT table shows the same
> > GUID value for all images on the platform and also across platforms,
> > which is not in compliance with the UEFI specification.
> >
> > Fix this by defining image GUID values and firmware names for
> > individual images per platform. The GetImageInfo FMP hook would then
> > populate these values in the image descriptor array.
> >
> > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > ---
> >   .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> >   .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> >   board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> >   board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> >   board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> >   board/kontron/sl28/sl28.c                     | 14 +++++++++++
> >   board/sandbox/sandbox.c                       | 17 ++++++++++++++
> >   board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> >   board/xilinx/common/board.h                   | 18 +++++++++++++++
> >   board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> >   board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> >   include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> >   include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> >   include/configs/kontron-sl-mx8mm.h            |  6 +++++
> >   include/configs/kontron_pitx_imx8m.h          |  6 +++++
> >   include/configs/kontron_sl28.h                |  6 +++++
> >   include/configs/qemu-arm.h                    | 10 ++++++++
> >   include/configs/sandbox.h                     | 10 ++++++++
> >   include/configs/synquacer.h                   | 14 +++++++++++
> >   include/efi_loader.h                          | 15 ++++++++++++
> >   20 files changed, 280 insertions(+), 1 deletion(-)

<snip>

> > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > index 69e642429b..9bcac14946 100644
> > --- a/board/xilinx/common/board.h
> > +++ b/board/xilinx/common/board.h
> > @@ -7,6 +7,24 @@
> >   #ifndef _BOARD_XILINX_COMMON_BOARD_H
> >   #define _BOARD_XILINX_COMMON_BOARD_H
> >
> > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > +#define ZYNQ_BOOT_IMAGE_GUID \
> > +     EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > +              0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > +
> > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > +     EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > +              0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > +
> > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > +     EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > +              0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > +
> > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > +     EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > +              0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
>
> I can't see any benefit to have it defined here for all.
> Directly in board or in include/configs/* seems to be better option.

I had initially put these definitions in
include/configs/zynq-common.h, but that breaks the build for both
zynq_virt and zynqmp_virt, since this file does not get included in
the corresponding board file. Which is why I put these under
board/xilinx/common/board.h, as this gets included in both the board
files. I don't see any other zynq* file under include/configs/. Can
you suggest one for both the platforms.

-sughosh
Michal Simek March 24, 2022, 2:51 p.m. UTC | #5
On 3/24/22 15:44, Sughosh Ganu wrote:
> On Thu, 24 Mar 2022 at 19:55, Michal Simek <michal.simek@xilinx.com> wrote:
>>
>>
>>
>> On 3/24/22 13:38, Sughosh Ganu wrote:
>>> Currently, all platforms that enable capsule updates do so using
>>> either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
>>> EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
>>> Management Protocol(FMP) instance used on the platform. However, this
>>> means that all platforms that enable a particular FMP instance have
>>> the same GUID value for all the updatable images, either the FIT image
>>> GUID or the raw image GUID, and that an image for some platform can be
>>> updated on any other platform which uses the same FMP instance. Another
>>> issue with this implementation is that the ESRT table shows the same
>>> GUID value for all images on the platform and also across platforms,
>>> which is not in compliance with the UEFI specification.
>>>
>>> Fix this by defining image GUID values and firmware names for
>>> individual images per platform. The GetImageInfo FMP hook would then
>>> populate these values in the image descriptor array.
>>>
>>> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
>>> ---
>>>    .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
>>>    .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
>>>    board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
>>>    board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
>>>    board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
>>>    board/kontron/sl28/sl28.c                     | 14 +++++++++++
>>>    board/sandbox/sandbox.c                       | 17 ++++++++++++++
>>>    board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
>>>    board/xilinx/common/board.h                   | 18 +++++++++++++++
>>>    board/xilinx/zynq/board.c                     | 18 +++++++++++++++
>>>    board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
>>>    include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
>>>    include/configs/imx8mp_rsb3720.h              | 10 ++++++++
>>>    include/configs/kontron-sl-mx8mm.h            |  6 +++++
>>>    include/configs/kontron_pitx_imx8m.h          |  6 +++++
>>>    include/configs/kontron_sl28.h                |  6 +++++
>>>    include/configs/qemu-arm.h                    | 10 ++++++++
>>>    include/configs/sandbox.h                     | 10 ++++++++
>>>    include/configs/synquacer.h                   | 14 +++++++++++
>>>    include/efi_loader.h                          | 15 ++++++++++++
>>>    20 files changed, 280 insertions(+), 1 deletion(-)
> 
> <snip>
> 
>>> diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
>>> index 69e642429b..9bcac14946 100644
>>> --- a/board/xilinx/common/board.h
>>> +++ b/board/xilinx/common/board.h
>>> @@ -7,6 +7,24 @@
>>>    #ifndef _BOARD_XILINX_COMMON_BOARD_H
>>>    #define _BOARD_XILINX_COMMON_BOARD_H
>>>
>>> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
>>> +#define ZYNQ_BOOT_IMAGE_GUID \
>>> +     EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
>>> +              0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
>>> +
>>> +#define ZYNQ_UBOOT_IMAGE_GUID \
>>> +     EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
>>> +              0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
>>> +
>>> +#define ZYNQMP_BOOT_IMAGE_GUID \
>>> +     EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
>>> +              0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
>>> +
>>> +#define ZYNQMP_UBOOT_IMAGE_GUID \
>>> +     EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
>>> +              0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
>>> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
>>
>> I can't see any benefit to have it defined here for all.
>> Directly in board or in include/configs/* seems to be better option.
> 
> I had initially put these definitions in
> include/configs/zynq-common.h, but that breaks the build for both
> zynq_virt and zynqmp_virt, since this file does not get included in
> the corresponding board file. Which is why I put these under
> board/xilinx/common/board.h, as this gets included in both the board
> files. I don't see any other zynq* file under include/configs/. Can
> you suggest one for both the platforms.

This is for zynq
include/configs/zynq-common.h

This is for zynqmp
include/configs/xilinx_zynqmp.h

there is also one for versal which doesn't have capsule enabled yet
include/configs/xilinx_versal.h

but maybe make sense to add fw_images structure to
board/xilinx/common/board.c

and define that macros in headers above with generic macro name 
XILINX_BOOT_IMAGE_GUID and XILINX_UBOOT_IMAGE_GUID
and fw_name and XILINX-BOOT and XILINX-UBOOT to have it ready for versal.

Thanks,
Michal
Sughosh Ganu March 24, 2022, 2:56 p.m. UTC | #6
On Thu, 24 Mar 2022 at 20:21, Michal Simek <michal.simek@xilinx.com> wrote:
>
>
>
> On 3/24/22 15:44, Sughosh Ganu wrote:
> > On Thu, 24 Mar 2022 at 19:55, Michal Simek <michal.simek@xilinx.com> wrote:
> >>
> >>
> >>
> >> On 3/24/22 13:38, Sughosh Ganu wrote:
> >>> Currently, all platforms that enable capsule updates do so using
> >>> either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> >>> EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> >>> Management Protocol(FMP) instance used on the platform. However, this
> >>> means that all platforms that enable a particular FMP instance have
> >>> the same GUID value for all the updatable images, either the FIT image
> >>> GUID or the raw image GUID, and that an image for some platform can be
> >>> updated on any other platform which uses the same FMP instance. Another
> >>> issue with this implementation is that the ESRT table shows the same
> >>> GUID value for all images on the platform and also across platforms,
> >>> which is not in compliance with the UEFI specification.
> >>>
> >>> Fix this by defining image GUID values and firmware names for
> >>> individual images per platform. The GetImageInfo FMP hook would then
> >>> populate these values in the image descriptor array.
> >>>
> >>> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> >>> ---
> >>>    .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> >>>    .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> >>>    board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> >>>    board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> >>>    board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> >>>    board/kontron/sl28/sl28.c                     | 14 +++++++++++
> >>>    board/sandbox/sandbox.c                       | 17 ++++++++++++++
> >>>    board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> >>>    board/xilinx/common/board.h                   | 18 +++++++++++++++
> >>>    board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> >>>    board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> >>>    include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> >>>    include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> >>>    include/configs/kontron-sl-mx8mm.h            |  6 +++++
> >>>    include/configs/kontron_pitx_imx8m.h          |  6 +++++
> >>>    include/configs/kontron_sl28.h                |  6 +++++
> >>>    include/configs/qemu-arm.h                    | 10 ++++++++
> >>>    include/configs/sandbox.h                     | 10 ++++++++
> >>>    include/configs/synquacer.h                   | 14 +++++++++++
> >>>    include/efi_loader.h                          | 15 ++++++++++++
> >>>    20 files changed, 280 insertions(+), 1 deletion(-)
> >
> > <snip>
> >
> >>> diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> >>> index 69e642429b..9bcac14946 100644
> >>> --- a/board/xilinx/common/board.h
> >>> +++ b/board/xilinx/common/board.h
> >>> @@ -7,6 +7,24 @@
> >>>    #ifndef _BOARD_XILINX_COMMON_BOARD_H
> >>>    #define _BOARD_XILINX_COMMON_BOARD_H
> >>>
> >>> +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> >>> +#define ZYNQ_BOOT_IMAGE_GUID \
> >>> +     EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> >>> +              0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> >>> +
> >>> +#define ZYNQ_UBOOT_IMAGE_GUID \
> >>> +     EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> >>> +              0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> >>> +
> >>> +#define ZYNQMP_BOOT_IMAGE_GUID \
> >>> +     EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> >>> +              0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> >>> +
> >>> +#define ZYNQMP_UBOOT_IMAGE_GUID \
> >>> +     EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> >>> +              0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> >>> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> >>
> >> I can't see any benefit to have it defined here for all.
> >> Directly in board or in include/configs/* seems to be better option.
> >
> > I had initially put these definitions in
> > include/configs/zynq-common.h, but that breaks the build for both
> > zynq_virt and zynqmp_virt, since this file does not get included in
> > the corresponding board file. Which is why I put these under
> > board/xilinx/common/board.h, as this gets included in both the board
> > files. I don't see any other zynq* file under include/configs/. Can
> > you suggest one for both the platforms.
>
> This is for zynq
> include/configs/zynq-common.h
>
> This is for zynqmp
> include/configs/xilinx_zynqmp.h
>
> there is also one for versal which doesn't have capsule enabled yet
> include/configs/xilinx_versal.h
>
> but maybe make sense to add fw_images structure to
> board/xilinx/common/board.c

Okay, I will move the array definition to the suggested file in the
next version.

>
> and define that macros in headers above with generic macro name
> XILINX_BOOT_IMAGE_GUID and XILINX_UBOOT_IMAGE_GUID
> and fw_name and XILINX-BOOT and XILINX-UBOOT to have it ready for versal.

Okay, will do as you suggest.

-sughosh
Masami Hiramatsu March 25, 2022, 1:09 a.m. UTC | #7
Hi Sughosh,

2022年3月24日(木) 23:40 Sughosh Ganu <sughosh.ganu@linaro.org>:
>
> hi Masami,
>
> On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
> <masami.hiramatsu@linaro.org> wrote:
> >
> > Hi Sughosh,
> >
> > 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > >
> > > Currently, all platforms that enable capsule updates do so using
> > > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > > Management Protocol(FMP) instance used on the platform. However, this
> > > means that all platforms that enable a particular FMP instance have
> > > the same GUID value for all the updatable images, either the FIT image
> > > GUID or the raw image GUID, and that an image for some platform can be
> > > updated on any other platform which uses the same FMP instance. Another
> > > issue with this implementation is that the ESRT table shows the same
> > > GUID value for all images on the platform and also across platforms,
> > > which is not in compliance with the UEFI specification.
> > >
> > > Fix this by defining image GUID values and firmware names for
> > > individual images per platform. The GetImageInfo FMP hook would then
> > > populate these values in the image descriptor array.
> >
> > OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> > platforms, correct?
>
> No, I have generated the fw_images array based on the information that
> I found in the dfu_alt_info variable for the platform. But this is not
> correlated to the dfu_alt_info variable. If you think that the array
> should have more/different entries for your platform, please let me
> know, and I will change it.

At least for the DeveloperBox, it looks good to me.
(Hopefully, if you comment the string formatted GUID in the code for
mkeficapsule, that is perfect. :) )

> > I think you should explain that those GUIDs (fw_images[] entries) must
> > be corresponding to the dfu_alt_info entries, in the same order.
>
> The dfu_alt_info can have more entries than the firmware images that
> are updatable through capsule update. One example is the ST platforms
> which have additional entries in the dfu_alt_info. The image
> descriptor array should only contain entries of images which are
> updatable through capsule update, since the same information is also
> used for generating the ESRT. Which is why I have changed the logic to
> populate the image descriptors through the fw_images array rather than
> the dfu_alt_info.

I meant, the order of the fw_images array needs to be same as
dfu_alt_info entries and the firmware entries for dfu_alt_info must be
the first, because finally we will use the index of the fw_images
array, which matched to given image type GUID, for specifying
dfu_alt_info entry.
Or, without dfu_alt_info, your new fw_images can update the firmware?
I would like to see such *relationship* at least in the patch
description and the documentation.

Thank you,


>
> -sughosh
>
> > Without that, it is hard to understand why the next patch ([2/6]) works :-)
> >
> > Thank you,
> >
> > >
> > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > ---
> > >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> > >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> > >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> > >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> > >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> > >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> > >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> > >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> > >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> > >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> > >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> > >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> > >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> > >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> > >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> > >  include/configs/kontron_sl28.h                |  6 +++++
> > >  include/configs/qemu-arm.h                    | 10 ++++++++
> > >  include/configs/sandbox.h                     | 10 ++++++++
> > >  include/configs/synquacer.h                   | 14 +++++++++++
> > >  include/efi_loader.h                          | 15 ++++++++++++
> > >  20 files changed, 280 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > index 16566092bd..6b534660fe 100644
> > > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > @@ -6,6 +6,8 @@
> > >
> > >  #include <common.h>
> > >  #include <dwc3-uboot.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <errno.h>
> > >  #include <miiphy.h>
> > >  #include <netdev.h>
> > > @@ -21,6 +23,7 @@
> > >  #include <asm/arch/clock.h>
> > >  #include <asm/mach-imx/dma.h>
> > >  #include <linux/delay.h>
> > > +#include <linux/kernel.h>
> > >  #include <power/pmic.h>
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> > >  }
> > >  #endif
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > > +#endif
> > > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > > +
> > >  int board_early_init_f(void)
> > >  {
> > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > index 7e2d88f449..ec73d75db3 100644
> > > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > @@ -5,6 +5,8 @@
> > >   */
> > >
> > >  #include <common.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <env.h>
> > >  #include <extension_board.h>
> > >  #include <hang.h>
> > > @@ -21,11 +23,27 @@
> > >  #include <asm/mach-imx/gpio.h>
> > >  #include <asm/mach-imx/mxc_i2c.h>
> > >  #include <asm/sections.h>
> > > +#include <linux/kernel.h>
> > >
> > >  #include "ddr/ddr.h"
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > > +#endif
> > > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  int board_phys_sdram_size(phys_size_t *size)
> > >  {
> > >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > > index 16d5a97167..99872ce0b8 100644
> > > --- a/board/emulation/qemu-arm/qemu-arm.c
> > > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > > @@ -6,15 +6,35 @@
> > >  #include <common.h>
> > >  #include <cpu_func.h>
> > >  #include <dm.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > > +#include <efi_loader.h>
> > >  #include <fdtdec.h>
> > >  #include <init.h>
> > >  #include <log.h>
> > >  #include <virtio_types.h>
> > >  #include <virtio.h>
> > >
> > > +#include <linux/kernel.h>
> > > +
> > >  #ifdef CONFIG_ARM64
> > >  #include <asm/armv8/mmu.h>
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > > +#endif
> > > +               .fw_name = u"Qemu-Arm-UBOOT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  static struct mm_region qemu_arm64_mem_map[] = {
> > >         {
> > >                 /* Flash */
> > > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > index d655fe099b..c3af951b14 100644
> > > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > @@ -2,6 +2,8 @@
> > >
> > >  #include "pitx_misc.h"
> > >  #include <common.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <init.h>
> > >  #include <mmc.h>
> > >  #include <miiphy.h>
> > > @@ -12,7 +14,7 @@
> > >  #include <asm/mach-imx/gpio.h>
> > >  #include <asm/mach-imx/iomux-v3.h>
> > >  #include <linux/delay.h>
> > > -
> > > +#include <linux/kernel.h>
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > >
> > > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> > >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> > >  };
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  int board_early_init_f(void)
> > >  {
> > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > index 48376cb826..4d25618895 100644
> > > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > @@ -6,12 +6,26 @@
> > >  #include <asm/arch/imx-regs.h>
> > >  #include <asm/global_data.h>
> > >  #include <asm/io.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <fdt_support.h>
> > >  #include <linux/errno.h>
> > > +#include <linux/kernel.h>
> > >  #include <net.h>
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  int board_phys_sdram_size(phys_size_t *size)
> > >  {
> > >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > > index 3c48a9141d..a4985df4ea 100644
> > > --- a/board/kontron/sl28/sl28.c
> > > +++ b/board/kontron/sl28/sl28.c
> > > @@ -3,11 +3,14 @@
> > >  #include <common.h>
> > >  #include <dm.h>
> > >  #include <malloc.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <errno.h>
> > >  #include <fsl_ddr.h>
> > >  #include <fdt_support.h>
> > >  #include <asm/global_data.h>
> > >  #include <linux/libfdt.h>
> > > +#include <linux/kernel.h>
> > >  #include <env_internal.h>
> > >  #include <asm/arch-fsl-layerscape/soc.h>
> > >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > > @@ -23,6 +26,17 @@
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > > +               .fw_name = u"KONTRON-SL28-FIT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  int board_early_init_f(void)
> > >  {
> > >         fsl_lsch3_early_init_f();
> > > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > > index 5d9a945d64..8b0f3de1ea 100644
> > > --- a/board/sandbox/sandbox.c
> > > +++ b/board/sandbox/sandbox.c
> > > @@ -7,6 +7,8 @@
> > >  #include <cpu_func.h>
> > >  #include <cros_ec.h>
> > >  #include <dm.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <env_internal.h>
> > >  #include <init.h>
> > >  #include <led.h>
> > > @@ -25,6 +27,21 @@
> > >   */
> > >  gd_t *gd;
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > > +               .fw_name = u"SANDBOX-UBOOT",
> > > +       },
> > > +       {
> > > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > >  /*
> > >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > > index 9552bfcdc3..4df26f4019 100644
> > > --- a/board/socionext/developerbox/developerbox.c
> > > +++ b/board/socionext/developerbox/developerbox.c
> > > @@ -10,10 +10,33 @@
> > >  #include <asm/global_data.h>
> > >  #include <asm/io.h>
> > >  #include <common.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <env_internal.h>
> > >  #include <fdt_support.h>
> > >  #include <log.h>
> > >
> > > +#include <linux/kernel.h>
> > > +
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > > +       },
> > > +       {
> > > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > > +               .fw_name = u"DEVELOPERBOX-FIP",
> > > +       },
> > > +       {
> > > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  static struct mm_region sc2a11_mem_map[] = {
> > >         {
> > >                 .virt = 0x0UL,
> > > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > > index 69e642429b..9bcac14946 100644
> > > --- a/board/xilinx/common/board.h
> > > +++ b/board/xilinx/common/board.h
> > > @@ -7,6 +7,24 @@
> > >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> > >  #define _BOARD_XILINX_COMMON_BOARD_H
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define ZYNQ_BOOT_IMAGE_GUID \
> > > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > > +
> > > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > > +
> > > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > > +
> > > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  int board_late_init_xilinx(void);
> > >
> > >  int xilinx_read_eeprom(void);
> > > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > > index 26ef048835..0aa51a3e6d 100644
> > > --- a/board/xilinx/zynq/board.c
> > > +++ b/board/xilinx/zynq/board.c
> > > @@ -8,6 +8,8 @@
> > >  #include <init.h>
> > >  #include <log.h>
> > >  #include <dm/uclass.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <env.h>
> > >  #include <env_internal.h>
> > >  #include <fdtdec.h>
> > > @@ -21,10 +23,26 @@
> > >  #include <asm/global_data.h>
> > >  #include <asm/arch/hardware.h>
> > >  #include <asm/arch/sys_proto.h>
> > > +#include <linux/kernel.h>
> > >  #include "../common/board.h"
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > > +       },
> > > +       {
> > > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > > +               .fw_name = u"ZYNQ-UBOOT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> > >  void board_debug_uart_init(void)
> > >  {
> > > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > > index 70b3c81f12..b232f7ac4f 100644
> > > --- a/board/xilinx/zynqmp/zynqmp.c
> > > +++ b/board/xilinx/zynqmp/zynqmp.c
> > > @@ -9,6 +9,8 @@
> > >  #include <cpu_func.h>
> > >  #include <debug_uart.h>
> > >  #include <dfu.h>
> > > +#include <efi.h>
> > > +#include <efi_loader.h>
> > >  #include <env.h>
> > >  #include <env_internal.h>
> > >  #include <init.h>
> > > @@ -40,6 +42,7 @@
> > >  #include <linux/bitops.h>
> > >  #include <linux/delay.h>
> > >  #include <linux/sizes.h>
> > > +#include <linux/kernel.h>
> > >  #include "../common/board.h"
> > >
> > >  #include "pm_cfg_obj.h"
> > > @@ -54,6 +57,21 @@
> > >
> > >  DECLARE_GLOBAL_DATA_PTR;
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +struct efi_fw_images fw_images[] = {
> > > +       {
> > > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > > +       },
> > > +       {
> > > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > > +               .fw_name = u"ZYNQMP-UBOOT",
> > > +       },
> > > +};
> > > +
> > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> > >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> > >
> > > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > > index 7e6be6050c..35df2e755e 100644
> > > --- a/include/configs/imx8mm-cl-iot-gate.h
> > > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > > @@ -31,6 +31,16 @@
> > >
> > >  #endif
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > > +
> > > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  #if CONFIG_IS_ENABLED(CMD_MMC)
> > >  # define BOOT_TARGET_MMC(func) \
> > >         func(MMC, mmc, 2)      \
> > > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > > index ac4a7d0cb3..a5a845c2da 100644
> > > --- a/include/configs/imx8mp_rsb3720.h
> > > +++ b/include/configs/imx8mp_rsb3720.h
> > > @@ -21,6 +21,16 @@
> > >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> > >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > > +
> > > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > > +
> > >  #ifdef CONFIG_SPL_BUILD
> > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > >  #define CONFIG_SPL_STACK               0x960000
> > > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > > index 788ae77cd3..aff1b90010 100644
> > > --- a/include/configs/kontron-sl-mx8mm.h
> > > +++ b/include/configs/kontron-sl-mx8mm.h
> > > @@ -38,6 +38,12 @@
> > >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> > >  #endif
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  #ifndef CONFIG_SPL_BUILD
> > >  #define BOOT_TARGET_DEVICES(func) \
> > >         func(MMC, mmc, 1) \
> > > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > > index 0f96b905ab..678364e367 100644
> > > --- a/include/configs/kontron_pitx_imx8m.h
> > > +++ b/include/configs/kontron_pitx_imx8m.h
> > > @@ -14,6 +14,12 @@
> > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  #ifdef CONFIG_SPL_BUILD
> > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > >  #define CONFIG_SPL_STACK               0x187FF0
> > > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > > index 448749a7f8..97d0d365f6 100644
> > > --- a/include/configs/kontron_sl28.h
> > > +++ b/include/configs/kontron_sl28.h
> > > @@ -57,6 +57,12 @@
> > >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> > >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  /* environment */
> > >  /* see include/configs/ti_armv7_common.h */
> > >  #define ENV_MEM_LAYOUT_SETTINGS \
> > > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > > index d45f606860..2f2abc746d 100644
> > > --- a/include/configs/qemu-arm.h
> > > +++ b/include/configs/qemu-arm.h
> > > @@ -17,6 +17,16 @@
> > >
> > >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > > +
> > > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> > >
> > >  /* Environment options */
> > > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > > index 75efbf3448..d06c3de2e0 100644
> > > --- a/include/configs/sandbox.h
> > > +++ b/include/configs/sandbox.h
> > > @@ -14,6 +14,16 @@
> > >
> > >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > > +
> > > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  /* Size of our emulated memory */
> > >  #define SB_CONCAT(x, y) x ## y
> > >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > > index 8dd092fc59..07e1f56e3d 100644
> > > --- a/include/configs/synquacer.h
> > > +++ b/include/configs/synquacer.h
> > > @@ -51,6 +51,20 @@
> > >                         "fip.bin raw 180000 78000;"                     \
> > >                         "optee.bin raw 500000 100000\0"
> > >
> > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > > +
> > > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > > +
> > > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > +
> > >  /* Distro boot settings */
> > >  #ifndef CONFIG_SPL_BUILD
> > >  #ifdef CONFIG_CMD_USB
> > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > index af36639ec6..1965b5a28f 100644
> > > --- a/include/efi_loader.h
> > > +++ b/include/efi_loader.h
> > > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> > >
> > >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> > >
> > > +/**
> > > + * struct efi_fw_images - List of firmware images updatable through capsule
> > > + *                        update
> > > + *
> > > + * This structure gives information about the firmware images on the platform
> > > + * which can be updated through the capsule update mechanism
> > > + *
> > > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > > + * @fw_name:           Name of the firmware image
> > > + */
> > > +struct efi_fw_images {
> > > +       efi_guid_t image_type_id;
> > > +       const u16 *fw_name;
> > > +};
> > > +
> > >  /**
> > >   * Install the ESRT system table.
> > >   *
> > > --
> > > 2.25.1
> > >
> >
> >
> > --
> > Masami Hiramatsu



--
Masami Hiramatsu
Masami Hiramatsu March 25, 2022, 5:28 a.m. UTC | #8
Hi Sughosh,

OK I understand that if the platform uses the FIT capsule, the
fw_images[] must have 1 entry and it is completely non relationship
with dfu_alt_info... We may need a document for this case too.

Thanks,

2022年3月25日(金) 10:09 Masami Hiramatsu <masami.hiramatsu@linaro.org>:
>
> Hi Sughosh,
>
> 2022年3月24日(木) 23:40 Sughosh Ganu <sughosh.ganu@linaro.org>:
> >
> > hi Masami,
> >
> > On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
> > <masami.hiramatsu@linaro.org> wrote:
> > >
> > > Hi Sughosh,
> > >
> > > 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > >
> > > > Currently, all platforms that enable capsule updates do so using
> > > > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > > > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > > > Management Protocol(FMP) instance used on the platform. However, this
> > > > means that all platforms that enable a particular FMP instance have
> > > > the same GUID value for all the updatable images, either the FIT image
> > > > GUID or the raw image GUID, and that an image for some platform can be
> > > > updated on any other platform which uses the same FMP instance. Another
> > > > issue with this implementation is that the ESRT table shows the same
> > > > GUID value for all images on the platform and also across platforms,
> > > > which is not in compliance with the UEFI specification.
> > > >
> > > > Fix this by defining image GUID values and firmware names for
> > > > individual images per platform. The GetImageInfo FMP hook would then
> > > > populate these values in the image descriptor array.
> > >
> > > OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> > > platforms, correct?
> >
> > No, I have generated the fw_images array based on the information that
> > I found in the dfu_alt_info variable for the platform. But this is not
> > correlated to the dfu_alt_info variable. If you think that the array
> > should have more/different entries for your platform, please let me
> > know, and I will change it.
>
> At least for the DeveloperBox, it looks good to me.
> (Hopefully, if you comment the string formatted GUID in the code for
> mkeficapsule, that is perfect. :) )
>
> > > I think you should explain that those GUIDs (fw_images[] entries) must
> > > be corresponding to the dfu_alt_info entries, in the same order.
> >
> > The dfu_alt_info can have more entries than the firmware images that
> > are updatable through capsule update. One example is the ST platforms
> > which have additional entries in the dfu_alt_info. The image
> > descriptor array should only contain entries of images which are
> > updatable through capsule update, since the same information is also
> > used for generating the ESRT. Which is why I have changed the logic to
> > populate the image descriptors through the fw_images array rather than
> > the dfu_alt_info.
>
> I meant, the order of the fw_images array needs to be same as
> dfu_alt_info entries and the firmware entries for dfu_alt_info must be
> the first, because finally we will use the index of the fw_images
> array, which matched to given image type GUID, for specifying
> dfu_alt_info entry.
> Or, without dfu_alt_info, your new fw_images can update the firmware?
> I would like to see such *relationship* at least in the patch
> description and the documentation.
>
> Thank you,
>
>
> >
> > -sughosh
> >
> > > Without that, it is hard to understand why the next patch ([2/6]) works :-)
> > >
> > > Thank you,
> > >
> > > >
> > > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > > ---
> > > >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> > > >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> > > >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> > > >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> > > >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> > > >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> > > >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> > > >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> > > >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> > > >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> > > >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> > > >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> > > >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> > > >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> > > >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> > > >  include/configs/kontron_sl28.h                |  6 +++++
> > > >  include/configs/qemu-arm.h                    | 10 ++++++++
> > > >  include/configs/sandbox.h                     | 10 ++++++++
> > > >  include/configs/synquacer.h                   | 14 +++++++++++
> > > >  include/efi_loader.h                          | 15 ++++++++++++
> > > >  20 files changed, 280 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > index 16566092bd..6b534660fe 100644
> > > > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > @@ -6,6 +6,8 @@
> > > >
> > > >  #include <common.h>
> > > >  #include <dwc3-uboot.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <errno.h>
> > > >  #include <miiphy.h>
> > > >  #include <netdev.h>
> > > > @@ -21,6 +23,7 @@
> > > >  #include <asm/arch/clock.h>
> > > >  #include <asm/mach-imx/dma.h>
> > > >  #include <linux/delay.h>
> > > > +#include <linux/kernel.h>
> > > >  #include <power/pmic.h>
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> > > >  }
> > > >  #endif
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > > > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > > > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > > > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > > > +#endif
> > > > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > > +
> > > >  int board_early_init_f(void)
> > > >  {
> > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > index 7e2d88f449..ec73d75db3 100644
> > > > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > @@ -5,6 +5,8 @@
> > > >   */
> > > >
> > > >  #include <common.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <env.h>
> > > >  #include <extension_board.h>
> > > >  #include <hang.h>
> > > > @@ -21,11 +23,27 @@
> > > >  #include <asm/mach-imx/gpio.h>
> > > >  #include <asm/mach-imx/mxc_i2c.h>
> > > >  #include <asm/sections.h>
> > > > +#include <linux/kernel.h>
> > > >
> > > >  #include "ddr/ddr.h"
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > > > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > > > +#endif
> > > > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  int board_phys_sdram_size(phys_size_t *size)
> > > >  {
> > > >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > > > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > > > index 16d5a97167..99872ce0b8 100644
> > > > --- a/board/emulation/qemu-arm/qemu-arm.c
> > > > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > > > @@ -6,15 +6,35 @@
> > > >  #include <common.h>
> > > >  #include <cpu_func.h>
> > > >  #include <dm.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > > +#include <efi_loader.h>
> > > >  #include <fdtdec.h>
> > > >  #include <init.h>
> > > >  #include <log.h>
> > > >  #include <virtio_types.h>
> > > >  #include <virtio.h>
> > > >
> > > > +#include <linux/kernel.h>
> > > > +
> > > >  #ifdef CONFIG_ARM64
> > > >  #include <asm/armv8/mmu.h>
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > > > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > > > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > > > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > > > +#endif
> > > > +               .fw_name = u"Qemu-Arm-UBOOT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  static struct mm_region qemu_arm64_mem_map[] = {
> > > >         {
> > > >                 /* Flash */
> > > > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > index d655fe099b..c3af951b14 100644
> > > > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > @@ -2,6 +2,8 @@
> > > >
> > > >  #include "pitx_misc.h"
> > > >  #include <common.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <init.h>
> > > >  #include <mmc.h>
> > > >  #include <miiphy.h>
> > > > @@ -12,7 +14,7 @@
> > > >  #include <asm/mach-imx/gpio.h>
> > > >  #include <asm/mach-imx/iomux-v3.h>
> > > >  #include <linux/delay.h>
> > > > -
> > > > +#include <linux/kernel.h>
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > >
> > > > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> > > >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> > > >  };
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > > > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  int board_early_init_f(void)
> > > >  {
> > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > index 48376cb826..4d25618895 100644
> > > > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > @@ -6,12 +6,26 @@
> > > >  #include <asm/arch/imx-regs.h>
> > > >  #include <asm/global_data.h>
> > > >  #include <asm/io.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <fdt_support.h>
> > > >  #include <linux/errno.h>
> > > > +#include <linux/kernel.h>
> > > >  #include <net.h>
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > > > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  int board_phys_sdram_size(phys_size_t *size)
> > > >  {
> > > >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > > > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > > > index 3c48a9141d..a4985df4ea 100644
> > > > --- a/board/kontron/sl28/sl28.c
> > > > +++ b/board/kontron/sl28/sl28.c
> > > > @@ -3,11 +3,14 @@
> > > >  #include <common.h>
> > > >  #include <dm.h>
> > > >  #include <malloc.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <errno.h>
> > > >  #include <fsl_ddr.h>
> > > >  #include <fdt_support.h>
> > > >  #include <asm/global_data.h>
> > > >  #include <linux/libfdt.h>
> > > > +#include <linux/kernel.h>
> > > >  #include <env_internal.h>
> > > >  #include <asm/arch-fsl-layerscape/soc.h>
> > > >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > > > @@ -23,6 +26,17 @@
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > > > +               .fw_name = u"KONTRON-SL28-FIT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  int board_early_init_f(void)
> > > >  {
> > > >         fsl_lsch3_early_init_f();
> > > > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > > > index 5d9a945d64..8b0f3de1ea 100644
> > > > --- a/board/sandbox/sandbox.c
> > > > +++ b/board/sandbox/sandbox.c
> > > > @@ -7,6 +7,8 @@
> > > >  #include <cpu_func.h>
> > > >  #include <cros_ec.h>
> > > >  #include <dm.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <env_internal.h>
> > > >  #include <init.h>
> > > >  #include <led.h>
> > > > @@ -25,6 +27,21 @@
> > > >   */
> > > >  gd_t *gd;
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > > > +               .fw_name = u"SANDBOX-UBOOT",
> > > > +       },
> > > > +       {
> > > > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > > > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > > >  /*
> > > >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > > > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > > > index 9552bfcdc3..4df26f4019 100644
> > > > --- a/board/socionext/developerbox/developerbox.c
> > > > +++ b/board/socionext/developerbox/developerbox.c
> > > > @@ -10,10 +10,33 @@
> > > >  #include <asm/global_data.h>
> > > >  #include <asm/io.h>
> > > >  #include <common.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <env_internal.h>
> > > >  #include <fdt_support.h>
> > > >  #include <log.h>
> > > >
> > > > +#include <linux/kernel.h>
> > > > +
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > > > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > > > +       },
> > > > +       {
> > > > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > > > +               .fw_name = u"DEVELOPERBOX-FIP",
> > > > +       },
> > > > +       {
> > > > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > > > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  static struct mm_region sc2a11_mem_map[] = {
> > > >         {
> > > >                 .virt = 0x0UL,
> > > > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > > > index 69e642429b..9bcac14946 100644
> > > > --- a/board/xilinx/common/board.h
> > > > +++ b/board/xilinx/common/board.h
> > > > @@ -7,6 +7,24 @@
> > > >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> > > >  #define _BOARD_XILINX_COMMON_BOARD_H
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define ZYNQ_BOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > > > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > > > +
> > > > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > > > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > > > +
> > > > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > > > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > > > +
> > > > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > > > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  int board_late_init_xilinx(void);
> > > >
> > > >  int xilinx_read_eeprom(void);
> > > > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > > > index 26ef048835..0aa51a3e6d 100644
> > > > --- a/board/xilinx/zynq/board.c
> > > > +++ b/board/xilinx/zynq/board.c
> > > > @@ -8,6 +8,8 @@
> > > >  #include <init.h>
> > > >  #include <log.h>
> > > >  #include <dm/uclass.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <env.h>
> > > >  #include <env_internal.h>
> > > >  #include <fdtdec.h>
> > > > @@ -21,10 +23,26 @@
> > > >  #include <asm/global_data.h>
> > > >  #include <asm/arch/hardware.h>
> > > >  #include <asm/arch/sys_proto.h>
> > > > +#include <linux/kernel.h>
> > > >  #include "../common/board.h"
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > > > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > > > +       },
> > > > +       {
> > > > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > > > +               .fw_name = u"ZYNQ-UBOOT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> > > >  void board_debug_uart_init(void)
> > > >  {
> > > > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > > > index 70b3c81f12..b232f7ac4f 100644
> > > > --- a/board/xilinx/zynqmp/zynqmp.c
> > > > +++ b/board/xilinx/zynqmp/zynqmp.c
> > > > @@ -9,6 +9,8 @@
> > > >  #include <cpu_func.h>
> > > >  #include <debug_uart.h>
> > > >  #include <dfu.h>
> > > > +#include <efi.h>
> > > > +#include <efi_loader.h>
> > > >  #include <env.h>
> > > >  #include <env_internal.h>
> > > >  #include <init.h>
> > > > @@ -40,6 +42,7 @@
> > > >  #include <linux/bitops.h>
> > > >  #include <linux/delay.h>
> > > >  #include <linux/sizes.h>
> > > > +#include <linux/kernel.h>
> > > >  #include "../common/board.h"
> > > >
> > > >  #include "pm_cfg_obj.h"
> > > > @@ -54,6 +57,21 @@
> > > >
> > > >  DECLARE_GLOBAL_DATA_PTR;
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +struct efi_fw_images fw_images[] = {
> > > > +       {
> > > > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > > > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > > > +       },
> > > > +       {
> > > > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > > > +               .fw_name = u"ZYNQMP-UBOOT",
> > > > +       },
> > > > +};
> > > > +
> > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> > > >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> > > >
> > > > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > > > index 7e6be6050c..35df2e755e 100644
> > > > --- a/include/configs/imx8mm-cl-iot-gate.h
> > > > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > > > @@ -31,6 +31,16 @@
> > > >
> > > >  #endif
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > > > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > > > +
> > > > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > > > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  #if CONFIG_IS_ENABLED(CMD_MMC)
> > > >  # define BOOT_TARGET_MMC(func) \
> > > >         func(MMC, mmc, 2)      \
> > > > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > > > index ac4a7d0cb3..a5a845c2da 100644
> > > > --- a/include/configs/imx8mp_rsb3720.h
> > > > +++ b/include/configs/imx8mp_rsb3720.h
> > > > @@ -21,6 +21,16 @@
> > > >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> > > >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > > > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > > > +
> > > > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > > > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > > > +
> > > >  #ifdef CONFIG_SPL_BUILD
> > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > >  #define CONFIG_SPL_STACK               0x960000
> > > > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > > > index 788ae77cd3..aff1b90010 100644
> > > > --- a/include/configs/kontron-sl-mx8mm.h
> > > > +++ b/include/configs/kontron-sl-mx8mm.h
> > > > @@ -38,6 +38,12 @@
> > > >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> > > >  #endif
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > > > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  #ifndef CONFIG_SPL_BUILD
> > > >  #define BOOT_TARGET_DEVICES(func) \
> > > >         func(MMC, mmc, 1) \
> > > > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > > > index 0f96b905ab..678364e367 100644
> > > > --- a/include/configs/kontron_pitx_imx8m.h
> > > > +++ b/include/configs/kontron_pitx_imx8m.h
> > > > @@ -14,6 +14,12 @@
> > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > > > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  #ifdef CONFIG_SPL_BUILD
> > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > >  #define CONFIG_SPL_STACK               0x187FF0
> > > > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > > > index 448749a7f8..97d0d365f6 100644
> > > > --- a/include/configs/kontron_sl28.h
> > > > +++ b/include/configs/kontron_sl28.h
> > > > @@ -57,6 +57,12 @@
> > > >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> > > >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > > > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > > > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  /* environment */
> > > >  /* see include/configs/ti_armv7_common.h */
> > > >  #define ENV_MEM_LAYOUT_SETTINGS \
> > > > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > > > index d45f606860..2f2abc746d 100644
> > > > --- a/include/configs/qemu-arm.h
> > > > +++ b/include/configs/qemu-arm.h
> > > > @@ -17,6 +17,16 @@
> > > >
> > > >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > > > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > > > +
> > > > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > > > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> > > >
> > > >  /* Environment options */
> > > > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > > > index 75efbf3448..d06c3de2e0 100644
> > > > --- a/include/configs/sandbox.h
> > > > +++ b/include/configs/sandbox.h
> > > > @@ -14,6 +14,16 @@
> > > >
> > > >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > > > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > > > +
> > > > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > > > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > > > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  /* Size of our emulated memory */
> > > >  #define SB_CONCAT(x, y) x ## y
> > > >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > > > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > > > index 8dd092fc59..07e1f56e3d 100644
> > > > --- a/include/configs/synquacer.h
> > > > +++ b/include/configs/synquacer.h
> > > > @@ -51,6 +51,20 @@
> > > >                         "fip.bin raw 180000 78000;"                     \
> > > >                         "optee.bin raw 500000 100000\0"
> > > >
> > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > > > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > > > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > > > +
> > > > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > > > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > > > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > > > +
> > > > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > > > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > > > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > +
> > > >  /* Distro boot settings */
> > > >  #ifndef CONFIG_SPL_BUILD
> > > >  #ifdef CONFIG_CMD_USB
> > > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > > index af36639ec6..1965b5a28f 100644
> > > > --- a/include/efi_loader.h
> > > > +++ b/include/efi_loader.h
> > > > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> > > >
> > > >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> > > >
> > > > +/**
> > > > + * struct efi_fw_images - List of firmware images updatable through capsule
> > > > + *                        update
> > > > + *
> > > > + * This structure gives information about the firmware images on the platform
> > > > + * which can be updated through the capsule update mechanism
> > > > + *
> > > > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > > > + * @fw_name:           Name of the firmware image
> > > > + */
> > > > +struct efi_fw_images {
> > > > +       efi_guid_t image_type_id;
> > > > +       const u16 *fw_name;
> > > > +};
> > > > +
> > > >  /**
> > > >   * Install the ESRT system table.
> > > >   *
> > > > --
> > > > 2.25.1
> > > >
> > >
> > >
> > > --
> > > Masami Hiramatsu
>
>
>
> --
> Masami Hiramatsu
Sughosh Ganu March 25, 2022, 9:59 a.m. UTC | #9
hi Masami,

On Fri, 25 Mar 2022 at 10:58, Masami Hiramatsu
<masami.hiramatsu@linaro.org> wrote:
>
> Hi Sughosh,
>
> OK I understand that if the platform uses the FIT capsule, the
> fw_images[] must have 1 entry and it is completely non relationship
> with dfu_alt_info... We may need a document for this case too.

Actually, what you are stating above applies to both raw images as
well as FIT images. I have added a paragraph in the capsule update
related section in the uefi.rst. Can you check my patch 4 of this
series. Thanks.

-sughosh

>
> Thanks,
>
> 2022年3月25日(金) 10:09 Masami Hiramatsu <masami.hiramatsu@linaro.org>:
> >
> > Hi Sughosh,
> >
> > 2022年3月24日(木) 23:40 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > >
> > > hi Masami,
> > >
> > > On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
> > > <masami.hiramatsu@linaro.org> wrote:
> > > >
> > > > Hi Sughosh,
> > > >
> > > > 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > > >
> > > > > Currently, all platforms that enable capsule updates do so using
> > > > > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > > > > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > > > > Management Protocol(FMP) instance used on the platform. However, this
> > > > > means that all platforms that enable a particular FMP instance have
> > > > > the same GUID value for all the updatable images, either the FIT image
> > > > > GUID or the raw image GUID, and that an image for some platform can be
> > > > > updated on any other platform which uses the same FMP instance. Another
> > > > > issue with this implementation is that the ESRT table shows the same
> > > > > GUID value for all images on the platform and also across platforms,
> > > > > which is not in compliance with the UEFI specification.
> > > > >
> > > > > Fix this by defining image GUID values and firmware names for
> > > > > individual images per platform. The GetImageInfo FMP hook would then
> > > > > populate these values in the image descriptor array.
> > > >
> > > > OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> > > > platforms, correct?
> > >
> > > No, I have generated the fw_images array based on the information that
> > > I found in the dfu_alt_info variable for the platform. But this is not
> > > correlated to the dfu_alt_info variable. If you think that the array
> > > should have more/different entries for your platform, please let me
> > > know, and I will change it.
> >
> > At least for the DeveloperBox, it looks good to me.
> > (Hopefully, if you comment the string formatted GUID in the code for
> > mkeficapsule, that is perfect. :) )
> >
> > > > I think you should explain that those GUIDs (fw_images[] entries) must
> > > > be corresponding to the dfu_alt_info entries, in the same order.
> > >
> > > The dfu_alt_info can have more entries than the firmware images that
> > > are updatable through capsule update. One example is the ST platforms
> > > which have additional entries in the dfu_alt_info. The image
> > > descriptor array should only contain entries of images which are
> > > updatable through capsule update, since the same information is also
> > > used for generating the ESRT. Which is why I have changed the logic to
> > > populate the image descriptors through the fw_images array rather than
> > > the dfu_alt_info.
> >
> > I meant, the order of the fw_images array needs to be same as
> > dfu_alt_info entries and the firmware entries for dfu_alt_info must be
> > the first, because finally we will use the index of the fw_images
> > array, which matched to given image type GUID, for specifying
> > dfu_alt_info entry.
> > Or, without dfu_alt_info, your new fw_images can update the firmware?
> > I would like to see such *relationship* at least in the patch
> > description and the documentation.
> >
> > Thank you,
> >
> >
> > >
> > > -sughosh
> > >
> > > > Without that, it is hard to understand why the next patch ([2/6]) works :-)
> > > >
> > > > Thank you,
> > > >
> > > > >
> > > > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > > > ---
> > > > >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> > > > >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> > > > >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> > > > >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> > > > >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> > > > >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> > > > >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> > > > >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> > > > >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> > > > >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> > > > >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> > > > >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> > > > >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> > > > >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> > > > >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> > > > >  include/configs/kontron_sl28.h                |  6 +++++
> > > > >  include/configs/qemu-arm.h                    | 10 ++++++++
> > > > >  include/configs/sandbox.h                     | 10 ++++++++
> > > > >  include/configs/synquacer.h                   | 14 +++++++++++
> > > > >  include/efi_loader.h                          | 15 ++++++++++++
> > > > >  20 files changed, 280 insertions(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > index 16566092bd..6b534660fe 100644
> > > > > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > @@ -6,6 +6,8 @@
> > > > >
> > > > >  #include <common.h>
> > > > >  #include <dwc3-uboot.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <errno.h>
> > > > >  #include <miiphy.h>
> > > > >  #include <netdev.h>
> > > > > @@ -21,6 +23,7 @@
> > > > >  #include <asm/arch/clock.h>
> > > > >  #include <asm/mach-imx/dma.h>
> > > > >  #include <linux/delay.h>
> > > > > +#include <linux/kernel.h>
> > > > >  #include <power/pmic.h>
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> > > > >  }
> > > > >  #endif
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > > > > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > > > > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > > > > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > > > > +#endif
> > > > > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > > +
> > > > >  int board_early_init_f(void)
> > > > >  {
> > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > index 7e2d88f449..ec73d75db3 100644
> > > > > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > @@ -5,6 +5,8 @@
> > > > >   */
> > > > >
> > > > >  #include <common.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <env.h>
> > > > >  #include <extension_board.h>
> > > > >  #include <hang.h>
> > > > > @@ -21,11 +23,27 @@
> > > > >  #include <asm/mach-imx/gpio.h>
> > > > >  #include <asm/mach-imx/mxc_i2c.h>
> > > > >  #include <asm/sections.h>
> > > > > +#include <linux/kernel.h>
> > > > >
> > > > >  #include "ddr/ddr.h"
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > > > > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > > > > +#endif
> > > > > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > >  {
> > > > >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > > > > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > > > > index 16d5a97167..99872ce0b8 100644
> > > > > --- a/board/emulation/qemu-arm/qemu-arm.c
> > > > > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > > > > @@ -6,15 +6,35 @@
> > > > >  #include <common.h>
> > > > >  #include <cpu_func.h>
> > > > >  #include <dm.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <fdtdec.h>
> > > > >  #include <init.h>
> > > > >  #include <log.h>
> > > > >  #include <virtio_types.h>
> > > > >  #include <virtio.h>
> > > > >
> > > > > +#include <linux/kernel.h>
> > > > > +
> > > > >  #ifdef CONFIG_ARM64
> > > > >  #include <asm/armv8/mmu.h>
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > > > > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > > > > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > > > > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > > > > +#endif
> > > > > +               .fw_name = u"Qemu-Arm-UBOOT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  static struct mm_region qemu_arm64_mem_map[] = {
> > > > >         {
> > > > >                 /* Flash */
> > > > > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > index d655fe099b..c3af951b14 100644
> > > > > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > @@ -2,6 +2,8 @@
> > > > >
> > > > >  #include "pitx_misc.h"
> > > > >  #include <common.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <init.h>
> > > > >  #include <mmc.h>
> > > > >  #include <miiphy.h>
> > > > > @@ -12,7 +14,7 @@
> > > > >  #include <asm/mach-imx/gpio.h>
> > > > >  #include <asm/mach-imx/iomux-v3.h>
> > > > >  #include <linux/delay.h>
> > > > > -
> > > > > +#include <linux/kernel.h>
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > >
> > > > > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> > > > >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> > > > >  };
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > > > > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  int board_early_init_f(void)
> > > > >  {
> > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > index 48376cb826..4d25618895 100644
> > > > > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > @@ -6,12 +6,26 @@
> > > > >  #include <asm/arch/imx-regs.h>
> > > > >  #include <asm/global_data.h>
> > > > >  #include <asm/io.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <fdt_support.h>
> > > > >  #include <linux/errno.h>
> > > > > +#include <linux/kernel.h>
> > > > >  #include <net.h>
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > > > > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > >  {
> > > > >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > > > > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > > > > index 3c48a9141d..a4985df4ea 100644
> > > > > --- a/board/kontron/sl28/sl28.c
> > > > > +++ b/board/kontron/sl28/sl28.c
> > > > > @@ -3,11 +3,14 @@
> > > > >  #include <common.h>
> > > > >  #include <dm.h>
> > > > >  #include <malloc.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <errno.h>
> > > > >  #include <fsl_ddr.h>
> > > > >  #include <fdt_support.h>
> > > > >  #include <asm/global_data.h>
> > > > >  #include <linux/libfdt.h>
> > > > > +#include <linux/kernel.h>
> > > > >  #include <env_internal.h>
> > > > >  #include <asm/arch-fsl-layerscape/soc.h>
> > > > >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > > > > @@ -23,6 +26,17 @@
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > > > > +               .fw_name = u"KONTRON-SL28-FIT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  int board_early_init_f(void)
> > > > >  {
> > > > >         fsl_lsch3_early_init_f();
> > > > > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > > > > index 5d9a945d64..8b0f3de1ea 100644
> > > > > --- a/board/sandbox/sandbox.c
> > > > > +++ b/board/sandbox/sandbox.c
> > > > > @@ -7,6 +7,8 @@
> > > > >  #include <cpu_func.h>
> > > > >  #include <cros_ec.h>
> > > > >  #include <dm.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <env_internal.h>
> > > > >  #include <init.h>
> > > > >  #include <led.h>
> > > > > @@ -25,6 +27,21 @@
> > > > >   */
> > > > >  gd_t *gd;
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > > > > +               .fw_name = u"SANDBOX-UBOOT",
> > > > > +       },
> > > > > +       {
> > > > > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > > > > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > > > >  /*
> > > > >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > > > > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > > > > index 9552bfcdc3..4df26f4019 100644
> > > > > --- a/board/socionext/developerbox/developerbox.c
> > > > > +++ b/board/socionext/developerbox/developerbox.c
> > > > > @@ -10,10 +10,33 @@
> > > > >  #include <asm/global_data.h>
> > > > >  #include <asm/io.h>
> > > > >  #include <common.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <env_internal.h>
> > > > >  #include <fdt_support.h>
> > > > >  #include <log.h>
> > > > >
> > > > > +#include <linux/kernel.h>
> > > > > +
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > > > > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > > > > +       },
> > > > > +       {
> > > > > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > > > > +               .fw_name = u"DEVELOPERBOX-FIP",
> > > > > +       },
> > > > > +       {
> > > > > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > > > > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  static struct mm_region sc2a11_mem_map[] = {
> > > > >         {
> > > > >                 .virt = 0x0UL,
> > > > > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > > > > index 69e642429b..9bcac14946 100644
> > > > > --- a/board/xilinx/common/board.h
> > > > > +++ b/board/xilinx/common/board.h
> > > > > @@ -7,6 +7,24 @@
> > > > >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> > > > >  #define _BOARD_XILINX_COMMON_BOARD_H
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define ZYNQ_BOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > > > > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > > > > +
> > > > > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > > > > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > > > > +
> > > > > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > > > > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > > > > +
> > > > > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > > > > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  int board_late_init_xilinx(void);
> > > > >
> > > > >  int xilinx_read_eeprom(void);
> > > > > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > > > > index 26ef048835..0aa51a3e6d 100644
> > > > > --- a/board/xilinx/zynq/board.c
> > > > > +++ b/board/xilinx/zynq/board.c
> > > > > @@ -8,6 +8,8 @@
> > > > >  #include <init.h>
> > > > >  #include <log.h>
> > > > >  #include <dm/uclass.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <env.h>
> > > > >  #include <env_internal.h>
> > > > >  #include <fdtdec.h>
> > > > > @@ -21,10 +23,26 @@
> > > > >  #include <asm/global_data.h>
> > > > >  #include <asm/arch/hardware.h>
> > > > >  #include <asm/arch/sys_proto.h>
> > > > > +#include <linux/kernel.h>
> > > > >  #include "../common/board.h"
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > > > > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > > > > +       },
> > > > > +       {
> > > > > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > > > > +               .fw_name = u"ZYNQ-UBOOT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> > > > >  void board_debug_uart_init(void)
> > > > >  {
> > > > > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > > > > index 70b3c81f12..b232f7ac4f 100644
> > > > > --- a/board/xilinx/zynqmp/zynqmp.c
> > > > > +++ b/board/xilinx/zynqmp/zynqmp.c
> > > > > @@ -9,6 +9,8 @@
> > > > >  #include <cpu_func.h>
> > > > >  #include <debug_uart.h>
> > > > >  #include <dfu.h>
> > > > > +#include <efi.h>
> > > > > +#include <efi_loader.h>
> > > > >  #include <env.h>
> > > > >  #include <env_internal.h>
> > > > >  #include <init.h>
> > > > > @@ -40,6 +42,7 @@
> > > > >  #include <linux/bitops.h>
> > > > >  #include <linux/delay.h>
> > > > >  #include <linux/sizes.h>
> > > > > +#include <linux/kernel.h>
> > > > >  #include "../common/board.h"
> > > > >
> > > > >  #include "pm_cfg_obj.h"
> > > > > @@ -54,6 +57,21 @@
> > > > >
> > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +struct efi_fw_images fw_images[] = {
> > > > > +       {
> > > > > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > > > > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > > > > +       },
> > > > > +       {
> > > > > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > > > > +               .fw_name = u"ZYNQMP-UBOOT",
> > > > > +       },
> > > > > +};
> > > > > +
> > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> > > > >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> > > > >
> > > > > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > > > > index 7e6be6050c..35df2e755e 100644
> > > > > --- a/include/configs/imx8mm-cl-iot-gate.h
> > > > > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > > > > @@ -31,6 +31,16 @@
> > > > >
> > > > >  #endif
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > > > > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > > > > +
> > > > > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > > > > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  #if CONFIG_IS_ENABLED(CMD_MMC)
> > > > >  # define BOOT_TARGET_MMC(func) \
> > > > >         func(MMC, mmc, 2)      \
> > > > > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > > > > index ac4a7d0cb3..a5a845c2da 100644
> > > > > --- a/include/configs/imx8mp_rsb3720.h
> > > > > +++ b/include/configs/imx8mp_rsb3720.h
> > > > > @@ -21,6 +21,16 @@
> > > > >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> > > > >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > > > > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > > > > +
> > > > > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > > > > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > > > > +
> > > > >  #ifdef CONFIG_SPL_BUILD
> > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > >  #define CONFIG_SPL_STACK               0x960000
> > > > > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > > > > index 788ae77cd3..aff1b90010 100644
> > > > > --- a/include/configs/kontron-sl-mx8mm.h
> > > > > +++ b/include/configs/kontron-sl-mx8mm.h
> > > > > @@ -38,6 +38,12 @@
> > > > >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> > > > >  #endif
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > > > > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  #ifndef CONFIG_SPL_BUILD
> > > > >  #define BOOT_TARGET_DEVICES(func) \
> > > > >         func(MMC, mmc, 1) \
> > > > > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > > > > index 0f96b905ab..678364e367 100644
> > > > > --- a/include/configs/kontron_pitx_imx8m.h
> > > > > +++ b/include/configs/kontron_pitx_imx8m.h
> > > > > @@ -14,6 +14,12 @@
> > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > > > > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  #ifdef CONFIG_SPL_BUILD
> > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > >  #define CONFIG_SPL_STACK               0x187FF0
> > > > > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > > > > index 448749a7f8..97d0d365f6 100644
> > > > > --- a/include/configs/kontron_sl28.h
> > > > > +++ b/include/configs/kontron_sl28.h
> > > > > @@ -57,6 +57,12 @@
> > > > >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> > > > >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > > > > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  /* environment */
> > > > >  /* see include/configs/ti_armv7_common.h */
> > > > >  #define ENV_MEM_LAYOUT_SETTINGS \
> > > > > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > > > > index d45f606860..2f2abc746d 100644
> > > > > --- a/include/configs/qemu-arm.h
> > > > > +++ b/include/configs/qemu-arm.h
> > > > > @@ -17,6 +17,16 @@
> > > > >
> > > > >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > > > > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > > > > +
> > > > > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > > > > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> > > > >
> > > > >  /* Environment options */
> > > > > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > > > > index 75efbf3448..d06c3de2e0 100644
> > > > > --- a/include/configs/sandbox.h
> > > > > +++ b/include/configs/sandbox.h
> > > > > @@ -14,6 +14,16 @@
> > > > >
> > > > >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > > > > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > > > > +
> > > > > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > > > > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > > > > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  /* Size of our emulated memory */
> > > > >  #define SB_CONCAT(x, y) x ## y
> > > > >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > > > > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > > > > index 8dd092fc59..07e1f56e3d 100644
> > > > > --- a/include/configs/synquacer.h
> > > > > +++ b/include/configs/synquacer.h
> > > > > @@ -51,6 +51,20 @@
> > > > >                         "fip.bin raw 180000 78000;"                     \
> > > > >                         "optee.bin raw 500000 100000\0"
> > > > >
> > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > > > > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > > > > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > > > > +
> > > > > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > > > > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > > > > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > > > > +
> > > > > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > > > > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > > > > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > +
> > > > >  /* Distro boot settings */
> > > > >  #ifndef CONFIG_SPL_BUILD
> > > > >  #ifdef CONFIG_CMD_USB
> > > > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > > > index af36639ec6..1965b5a28f 100644
> > > > > --- a/include/efi_loader.h
> > > > > +++ b/include/efi_loader.h
> > > > > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> > > > >
> > > > >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> > > > >
> > > > > +/**
> > > > > + * struct efi_fw_images - List of firmware images updatable through capsule
> > > > > + *                        update
> > > > > + *
> > > > > + * This structure gives information about the firmware images on the platform
> > > > > + * which can be updated through the capsule update mechanism
> > > > > + *
> > > > > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > > > > + * @fw_name:           Name of the firmware image
> > > > > + */
> > > > > +struct efi_fw_images {
> > > > > +       efi_guid_t image_type_id;
> > > > > +       const u16 *fw_name;
> > > > > +};
> > > > > +
> > > > >  /**
> > > > >   * Install the ESRT system table.
> > > > >   *
> > > > > --
> > > > > 2.25.1
> > > > >
> > > >
> > > >
> > > > --
> > > > Masami Hiramatsu
> >
> >
> >
> > --
> > Masami Hiramatsu
>
>
>
> --
> Masami Hiramatsu
Masami Hiramatsu March 26, 2022, 10:47 a.m. UTC | #10
Hi Sughosh,

2022年3月25日(金) 18:59 Sughosh Ganu <sughosh.ganu@linaro.org>:
>
> hi Masami,
>
> On Fri, 25 Mar 2022 at 10:58, Masami Hiramatsu
> <masami.hiramatsu@linaro.org> wrote:
> >
> > Hi Sughosh,
> >
> > OK I understand that if the platform uses the FIT capsule, the
> > fw_images[] must have 1 entry and it is completely non relationship
> > with dfu_alt_info... We may need a document for this case too.
>
> Actually, what you are stating above applies to both raw images as
> well as FIT images. I have added a paragraph in the capsule update
> related section in the uefi.rst. Can you check my patch 4 of this
> series. Thanks.

I've checked that you didn't change the FMP::set_image(), but updated
FMP::get_image_info() to use the per-platform GUID list.
Thus, the efi_fmp_find() ensures that the image type GUID in the
capsule image is *included* in the platform GUID list (fw_images[]
array).

OK, at this point, it filters out the firmware image which is not
supported on the platform.

However, since you didn't update the FMP::set_image() and
efi_capsule_update_firmware(), it directly uses the *index* number in
the capsule image for updating the firmware. Is that correct?

If so, if the platform supports several image types, the problem happens.
Suppose that if the platform has TF-A and U-Boot, the DFU entity index
are 1 and 2.
And user missed to make a capsule file with index 1 for U-Boot image
with U-Boot image type GUID of that platform.
This capsule file passed the check in the efi_fmp_find(), because the
GUID is included in the platform supported GUID list. However,
FMP::set_image() will overwrite the TF-A with given U-Boot image
without any error.

I think we need one more patch to check the given image-index in the
capsule image is correctly matched to the image-type GUID for safety.

Thank you,

> -sughosh
>
> >
> > Thanks,
> >
> > 2022年3月25日(金) 10:09 Masami Hiramatsu <masami.hiramatsu@linaro.org>:
> > >
> > > Hi Sughosh,
> > >
> > > 2022年3月24日(木) 23:40 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > >
> > > > hi Masami,
> > > >
> > > > On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
> > > > <masami.hiramatsu@linaro.org> wrote:
> > > > >
> > > > > Hi Sughosh,
> > > > >
> > > > > 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > > > >
> > > > > > Currently, all platforms that enable capsule updates do so using
> > > > > > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > > > > > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > > > > > Management Protocol(FMP) instance used on the platform. However, this
> > > > > > means that all platforms that enable a particular FMP instance have
> > > > > > the same GUID value for all the updatable images, either the FIT image
> > > > > > GUID or the raw image GUID, and that an image for some platform can be
> > > > > > updated on any other platform which uses the same FMP instance. Another
> > > > > > issue with this implementation is that the ESRT table shows the same
> > > > > > GUID value for all images on the platform and also across platforms,
> > > > > > which is not in compliance with the UEFI specification.
> > > > > >
> > > > > > Fix this by defining image GUID values and firmware names for
> > > > > > individual images per platform. The GetImageInfo FMP hook would then
> > > > > > populate these values in the image descriptor array.
> > > > >
> > > > > OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> > > > > platforms, correct?
> > > >
> > > > No, I have generated the fw_images array based on the information that
> > > > I found in the dfu_alt_info variable for the platform. But this is not
> > > > correlated to the dfu_alt_info variable. If you think that the array
> > > > should have more/different entries for your platform, please let me
> > > > know, and I will change it.
> > >
> > > At least for the DeveloperBox, it looks good to me.
> > > (Hopefully, if you comment the string formatted GUID in the code for
> > > mkeficapsule, that is perfect. :) )
> > >
> > > > > I think you should explain that those GUIDs (fw_images[] entries) must
> > > > > be corresponding to the dfu_alt_info entries, in the same order.
> > > >
> > > > The dfu_alt_info can have more entries than the firmware images that
> > > > are updatable through capsule update. One example is the ST platforms
> > > > which have additional entries in the dfu_alt_info. The image
> > > > descriptor array should only contain entries of images which are
> > > > updatable through capsule update, since the same information is also
> > > > used for generating the ESRT. Which is why I have changed the logic to
> > > > populate the image descriptors through the fw_images array rather than
> > > > the dfu_alt_info.
> > >
> > > I meant, the order of the fw_images array needs to be same as
> > > dfu_alt_info entries and the firmware entries for dfu_alt_info must be
> > > the first, because finally we will use the index of the fw_images
> > > array, which matched to given image type GUID, for specifying
> > > dfu_alt_info entry.
> > > Or, without dfu_alt_info, your new fw_images can update the firmware?
> > > I would like to see such *relationship* at least in the patch
> > > description and the documentation.
> > >
> > > Thank you,
> > >
> > >
> > > >
> > > > -sughosh
> > > >
> > > > > Without that, it is hard to understand why the next patch ([2/6]) works :-)
> > > > >
> > > > > Thank you,
> > > > >
> > > > > >
> > > > > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > > > > ---
> > > > > >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> > > > > >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> > > > > >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> > > > > >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> > > > > >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> > > > > >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> > > > > >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> > > > > >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> > > > > >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> > > > > >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> > > > > >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> > > > > >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> > > > > >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> > > > > >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> > > > > >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> > > > > >  include/configs/kontron_sl28.h                |  6 +++++
> > > > > >  include/configs/qemu-arm.h                    | 10 ++++++++
> > > > > >  include/configs/sandbox.h                     | 10 ++++++++
> > > > > >  include/configs/synquacer.h                   | 14 +++++++++++
> > > > > >  include/efi_loader.h                          | 15 ++++++++++++
> > > > > >  20 files changed, 280 insertions(+), 1 deletion(-)
> > > > > >
> > > > > > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > index 16566092bd..6b534660fe 100644
> > > > > > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > @@ -6,6 +6,8 @@
> > > > > >
> > > > > >  #include <common.h>
> > > > > >  #include <dwc3-uboot.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <errno.h>
> > > > > >  #include <miiphy.h>
> > > > > >  #include <netdev.h>
> > > > > > @@ -21,6 +23,7 @@
> > > > > >  #include <asm/arch/clock.h>
> > > > > >  #include <asm/mach-imx/dma.h>
> > > > > >  #include <linux/delay.h>
> > > > > > +#include <linux/kernel.h>
> > > > > >  #include <power/pmic.h>
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> > > > > >  }
> > > > > >  #endif
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > > > > > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > > > > > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > > > > > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > > > > > +#endif
> > > > > > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > > +
> > > > > >  int board_early_init_f(void)
> > > > > >  {
> > > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > index 7e2d88f449..ec73d75db3 100644
> > > > > > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > @@ -5,6 +5,8 @@
> > > > > >   */
> > > > > >
> > > > > >  #include <common.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <env.h>
> > > > > >  #include <extension_board.h>
> > > > > >  #include <hang.h>
> > > > > > @@ -21,11 +23,27 @@
> > > > > >  #include <asm/mach-imx/gpio.h>
> > > > > >  #include <asm/mach-imx/mxc_i2c.h>
> > > > > >  #include <asm/sections.h>
> > > > > > +#include <linux/kernel.h>
> > > > > >
> > > > > >  #include "ddr/ddr.h"
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > > > > > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > > > > > +#endif
> > > > > > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > > >  {
> > > > > >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > > > > > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > > > > > index 16d5a97167..99872ce0b8 100644
> > > > > > --- a/board/emulation/qemu-arm/qemu-arm.c
> > > > > > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > > > > > @@ -6,15 +6,35 @@
> > > > > >  #include <common.h>
> > > > > >  #include <cpu_func.h>
> > > > > >  #include <dm.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <fdtdec.h>
> > > > > >  #include <init.h>
> > > > > >  #include <log.h>
> > > > > >  #include <virtio_types.h>
> > > > > >  #include <virtio.h>
> > > > > >
> > > > > > +#include <linux/kernel.h>
> > > > > > +
> > > > > >  #ifdef CONFIG_ARM64
> > > > > >  #include <asm/armv8/mmu.h>
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > > > > > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > > > > > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > > > > > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > > > > > +#endif
> > > > > > +               .fw_name = u"Qemu-Arm-UBOOT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  static struct mm_region qemu_arm64_mem_map[] = {
> > > > > >         {
> > > > > >                 /* Flash */
> > > > > > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > index d655fe099b..c3af951b14 100644
> > > > > > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > @@ -2,6 +2,8 @@
> > > > > >
> > > > > >  #include "pitx_misc.h"
> > > > > >  #include <common.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <init.h>
> > > > > >  #include <mmc.h>
> > > > > >  #include <miiphy.h>
> > > > > > @@ -12,7 +14,7 @@
> > > > > >  #include <asm/mach-imx/gpio.h>
> > > > > >  #include <asm/mach-imx/iomux-v3.h>
> > > > > >  #include <linux/delay.h>
> > > > > > -
> > > > > > +#include <linux/kernel.h>
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > >
> > > > > > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> > > > > >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> > > > > >  };
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > > > > > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  int board_early_init_f(void)
> > > > > >  {
> > > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > index 48376cb826..4d25618895 100644
> > > > > > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > @@ -6,12 +6,26 @@
> > > > > >  #include <asm/arch/imx-regs.h>
> > > > > >  #include <asm/global_data.h>
> > > > > >  #include <asm/io.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <fdt_support.h>
> > > > > >  #include <linux/errno.h>
> > > > > > +#include <linux/kernel.h>
> > > > > >  #include <net.h>
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > > > > > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > > >  {
> > > > > >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > > > > > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > > > > > index 3c48a9141d..a4985df4ea 100644
> > > > > > --- a/board/kontron/sl28/sl28.c
> > > > > > +++ b/board/kontron/sl28/sl28.c
> > > > > > @@ -3,11 +3,14 @@
> > > > > >  #include <common.h>
> > > > > >  #include <dm.h>
> > > > > >  #include <malloc.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <errno.h>
> > > > > >  #include <fsl_ddr.h>
> > > > > >  #include <fdt_support.h>
> > > > > >  #include <asm/global_data.h>
> > > > > >  #include <linux/libfdt.h>
> > > > > > +#include <linux/kernel.h>
> > > > > >  #include <env_internal.h>
> > > > > >  #include <asm/arch-fsl-layerscape/soc.h>
> > > > > >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > > > > > @@ -23,6 +26,17 @@
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > > > > > +               .fw_name = u"KONTRON-SL28-FIT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  int board_early_init_f(void)
> > > > > >  {
> > > > > >         fsl_lsch3_early_init_f();
> > > > > > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > > > > > index 5d9a945d64..8b0f3de1ea 100644
> > > > > > --- a/board/sandbox/sandbox.c
> > > > > > +++ b/board/sandbox/sandbox.c
> > > > > > @@ -7,6 +7,8 @@
> > > > > >  #include <cpu_func.h>
> > > > > >  #include <cros_ec.h>
> > > > > >  #include <dm.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <env_internal.h>
> > > > > >  #include <init.h>
> > > > > >  #include <led.h>
> > > > > > @@ -25,6 +27,21 @@
> > > > > >   */
> > > > > >  gd_t *gd;
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > > > > > +               .fw_name = u"SANDBOX-UBOOT",
> > > > > > +       },
> > > > > > +       {
> > > > > > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > > > > > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > > > > >  /*
> > > > > >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > > > > > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > > > > > index 9552bfcdc3..4df26f4019 100644
> > > > > > --- a/board/socionext/developerbox/developerbox.c
> > > > > > +++ b/board/socionext/developerbox/developerbox.c
> > > > > > @@ -10,10 +10,33 @@
> > > > > >  #include <asm/global_data.h>
> > > > > >  #include <asm/io.h>
> > > > > >  #include <common.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <env_internal.h>
> > > > > >  #include <fdt_support.h>
> > > > > >  #include <log.h>
> > > > > >
> > > > > > +#include <linux/kernel.h>
> > > > > > +
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > > > > > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > > > > > +       },
> > > > > > +       {
> > > > > > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > > > > > +               .fw_name = u"DEVELOPERBOX-FIP",
> > > > > > +       },
> > > > > > +       {
> > > > > > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > > > > > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  static struct mm_region sc2a11_mem_map[] = {
> > > > > >         {
> > > > > >                 .virt = 0x0UL,
> > > > > > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > > > > > index 69e642429b..9bcac14946 100644
> > > > > > --- a/board/xilinx/common/board.h
> > > > > > +++ b/board/xilinx/common/board.h
> > > > > > @@ -7,6 +7,24 @@
> > > > > >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> > > > > >  #define _BOARD_XILINX_COMMON_BOARD_H
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define ZYNQ_BOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > > > > > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > > > > > +
> > > > > > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > > > > > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > > > > > +
> > > > > > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > > > > > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > > > > > +
> > > > > > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > > > > > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  int board_late_init_xilinx(void);
> > > > > >
> > > > > >  int xilinx_read_eeprom(void);
> > > > > > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > > > > > index 26ef048835..0aa51a3e6d 100644
> > > > > > --- a/board/xilinx/zynq/board.c
> > > > > > +++ b/board/xilinx/zynq/board.c
> > > > > > @@ -8,6 +8,8 @@
> > > > > >  #include <init.h>
> > > > > >  #include <log.h>
> > > > > >  #include <dm/uclass.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <env.h>
> > > > > >  #include <env_internal.h>
> > > > > >  #include <fdtdec.h>
> > > > > > @@ -21,10 +23,26 @@
> > > > > >  #include <asm/global_data.h>
> > > > > >  #include <asm/arch/hardware.h>
> > > > > >  #include <asm/arch/sys_proto.h>
> > > > > > +#include <linux/kernel.h>
> > > > > >  #include "../common/board.h"
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > > > > > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > > > > > +       },
> > > > > > +       {
> > > > > > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > > > > > +               .fw_name = u"ZYNQ-UBOOT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> > > > > >  void board_debug_uart_init(void)
> > > > > >  {
> > > > > > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > > > > > index 70b3c81f12..b232f7ac4f 100644
> > > > > > --- a/board/xilinx/zynqmp/zynqmp.c
> > > > > > +++ b/board/xilinx/zynqmp/zynqmp.c
> > > > > > @@ -9,6 +9,8 @@
> > > > > >  #include <cpu_func.h>
> > > > > >  #include <debug_uart.h>
> > > > > >  #include <dfu.h>
> > > > > > +#include <efi.h>
> > > > > > +#include <efi_loader.h>
> > > > > >  #include <env.h>
> > > > > >  #include <env_internal.h>
> > > > > >  #include <init.h>
> > > > > > @@ -40,6 +42,7 @@
> > > > > >  #include <linux/bitops.h>
> > > > > >  #include <linux/delay.h>
> > > > > >  #include <linux/sizes.h>
> > > > > > +#include <linux/kernel.h>
> > > > > >  #include "../common/board.h"
> > > > > >
> > > > > >  #include "pm_cfg_obj.h"
> > > > > > @@ -54,6 +57,21 @@
> > > > > >
> > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > +       {
> > > > > > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > > > > > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > > > > > +       },
> > > > > > +       {
> > > > > > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > > > > > +               .fw_name = u"ZYNQMP-UBOOT",
> > > > > > +       },
> > > > > > +};
> > > > > > +
> > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> > > > > >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> > > > > >
> > > > > > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > > > > > index 7e6be6050c..35df2e755e 100644
> > > > > > --- a/include/configs/imx8mm-cl-iot-gate.h
> > > > > > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > > > > > @@ -31,6 +31,16 @@
> > > > > >
> > > > > >  #endif
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > > > > > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > > > > > +
> > > > > > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > > > > > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  #if CONFIG_IS_ENABLED(CMD_MMC)
> > > > > >  # define BOOT_TARGET_MMC(func) \
> > > > > >         func(MMC, mmc, 2)      \
> > > > > > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > > > > > index ac4a7d0cb3..a5a845c2da 100644
> > > > > > --- a/include/configs/imx8mp_rsb3720.h
> > > > > > +++ b/include/configs/imx8mp_rsb3720.h
> > > > > > @@ -21,6 +21,16 @@
> > > > > >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> > > > > >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > > > > > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > > > > > +
> > > > > > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > > > > > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > > > > > +
> > > > > >  #ifdef CONFIG_SPL_BUILD
> > > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > > >  #define CONFIG_SPL_STACK               0x960000
> > > > > > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > > > > > index 788ae77cd3..aff1b90010 100644
> > > > > > --- a/include/configs/kontron-sl-mx8mm.h
> > > > > > +++ b/include/configs/kontron-sl-mx8mm.h
> > > > > > @@ -38,6 +38,12 @@
> > > > > >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> > > > > >  #endif
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > > > > > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  #ifndef CONFIG_SPL_BUILD
> > > > > >  #define BOOT_TARGET_DEVICES(func) \
> > > > > >         func(MMC, mmc, 1) \
> > > > > > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > > > > > index 0f96b905ab..678364e367 100644
> > > > > > --- a/include/configs/kontron_pitx_imx8m.h
> > > > > > +++ b/include/configs/kontron_pitx_imx8m.h
> > > > > > @@ -14,6 +14,12 @@
> > > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > > > > > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  #ifdef CONFIG_SPL_BUILD
> > > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > > >  #define CONFIG_SPL_STACK               0x187FF0
> > > > > > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > > > > > index 448749a7f8..97d0d365f6 100644
> > > > > > --- a/include/configs/kontron_sl28.h
> > > > > > +++ b/include/configs/kontron_sl28.h
> > > > > > @@ -57,6 +57,12 @@
> > > > > >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> > > > > >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > > > > > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  /* environment */
> > > > > >  /* see include/configs/ti_armv7_common.h */
> > > > > >  #define ENV_MEM_LAYOUT_SETTINGS \
> > > > > > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > > > > > index d45f606860..2f2abc746d 100644
> > > > > > --- a/include/configs/qemu-arm.h
> > > > > > +++ b/include/configs/qemu-arm.h
> > > > > > @@ -17,6 +17,16 @@
> > > > > >
> > > > > >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > > > > > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > > > > > +
> > > > > > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > > > > > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> > > > > >
> > > > > >  /* Environment options */
> > > > > > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > > > > > index 75efbf3448..d06c3de2e0 100644
> > > > > > --- a/include/configs/sandbox.h
> > > > > > +++ b/include/configs/sandbox.h
> > > > > > @@ -14,6 +14,16 @@
> > > > > >
> > > > > >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > > > > > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > > > > > +
> > > > > > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > > > > > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  /* Size of our emulated memory */
> > > > > >  #define SB_CONCAT(x, y) x ## y
> > > > > >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > > > > > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > > > > > index 8dd092fc59..07e1f56e3d 100644
> > > > > > --- a/include/configs/synquacer.h
> > > > > > +++ b/include/configs/synquacer.h
> > > > > > @@ -51,6 +51,20 @@
> > > > > >                         "fip.bin raw 180000 78000;"                     \
> > > > > >                         "optee.bin raw 500000 100000\0"
> > > > > >
> > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > > > > > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > > > > > +
> > > > > > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > > > > > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > > > > > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > > > > > +
> > > > > > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > > > > > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > > > > > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > +
> > > > > >  /* Distro boot settings */
> > > > > >  #ifndef CONFIG_SPL_BUILD
> > > > > >  #ifdef CONFIG_CMD_USB
> > > > > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > > > > index af36639ec6..1965b5a28f 100644
> > > > > > --- a/include/efi_loader.h
> > > > > > +++ b/include/efi_loader.h
> > > > > > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> > > > > >
> > > > > >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> > > > > >
> > > > > > +/**
> > > > > > + * struct efi_fw_images - List of firmware images updatable through capsule
> > > > > > + *                        update
> > > > > > + *
> > > > > > + * This structure gives information about the firmware images on the platform
> > > > > > + * which can be updated through the capsule update mechanism
> > > > > > + *
> > > > > > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > > > > > + * @fw_name:           Name of the firmware image
> > > > > > + */
> > > > > > +struct efi_fw_images {
> > > > > > +       efi_guid_t image_type_id;
> > > > > > +       const u16 *fw_name;
> > > > > > +};
> > > > > > +
> > > > > >  /**
> > > > > >   * Install the ESRT system table.
> > > > > >   *
> > > > > > --
> > > > > > 2.25.1
> > > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Masami Hiramatsu
> > >
> > >
> > >
> > > --
> > > Masami Hiramatsu
> >
> >
> >
> > --
> > Masami Hiramatsu
Sughosh Ganu March 27, 2022, 9:11 a.m. UTC | #11
hi Masami,

On Sat, 26 Mar 2022 at 16:17, Masami Hiramatsu
<masami.hiramatsu@linaro.org> wrote:
>
> Hi Sughosh,
>
> 2022年3月25日(金) 18:59 Sughosh Ganu <sughosh.ganu@linaro.org>:
> >
> > hi Masami,
> >
> > On Fri, 25 Mar 2022 at 10:58, Masami Hiramatsu
> > <masami.hiramatsu@linaro.org> wrote:
> > >
> > > Hi Sughosh,
> > >
> > > OK I understand that if the platform uses the FIT capsule, the
> > > fw_images[] must have 1 entry and it is completely non relationship
> > > with dfu_alt_info... We may need a document for this case too.
> >
> > Actually, what you are stating above applies to both raw images as
> > well as FIT images. I have added a paragraph in the capsule update
> > related section in the uefi.rst. Can you check my patch 4 of this
> > series. Thanks.
>
> I've checked that you didn't change the FMP::set_image(), but updated
> FMP::get_image_info() to use the per-platform GUID list.
> Thus, the efi_fmp_find() ensures that the image type GUID in the
> capsule image is *included* in the platform GUID list (fw_images[]
> array).
>
> OK, at this point, it filters out the firmware image which is not
> supported on the platform.
>
> However, since you didn't update the FMP::set_image() and
> efi_capsule_update_firmware(), it directly uses the *index* number in
> the capsule image for updating the firmware. Is that correct?

Yes, your observation is correct. The aim of this series is to fix the
issue of using a common GUID value across images and platforms for a
given FMP instance.

>
> If so, if the platform supports several image types, the problem happens.
> Suppose that if the platform has TF-A and U-Boot, the DFU entity index
> are 1 and 2.
> And user missed to make a capsule file with index 1 for U-Boot image
> with U-Boot image type GUID of that platform.
> This capsule file passed the check in the efi_fmp_find(), because the
> GUID is included in the platform supported GUID list. However,
> FMP::set_image() will overwrite the TF-A with given U-Boot image
> without any error.
>
> I think we need one more patch to check the given image-index in the
> capsule image is correctly matched to the image-type GUID for safety.

Yes, this is very much in the pipeline. I will be working on extending
the struct efi_fw_images to have information on the image index as
part of the structure. But please note that what you mention above is
just making the process of capsule update more robust -- the current
implementation that we have in the capsule update module where the
image_index value is taken from the capsule is very much in compliance
with the UEFI specification. The current patch series is fixing an
issue which was not compliant with the spec. But what you are
suggesting above is on my Todo list, just that it is a separate task,
and not a fix as such.

-sughosh

>
> Thank you,
>
> > -sughosh
> >
> > >
> > > Thanks,
> > >
> > > 2022年3月25日(金) 10:09 Masami Hiramatsu <masami.hiramatsu@linaro.org>:
> > > >
> > > > Hi Sughosh,
> > > >
> > > > 2022年3月24日(木) 23:40 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > > >
> > > > > hi Masami,
> > > > >
> > > > > On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
> > > > > <masami.hiramatsu@linaro.org> wrote:
> > > > > >
> > > > > > Hi Sughosh,
> > > > > >
> > > > > > 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > > > > >
> > > > > > > Currently, all platforms that enable capsule updates do so using
> > > > > > > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > > > > > > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > > > > > > Management Protocol(FMP) instance used on the platform. However, this
> > > > > > > means that all platforms that enable a particular FMP instance have
> > > > > > > the same GUID value for all the updatable images, either the FIT image
> > > > > > > GUID or the raw image GUID, and that an image for some platform can be
> > > > > > > updated on any other platform which uses the same FMP instance. Another
> > > > > > > issue with this implementation is that the ESRT table shows the same
> > > > > > > GUID value for all images on the platform and also across platforms,
> > > > > > > which is not in compliance with the UEFI specification.
> > > > > > >
> > > > > > > Fix this by defining image GUID values and firmware names for
> > > > > > > individual images per platform. The GetImageInfo FMP hook would then
> > > > > > > populate these values in the image descriptor array.
> > > > > >
> > > > > > OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> > > > > > platforms, correct?
> > > > >
> > > > > No, I have generated the fw_images array based on the information that
> > > > > I found in the dfu_alt_info variable for the platform. But this is not
> > > > > correlated to the dfu_alt_info variable. If you think that the array
> > > > > should have more/different entries for your platform, please let me
> > > > > know, and I will change it.
> > > >
> > > > At least for the DeveloperBox, it looks good to me.
> > > > (Hopefully, if you comment the string formatted GUID in the code for
> > > > mkeficapsule, that is perfect. :) )
> > > >
> > > > > > I think you should explain that those GUIDs (fw_images[] entries) must
> > > > > > be corresponding to the dfu_alt_info entries, in the same order.
> > > > >
> > > > > The dfu_alt_info can have more entries than the firmware images that
> > > > > are updatable through capsule update. One example is the ST platforms
> > > > > which have additional entries in the dfu_alt_info. The image
> > > > > descriptor array should only contain entries of images which are
> > > > > updatable through capsule update, since the same information is also
> > > > > used for generating the ESRT. Which is why I have changed the logic to
> > > > > populate the image descriptors through the fw_images array rather than
> > > > > the dfu_alt_info.
> > > >
> > > > I meant, the order of the fw_images array needs to be same as
> > > > dfu_alt_info entries and the firmware entries for dfu_alt_info must be
> > > > the first, because finally we will use the index of the fw_images
> > > > array, which matched to given image type GUID, for specifying
> > > > dfu_alt_info entry.
> > > > Or, without dfu_alt_info, your new fw_images can update the firmware?
> > > > I would like to see such *relationship* at least in the patch
> > > > description and the documentation.
> > > >
> > > > Thank you,
> > > >
> > > >
> > > > >
> > > > > -sughosh
> > > > >
> > > > > > Without that, it is hard to understand why the next patch ([2/6]) works :-)
> > > > > >
> > > > > > Thank you,
> > > > > >
> > > > > > >
> > > > > > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > > > > > ---
> > > > > > >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> > > > > > >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> > > > > > >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> > > > > > >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> > > > > > >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> > > > > > >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> > > > > > >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> > > > > > >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> > > > > > >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> > > > > > >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> > > > > > >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> > > > > > >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> > > > > > >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> > > > > > >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> > > > > > >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> > > > > > >  include/configs/kontron_sl28.h                |  6 +++++
> > > > > > >  include/configs/qemu-arm.h                    | 10 ++++++++
> > > > > > >  include/configs/sandbox.h                     | 10 ++++++++
> > > > > > >  include/configs/synquacer.h                   | 14 +++++++++++
> > > > > > >  include/efi_loader.h                          | 15 ++++++++++++
> > > > > > >  20 files changed, 280 insertions(+), 1 deletion(-)
> > > > > > >
> > > > > > > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > > index 16566092bd..6b534660fe 100644
> > > > > > > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > > @@ -6,6 +6,8 @@
> > > > > > >
> > > > > > >  #include <common.h>
> > > > > > >  #include <dwc3-uboot.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <errno.h>
> > > > > > >  #include <miiphy.h>
> > > > > > >  #include <netdev.h>
> > > > > > > @@ -21,6 +23,7 @@
> > > > > > >  #include <asm/arch/clock.h>
> > > > > > >  #include <asm/mach-imx/dma.h>
> > > > > > >  #include <linux/delay.h>
> > > > > > > +#include <linux/kernel.h>
> > > > > > >  #include <power/pmic.h>
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> > > > > > >  }
> > > > > > >  #endif
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > > > > > > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > > > > > > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > > > > > > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > > > > > > +#endif
> > > > > > > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > > +
> > > > > > >  int board_early_init_f(void)
> > > > > > >  {
> > > > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > > > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > > index 7e2d88f449..ec73d75db3 100644
> > > > > > > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > > @@ -5,6 +5,8 @@
> > > > > > >   */
> > > > > > >
> > > > > > >  #include <common.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <env.h>
> > > > > > >  #include <extension_board.h>
> > > > > > >  #include <hang.h>
> > > > > > > @@ -21,11 +23,27 @@
> > > > > > >  #include <asm/mach-imx/gpio.h>
> > > > > > >  #include <asm/mach-imx/mxc_i2c.h>
> > > > > > >  #include <asm/sections.h>
> > > > > > > +#include <linux/kernel.h>
> > > > > > >
> > > > > > >  #include "ddr/ddr.h"
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > > > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > > > > > > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > > > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > > > > > > +#endif
> > > > > > > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > > > >  {
> > > > > > >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > > > > > > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > > > > > > index 16d5a97167..99872ce0b8 100644
> > > > > > > --- a/board/emulation/qemu-arm/qemu-arm.c
> > > > > > > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > > > > > > @@ -6,15 +6,35 @@
> > > > > > >  #include <common.h>
> > > > > > >  #include <cpu_func.h>
> > > > > > >  #include <dm.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <fdtdec.h>
> > > > > > >  #include <init.h>
> > > > > > >  #include <log.h>
> > > > > > >  #include <virtio_types.h>
> > > > > > >  #include <virtio.h>
> > > > > > >
> > > > > > > +#include <linux/kernel.h>
> > > > > > > +
> > > > > > >  #ifdef CONFIG_ARM64
> > > > > > >  #include <asm/armv8/mmu.h>
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > > > > > > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > > > > > > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > > > > > > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > > > > > > +#endif
> > > > > > > +               .fw_name = u"Qemu-Arm-UBOOT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  static struct mm_region qemu_arm64_mem_map[] = {
> > > > > > >         {
> > > > > > >                 /* Flash */
> > > > > > > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > > index d655fe099b..c3af951b14 100644
> > > > > > > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > > @@ -2,6 +2,8 @@
> > > > > > >
> > > > > > >  #include "pitx_misc.h"
> > > > > > >  #include <common.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <init.h>
> > > > > > >  #include <mmc.h>
> > > > > > >  #include <miiphy.h>
> > > > > > > @@ -12,7 +14,7 @@
> > > > > > >  #include <asm/mach-imx/gpio.h>
> > > > > > >  #include <asm/mach-imx/iomux-v3.h>
> > > > > > >  #include <linux/delay.h>
> > > > > > > -
> > > > > > > +#include <linux/kernel.h>
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > >
> > > > > > > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> > > > > > >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> > > > > > >  };
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  int board_early_init_f(void)
> > > > > > >  {
> > > > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > > > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > > index 48376cb826..4d25618895 100644
> > > > > > > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > > @@ -6,12 +6,26 @@
> > > > > > >  #include <asm/arch/imx-regs.h>
> > > > > > >  #include <asm/global_data.h>
> > > > > > >  #include <asm/io.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <fdt_support.h>
> > > > > > >  #include <linux/errno.h>
> > > > > > > +#include <linux/kernel.h>
> > > > > > >  #include <net.h>
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > > > >  {
> > > > > > >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > > > > > > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > > > > > > index 3c48a9141d..a4985df4ea 100644
> > > > > > > --- a/board/kontron/sl28/sl28.c
> > > > > > > +++ b/board/kontron/sl28/sl28.c
> > > > > > > @@ -3,11 +3,14 @@
> > > > > > >  #include <common.h>
> > > > > > >  #include <dm.h>
> > > > > > >  #include <malloc.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <errno.h>
> > > > > > >  #include <fsl_ddr.h>
> > > > > > >  #include <fdt_support.h>
> > > > > > >  #include <asm/global_data.h>
> > > > > > >  #include <linux/libfdt.h>
> > > > > > > +#include <linux/kernel.h>
> > > > > > >  #include <env_internal.h>
> > > > > > >  #include <asm/arch-fsl-layerscape/soc.h>
> > > > > > >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > > > > > > @@ -23,6 +26,17 @@
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"KONTRON-SL28-FIT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  int board_early_init_f(void)
> > > > > > >  {
> > > > > > >         fsl_lsch3_early_init_f();
> > > > > > > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > > > > > > index 5d9a945d64..8b0f3de1ea 100644
> > > > > > > --- a/board/sandbox/sandbox.c
> > > > > > > +++ b/board/sandbox/sandbox.c
> > > > > > > @@ -7,6 +7,8 @@
> > > > > > >  #include <cpu_func.h>
> > > > > > >  #include <cros_ec.h>
> > > > > > >  #include <dm.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <env_internal.h>
> > > > > > >  #include <init.h>
> > > > > > >  #include <led.h>
> > > > > > > @@ -25,6 +27,21 @@
> > > > > > >   */
> > > > > > >  gd_t *gd;
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"SANDBOX-UBOOT",
> > > > > > > +       },
> > > > > > > +       {
> > > > > > > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > > > > > > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > > > > > >  /*
> > > > > > >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > > > > > > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > > > > > > index 9552bfcdc3..4df26f4019 100644
> > > > > > > --- a/board/socionext/developerbox/developerbox.c
> > > > > > > +++ b/board/socionext/developerbox/developerbox.c
> > > > > > > @@ -10,10 +10,33 @@
> > > > > > >  #include <asm/global_data.h>
> > > > > > >  #include <asm/io.h>
> > > > > > >  #include <common.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <env_internal.h>
> > > > > > >  #include <fdt_support.h>
> > > > > > >  #include <log.h>
> > > > > > >
> > > > > > > +#include <linux/kernel.h>
> > > > > > > +
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > > > > > > +       },
> > > > > > > +       {
> > > > > > > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > > > > > > +               .fw_name = u"DEVELOPERBOX-FIP",
> > > > > > > +       },
> > > > > > > +       {
> > > > > > > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > > > > > > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  static struct mm_region sc2a11_mem_map[] = {
> > > > > > >         {
> > > > > > >                 .virt = 0x0UL,
> > > > > > > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > > > > > > index 69e642429b..9bcac14946 100644
> > > > > > > --- a/board/xilinx/common/board.h
> > > > > > > +++ b/board/xilinx/common/board.h
> > > > > > > @@ -7,6 +7,24 @@
> > > > > > >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> > > > > > >  #define _BOARD_XILINX_COMMON_BOARD_H
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define ZYNQ_BOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > > > > > > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > > > > > > +
> > > > > > > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > > > > > > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > > > > > > +
> > > > > > > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > > > > > > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > > > > > > +
> > > > > > > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > > > > > > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  int board_late_init_xilinx(void);
> > > > > > >
> > > > > > >  int xilinx_read_eeprom(void);
> > > > > > > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > > > > > > index 26ef048835..0aa51a3e6d 100644
> > > > > > > --- a/board/xilinx/zynq/board.c
> > > > > > > +++ b/board/xilinx/zynq/board.c
> > > > > > > @@ -8,6 +8,8 @@
> > > > > > >  #include <init.h>
> > > > > > >  #include <log.h>
> > > > > > >  #include <dm/uclass.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <env.h>
> > > > > > >  #include <env_internal.h>
> > > > > > >  #include <fdtdec.h>
> > > > > > > @@ -21,10 +23,26 @@
> > > > > > >  #include <asm/global_data.h>
> > > > > > >  #include <asm/arch/hardware.h>
> > > > > > >  #include <asm/arch/sys_proto.h>
> > > > > > > +#include <linux/kernel.h>
> > > > > > >  #include "../common/board.h"
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > > > > > > +       },
> > > > > > > +       {
> > > > > > > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"ZYNQ-UBOOT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> > > > > > >  void board_debug_uart_init(void)
> > > > > > >  {
> > > > > > > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > > > > > > index 70b3c81f12..b232f7ac4f 100644
> > > > > > > --- a/board/xilinx/zynqmp/zynqmp.c
> > > > > > > +++ b/board/xilinx/zynqmp/zynqmp.c
> > > > > > > @@ -9,6 +9,8 @@
> > > > > > >  #include <cpu_func.h>
> > > > > > >  #include <debug_uart.h>
> > > > > > >  #include <dfu.h>
> > > > > > > +#include <efi.h>
> > > > > > > +#include <efi_loader.h>
> > > > > > >  #include <env.h>
> > > > > > >  #include <env_internal.h>
> > > > > > >  #include <init.h>
> > > > > > > @@ -40,6 +42,7 @@
> > > > > > >  #include <linux/bitops.h>
> > > > > > >  #include <linux/delay.h>
> > > > > > >  #include <linux/sizes.h>
> > > > > > > +#include <linux/kernel.h>
> > > > > > >  #include "../common/board.h"
> > > > > > >
> > > > > > >  #include "pm_cfg_obj.h"
> > > > > > > @@ -54,6 +57,21 @@
> > > > > > >
> > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > +       {
> > > > > > > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > > > > > > +       },
> > > > > > > +       {
> > > > > > > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > > > > > > +               .fw_name = u"ZYNQMP-UBOOT",
> > > > > > > +       },
> > > > > > > +};
> > > > > > > +
> > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> > > > > > >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> > > > > > >
> > > > > > > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > > > > > > index 7e6be6050c..35df2e755e 100644
> > > > > > > --- a/include/configs/imx8mm-cl-iot-gate.h
> > > > > > > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > > > > > > @@ -31,6 +31,16 @@
> > > > > > >
> > > > > > >  #endif
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > > > > > > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > > > > > > +
> > > > > > > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > > > > > > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  #if CONFIG_IS_ENABLED(CMD_MMC)
> > > > > > >  # define BOOT_TARGET_MMC(func) \
> > > > > > >         func(MMC, mmc, 2)      \
> > > > > > > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > > > > > > index ac4a7d0cb3..a5a845c2da 100644
> > > > > > > --- a/include/configs/imx8mp_rsb3720.h
> > > > > > > +++ b/include/configs/imx8mp_rsb3720.h
> > > > > > > @@ -21,6 +21,16 @@
> > > > > > >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> > > > > > >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > > > > > > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > > > > > > +
> > > > > > > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > > > > > > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > > > > > > +
> > > > > > >  #ifdef CONFIG_SPL_BUILD
> > > > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > > > >  #define CONFIG_SPL_STACK               0x960000
> > > > > > > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > > > > > > index 788ae77cd3..aff1b90010 100644
> > > > > > > --- a/include/configs/kontron-sl-mx8mm.h
> > > > > > > +++ b/include/configs/kontron-sl-mx8mm.h
> > > > > > > @@ -38,6 +38,12 @@
> > > > > > >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> > > > > > >  #endif
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > > > > > > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  #ifndef CONFIG_SPL_BUILD
> > > > > > >  #define BOOT_TARGET_DEVICES(func) \
> > > > > > >         func(MMC, mmc, 1) \
> > > > > > > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > > > > > > index 0f96b905ab..678364e367 100644
> > > > > > > --- a/include/configs/kontron_pitx_imx8m.h
> > > > > > > +++ b/include/configs/kontron_pitx_imx8m.h
> > > > > > > @@ -14,6 +14,12 @@
> > > > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > > > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > > > > > > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  #ifdef CONFIG_SPL_BUILD
> > > > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > > > >  #define CONFIG_SPL_STACK               0x187FF0
> > > > > > > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > > > > > > index 448749a7f8..97d0d365f6 100644
> > > > > > > --- a/include/configs/kontron_sl28.h
> > > > > > > +++ b/include/configs/kontron_sl28.h
> > > > > > > @@ -57,6 +57,12 @@
> > > > > > >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> > > > > > >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > > > > > > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  /* environment */
> > > > > > >  /* see include/configs/ti_armv7_common.h */
> > > > > > >  #define ENV_MEM_LAYOUT_SETTINGS \
> > > > > > > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > > > > > > index d45f606860..2f2abc746d 100644
> > > > > > > --- a/include/configs/qemu-arm.h
> > > > > > > +++ b/include/configs/qemu-arm.h
> > > > > > > @@ -17,6 +17,16 @@
> > > > > > >
> > > > > > >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > > > > > > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > > > > > > +
> > > > > > > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > > > > > > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> > > > > > >
> > > > > > >  /* Environment options */
> > > > > > > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > > > > > > index 75efbf3448..d06c3de2e0 100644
> > > > > > > --- a/include/configs/sandbox.h
> > > > > > > +++ b/include/configs/sandbox.h
> > > > > > > @@ -14,6 +14,16 @@
> > > > > > >
> > > > > > >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > > > > > > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > > > > > > +
> > > > > > > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > > > > > > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  /* Size of our emulated memory */
> > > > > > >  #define SB_CONCAT(x, y) x ## y
> > > > > > >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > > > > > > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > > > > > > index 8dd092fc59..07e1f56e3d 100644
> > > > > > > --- a/include/configs/synquacer.h
> > > > > > > +++ b/include/configs/synquacer.h
> > > > > > > @@ -51,6 +51,20 @@
> > > > > > >                         "fip.bin raw 180000 78000;"                     \
> > > > > > >                         "optee.bin raw 500000 100000\0"
> > > > > > >
> > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > > > > > > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > > > > > > +
> > > > > > > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > > > > > > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > > > > > > +
> > > > > > > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > > > > > > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > > > > > > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > +
> > > > > > >  /* Distro boot settings */
> > > > > > >  #ifndef CONFIG_SPL_BUILD
> > > > > > >  #ifdef CONFIG_CMD_USB
> > > > > > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > > > > > index af36639ec6..1965b5a28f 100644
> > > > > > > --- a/include/efi_loader.h
> > > > > > > +++ b/include/efi_loader.h
> > > > > > > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> > > > > > >
> > > > > > >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> > > > > > >
> > > > > > > +/**
> > > > > > > + * struct efi_fw_images - List of firmware images updatable through capsule
> > > > > > > + *                        update
> > > > > > > + *
> > > > > > > + * This structure gives information about the firmware images on the platform
> > > > > > > + * which can be updated through the capsule update mechanism
> > > > > > > + *
> > > > > > > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > > > > > > + * @fw_name:           Name of the firmware image
> > > > > > > + */
> > > > > > > +struct efi_fw_images {
> > > > > > > +       efi_guid_t image_type_id;
> > > > > > > +       const u16 *fw_name;
> > > > > > > +};
> > > > > > > +
> > > > > > >  /**
> > > > > > >   * Install the ESRT system table.
> > > > > > >   *
> > > > > > > --
> > > > > > > 2.25.1
> > > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Masami Hiramatsu
> > > >
> > > >
> > > >
> > > > --
> > > > Masami Hiramatsu
> > >
> > >
> > >
> > > --
> > > Masami Hiramatsu
>
>
>
> --
> Masami Hiramatsu
Masami Hiramatsu March 28, 2022, 12:01 a.m. UTC | #12
Hi Sughosh,

2022年3月27日(日) 18:11 Sughosh Ganu <sughosh.ganu@linaro.org>:
>
> hi Masami,
>
> On Sat, 26 Mar 2022 at 16:17, Masami Hiramatsu
> <masami.hiramatsu@linaro.org> wrote:
> >
> > Hi Sughosh,
> >
> > 2022年3月25日(金) 18:59 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > >
> > > hi Masami,
> > >
> > > On Fri, 25 Mar 2022 at 10:58, Masami Hiramatsu
> > > <masami.hiramatsu@linaro.org> wrote:
> > > >
> > > > Hi Sughosh,
> > > >
> > > > OK I understand that if the platform uses the FIT capsule, the
> > > > fw_images[] must have 1 entry and it is completely non relationship
> > > > with dfu_alt_info... We may need a document for this case too.
> > >
> > > Actually, what you are stating above applies to both raw images as
> > > well as FIT images. I have added a paragraph in the capsule update
> > > related section in the uefi.rst. Can you check my patch 4 of this
> > > series. Thanks.
> >
> > I've checked that you didn't change the FMP::set_image(), but updated
> > FMP::get_image_info() to use the per-platform GUID list.
> > Thus, the efi_fmp_find() ensures that the image type GUID in the
> > capsule image is *included* in the platform GUID list (fw_images[]
> > array).
> >
> > OK, at this point, it filters out the firmware image which is not
> > supported on the platform.
> >
> > However, since you didn't update the FMP::set_image() and
> > efi_capsule_update_firmware(), it directly uses the *index* number in
> > the capsule image for updating the firmware. Is that correct?
>
> Yes, your observation is correct. The aim of this series is to fix the
> issue of using a common GUID value across images and platforms for a
> given FMP instance.

OK, but I think this has made the thing complicated.
Without this series, user will only care about the index number to
make the capsule image and the GUID is correct for the platform, since
the platform chooses FIP or RAW.

With this series, user additionally needs to care about the
combination of the index and the GUID of image type, because the
U-Boot doesn't check the combination is correct or not.

I would like to ask you to add this note in the document. Even if the
U-Boot checks the combination, user still need to check it when making
the capsule file.

> > If so, if the platform supports several image types, the problem happens.
> > Suppose that if the platform has TF-A and U-Boot, the DFU entity index
> > are 1 and 2.
> > And user missed to make a capsule file with index 1 for U-Boot image
> > with U-Boot image type GUID of that platform.
> > This capsule file passed the check in the efi_fmp_find(), because the
> > GUID is included in the platform supported GUID list. However,
> > FMP::set_image() will overwrite the TF-A with given U-Boot image
> > without any error.
> >
> > I think we need one more patch to check the given image-index in the
> > capsule image is correctly matched to the image-type GUID for safety.
>
> Yes, this is very much in the pipeline. I will be working on extending
> the struct efi_fw_images to have information on the image index as
> part of the structure.

That is great!
BTW, if we have 2 different dfu_alt_info entries for the same type of
firmware, should we have different GUIDs for those?

> But please note that what you mention above is
> just making the process of capsule update more robust -- the current
> implementation that we have in the capsule update module where the
> image_index value is taken from the capsule is very much in compliance
> with the UEFI specification. The current patch series is fixing an
> issue which was not compliant with the spec. But what you are
> suggesting above is on my Todo list, just that it is a separate task,
> and not a fix as such.

OK, I don't mind the actual robustness change, but please describe
this scenario as a notice for users so that they can make capsule
files correctly.

Thank you,

>
> -sughosh
>
> >
> > Thank you,
> >
> > > -sughosh
> > >
> > > >
> > > > Thanks,
> > > >
> > > > 2022年3月25日(金) 10:09 Masami Hiramatsu <masami.hiramatsu@linaro.org>:
> > > > >
> > > > > Hi Sughosh,
> > > > >
> > > > > 2022年3月24日(木) 23:40 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > > > >
> > > > > > hi Masami,
> > > > > >
> > > > > > On Thu, 24 Mar 2022 at 19:14, Masami Hiramatsu
> > > > > > <masami.hiramatsu@linaro.org> wrote:
> > > > > > >
> > > > > > > Hi Sughosh,
> > > > > > >
> > > > > > > 2022年3月24日(木) 21:39 Sughosh Ganu <sughosh.ganu@linaro.org>:
> > > > > > > >
> > > > > > > > Currently, all platforms that enable capsule updates do so using
> > > > > > > > either EFI_FIRMWARE_IMAGE_TYPE_UBOOT_RAW_GUID or
> > > > > > > > EFI_FIRMWARE_IMAGE_TYPE_UBOOT_FIT_GUID. This is based on the Firmware
> > > > > > > > Management Protocol(FMP) instance used on the platform. However, this
> > > > > > > > means that all platforms that enable a particular FMP instance have
> > > > > > > > the same GUID value for all the updatable images, either the FIT image
> > > > > > > > GUID or the raw image GUID, and that an image for some platform can be
> > > > > > > > updated on any other platform which uses the same FMP instance. Another
> > > > > > > > issue with this implementation is that the ESRT table shows the same
> > > > > > > > GUID value for all images on the platform and also across platforms,
> > > > > > > > which is not in compliance with the UEFI specification.
> > > > > > > >
> > > > > > > > Fix this by defining image GUID values and firmware names for
> > > > > > > > individual images per platform. The GetImageInfo FMP hook would then
> > > > > > > > populate these values in the image descriptor array.
> > > > > > >
> > > > > > > OK, so you have generated GUIDs for each "dfu_alt_info" entry on the
> > > > > > > platforms, correct?
> > > > > >
> > > > > > No, I have generated the fw_images array based on the information that
> > > > > > I found in the dfu_alt_info variable for the platform. But this is not
> > > > > > correlated to the dfu_alt_info variable. If you think that the array
> > > > > > should have more/different entries for your platform, please let me
> > > > > > know, and I will change it.
> > > > >
> > > > > At least for the DeveloperBox, it looks good to me.
> > > > > (Hopefully, if you comment the string formatted GUID in the code for
> > > > > mkeficapsule, that is perfect. :) )
> > > > >
> > > > > > > I think you should explain that those GUIDs (fw_images[] entries) must
> > > > > > > be corresponding to the dfu_alt_info entries, in the same order.
> > > > > >
> > > > > > The dfu_alt_info can have more entries than the firmware images that
> > > > > > are updatable through capsule update. One example is the ST platforms
> > > > > > which have additional entries in the dfu_alt_info. The image
> > > > > > descriptor array should only contain entries of images which are
> > > > > > updatable through capsule update, since the same information is also
> > > > > > used for generating the ESRT. Which is why I have changed the logic to
> > > > > > populate the image descriptors through the fw_images array rather than
> > > > > > the dfu_alt_info.
> > > > >
> > > > > I meant, the order of the fw_images array needs to be same as
> > > > > dfu_alt_info entries and the firmware entries for dfu_alt_info must be
> > > > > the first, because finally we will use the index of the fw_images
> > > > > array, which matched to given image type GUID, for specifying
> > > > > dfu_alt_info entry.
> > > > > Or, without dfu_alt_info, your new fw_images can update the firmware?
> > > > > I would like to see such *relationship* at least in the patch
> > > > > description and the documentation.
> > > > >
> > > > > Thank you,
> > > > >
> > > > >
> > > > > >
> > > > > > -sughosh
> > > > > >
> > > > > > > Without that, it is hard to understand why the next patch ([2/6]) works :-)
> > > > > > >
> > > > > > > Thank you,
> > > > > > >
> > > > > > > >
> > > > > > > > Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> > > > > > > > ---
> > > > > > > >  .../imx8mp_rsb3720a1/imx8mp_rsb3720a1.c       | 19 +++++++++++++++
> > > > > > > >  .../imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c   | 18 +++++++++++++++
> > > > > > > >  board/emulation/qemu-arm/qemu-arm.c           | 20 ++++++++++++++++
> > > > > > > >  board/kontron/pitx_imx8m/pitx_imx8m.c         | 15 +++++++++++-
> > > > > > > >  board/kontron/sl-mx8mm/sl-mx8mm.c             | 14 +++++++++++
> > > > > > > >  board/kontron/sl28/sl28.c                     | 14 +++++++++++
> > > > > > > >  board/sandbox/sandbox.c                       | 17 ++++++++++++++
> > > > > > > >  board/socionext/developerbox/developerbox.c   | 23 +++++++++++++++++++
> > > > > > > >  board/xilinx/common/board.h                   | 18 +++++++++++++++
> > > > > > > >  board/xilinx/zynq/board.c                     | 18 +++++++++++++++
> > > > > > > >  board/xilinx/zynqmp/zynqmp.c                  | 18 +++++++++++++++
> > > > > > > >  include/configs/imx8mm-cl-iot-gate.h          | 10 ++++++++
> > > > > > > >  include/configs/imx8mp_rsb3720.h              | 10 ++++++++
> > > > > > > >  include/configs/kontron-sl-mx8mm.h            |  6 +++++
> > > > > > > >  include/configs/kontron_pitx_imx8m.h          |  6 +++++
> > > > > > > >  include/configs/kontron_sl28.h                |  6 +++++
> > > > > > > >  include/configs/qemu-arm.h                    | 10 ++++++++
> > > > > > > >  include/configs/sandbox.h                     | 10 ++++++++
> > > > > > > >  include/configs/synquacer.h                   | 14 +++++++++++
> > > > > > > >  include/efi_loader.h                          | 15 ++++++++++++
> > > > > > > >  20 files changed, 280 insertions(+), 1 deletion(-)
> > > > > > > >
> > > > > > > > diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > > > index 16566092bd..6b534660fe 100644
> > > > > > > > --- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > > > +++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
> > > > > > > > @@ -6,6 +6,8 @@
> > > > > > > >
> > > > > > > >  #include <common.h>
> > > > > > > >  #include <dwc3-uboot.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <errno.h>
> > > > > > > >  #include <miiphy.h>
> > > > > > > >  #include <netdev.h>
> > > > > > > > @@ -21,6 +23,7 @@
> > > > > > > >  #include <asm/arch/clock.h>
> > > > > > > >  #include <asm/mach-imx/dma.h>
> > > > > > > >  #include <linux/delay.h>
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >  #include <power/pmic.h>
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > > @@ -44,6 +47,22 @@ static void setup_gpmi_nand(void)
> > > > > > > >  }
> > > > > > > >  #endif
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
> > > > > > > > +               .image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
> > > > > > > > +#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
> > > > > > > > +               .image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
> > > > > > > > +#endif
> > > > > > > > +               .fw_name = u"IMX8MP-RSB3720-FIT"
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > > +
> > > > > > > >  int board_early_init_f(void)
> > > > > > > >  {
> > > > > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > > > > diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > > > index 7e2d88f449..ec73d75db3 100644
> > > > > > > > --- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > > > +++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
> > > > > > > > @@ -5,6 +5,8 @@
> > > > > > > >   */
> > > > > > > >
> > > > > > > >  #include <common.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <env.h>
> > > > > > > >  #include <extension_board.h>
> > > > > > > >  #include <hang.h>
> > > > > > > > @@ -21,11 +23,27 @@
> > > > > > > >  #include <asm/mach-imx/gpio.h>
> > > > > > > >  #include <asm/mach-imx/mxc_i2c.h>
> > > > > > > >  #include <asm/sections.h>
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >
> > > > > > > >  #include "ddr/ddr.h"
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
> > > > > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
> > > > > > > > +#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
> > > > > > > > +               .image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
> > > > > > > > +#endif
> > > > > > > > +               .fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > > > > >  {
> > > > > > > >         struct lpddr4_tcm_desc *lpddr4_tcm_desc =
> > > > > > > > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > > > > > > > index 16d5a97167..99872ce0b8 100644
> > > > > > > > --- a/board/emulation/qemu-arm/qemu-arm.c
> > > > > > > > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > > > > > > > @@ -6,15 +6,35 @@
> > > > > > > >  #include <common.h>
> > > > > > > >  #include <cpu_func.h>
> > > > > > > >  #include <dm.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <fdtdec.h>
> > > > > > > >  #include <init.h>
> > > > > > > >  #include <log.h>
> > > > > > > >  #include <virtio_types.h>
> > > > > > > >  #include <virtio.h>
> > > > > > > >
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > > +
> > > > > > > >  #ifdef CONFIG_ARM64
> > > > > > > >  #include <asm/armv8/mmu.h>
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
> > > > > > > > +               .image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
> > > > > > > > +#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
> > > > > > > > +               .image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
> > > > > > > > +#endif
> > > > > > > > +               .fw_name = u"Qemu-Arm-UBOOT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  static struct mm_region qemu_arm64_mem_map[] = {
> > > > > > > >         {
> > > > > > > >                 /* Flash */
> > > > > > > > diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > > > index d655fe099b..c3af951b14 100644
> > > > > > > > --- a/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > > > +++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
> > > > > > > > @@ -2,6 +2,8 @@
> > > > > > > >
> > > > > > > >  #include "pitx_misc.h"
> > > > > > > >  #include <common.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <init.h>
> > > > > > > >  #include <mmc.h>
> > > > > > > >  #include <miiphy.h>
> > > > > > > > @@ -12,7 +14,7 @@
> > > > > > > >  #include <asm/mach-imx/gpio.h>
> > > > > > > >  #include <asm/mach-imx/iomux-v3.h>
> > > > > > > >  #include <linux/delay.h>
> > > > > > > > -
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > >
> > > > > > > > @@ -30,6 +32,17 @@ static iomux_v3_cfg_t const uart_pads[] = {
> > > > > > > >         IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
> > > > > > > >  };
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  int board_early_init_f(void)
> > > > > > > >  {
> > > > > > > >         struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
> > > > > > > > diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > > > index 48376cb826..4d25618895 100644
> > > > > > > > --- a/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > > > +++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
> > > > > > > > @@ -6,12 +6,26 @@
> > > > > > > >  #include <asm/arch/imx-regs.h>
> > > > > > > >  #include <asm/global_data.h>
> > > > > > > >  #include <asm/io.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <fdt_support.h>
> > > > > > > >  #include <linux/errno.h>
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >  #include <net.h>
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"KONTROL-SL-MX8MM-UBOOT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  int board_phys_sdram_size(phys_size_t *size)
> > > > > > > >  {
> > > > > > > >         u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
> > > > > > > > diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
> > > > > > > > index 3c48a9141d..a4985df4ea 100644
> > > > > > > > --- a/board/kontron/sl28/sl28.c
> > > > > > > > +++ b/board/kontron/sl28/sl28.c
> > > > > > > > @@ -3,11 +3,14 @@
> > > > > > > >  #include <common.h>
> > > > > > > >  #include <dm.h>
> > > > > > > >  #include <malloc.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <errno.h>
> > > > > > > >  #include <fsl_ddr.h>
> > > > > > > >  #include <fdt_support.h>
> > > > > > > >  #include <asm/global_data.h>
> > > > > > > >  #include <linux/libfdt.h>
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >  #include <env_internal.h>
> > > > > > > >  #include <asm/arch-fsl-layerscape/soc.h>
> > > > > > > >  #include <asm/arch-fsl-layerscape/fsl_icid.h>
> > > > > > > > @@ -23,6 +26,17 @@
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"KONTRON-SL28-FIT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  int board_early_init_f(void)
> > > > > > > >  {
> > > > > > > >         fsl_lsch3_early_init_f();
> > > > > > > > diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> > > > > > > > index 5d9a945d64..8b0f3de1ea 100644
> > > > > > > > --- a/board/sandbox/sandbox.c
> > > > > > > > +++ b/board/sandbox/sandbox.c
> > > > > > > > @@ -7,6 +7,8 @@
> > > > > > > >  #include <cpu_func.h>
> > > > > > > >  #include <cros_ec.h>
> > > > > > > >  #include <dm.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <env_internal.h>
> > > > > > > >  #include <init.h>
> > > > > > > >  #include <led.h>
> > > > > > > > @@ -25,6 +27,21 @@
> > > > > > > >   */
> > > > > > > >  gd_t *gd;
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"SANDBOX-UBOOT",
> > > > > > > > +       },
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"SANDBOX-UBOOT-ENV",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  #if !CONFIG_IS_ENABLED(OF_PLATDATA)
> > > > > > > >  /*
> > > > > > > >   * Add a simple GPIO device (don't use with of-platdata as it interferes with
> > > > > > > > diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
> > > > > > > > index 9552bfcdc3..4df26f4019 100644
> > > > > > > > --- a/board/socionext/developerbox/developerbox.c
> > > > > > > > +++ b/board/socionext/developerbox/developerbox.c
> > > > > > > > @@ -10,10 +10,33 @@
> > > > > > > >  #include <asm/global_data.h>
> > > > > > > >  #include <asm/io.h>
> > > > > > > >  #include <common.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <env_internal.h>
> > > > > > > >  #include <fdt_support.h>
> > > > > > > >  #include <log.h>
> > > > > > > >
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > > +
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"DEVELOPERBOX-UBOOT",
> > > > > > > > +       },
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"DEVELOPERBOX-FIP",
> > > > > > > > +       },
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"DEVELOPERBOX-OPTEE",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  static struct mm_region sc2a11_mem_map[] = {
> > > > > > > >         {
> > > > > > > >                 .virt = 0x0UL,
> > > > > > > > diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
> > > > > > > > index 69e642429b..9bcac14946 100644
> > > > > > > > --- a/board/xilinx/common/board.h
> > > > > > > > +++ b/board/xilinx/common/board.h
> > > > > > > > @@ -7,6 +7,24 @@
> > > > > > > >  #ifndef _BOARD_XILINX_COMMON_BOARD_H
> > > > > > > >  #define _BOARD_XILINX_COMMON_BOARD_H
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define ZYNQ_BOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
> > > > > > > > +                0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
> > > > > > > > +
> > > > > > > > +#define ZYNQ_UBOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
> > > > > > > > +                0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
> > > > > > > > +
> > > > > > > > +#define ZYNQMP_BOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
> > > > > > > > +                0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
> > > > > > > > +
> > > > > > > > +#define ZYNQMP_UBOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
> > > > > > > > +                0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  int board_late_init_xilinx(void);
> > > > > > > >
> > > > > > > >  int xilinx_read_eeprom(void);
> > > > > > > > diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
> > > > > > > > index 26ef048835..0aa51a3e6d 100644
> > > > > > > > --- a/board/xilinx/zynq/board.c
> > > > > > > > +++ b/board/xilinx/zynq/board.c
> > > > > > > > @@ -8,6 +8,8 @@
> > > > > > > >  #include <init.h>
> > > > > > > >  #include <log.h>
> > > > > > > >  #include <dm/uclass.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <env.h>
> > > > > > > >  #include <env_internal.h>
> > > > > > > >  #include <fdtdec.h>
> > > > > > > > @@ -21,10 +23,26 @@
> > > > > > > >  #include <asm/global_data.h>
> > > > > > > >  #include <asm/arch/hardware.h>
> > > > > > > >  #include <asm/arch/sys_proto.h>
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >  #include "../common/board.h"
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = ZYNQ_BOOT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"ZYNQ-BOOT-IMAGE",
> > > > > > > > +       },
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"ZYNQ-UBOOT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
> > > > > > > >  void board_debug_uart_init(void)
> > > > > > > >  {
> > > > > > > > diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> > > > > > > > index 70b3c81f12..b232f7ac4f 100644
> > > > > > > > --- a/board/xilinx/zynqmp/zynqmp.c
> > > > > > > > +++ b/board/xilinx/zynqmp/zynqmp.c
> > > > > > > > @@ -9,6 +9,8 @@
> > > > > > > >  #include <cpu_func.h>
> > > > > > > >  #include <debug_uart.h>
> > > > > > > >  #include <dfu.h>
> > > > > > > > +#include <efi.h>
> > > > > > > > +#include <efi_loader.h>
> > > > > > > >  #include <env.h>
> > > > > > > >  #include <env_internal.h>
> > > > > > > >  #include <init.h>
> > > > > > > > @@ -40,6 +42,7 @@
> > > > > > > >  #include <linux/bitops.h>
> > > > > > > >  #include <linux/delay.h>
> > > > > > > >  #include <linux/sizes.h>
> > > > > > > > +#include <linux/kernel.h>
> > > > > > > >  #include "../common/board.h"
> > > > > > > >
> > > > > > > >  #include "pm_cfg_obj.h"
> > > > > > > > @@ -54,6 +57,21 @@
> > > > > > > >
> > > > > > > >  DECLARE_GLOBAL_DATA_PTR;
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +struct efi_fw_images fw_images[] = {
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"ZYNQMP-BOOT-IMAGE",
> > > > > > > > +       },
> > > > > > > > +       {
> > > > > > > > +               .image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
> > > > > > > > +               .fw_name = u"ZYNQMP-UBOOT",
> > > > > > > > +       },
> > > > > > > > +};
> > > > > > > > +
> > > > > > > > +u8 num_image_type_guids = ARRAY_SIZE(fw_images);
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
> > > > > > > >  static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
> > > > > > > >
> > > > > > > > diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
> > > > > > > > index 7e6be6050c..35df2e755e 100644
> > > > > > > > --- a/include/configs/imx8mm-cl-iot-gate.h
> > > > > > > > +++ b/include/configs/imx8mm-cl-iot-gate.h
> > > > > > > > @@ -31,6 +31,16 @@
> > > > > > > >
> > > > > > > >  #endif
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
> > > > > > > > +                0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
> > > > > > > > +
> > > > > > > > +#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
> > > > > > > > +                0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  #if CONFIG_IS_ENABLED(CMD_MMC)
> > > > > > > >  # define BOOT_TARGET_MMC(func) \
> > > > > > > >         func(MMC, mmc, 2)      \
> > > > > > > > diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
> > > > > > > > index ac4a7d0cb3..a5a845c2da 100644
> > > > > > > > --- a/include/configs/imx8mp_rsb3720.h
> > > > > > > > +++ b/include/configs/imx8mp_rsb3720.h
> > > > > > > > @@ -21,6 +21,16 @@
> > > > > > > >  #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
> > > > > > > >  #define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
> > > > > > > > +                0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
> > > > > > > > +
> > > > > > > > +#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
> > > > > > > > +                0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
> > > > > > > > +
> > > > > > > >  #ifdef CONFIG_SPL_BUILD
> > > > > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > > > > >  #define CONFIG_SPL_STACK               0x960000
> > > > > > > > diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
> > > > > > > > index 788ae77cd3..aff1b90010 100644
> > > > > > > > --- a/include/configs/kontron-sl-mx8mm.h
> > > > > > > > +++ b/include/configs/kontron-sl-mx8mm.h
> > > > > > > > @@ -38,6 +38,12 @@
> > > > > > > >  #define CONFIG_USB_MAX_CONTROLLER_COUNT        2
> > > > > > > >  #endif
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
> > > > > > > > +                0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  #ifndef CONFIG_SPL_BUILD
> > > > > > > >  #define BOOT_TARGET_DEVICES(func) \
> > > > > > > >         func(MMC, mmc, 1) \
> > > > > > > > diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
> > > > > > > > index 0f96b905ab..678364e367 100644
> > > > > > > > --- a/include/configs/kontron_pitx_imx8m.h
> > > > > > > > +++ b/include/configs/kontron_pitx_imx8m.h
> > > > > > > > @@ -14,6 +14,12 @@
> > > > > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > > > > > > >  #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
> > > > > > > > +                0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  #ifdef CONFIG_SPL_BUILD
> > > > > > > >  #define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
> > > > > > > >  #define CONFIG_SPL_STACK               0x187FF0
> > > > > > > > diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
> > > > > > > > index 448749a7f8..97d0d365f6 100644
> > > > > > > > --- a/include/configs/kontron_sl28.h
> > > > > > > > +++ b/include/configs/kontron_sl28.h
> > > > > > > > @@ -57,6 +57,12 @@
> > > > > > > >  #define CONFIG_SYS_SPL_MALLOC_START    0x80200000
> > > > > > > >  #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define KONTRON_SL28_FIT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
> > > > > > > > +                0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  /* environment */
> > > > > > > >  /* see include/configs/ti_armv7_common.h */
> > > > > > > >  #define ENV_MEM_LAYOUT_SETTINGS \
> > > > > > > > diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
> > > > > > > > index d45f606860..2f2abc746d 100644
> > > > > > > > --- a/include/configs/qemu-arm.h
> > > > > > > > +++ b/include/configs/qemu-arm.h
> > > > > > > > @@ -17,6 +17,16 @@
> > > > > > > >
> > > > > > > >  #define CONFIG_SYS_BOOTM_LEN           SZ_64M
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define QEMU_ARM_UBOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
> > > > > > > > +                0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
> > > > > > > > +
> > > > > > > > +#define QEMU_ARM64_UBOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
> > > > > > > > +                0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
> > > > > > > >
> > > > > > > >  /* Environment options */
> > > > > > > > diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
> > > > > > > > index 75efbf3448..d06c3de2e0 100644
> > > > > > > > --- a/include/configs/sandbox.h
> > > > > > > > +++ b/include/configs/sandbox.h
> > > > > > > > @@ -14,6 +14,16 @@
> > > > > > > >
> > > > > > > >  #define CONFIG_SYS_CBSIZE              1024    /* Console I/O Buffer Size */
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define SANDBOX_UBOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
> > > > > > > > +                0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
> > > > > > > > +
> > > > > > > > +#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
> > > > > > > > +                0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  /* Size of our emulated memory */
> > > > > > > >  #define SB_CONCAT(x, y) x ## y
> > > > > > > >  #define SB_TO_UL(s) SB_CONCAT(s, UL)
> > > > > > > > diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
> > > > > > > > index 8dd092fc59..07e1f56e3d 100644
> > > > > > > > --- a/include/configs/synquacer.h
> > > > > > > > +++ b/include/configs/synquacer.h
> > > > > > > > @@ -51,6 +51,20 @@
> > > > > > > >                         "fip.bin raw 180000 78000;"                     \
> > > > > > > >                         "optee.bin raw 500000 100000\0"
> > > > > > > >
> > > > > > > > +#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
> > > > > > > > +#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
> > > > > > > > +                0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
> > > > > > > > +
> > > > > > > > +#define DEVELOPERBOX_FIP_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
> > > > > > > > +                0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
> > > > > > > > +
> > > > > > > > +#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
> > > > > > > > +       EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
> > > > > > > > +                0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
> > > > > > > > +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> > > > > > > > +
> > > > > > > >  /* Distro boot settings */
> > > > > > > >  #ifndef CONFIG_SPL_BUILD
> > > > > > > >  #ifdef CONFIG_CMD_USB
> > > > > > > > diff --git a/include/efi_loader.h b/include/efi_loader.h
> > > > > > > > index af36639ec6..1965b5a28f 100644
> > > > > > > > --- a/include/efi_loader.h
> > > > > > > > +++ b/include/efi_loader.h
> > > > > > > > @@ -979,6 +979,21 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
> > > > > > > >
> > > > > > > >  #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
> > > > > > > >
> > > > > > > > +/**
> > > > > > > > + * struct efi_fw_images - List of firmware images updatable through capsule
> > > > > > > > + *                        update
> > > > > > > > + *
> > > > > > > > + * This structure gives information about the firmware images on the platform
> > > > > > > > + * which can be updated through the capsule update mechanism
> > > > > > > > + *
> > > > > > > > + * @image_type_id:     Image GUID. Same value is to be used in the capsule
> > > > > > > > + * @fw_name:           Name of the firmware image
> > > > > > > > + */
> > > > > > > > +struct efi_fw_images {
> > > > > > > > +       efi_guid_t image_type_id;
> > > > > > > > +       const u16 *fw_name;
> > > > > > > > +};
> > > > > > > > +
> > > > > > > >  /**
> > > > > > > >   * Install the ESRT system table.
> > > > > > > >   *
> > > > > > > > --
> > > > > > > > 2.25.1
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > Masami Hiramatsu
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Masami Hiramatsu
> > > >
> > > >
> > > >
> > > > --
> > > > Masami Hiramatsu
> >
> >
> >
> > --
> > Masami Hiramatsu
diff mbox series

Patch

diff --git a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
index 16566092bd..6b534660fe 100644
--- a/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
+++ b/board/advantech/imx8mp_rsb3720a1/imx8mp_rsb3720a1.c
@@ -6,6 +6,8 @@ 
 
 #include <common.h>
 #include <dwc3-uboot.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <errno.h>
 #include <miiphy.h>
 #include <netdev.h>
@@ -21,6 +23,7 @@ 
 #include <asm/arch/clock.h>
 #include <asm/mach-imx/dma.h>
 #include <linux/delay.h>
+#include <linux/kernel.h>
 #include <power/pmic.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -44,6 +47,22 @@  static void setup_gpmi_nand(void)
 }
 #endif
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+#if defined(CONFIG_TARGET_IMX8MP_RSB3720A1_4G)
+		.image_type_id = IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID,
+#elif defined(CONFIG_TARGET_IMX8MP_RSB3720A1_6G)
+		.image_type_id = IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID,
+#endif
+		.fw_name = u"IMX8MP-RSB3720-FIT"
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
+
 int board_early_init_f(void)
 {
 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
diff --git a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
index 7e2d88f449..ec73d75db3 100644
--- a/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
+++ b/board/compulab/imx8mm-cl-iot-gate/imx8mm-cl-iot-gate.c
@@ -5,6 +5,8 @@ 
  */
 
 #include <common.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <env.h>
 #include <extension_board.h>
 #include <hang.h>
@@ -21,11 +23,27 @@ 
 #include <asm/mach-imx/gpio.h>
 #include <asm/mach-imx/mxc_i2c.h>
 #include <asm/sections.h>
+#include <linux/kernel.h>
 
 #include "ddr/ddr.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+#if defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE)
+		.image_type_id = IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID,
+#elif defined(CONFIG_TARGET_IMX8MM_CL_IOT_GATE_OPTEE)
+		.image_type_id = IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID,
+#endif
+		.fw_name = u"IMX8MM-CL-IOT-GATE-FIT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 int board_phys_sdram_size(phys_size_t *size)
 {
 	struct lpddr4_tcm_desc *lpddr4_tcm_desc =
diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
index 16d5a97167..99872ce0b8 100644
--- a/board/emulation/qemu-arm/qemu-arm.c
+++ b/board/emulation/qemu-arm/qemu-arm.c
@@ -6,15 +6,35 @@ 
 #include <common.h>
 #include <cpu_func.h>
 #include <dm.h>
+#include <efi.h>
+#include <efi_loader.h>
+#include <efi_loader.h>
 #include <fdtdec.h>
 #include <init.h>
 #include <log.h>
 #include <virtio_types.h>
 #include <virtio.h>
 
+#include <linux/kernel.h>
+
 #ifdef CONFIG_ARM64
 #include <asm/armv8/mmu.h>
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+#if defined(CONFIG_TARGET_QEMU_ARM_32BIT)
+		.image_type_id = QEMU_ARM_UBOOT_IMAGE_GUID,
+#elif defined(CONFIG_TARGET_QEMU_ARM_64BIT)
+		.image_type_id = QEMU_ARM64_UBOOT_IMAGE_GUID,
+#endif
+		.fw_name = u"Qemu-Arm-UBOOT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 static struct mm_region qemu_arm64_mem_map[] = {
 	{
 		/* Flash */
diff --git a/board/kontron/pitx_imx8m/pitx_imx8m.c b/board/kontron/pitx_imx8m/pitx_imx8m.c
index d655fe099b..c3af951b14 100644
--- a/board/kontron/pitx_imx8m/pitx_imx8m.c
+++ b/board/kontron/pitx_imx8m/pitx_imx8m.c
@@ -2,6 +2,8 @@ 
 
 #include "pitx_misc.h"
 #include <common.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <init.h>
 #include <mmc.h>
 #include <miiphy.h>
@@ -12,7 +14,7 @@ 
 #include <asm/mach-imx/gpio.h>
 #include <asm/mach-imx/iomux-v3.h>
 #include <linux/delay.h>
-
+#include <linux/kernel.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -30,6 +32,17 @@  static iomux_v3_cfg_t const uart_pads[] = {
 	IMX8MQ_PAD_ECSPI1_MISO__UART3_CTS_B | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = KONTRON_PITX_IMX8M_FIT_IMAGE_GUID,
+		.fw_name = u"KONTRON-PITX-IMX8M-UBOOT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 int board_early_init_f(void)
 {
 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
diff --git a/board/kontron/sl-mx8mm/sl-mx8mm.c b/board/kontron/sl-mx8mm/sl-mx8mm.c
index 48376cb826..4d25618895 100644
--- a/board/kontron/sl-mx8mm/sl-mx8mm.c
+++ b/board/kontron/sl-mx8mm/sl-mx8mm.c
@@ -6,12 +6,26 @@ 
 #include <asm/arch/imx-regs.h>
 #include <asm/global_data.h>
 #include <asm/io.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <fdt_support.h>
 #include <linux/errno.h>
+#include <linux/kernel.h>
 #include <net.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = KONTRON_SL_MX8MM_FIT_IMAGE_GUID,
+		.fw_name = u"KONTROL-SL-MX8MM-UBOOT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 int board_phys_sdram_size(phys_size_t *size)
 {
 	u32 ddr_size = readl(M4_BOOTROM_BASE_ADDR);
diff --git a/board/kontron/sl28/sl28.c b/board/kontron/sl28/sl28.c
index 3c48a9141d..a4985df4ea 100644
--- a/board/kontron/sl28/sl28.c
+++ b/board/kontron/sl28/sl28.c
@@ -3,11 +3,14 @@ 
 #include <common.h>
 #include <dm.h>
 #include <malloc.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <errno.h>
 #include <fsl_ddr.h>
 #include <fdt_support.h>
 #include <asm/global_data.h>
 #include <linux/libfdt.h>
+#include <linux/kernel.h>
 #include <env_internal.h>
 #include <asm/arch-fsl-layerscape/soc.h>
 #include <asm/arch-fsl-layerscape/fsl_icid.h>
@@ -23,6 +26,17 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = KONTRON_SL28_FIT_IMAGE_GUID,
+		.fw_name = u"KONTRON-SL28-FIT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 int board_early_init_f(void)
 {
 	fsl_lsch3_early_init_f();
diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
index 5d9a945d64..8b0f3de1ea 100644
--- a/board/sandbox/sandbox.c
+++ b/board/sandbox/sandbox.c
@@ -7,6 +7,8 @@ 
 #include <cpu_func.h>
 #include <cros_ec.h>
 #include <dm.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <env_internal.h>
 #include <init.h>
 #include <led.h>
@@ -25,6 +27,21 @@ 
  */
 gd_t *gd;
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = SANDBOX_UBOOT_IMAGE_GUID,
+		.fw_name = u"SANDBOX-UBOOT",
+	},
+	{
+		.image_type_id = SANDBOX_UBOOT_ENV_IMAGE_GUID,
+		.fw_name = u"SANDBOX-UBOOT-ENV",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
 /*
  * Add a simple GPIO device (don't use with of-platdata as it interferes with
diff --git a/board/socionext/developerbox/developerbox.c b/board/socionext/developerbox/developerbox.c
index 9552bfcdc3..4df26f4019 100644
--- a/board/socionext/developerbox/developerbox.c
+++ b/board/socionext/developerbox/developerbox.c
@@ -10,10 +10,33 @@ 
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <common.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <env_internal.h>
 #include <fdt_support.h>
 #include <log.h>
 
+#include <linux/kernel.h>
+
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = DEVELOPERBOX_UBOOT_IMAGE_GUID,
+		.fw_name = u"DEVELOPERBOX-UBOOT",
+	},
+	{
+		.image_type_id = DEVELOPERBOX_FIP_IMAGE_GUID,
+		.fw_name = u"DEVELOPERBOX-FIP",
+	},
+	{
+		.image_type_id = DEVELOPERBOX_OPTEE_IMAGE_GUID,
+		.fw_name = u"DEVELOPERBOX-OPTEE",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 static struct mm_region sc2a11_mem_map[] = {
 	{
 		.virt = 0x0UL,
diff --git a/board/xilinx/common/board.h b/board/xilinx/common/board.h
index 69e642429b..9bcac14946 100644
--- a/board/xilinx/common/board.h
+++ b/board/xilinx/common/board.h
@@ -7,6 +7,24 @@ 
 #ifndef _BOARD_XILINX_COMMON_BOARD_H
 #define _BOARD_XILINX_COMMON_BOARD_H
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define ZYNQ_BOOT_IMAGE_GUID \
+	EFI_GUID(0x1ba29a15, 0x9969, 0x40aa, 0xb4, 0x24, \
+		 0xe8, 0x61, 0x21, 0x61, 0x86, 0x64)
+
+#define ZYNQ_UBOOT_IMAGE_GUID \
+	EFI_GUID(0x1a5178f0, 0x87d3, 0x4f36, 0xac, 0x63, \
+		 0x3b, 0x31, 0xa2, 0x3b, 0xe3, 0x05)
+
+#define ZYNQMP_BOOT_IMAGE_GUID \
+	EFI_GUID(0xde6066e8, 0x0256, 0x4fad, 0x82, 0x38, \
+		 0xe4, 0x06, 0xe2, 0x74, 0xc4, 0xcf)
+
+#define ZYNQMP_UBOOT_IMAGE_GUID \
+	EFI_GUID(0xcf9ecfd4, 0x938b, 0x41c5, 0x85, 0x51, \
+		 0x1f, 0x88, 0x3a, 0xb7, 0xdc, 0x18)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 int board_late_init_xilinx(void);
 
 int xilinx_read_eeprom(void);
diff --git a/board/xilinx/zynq/board.c b/board/xilinx/zynq/board.c
index 26ef048835..0aa51a3e6d 100644
--- a/board/xilinx/zynq/board.c
+++ b/board/xilinx/zynq/board.c
@@ -8,6 +8,8 @@ 
 #include <init.h>
 #include <log.h>
 #include <dm/uclass.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <env.h>
 #include <env_internal.h>
 #include <fdtdec.h>
@@ -21,10 +23,26 @@ 
 #include <asm/global_data.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/sys_proto.h>
+#include <linux/kernel.h>
 #include "../common/board.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = ZYNQ_BOOT_IMAGE_GUID,
+		.fw_name = u"ZYNQ-BOOT-IMAGE",
+	},
+	{
+		.image_type_id = ZYNQ_UBOOT_IMAGE_GUID,
+		.fw_name = u"ZYNQ-UBOOT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_DEBUG_UART_BOARD_INIT)
 void board_debug_uart_init(void)
 {
diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 70b3c81f12..b232f7ac4f 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -9,6 +9,8 @@ 
 #include <cpu_func.h>
 #include <debug_uart.h>
 #include <dfu.h>
+#include <efi.h>
+#include <efi_loader.h>
 #include <env.h>
 #include <env_internal.h>
 #include <init.h>
@@ -40,6 +42,7 @@ 
 #include <linux/bitops.h>
 #include <linux/delay.h>
 #include <linux/sizes.h>
+#include <linux/kernel.h>
 #include "../common/board.h"
 
 #include "pm_cfg_obj.h"
@@ -54,6 +57,21 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+struct efi_fw_images fw_images[] = {
+	{
+		.image_type_id = ZYNQMP_BOOT_IMAGE_GUID,
+		.fw_name = u"ZYNQMP-BOOT-IMAGE",
+	},
+	{
+		.image_type_id = ZYNQMP_UBOOT_IMAGE_GUID,
+		.fw_name = u"ZYNQMP-UBOOT",
+	},
+};
+
+u8 num_image_type_guids = ARRAY_SIZE(fw_images);
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 #if CONFIG_IS_ENABLED(FPGA) && defined(CONFIG_FPGA_ZYNQMPPL)
 static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
 
diff --git a/include/configs/imx8mm-cl-iot-gate.h b/include/configs/imx8mm-cl-iot-gate.h
index 7e6be6050c..35df2e755e 100644
--- a/include/configs/imx8mm-cl-iot-gate.h
+++ b/include/configs/imx8mm-cl-iot-gate.h
@@ -31,6 +31,16 @@ 
 
 #endif
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define IMX8MM_CL_IOT_GATE_FIT_IMAGE_GUID \
+	EFI_GUID(0x7a32a939, 0xab92, 0x467b, 0x91, 0x52, \
+		 0x74, 0x77, 0x1b, 0x95, 0xe6, 0x46)
+
+#define IMX8MM_CL_IOT_GATE_OPTEE_FIT_IMAGE_GUID \
+	EFI_GUID(0x0bf1165c, 0x1831, 0x4864, 0x94, 0x5e, \
+		 0xac, 0x3d, 0x38, 0x48, 0xf4, 0x99)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 #if CONFIG_IS_ENABLED(CMD_MMC)
 # define BOOT_TARGET_MMC(func) \
 	func(MMC, mmc, 2)      \
diff --git a/include/configs/imx8mp_rsb3720.h b/include/configs/imx8mp_rsb3720.h
index ac4a7d0cb3..a5a845c2da 100644
--- a/include/configs/imx8mp_rsb3720.h
+++ b/include/configs/imx8mp_rsb3720.h
@@ -21,6 +21,16 @@ 
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION	1
 #define CONFIG_SYS_UBOOT_BASE	(QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define IMX8MP_RSB3720A1_4G_FIT_IMAGE_GUID \
+	EFI_GUID(0xb1251e89, 0x384a, 0x4635, 0xa8, 0x06, \
+		 0x3a, 0xa0, 0xb0, 0xe9, 0xf9, 0x65)
+
+#define IMX8MP_RSB3720A1_6G_FIT_IMAGE_GUID \
+	EFI_GUID(0xb5fb6f08, 0xe142, 0x4db1, 0x97, 0xea, \
+		 0x5f, 0xd3, 0x6b, 0x9b, 0xe5, 0xb9)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT*/
+
 #ifdef CONFIG_SPL_BUILD
 #define CONFIG_SPL_LDSCRIPT		"arch/arm/cpu/armv8/u-boot-spl.lds"
 #define CONFIG_SPL_STACK		0x960000
diff --git a/include/configs/kontron-sl-mx8mm.h b/include/configs/kontron-sl-mx8mm.h
index 788ae77cd3..aff1b90010 100644
--- a/include/configs/kontron-sl-mx8mm.h
+++ b/include/configs/kontron-sl-mx8mm.h
@@ -38,6 +38,12 @@ 
 #define CONFIG_USB_MAX_CONTROLLER_COUNT	2
 #endif
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define KONTRON_SL_MX8MM_FIT_IMAGE_GUID \
+	EFI_GUID(0xd488e45a, 0x4929, 0x4b55, 0x8c, 0x14, \
+		 0x86, 0xce, 0xa2, 0xcd, 0x66, 0x29)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 #ifndef CONFIG_SPL_BUILD
 #define BOOT_TARGET_DEVICES(func) \
 	func(MMC, mmc, 1) \
diff --git a/include/configs/kontron_pitx_imx8m.h b/include/configs/kontron_pitx_imx8m.h
index 0f96b905ab..678364e367 100644
--- a/include/configs/kontron_pitx_imx8m.h
+++ b/include/configs/kontron_pitx_imx8m.h
@@ -14,6 +14,12 @@ 
 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
 #define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR	0x300
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define KONTRON_PITX_IMX8M_FIT_IMAGE_GUID \
+	EFI_GUID(0xc898e959, 0x5b1f, 0x4e6d, 0x88, 0xe0, \
+		 0x40, 0xd4, 0x5c, 0xca, 0x13, 0x99)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 #ifdef CONFIG_SPL_BUILD
 #define CONFIG_SPL_LDSCRIPT		"arch/arm/cpu/armv8/u-boot-spl.lds"
 #define CONFIG_SPL_STACK		0x187FF0
diff --git a/include/configs/kontron_sl28.h b/include/configs/kontron_sl28.h
index 448749a7f8..97d0d365f6 100644
--- a/include/configs/kontron_sl28.h
+++ b/include/configs/kontron_sl28.h
@@ -57,6 +57,12 @@ 
 #define CONFIG_SYS_SPL_MALLOC_START	0x80200000
 #define CONFIG_SYS_MONITOR_LEN		(1024 * 1024)
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define KONTRON_SL28_FIT_IMAGE_GUID \
+	EFI_GUID(0x86ebd44f, 0xfeb8, 0x466f, 0x8b, 0xb8, \
+		 0x89, 0x06, 0x18, 0x45, 0x6d, 0x8b)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 /* environment */
 /* see include/configs/ti_armv7_common.h */
 #define ENV_MEM_LAYOUT_SETTINGS \
diff --git a/include/configs/qemu-arm.h b/include/configs/qemu-arm.h
index d45f606860..2f2abc746d 100644
--- a/include/configs/qemu-arm.h
+++ b/include/configs/qemu-arm.h
@@ -17,6 +17,16 @@ 
 
 #define CONFIG_SYS_BOOTM_LEN		SZ_64M
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define QEMU_ARM_UBOOT_IMAGE_GUID \
+	EFI_GUID(0xf885b085, 0x99f8, 0x45af, 0x84, 0x7d, \
+		 0xd5, 0x14, 0x10, 0x7a, 0x4a, 0x2c)
+
+#define QEMU_ARM64_UBOOT_IMAGE_GUID \
+	EFI_GUID(0x058b7d83, 0x50d5, 0x4c47, 0xa1, 0x95, \
+		 0x60, 0xd8, 0x6a, 0xd3, 0x41, 0xc4)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 /* For timer, QEMU emulates an ARMv7/ARMv8 architected timer */
 
 /* Environment options */
diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
index 75efbf3448..d06c3de2e0 100644
--- a/include/configs/sandbox.h
+++ b/include/configs/sandbox.h
@@ -14,6 +14,16 @@ 
 
 #define CONFIG_SYS_CBSIZE		1024	/* Console I/O Buffer Size */
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define SANDBOX_UBOOT_IMAGE_GUID \
+	EFI_GUID(0x09d7cf52, 0x0720, 0x4710, 0x91, 0xd1, \
+		 0x08, 0x46, 0x9b, 0x7f, 0xe9, 0xc8)
+
+#define SANDBOX_UBOOT_ENV_IMAGE_GUID \
+	EFI_GUID(0x5a7021f5, 0xfef2, 0x48b4, 0xaa, 0xba, \
+		 0x83, 0x2e, 0x77, 0x74, 0x18, 0xc0)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 /* Size of our emulated memory */
 #define SB_CONCAT(x, y) x ## y
 #define SB_TO_UL(s) SB_CONCAT(s, UL)
diff --git a/include/configs/synquacer.h b/include/configs/synquacer.h
index 8dd092fc59..07e1f56e3d 100644
--- a/include/configs/synquacer.h
+++ b/include/configs/synquacer.h
@@ -51,6 +51,20 @@ 
 			"fip.bin raw 180000 78000;"			\
 			"optee.bin raw 500000 100000\0"
 
+#if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
+#define DEVELOPERBOX_UBOOT_IMAGE_GUID \
+	EFI_GUID(0x53a92e83, 0x4ef4, 0x473a, 0x8b, 0x0d, \
+		 0xb5, 0xd8, 0xc7, 0xb2, 0xd6, 0x00)
+
+#define DEVELOPERBOX_FIP_IMAGE_GUID \
+	EFI_GUID(0x880866e9, 0x84ba, 0x4793, 0xa9, 0x08, \
+		 0x33, 0xe0, 0xb9, 0x16, 0xf3, 0x98)
+
+#define DEVELOPERBOX_OPTEE_IMAGE_GUID \
+	EFI_GUID(0xc1b629f1, 0xce0e, 0x4894, 0x82, 0xbf, \
+		 0xf0, 0xa3, 0x83, 0x87, 0xe6, 0x30)
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
 /* Distro boot settings */
 #ifndef CONFIG_SPL_BUILD
 #ifdef CONFIG_CMD_USB
diff --git a/include/efi_loader.h b/include/efi_loader.h
index af36639ec6..1965b5a28f 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -979,6 +979,21 @@  efi_status_t efi_capsule_authenticate(const void *capsule,
 
 #define EFI_CAPSULE_DIR u"\\EFI\\UpdateCapsule\\"
 
+/**
+ * struct efi_fw_images - List of firmware images updatable through capsule
+ *                        update
+ *
+ * This structure gives information about the firmware images on the platform
+ * which can be updated through the capsule update mechanism
+ *
+ * @image_type_id:	Image GUID. Same value is to be used in the capsule
+ * @fw_name:		Name of the firmware image
+ */
+struct efi_fw_images {
+	efi_guid_t image_type_id;
+	const u16 *fw_name;
+};
+
 /**
  * Install the ESRT system table.
  *