public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Sean Anderson <seanga2@gmail.com>
To: u-boot@lists.denx.de, Tom Rini <trini@konsulko.com>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>,
	Harald Seiler <hws@denx.de>, Simon Glass <sjg@chromium.org>,
	Sean Anderson <seanga2@gmail.com>,
	Jaehoon Chung <jh80.chung@samsung.com>,
	Peng Fan <peng.fan@nxp.com>
Subject: [PATCH 23/26] test: spl: Add a test for the MMC load method
Date: Wed, 11 Oct 2023 21:56:23 -0400	[thread overview]
Message-ID: <20231012015626.3487451-24-seanga2@gmail.com> (raw)
In-Reply-To: <20231012015626.3487451-1-seanga2@gmail.com>

Add a test for the MMC load method. This shows the general shape of tests
to come: The main test function calls do_spl_test_load with an appropriate
callback to write the image to the medium.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
---

 configs/sandbox_noinst_defconfig |  2 +
 include/spl.h                    |  4 ++
 include/test/spl.h               | 30 +++++++++++++++
 test/image/Kconfig               |  1 +
 test/image/spl_load.c            | 36 +++++++++++++++++
 test/image/spl_load_fs.c         | 66 +++++++++++++++++++++++++++++---
 6 files changed, 134 insertions(+), 5 deletions(-)

diff --git a/configs/sandbox_noinst_defconfig b/configs/sandbox_noinst_defconfig
index 11be2dccf7d..4f16d9860d2 100644
--- a/configs/sandbox_noinst_defconfig
+++ b/configs/sandbox_noinst_defconfig
@@ -41,6 +41,8 @@ CONFIG_SPL_SYS_MALLOC=y
 CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y
 CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0xa000000
 CONFIG_SPL_SYS_MALLOC_SIZE=0x4000000
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x0
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_FS_EXT4=y
 CONFIG_SPL_I2C=y
diff --git a/include/spl.h b/include/spl.h
index 7d30fb57dac..8229d40adab 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -673,6 +673,10 @@ static inline const char *spl_loader_name(const struct spl_image_loader *loader)
 	}
 #endif
 
