]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
test: dm: Add test cases for FWU Metadata uclass
authorSughosh Ganu <sughosh.ganu@linaro.org>
Fri, 21 Oct 2022 12:46:05 +0000 (18:16 +0530)
committerTom Rini <trini@konsulko.com>
Mon, 31 Oct 2022 18:47:33 +0000 (14:47 -0400)
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>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
arch/sandbox/Kconfig
arch/sandbox/dts/test.dts
board/sandbox/sandbox.c
configs/sandbox64_defconfig
lib/fwu_updates/fwu.c
test/dm/Makefile
test/dm/fwu_mdata.c [new file with mode: 0644]
test/dm/fwu_mdata_disk_image.h [new file with mode: 0644]
test/py/tests/test_efi_capsule/test_capsule_firmware_fit.py
test/py/tests/test_efi_capsule/test_capsule_firmware_signed_fit.py
tools/Makefile

index 35508c6b2928bc0cf80ae540f4458c84b698de88..96b3402b47c187f6e62156475f626dc49da8841e 100644 (file)
@@ -72,3 +72,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
index 25fd2bcab871f715eb3eb5a909f456244fa35a8c..dffe10adbf4766b40a23e41f978d9475d06c5452 100644 (file)
        };
 
        /* This is used for the fastboot tests */
-       mmc0 {
+       mmc0: mmc0 {
                compatible = "sandbox,mmc";
        };
 
        thermal {
                compatible = "sandbox,thermal";
        };
+
+       fwu-mdata {
+               compatible = "u-boot,fwu-mdata-gpt";
+               fwu-mdata-store = <&mmc0>;
+       };
 };
 
 #include "sandbox_pmic.dtsi"
index 38cfa0832d72d6d96c77217f791e343309c1d8de..4d89f9be1cd91f013643f534fde244083b5f7f1e 100644 (file)
@@ -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
index af2ce34174e2259e0ec5c9ef578781f70eca5ff8..d43390bca339dd5dfb8a6a3cf991bbf826db89ff 100644 (file)
@@ -250,9 +250,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
index 6e159c050c502f55361468ac305696a429fbb5a7..5313d0730202af37564e5779bb57c958cd9a96c9 100644 (file)
@@ -659,6 +659,12 @@ static int fwu_boottime_checks(void *ctx, struct event *event)
        struct udevice *dev;
        struct fwu_mdata mdata = { 0 };
 
+       /* Don't have boot time checks on sandbox */
+       if (IS_ENABLED(CONFIG_SANDBOX)) {
+               boottime_check = 1;
+               return 0;
+       }
+
        ret = fwu_check_mdata_validity();
        if (ret)
                return 0;
index cc3cc454f7fbb8787325d06e8238314844f8af58..1901f22a0cb7a3294fd5312bfe6afa6666fac08b 100644 (file)
@@ -48,6 +48,7 @@ obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fastboot.o
 endif
 obj-$(CONFIG_FIRMWARE) += firmware.o
 obj-$(CONFIG_DM_FPGA) += fpga.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 (file)
index 0000000..b179a65
--- /dev/null
@@ -0,0 +1,147 @@
+// 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_err(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_err(UCLASS_FWU_MDATA, &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_err(UCLASS_FWU_MDATA, &dev));
+
+       ut_assertok(fwu_check_mdata_validity());
+
+       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 (file)
index 0000000..b980341
--- /dev/null
@@ -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} } }
index 8f75b554ad7aa5ac5e0f78e8b00e28c37dd626cf..d28b53a1a15cba686d04607c8ade2e5122a8a150 100644 (file)
@@ -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')
index d6ca9b16745eedb56ee950968a3f6874c22d0f75..8c2d616fd06cc8e6d28172312575709df11cc798 100644 (file)
@@ -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')
index af6a710c2dd7c7e8997e5164ff1f9e6fe6194726..26be0a7ba2eabb9cff10118cfd102ffd285fb8ba 100644 (file)
@@ -72,7 +72,9 @@ 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
+ifneq ($(CONFIG_CMD_BOOTEFI_SELFTEST)$(CONFIG_FWU_MDATA_GPT_BLK),)
+hostprogs-y += file2include
+endif
 
 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