[PATCH 45/45] vbe: Add a test for the VBE flow into U-Boot proper

Simon Glass sjg at chromium.org
Sun Sep 25 17:02:48 CEST 2022


Add a test which checks that VBE boots correctly from TPL through to
U-Boot proper. This works by attaching the image.bin file to mmc3 so
that it is accessible to sandbox_vpl. We don't want to include this
in the generic sandbox build, since that image is of zero size and
cannot be mapped with mmap().

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 arch/sandbox/dts/test.dts     | 37 +++++++++++++++++++++++
 test/py/tests/test_vbe_vpl.py | 55 +++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+)
 create mode 100644 test/py/tests/test_vbe_vpl.py

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 0fecfa850bd..7303e7cfa2f 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -37,6 +37,8 @@
 		i2c0 = "/i2c at 0";
 		mmc0 = "/mmc0";
 		mmc1 = "/mmc1";
+		mmc2 = "/mmc2";
+		mmc3 = "/mmc3";
 		pci0 = &pci0;
 		pci1 = &pci1;
 		pci2 = &pci2;
@@ -92,6 +94,11 @@
 			compatible = "u-boot,distro-efi";
 		};
 
+		/*
+		 * This is used for the VBE OS-request tests. A FAT filesystem
+		 * created in a partition with the VBE information appearing
+		 * before the parititon starts
+		 */
 		firmware0 {
 			u-boot,dm-vpl;
 			compatible = "fwupd,vbe-simple";
@@ -104,6 +111,28 @@
 			version-offset = <0x800>;
 			version-size = <0x100>;
 		};
+
+		/*
+		 * This is used for the VBE VPL tests. The MMC device holds the
+		 * binman image.bin file. The test progresses through each phase
+		 * of U-Boot, loading each in turn from MMC.
+		 *
+		 * Note that the test enables this node (and mmc3) before
+		 * running U-Boot
+		 */
+		firmware1 {
+			u-boot,dm-vpl;
+			status = "disabled";
+			compatible = "fwupd,vbe-simple";
+			storage = "mmc3";
+			skip-offset = <0x400000>;
+			area-start = <0>;
+			area-size = <0xe00000>;
+			state-offset = <0xdffc00>;
+			state-size = <0x40>;
+			version-offset = <0xdffe00>;
+			version-size = <0x100>;
+		};
 	};
 
 	fuzzing-engine {
@@ -966,6 +995,14 @@
 		compatible = "sandbox,mmc";
 	};
 
+	/* This is used for VBE VPL tests */
+	mmc3 {
+		status = "disabled";
+		compatible = "sandbox,mmc";
+		filename = "image.bin";
+		non-removable;
+	};
+
 	pch {
 		compatible = "sandbox,pch";
 	};
diff --git a/test/py/tests/test_vbe_vpl.py b/test/py/tests/test_vbe_vpl.py
new file mode 100644
index 00000000000..3b31b16de99
--- /dev/null
+++ b/test/py/tests/test_vbe_vpl.py
@@ -0,0 +1,55 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2022 Google LLC
+#
+# Test addition of VBE
+
+import os
+
+import pytest
+import u_boot_utils
+
+ at pytest.mark.boardspec('sandbox_vpl')
+ at pytest.mark.requiredtool('dtc')
+def test_vbe_vpl(u_boot_console):
+    cons = u_boot_console
+
+    # Set up the RAM buffer
+    ram = os.path.join(cons.config.build_dir, 'ram.bin')
+
+    # Make a copy of the FDT before making out changes
+    fdt_in = os.path.join(cons.config.build_dir, 'arch/sandbox/dts/test.dtb')
+    fdt = os.path.join(cons.config.build_dir, 'vpl_test.dtb')
+    with open(fdt, 'wb') as outf:
+        with open(fdt_in, 'rb') as inf:
+            outf.write(inf.read())
+
+    # Use the image file produced by binman
+    image = os.path.join(cons.config.build_dir, 'image.bin')
+
+    # Enable firmware1 and the mmc that it uses. These are needed for the full
+    # VBE flow.
+    u_boot_utils.run_and_log(
+        cons, f'fdtput -t s {fdt} /bootstd/firmware0 status disabled')
+    u_boot_utils.run_and_log(
+        cons, f'fdtput -t s {fdt} /bootstd/firmware1 status okay')
+    u_boot_utils.run_and_log(
+        cons, f'fdtput -t s {fdt} /mmc3 status okay')
+    u_boot_utils.run_and_log(
+        cons, f'fdtput -t s {fdt} /mmc3 filename {image}')
+
+    # Remove any existing RAM file, so we don't have old data present
+    if os.path.exists(ram):
+        os.remove(ram)
+    try:
+        cons.restart_uboot_with_flags(
+            ['-p', image, '-w', '-s', 'state.dtb', '-d', fdt])
+
+        # Make sure that VBE was used in both VPL (to load SPL) and SPL (to load
+        # U-Boot
+        output = cons.run_command('vbe state')
+        assert output == 'Phases: VPL SPL'
+    finally:
+        # Restart afterward in case a non-VPL test is run next. This should not
+        # happen since VPL tests are run in their own invocation of test.py, but
+        # the cost of doing this is not too great at present.
+        u_boot_console.restart_uboot()
-- 
2.37.3.998.g577e59143f-goog



More information about the U-Boot mailing list