+#define SPL_LOAD_IMAGE_GET(_priority, _boot_device, _method) \
+	ll_entry_get(struct spl_image_loader, \
+		     _boot_device ## _priority ## _method, spl_image_loader)
+
 /* SPL FAT image functions */
 int spl_load_image_fat(struct spl_image_info *spl_image,
 		       struct spl_boot_device *bootdev,
diff --git a/include/test/spl.h b/include/test/spl.h
index 7ae32a1020b..cfb52c90855 100644
--- a/include/test/spl.h
+++ b/include/test/spl.h
@@ -79,6 +79,36 @@ size_t create_image(void *dst, enum spl_test_image type,
 int check_image_info(struct unit_test_state *uts, struct spl_image_info *info1,
 		     struct spl_image_info *info2);
 
+/**
+ * typedef write_image_t - Callback for writing an image
+ * @uts: Current unit test state
+ * @img: Image to write
+ * @size: Size of @img
+ *
+ * Write @img to a location which will be read by a &struct spl_image_loader.
+ *
+ * Return: 0 on success or -1 on failure
+ */
+typedef int write_image_t(struct unit_test_state *its, void *img, size_t size);
+
+/**
+ * do_spl_test_load() - Test loading with an SPL image loader
+ * @uts: Current unit test state
+ * @test_name: Name of the current test
+ * @type: Type of image to try loading
+ * @loader: The loader to test
+ * @write_image: Callback to write the image to the backing storage
+ *
+ * Test @loader, performing the common tasks of setting up the image and
+ * checking it was loaded correctly. The caller must supply a @write_image
+ * callback to write the image to a location which will be read by @loader.
+ *
+ * Return: 0 on success or -1 on failure
+ */
+int do_spl_test_load(struct unit_test_state *uts, const char *test_name,
+		     enum spl_test_image type, struct spl_image_loader *loader,
+		     write_image_t write_image);
+
 /**
  * image_supported() - Determine whether an image type is supported
  * @type: The image type to check
diff --git a/test/image/Kconfig b/test/image/Kconfig
index a52766b77d4..e6be1b829f3 100644
--- a/test/image/Kconfig
+++ b/test/image/Kconfig
@@ -18,6 +18,7 @@ config SPL_UT_LOAD_FS
 	depends on SPL_FS_FAT
 	depends on SPL_FS_EXT4
 	depends on SPL_MMC_WRITE
+	depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
 	default y
 	help
 	  Test filesystems and the various load methods which use them.
diff --git a/test/image/spl_load.c b/test/image/spl_load.c
index 4338da417ce..06249044f9b 100644
--- a/test/image/spl_load.c
+++ b/test/image/spl_load.c
@@ -368,3 +368,39 @@ SPL_IMG_TEST(spl_test_image, LEGACY, 0);
 SPL_IMG_TEST(spl_test_image, IMX8, 0);
 SPL_IMG_TEST(spl_test_image, FIT_INTERNAL, 0);
 SPL_IMG_TEST(spl_test_image, FIT_EXTERNAL, 0);
+
+int do_spl_test_load(struct unit_test_state *uts, const char *test_name,
+		     enum spl_test_image type, struct spl_image_loader *loader,
+		     int (*write_image)(struct unit_test_state *, void *, size_t))
+{
+	size_t img_size, img_data, plain_size = SPL_TEST_DATA_SIZE;
+	struct spl_image_info info_write = {
+		.name = test_name,
+		.size = plain_size,
+	}, info_read = { };
+	struct spl_boot_device bootdev = {
+		.boot_device = loader->boot_device,
+	};
+	char *plain;
+	void *img;
+
+	img_size = create_image(NULL, type, &info_write, &img_data);
+	ut_assert(img_size);
+	img = calloc(img_size, 1);
+	ut_assertnonnull(img);
+
+	plain = img + img_data;
+	generate_data(plain, plain_size, test_name);
+	ut_asserteq(img_size, create_image(img, type, &info_write, NULL));
+
+	if (write_image(uts, img, img_size))
+		return CMD_RET_FAILURE;
+
+	ut_assertok(loader->load_image(&info_read, &bootdev));
+	if (check_image_info(uts, &info_write, &info_read))
+		return CMD_RET_FAILURE;
+	ut_asserteq_mem(plain, phys_to_virt(info_write.load_addr), plain_size);
+
+	free(img);
+	return 0;
+}
diff --git a/test/image/spl_load_fs.c b/test/image/spl_load_fs.c
index 45059f91999..77a6956fb95 100644
--- a/test/image/spl_load_fs.c
+++ b/test/image/spl_load_fs.c
@@ -305,8 +305,16 @@ static int spl_test_fat(struct unit_test_state *uts)
 }
 SPL_TEST(spl_test_fat, DM_FLAGS);
 
+static bool spl_mmc_raw;
+
+u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device)
+{
+	return spl_mmc_raw ? MMCSD_MODE_RAW : MMCSD_MODE_FS;
+}
+
 static int spl_test_mmc_fs(struct unit_test_state *uts, const char *test_name,
-			   enum spl_test_image type, create_fs_t create_fs)
+			   enum spl_test_image type, create_fs_t create_fs,
+			   bool blk_mode)
 {
 	const char *filename = CONFIG_SPL_FS_LOAD_PAYLOAD_NAME;
 	struct blk_desc *dev_desc;
@@ -320,7 +328,11 @@ static int spl_test_mmc_fs(struct unit_test_state *uts, const char *test_name,
 		.start = 1,
 		.sys_ind = 0x83,
 	};
-	struct spl_boot_device bootdev = { };
+	struct spl_image_loader *loader =
+		SPL_LOAD_IMAGE_GET(0, BOOT_DEVICE_MMC1, spl_mmc_load_image);
+	struct spl_boot_device bootdev = {
+		.boot_device = loader->boot_device,
+	};
 	void *fs;
 	char *data;
 
@@ -345,7 +357,12 @@ static int spl_test_mmc_fs(struct unit_test_state *uts, const char *test_name,
 	ut_assertok(write_mbr_partitions(dev_desc, &part, 1, 0));
 	ut_asserteq(part.size, blk_dwrite(dev_desc, part.start, part.size, fs));
 
-	ut_assertok(spl_blk_load_image(&info_read, &bootdev, UCLASS_MMC, 0, 1));
+	spl_mmc_raw = false;
+	if (blk_mode)
+		ut_assertok(spl_blk_load_image(&info_read, &bootdev, UCLASS_MMC,
+					       0, 1));
+	else
+		ut_assertok(loader->load_image(&info_read, &bootdev));
 	if (check_image_info(uts, &info_write, &info_read))
 		return CMD_RET_FAILURE;
 	ut_asserteq_mem(data, phys_to_virt(info_write.load_addr), data_size);
@@ -357,11 +374,50 @@ static int spl_test_mmc_fs(struct unit_test_state *uts, const char *test_name,
 static int spl_test_blk(struct unit_test_state *uts, const char *test_name,
 			enum spl_test_image type)
 {
-	if (spl_test_mmc_fs(uts, test_name, type, create_fat))
+	if (spl_test_mmc_fs(uts, test_name, type, create_fat, true))
 		return CMD_RET_FAILURE;
 
-	return spl_test_mmc_fs(uts, test_name, type, create_ext2);
+	return spl_test_mmc_fs(uts, test_name, type, create_ext2, true);
 }
 SPL_IMG_TEST(spl_test_blk, LEGACY, DM_FLAGS);
 SPL_IMG_TEST(spl_test_blk, FIT_EXTERNAL, DM_FLAGS);
 SPL_IMG_TEST(spl_test_blk, FIT_INTERNAL, DM_FLAGS);
+
+static int spl_test_mmc_write_image(struct unit_test_state *uts, void *img,
+				    size_t img_size)
+{
+	struct blk_desc *dev_desc;
+	size_t img_blocks;
+
+	dev_desc = blk_get_devnum_by_uclass_id(UCLASS_MMC, 0);
+	ut_assertnonnull(dev_desc);
+
+	img_blocks = DIV_ROUND_UP(img_size, dev_desc->blksz);
+	ut_asserteq(img_blocks, blk_dwrite(dev_desc,
+					   CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR,
+					   img_blocks, img));
+
+	spl_mmc_raw = true;
+	return 0;
+}
+
+static int spl_test_mmc(struct unit_test_state *uts, const char *test_name,
+			enum spl_test_image type)
+{
+	if (type == LEGACY &&
+	    spl_test_mmc_fs(uts, test_name, type, create_ext2, false))
+		return CMD_RET_FAILURE;
+
+	if (type != IMX8 &&
+	    spl_test_mmc_fs(uts, test_name, type, create_fat, false))
+		return CMD_RET_FAILURE;
+
+	return do_spl_test_load(uts, test_name, type,
+				SPL_LOAD_IMAGE_GET(0, BOOT_DEVICE_MMC1,
+						   spl_mmc_load_image),
+				spl_test_mmc_write_image);
+}
+SPL_IMG_TEST(spl_test_mmc, LEGACY, DM_FLAGS);
+SPL_IMG_TEST(spl_test_mmc, IMX8, DM_FLAGS);
+SPL_IMG_TEST(spl_test_mmc, FIT_EXTERNAL, DM_FLAGS);
+SPL_IMG_TEST(spl_test_mmc, FIT_INTERNAL, DM_FLAGS);
-- 
2.37.1


  parent reply	other threads:[~2023-10-12  2:26 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-12  1:56 [PATCH 00/26] test: spl: Test some load methods Sean Anderson
2023-10-12  1:56 ` [PATCH 01/26] spl: legacy: Fix referencing _image_binary_end Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:30     ` Sean Anderson
2023-10-12 15:28       ` Simon Glass
2023-10-12  1:56 ` [PATCH 02/26] spl: nor: Don't allocate header on stack Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  7:26     ` Michael Nazzareno Trimarchi
2023-10-12  1:56 ` [PATCH 03/26] spl: fit: Fix entry point for SPL_LOAD_FIT_FULL Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:28     ` Sean Anderson
2023-10-12 15:20       ` Tom Rini
2023-10-12 15:28       ` Simon Glass
2023-10-12  1:56 ` [PATCH 04/26] arm: imx: Fix i.MX8 container load address Sean Anderson
2023-10-12  1:56 ` [PATCH 05/26] arm: imx: Add newlines after error messages Sean Anderson
2023-10-12  7:33   ` Heinrich Schuchardt
2023-10-12  1:56 ` [PATCH 06/26] arm: imx: Add function to validate i.MX8 containers Sean Anderson
2023-10-12  1:56 ` [PATCH 07/26] arm: imx: Check header before calling spl_load_imx_container Sean Anderson
2023-10-12  7:44   ` Heinrich Schuchardt
2023-10-13  0:48     ` Sean Anderson
2023-10-12 16:40   ` Tom Rini
2023-10-13  1:39     ` Sean Anderson
2023-10-13 12:55       ` Tom Rini
2023-10-12  1:56 ` [PATCH 08/26] Move i.MX8 container image loading support to common/spl Sean Anderson
2023-10-12  1:56 ` [PATCH 09/26] spl: Allow enabling SPL_OF_REAL and SPL_OF_PLATDATA at the same time Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:22     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 10/26] lib: acpi: Fix linking SPL when ACPIGEN is enabled Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:56 ` [PATCH 11/26] fs: ext4: Fix building ext4 in SPL if write " Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:56 ` [PATCH 12/26] fs: Compile in sandbox filesystem in SPL if it " Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  6:39   ` Heinrich Schuchardt
2023-10-12 14:15     ` Sean Anderson
2023-10-12 14:50       ` Tom Rini
2023-10-12 14:52       ` Tom Rini
2023-10-12  1:56 ` [PATCH 13/26] net: Fix compiling SPL when fastboot " Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  6:52   ` Heinrich Schuchardt
2023-10-12 14:16     ` Sean Anderson
2023-10-12 14:52   ` Tom Rini
2023-10-12  1:56 ` [PATCH 14/26] net: bootp: Move port numbers to header Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  6:53   ` Heinrich Schuchardt
2023-10-12  1:56 ` [PATCH 15/26] net: bootp: Fall back to BOOTP from DHCP when unit testing Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  7:16   ` Heinrich Schuchardt
2023-10-12 14:18     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 16/26] spl: Don't cache devices when UNIT_TEST is enabled Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:18     ` Sean Anderson
2023-10-12  7:23   ` Heinrich Schuchardt
2023-10-12 14:19     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 17/26] spl: Use map_sysmem where appropriate Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:56 ` [PATCH 18/26] test: spl: Split tests up and use some configs Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:56 ` [PATCH 19/26] test: spl: Fix spl_test_load not failing if fname doesn't exist Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:56 ` [PATCH 20/26] test: spl: Add functions to create images Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-13 19:44   ` [SPAM] " Xavier Drudis Ferran
2023-10-14 14:37     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 21/26] test: spl: Add functions to create filesystems Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:11     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 22/26] test: spl: Add a test for spl_blk_load_image Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:56 ` Sean Anderson [this message]
2023-10-12  3:41   ` [PATCH 23/26] test: spl: Add a test for the MMC load method Simon Glass
2023-10-12  4:12     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 24/26] test: spl: Add a test for the NET " Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:11     ` Sean Anderson
2023-10-12  1:56 ` [PATCH 25/26] test: spl: Add a test for the NOR " Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  4:16     ` Sean Anderson
2023-10-12 15:28       ` Simon Glass
2023-10-12  1:56 ` [PATCH 26/26] test: spl: Add a test for the SPI " Sean Anderson
2023-10-12  3:41   ` Simon Glass
2023-10-12  1:59 ` [PATCH 00/26] test: spl: Test some load methods Sean Anderson
2023-10-12  3:41 ` Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231012015626.3487451-24-seanga2@gmail.com \
    --to=seanga2@gmail.com \
    --cc=hws@denx.de \
    --cc=jh80.chung@samsung.com \
    --cc=peng.fan@nxp.com \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox