Re: [PATCH v13 12/15] test: dm: Add test cases for FWU Metadata uclass

Etienne Carriere
2022-10-06T14:06:48Z

Hi Sughosh,

On Thu, 6 Oct 2022 at 11:07, Sughosh Ganu <sughosh.ganu@linaro.org> wrote:
>
> Add test cases for accessing the FWU Metadata on the sandbox
> platform. The sandbox platform also uses the metadata access driver
> for GPT partitioned block devices.
>
> The FWU feature will be tested on the sandbox64 variant with a raw
> capsule. Remove the FIT capsule testing from sandbox64 defconfig --
> the FIT capsule test will be run on the sandbox_flattree variant.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
> Suggested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
> Changes since V12: None
>
> arch/sandbox/Kconfig | 6 +
> arch/sandbox/dts/test.dts | 7 +-
> board/sandbox/sandbox.c | 8 +
> configs/sandbox64_defconfig | 5 +-
> lib/fwu_updates/fwu.c | 6 +
> test/dm/Makefile | 1 +
> test/dm/fwu_mdata.c | 149 ++++++++++++++++++
> test/dm/fwu_mdata_disk_image.h | 112 +++++++++++++
> .../test_capsule_firmware_fit.py | 1 -
> .../test_capsule_firmware_signed_fit.py | 1 -
> tools/Makefile | 2 +-
> 11 files changed, 293 insertions(+), 5 deletions(-)
> create mode 100644 test/dm/fwu_mdata.c
> create mode 100644 test/dm/fwu_mdata_disk_image.h
>
> diff --git a/arch/sandbox/Kconfig b/arch/sandbox/Kconfig
> index 852a7c8bf2..40cdea7d46 100644
> --- a/arch/sandbox/Kconfig
> +++ b/arch/sandbox/Kconfig
> @@ -84,3 +84,9 @@ config SYS_FDT_LOAD_ADDR
> See `doc/arch/sandbox.rst` for more information.
>
> endmenu
> +
> +config FWU_NUM_BANKS
> + default 2
> +
> +config FWU_NUM_IMAGES_PER_BANK
> + default 2
> diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
> index 4ee471238e..a4f6fc3abe 100644
> --- a/arch/sandbox/dts/test.dts
> +++ b/arch/sandbox/dts/test.dts
> @@ -950,7 +950,7 @@
> };
>
> /* This is used for the fastboot tests */
> - mmc0 {
> + mmc0: mmc0 {
> compatible = "sandbox,mmc";
> };
>
> @@ -1690,6 +1690,11 @@
> compatible = "sandbox,regmap_test";
> };
> };
> +
> + fwu-mdata {
> + compatible = "u-boot,fwu-mdata-gpt";
> + fwu-mdata-store = <&mmc0>;
> + };
> };
>
> #include "sandbox_pmic.dtsi"
> diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
> index ca9a2ca5b1..c3d0c35444 100644
> --- a/board/sandbox/sandbox.c
> +++ b/board/sandbox/sandbox.c
> @@ -164,3 +164,11 @@ int init_addr_map(void)
>
> return 0;
> }
> +
> +#if defined(CONFIG_FWU_MULTI_BANK_UPDATE)
> +void fwu_plat_get_bootidx(uint *boot_idx)
> +{
> + /* Dummy value */
> + *boot_idx = 0;
> +}
> +#endif
> diff --git a/configs/sandbox64_defconfig b/configs/sandbox64_defconfig
> index b20b181ab1..8b0d35f484 100644
> --- a/configs/sandbox64_defconfig
> +++ b/configs/sandbox64_defconfig
> @@ -244,9 +244,12 @@ CONFIG_LZ4=y
> CONFIG_ERRNO_STR=y
> CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
> CONFIG_EFI_CAPSULE_ON_DISK=y
> -CONFIG_EFI_CAPSULE_FIRMWARE_FIT=y
> +CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
> CONFIG_EFI_SECURE_BOOT=y
> CONFIG_TEST_FDTDEC=y
> CONFIG_UNIT_TEST=y
> CONFIG_UT_TIME=y
> CONFIG_UT_DM=y
> +CONFIG_FWU_MDATA=y
> +CONFIG_FWU_MDATA_GPT_BLK=y
> +CONFIG_FWU_MULTI_BANK_UPDATE=y
> diff --git a/lib/fwu_updates/fwu.c b/lib/fwu_updates/fwu.c
> index ea8d4144b2..9e3d9e962a 100644
> --- a/lib/fwu_updates/fwu.c
> +++ b/lib/fwu_updates/fwu.c
> @@ -551,6 +551,12 @@ static int fwu_boottime_checks(void *ctx, struct event *event)
> struct udevice *dev;
> u32 boot_idx, active_idx;
>
> + /* Don't have boot time checks on sandbox */
> + if (IS_ENABLED(CONFIG_SANDBOX)) {
> + boottime_check = 1;
> + return 0;
> + }
> +
> ret = fwu_get_dev_mdata(&dev, NULL);
> if (ret)
> return ret;
> diff --git a/test/dm/Makefile b/test/dm/Makefile
> index 5178daa7cf..8b2ac9e989 100644
> --- a/test/dm/Makefile
> +++ b/test/dm/Makefile
> @@ -47,6 +47,7 @@ ifneq ($(CONFIG_EFI_PARTITION),)
> obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fastboot.o
> endif
> obj-$(CONFIG_FIRMWARE) += firmware.o
> +obj-$(CONFIG_FWU_MDATA_GPT_BLK) += fwu_mdata.o
> obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock.o
> obj-$(CONFIG_DM_I2C) += i2c.o
> obj-$(CONFIG_SOUND) += i2s.o
> diff --git a/test/dm/fwu_mdata.c b/test/dm/fwu_mdata.c
> new file mode 100644
> index 0000000000..3401fb64d5
> --- /dev/null
> +++ b/test/dm/fwu_mdata.c
> @@ -0,0 +1,149 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2022, Linaro Limited
> + * Copyright (c) 2022, Heinrich Schuchardt <xypron.glpk@gmx.de>
> + */
> +
> +#include <blk.h>
> +#include <common.h>
> +#include <dm.h>
> +#include <fwu.h>
> +#include <fwu_mdata.h>
> +#include <log.h>
> +#include <malloc.h>
> +#include <memalign.h>
> +#include <part.h>
> +
> +#include <dm/test.h>
> +#include <test/ut.h>
> +
> +#include "fwu_mdata_disk_image.h"
> +
> +/* Block size of compressed disk image */
> +#define COMPRESSED_DISK_IMAGE_BLOCK_SIZE 8
> +
> +static struct udevice *mmc_dev;
> +static struct blk_desc *dev_desc;
> +
> +/* One 8 byte block of the compressed disk image */
> +struct line {
> + size_t addr;
> + char *line;
> +};
> +
> +/* Compressed disk image */
> +struct compressed_disk_image {
> + size_t length;
> + struct line lines[];
> +};
> +
> +static const struct compressed_disk_image img = FWU_MDATA_DISK_IMG;
> +
> +/* Decompressed disk image */
> +static u8 *image;
> +
> +static int setup_blk_device(struct unit_test_state *uts)
> +{
> + ut_assertok(uclass_get_device(UCLASS_MMC, 0, &mmc_dev));
> + ut_assertok(blk_get_device_by_str("mmc", "0", &dev_desc));
> +
> + return 0;
> +}
> +
> +static int populate_mmc_disk_image(struct unit_test_state *uts)
> +{
> + u8 *buf;
> + size_t i;
> + size_t addr;
> + size_t len;
> +
> + buf = malloc(img.length);
> + if (!buf)
> + return -ENOMEM;
> +
> + memset(buf, 0, img.length);
> +
> + for (i = 0; ; i++) {
> + if (!img.lines[i].line)
> + break;
> + addr = img.lines[i].addr;
> + len = COMPRESSED_DISK_IMAGE_BLOCK_SIZE;
> + if (addr + len > img.length)
> + len = img.length - addr;
> + memcpy(buf + addr, img.lines[i].line, len);
> + }
> + image = buf;
> +
> + return 0;
> +}
> +
> +static int write_mmc_blk_device(struct unit_test_state *uts)
> +{
> + lbaint_t blkcnt;
> +
> + blkcnt = BLOCK_CNT(img.length, dev_desc);
> +
> + ut_asserteq(blkcnt, blk_dwrite(dev_desc, 0, blkcnt, image));
> +
> + return 0;
> +}
> +
> +static int dm_test_fwu_mdata_read(struct unit_test_state *uts)
> +{
> + struct udevice *dev;
> + struct fwu_mdata mdata = { 0 };
> +
> + ut_assertok(uclass_first_device(UCLASS_FWU_MDATA, &dev));
> + ut_assertok(setup_blk_device(uts));
> + ut_assertok(populate_mmc_disk_image(uts));
> + ut_assertok(write_mmc_blk_device(uts));
> +
> + ut_assertok(fwu_get_mdata(dev, &mdata));
> +
> + ut_asserteq(mdata.version, 0x1);
> +
> + return 0;
> +}
> +DM_TEST(dm_test_fwu_mdata_read, UT_TESTF_SCAN_FDT);
> +
> +static int dm_test_fwu_mdata_write(struct unit_test_state *uts)
> +{
> + u32 active_idx;
> + struct udevice *dev;
> + struct fwu_mdata mdata = { 0 };
> +
> + ut_assertok(setup_blk_device(uts));
> + ut_assertok(populate_mmc_disk_image(uts));
> + ut_assertok(write_mmc_blk_device(uts));
> +
> + ut_assertok(uclass_first_device(UCLASS_FWU_MDATA, &dev));
> + ut_assertnonnull(dev);
> +
> + ut_assertok(fwu_get_mdata(dev, &mdata));
> +
> + active_idx = (mdata.active_index + 1) % CONFIG_FWU_NUM_BANKS;
> + ut_assertok(fwu_set_active_index(active_idx));
> +
> + ut_assertok(fwu_get_mdata(dev, &mdata));
> + ut_asserteq(mdata.active_index, active_idx);
> +
> + return 0;
> +}
> +DM_TEST(dm_test_fwu_mdata_write, UT_TESTF_SCAN_FDT);
> +
> +static int dm_test_fwu_mdata_check(struct unit_test_state *uts)
> +{
> + struct udevice *dev;
> +
> + ut_assertok(setup_blk_device(uts));
> + ut_assertok(populate_mmc_disk_image(uts));
> + ut_assertok(write_mmc_blk_device(uts));
> +
> + ut_assertok(uclass_first_device(UCLASS_FWU_MDATA, &dev));
> + ut_assertnonnull(dev);
> +
> + ut_assertok(fwu_mdata_check(dev));
> +
> + return 0;
> +}
> +DM_TEST(dm_test_fwu_mdata_check, UT_TESTF_SCAN_FDT);
> diff --git a/test/dm/fwu_mdata_disk_image.h b/test/dm/fwu_mdata_disk_image.h
> new file mode 100644
> index 0000000000..b9803417c8
> --- /dev/null
> +++ b/test/dm/fwu_mdata_disk_image.h
> @@ -0,0 +1,112 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Non-zero 8 byte strings of a disk image
> + *
> + * Generated with tools/file2include
> + */
> +
> +#define FWU_MDATA_DISK_IMG { 0x00010000, { \
> + {0x000001c0, "\x02\x00\xee\x02\x02\x00\x01\x00"}, /* ........ */ \
> + {0x000001c8, "\x00\x00\x7f\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x000001f8, "\x00\x00\x00\x00\x00\x00\x55\xaa"}, /* ......U. */ \
> + {0x00000200, "\x45\x46\x49\x20\x50\x41\x52\x54"}, /* EFI PART */ \
> + {0x00000208, "\x00\x00\x01\x00\x5c\x00\x00\x00"}, /* ....\... */ \
> + {0x00000210, "\xa6\xf6\x92\x20\x00\x00\x00\x00"}, /* ... .... */ \
> + {0x00000218, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00000220, "\x7f\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00000228, "\x22\x00\x00\x00\x00\x00\x00\x00"}, /* "....... */ \
> + {0x00000230, "\x5e\x00\x00\x00\x00\x00\x00\x00"}, /* ^....... */ \
> + {0x00000238, "\xde\x99\xa2\x7e\x46\x34\xeb\x47"}, /* ...~F4.G */ \
> + {0x00000240, "\x87\xf6\x4f\x75\xe8\xd5\x7d\xc7"}, /* ..Ou..}. */ \
> + {0x00000248, "\x02\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00000250, "\x80\x00\x00\x00\x80\x00\x00\x00"}, /* ........ */ \
> + {0x00000258, "\x2a\x64\x03\x83\x00\x00\x00\x00"}, /* .d...... */ \
> + {0x00000400, "\xa0\x84\x7a\x8a\x87\x83\xf6\x40"}, /* ..z....@ */ \
> + {0x00000408, "\xab\x41\xa8\xb9\xa5\xa6\x0d\x23"}, /* .A.....# */ \
> + {0x00000410, "\x3d\x6c\xb9\xaa\x20\xb2\x18\x4c"}, /* =l.. ..L */ \
> + {0x00000418, "\xbc\x87\x1c\x9f\xe0\x35\x9b\x73"}, /* .....5.s */ \
> + {0x00000420, "\x22\x00\x00\x00\x00\x00\x00\x00"}, /* "....... */ \
> + {0x00000428, "\x31\x00\x00\x00\x00\x00\x00\x00"}, /* 1....... */ \
> + {0x00000438, "\x55\x00\x6e\x00\x6b\x00\x6e\x00"}, /* U.n.k.n. */ \
> + {0x00000440, "\x6f\x00\x77\x00\x6e\x00\x00\x00"}, /* o.w.n... */ \
> + {0x00000480, "\xa0\x84\x7a\x8a\x87\x83\xf6\x40"}, /* ..z....@ */ \
> + {0x00000488, "\xab\x41\xa8\xb9\xa5\xa6\x0d\x23"}, /* .A.....# */ \
> + {0x00000490, "\x57\x24\xf6\xe6\x0b\x6f\x66\x4e"}, /* W$...ofN */ \
> + {0x00000498, "\xb3\xd5\x99\x50\xa5\xc6\x4e\xc1"}, /* ...P..N. */ \
> + {0x000004a0, "\x32\x00\x00\x00\x00\x00\x00\x00"}, /* 2....... */ \
> + {0x000004a8, "\x41\x00\x00\x00\x00\x00\x00\x00"}, /* A....... */ \
> + {0x000004b8, "\x55\x00\x6e\x00\x6b\x00\x6e\x00"}, /* U.n.k.n. */ \
> + {0x000004c0, "\x6f\x00\x77\x00\x6e\x00\x00\x00"}, /* o.w.n... */ \
> + {0x00004400, "\x4e\xd5\x3f\x43\x01\x00\x00\x00"}, /* N.?C.... */ \
> + {0x00004408, "\x00\x00\x00\x00\x01\x00\x00\x00"}, /* ........ */ \
> + {0x00004410, "\x52\xcf\xd7\x09\x20\x07\x10\x47"}, /* R... ..G */ \
> + {0x00004418, "\x91\xd1\x08\x46\x9b\x7f\xe9\xc8"}, /* ...F.... */ \
> + {0x00004420, "\xeb\x2b\x27\x49\xd8\x8d\xdf\x46"}, /* .+'I...F */ \
> + {0x00004428, "\x8d\x75\x35\x6c\x65\xef\xf4\x17"}, /* .u5le... */ \
> + {0x00004430, "\x86\x7a\x05\x10\xf1\xda\x93\x4f"}, /* .z.....O */ \
> + {0x00004438, "\xba\x7f\xb1\x95\xf7\xfa\x41\x70"}, /* ......Ap */ \
> + {0x00004440, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00004448, "\x3e\xed\x62\xdb\x37\x62\xb4\x4f"}, /* >.b.7b.O */ \
> + {0x00004450, "\x80\xc4\x1b\x74\xd8\x46\xa8\xe7"}, /* ...t.F.. */ \
> + {0x00004458, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00004460, "\xf5\x21\x70\x5a\xf2\xfe\xb4\x48"}, /* .!pZ...H */ \
> + {0x00004468, "\xaa\xba\x83\x2e\x77\x74\x18\xc0"}, /* ....wt.. */ \
> + {0x00004470, "\xeb\x2b\x27\x49\xd8\x8d\xdf\x46"}, /* .+'I...F */ \
> + {0x00004478, "\x8d\x75\x35\x6c\x65\xef\xf4\x17"}, /* .u5le... */ \
> + {0x00004480, "\x3b\x0e\xd2\x0b\x9f\xab\x86\x49"}, /* ;......I */ \
> + {0x00004488, "\xb7\x90\x8d\xf3\x9c\x9c\xa3\x82"}, /* ........ */ \
> + {0x00004490, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00004498, "\x6d\xe4\x25\x0e\x15\xb6\xd3\x4c"}, /* m.%....L */ \
> + {0x000044a0, "\x94\xda\x51\x79\x8f\xb1\x9e\xb1"}, /* ..Qy.... */ \
> + {0x000044a8, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00006400, "\x4e\xd5\x3f\x43\x01\x00\x00\x00"}, /* N.?C.... */ \
> + {0x00006408, "\x00\x00\x00\x00\x01\x00\x00\x00"}, /* ........ */ \
> + {0x00006410, "\x52\xcf\xd7\x09\x20\x07\x10\x47"}, /* R... ..G */ \
> + {0x00006418, "\x91\xd1\x08\x46\x9b\x7f\xe9\xc8"}, /* ...F.... */ \
> + {0x00006420, "\xeb\x2b\x27\x49\xd8\x8d\xdf\x46"}, /* .+'I...F */ \
> + {0x00006428, "\x8d\x75\x35\x6c\x65\xef\xf4\x17"}, /* .u5le... */ \
> + {0x00006430, "\x86\x7a\x05\x10\xf1\xda\x93\x4f"}, /* .z.....O */ \
> + {0x00006438, "\xba\x7f\xb1\x95\xf7\xfa\x41\x70"}, /* ......Ap */ \
> + {0x00006440, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00006448, "\x3e\xed\x62\xdb\x37\x62\xb4\x4f"}, /* >.b.7b.O */ \
> + {0x00006450, "\x80\xc4\x1b\x74\xd8\x46\xa8\xe7"}, /* ...t.F.. */ \
> + {0x00006458, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00006460, "\xf5\x21\x70\x5a\xf2\xfe\xb4\x48"}, /* .!pZ...H */ \
> + {0x00006468, "\xaa\xba\x83\x2e\x77\x74\x18\xc0"}, /* ....wt.. */ \
> + {0x00006470, "\xeb\x2b\x27\x49\xd8\x8d\xdf\x46"}, /* .+'I...F */ \
> + {0x00006478, "\x8d\x75\x35\x6c\x65\xef\xf4\x17"}, /* .u5le... */ \
> + {0x00006480, "\x3b\x0e\xd2\x0b\x9f\xab\x86\x49"}, /* ;......I */ \
> + {0x00006488, "\xb7\x90\x8d\xf3\x9c\x9c\xa3\x82"}, /* ........ */ \
> + {0x00006490, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x00006498, "\x6d\xe4\x25\x0e\x15\xb6\xd3\x4c"}, /* m.%....L */ \
> + {0x000064a0, "\x94\xda\x51\x79\x8f\xb1\x9e\xb1"}, /* ..Qy.... */ \
> + {0x000064a8, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x0000be00, "\xa0\x84\x7a\x8a\x87\x83\xf6\x40"}, /* ..z....@ */ \
> + {0x0000be08, "\xab\x41\xa8\xb9\xa5\xa6\x0d\x23"}, /* .A.....# */ \
> + {0x0000be10, "\x3d\x6c\xb9\xaa\x20\xb2\x18\x4c"}, /* =l.. ..L */ \
> + {0x0000be18, "\xbc\x87\x1c\x9f\xe0\x35\x9b\x73"}, /* .....5.s */ \
> + {0x0000be20, "\x22\x00\x00\x00\x00\x00\x00\x00"}, /* "....... */ \
> + {0x0000be28, "\x31\x00\x00\x00\x00\x00\x00\x00"}, /* 1....... */ \
> + {0x0000be38, "\x55\x00\x6e\x00\x6b\x00\x6e\x00"}, /* U.n.k.n. */ \
> + {0x0000be40, "\x6f\x00\x77\x00\x6e\x00\x00\x00"}, /* o.w.n... */ \
> + {0x0000be80, "\xa0\x84\x7a\x8a\x87\x83\xf6\x40"}, /* ..z....@ */ \
> + {0x0000be88, "\xab\x41\xa8\xb9\xa5\xa6\x0d\x23"}, /* .A.....# */ \
> + {0x0000be90, "\x57\x24\xf6\xe6\x0b\x6f\x66\x4e"}, /* W$...ofN */ \
> + {0x0000be98, "\xb3\xd5\x99\x50\xa5\xc6\x4e\xc1"}, /* ...P..N. */ \
> + {0x0000bea0, "\x32\x00\x00\x00\x00\x00\x00\x00"}, /* 2....... */ \
> + {0x0000bea8, "\x41\x00\x00\x00\x00\x00\x00\x00"}, /* A....... */ \
> + {0x0000beb8, "\x55\x00\x6e\x00\x6b\x00\x6e\x00"}, /* U.n.k.n. */ \
> + {0x0000bec0, "\x6f\x00\x77\x00\x6e\x00\x00\x00"}, /* o.w.n... */ \
> + {0x0000fe00, "\x45\x46\x49\x20\x50\x41\x52\x54"}, /* EFI PART */ \
> + {0x0000fe08, "\x00\x00\x01\x00\x5c\x00\x00\x00"}, /* ....\... */ \
> + {0x0000fe10, "\xa2\xce\x23\xfc\x00\x00\x00\x00"}, /* ..#..... */ \
> + {0x0000fe18, "\x7f\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x0000fe20, "\x01\x00\x00\x00\x00\x00\x00\x00"}, /* ........ */ \
> + {0x0000fe28, "\x22\x00\x00\x00\x00\x00\x00\x00"}, /* "....... */ \
> + {0x0000fe30, "\x5e\x00\x00\x00\x00\x00\x00\x00"}, /* ^....... */ \
> + {0x0000fe38, "\xde\x99\xa2\x7e\x46\x34\xeb\x47"}, /* ...~F4.G */ \
> + {0x0000fe40, "\x87\xf6\x4f\x75\xe8\xd5\x7d\xc7"}, /* ..Ou..}. */ \
> + {0x0000fe48, "\x5f\x00\x00\x00\x00\x00\x00\x00"}, /* _....... */ \
> + {0x0000fe50, "\x80\x00\x00\x00\x80\x00\x00\x00"}, /* ........ */ \
> + {0x0000fe58, "\x2a\x64\x03\x83\x00\x00\x00\x00"}, /* .d...... */ \
> + {0, NULL} } }
> diff --git a/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py b/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py
> index 8f75b554ad..d28b53a1a1 100644
> --- a/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py
> +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py
> @@ -13,7 +13,6 @@ import pytest
> from capsule_defs import *
>
>
> -@pytest.mark.boardspec('sandbox64')
> @pytest.mark.boardspec('sandbox_flattree')
> @pytest.mark.buildconfigspec('efi_capsule_firmware_fit')
> @pytest.mark.buildconfigspec('efi_capsule_on_disk')
> diff --git a/test/py/tests/test_efi_capsule/test_capsule_firmware_signed_fit.py b/test/py/tests/test_efi_capsule/test_capsule_firmware_signed_fit.py
> index d6ca9b1674..8c2d616fd0 100644
> --- a/test/py/tests/test_efi_capsule/test_capsule_firmware_signed_fit.py
> +++ b/test/py/tests/test_efi_capsule/test_capsule_firmware_signed_fit.py
> @@ -14,7 +14,6 @@ with signed capsule files containing FIT images
> import pytest
> from capsule_defs import CAPSULE_DATA_DIR, CAPSULE_INSTALL_DIR
>
> -@pytest.mark.boardspec('sandbox64')
> @pytest.mark.boardspec('sandbox_flattree')
> @pytest.mark.buildconfigspec('efi_capsule_firmware_fit')
> @pytest.mark.buildconfigspec('efi_capsule_authenticate')
> diff --git a/tools/Makefile b/tools/Makefile
> index 34a1aa7a8b..27687d5cd9 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -74,7 +74,7 @@ mkenvimage-objs := mkenvimage.o os_support.o lib/crc32.o
> hostprogs-y += dumpimage mkimage
> hostprogs-$(CONFIG_TOOLS_LIBCRYPTO) += fit_info fit_check_sign
>
> -hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
> +hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST)$(CONFIG_FWU_MDATA_GPT_BLK) += file2include

Late catch, my apologies. This won't work when both switches are enable.
Prefer something like:

+ifneq (,$(filter y,$(CONFIG_CMD_BOOTEFI_SELFTEST) $(CONFIG_FWU_MDATA_GPT_BLK)))
+hostprogs-y += file2include
+endif

br,
etienne

>
> FIT_OBJS-y := fit_common.o fit_image.o image-host.o boot/image-fit.o
> FIT_SIG_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := image-sig-host.o boot/image-fit-sig.o
> --
> 2.34.1
>