bootstd: Add vbe bootmeth into sandbox
authorSimon Glass <sjg@chromium.org>
Sat, 30 Jul 2022 21:52:34 +0000 (15:52 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 12 Aug 2022 12:17:11 +0000 (08:17 -0400)
Update sandbox to include the VBE bootmeth. Update a few existing tests to
take account of this change, specifically that the new bootmeth now
appears when scanning.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/sandbox/dts/sandbox.dtsi
arch/sandbox/dts/test.dts
test/boot/Makefile
test/boot/bootflow.c
test/boot/bootmeth.c

index aa22b87..56e6b38 100644 (file)
 
        chosen {
                stdout-path = "/serial";
+
+               fwupd {
+                       compatible = "simple-bus";
+                       firmware {
+                               compatible = "fwupd,vbe-simple";
+                               cur-version = "1.2.3";
+                               bootloader-version = "2022.01";
+                               storage = "mmc1";
+                               area-start = <0x0>;
+                               area-size = <0x1000000>;
+                               skip-offset = <0x8000>;
+                       };
+               };
        };
 
        audio: audio-codec {
index d1a8cc7..2761588 100644 (file)
                        compatible = "denx,u-boot-fdt-test";
                        reg = <9 1>;
                };
+
+               fwupd {
+                       compatible = "simple-bus";
+                       firmware0 {
+                               compatible = "fwupd,vbe-simple";
+                               storage = "mmc1";
+                               area-start = <0x400>;
+                               area-size = <0x1000>;
+                               skip-offset = <0x200>;
+                               state-offset = <0x400>;
+                               state-size = <0x40>;
+                               version-offset = <0x800>;
+                               version-size = <0x100>;
+                       };
+               };
        };
 
        translation-test@8000 {
index 1730792..9e9d5ae 100644 (file)
@@ -3,3 +3,7 @@
 # Copyright 2021 Google LLC
 
 obj-$(CONFIG_BOOTSTD) += bootdev.o bootstd_common.o bootflow.o bootmeth.o
+
+ifdef CONFIG_OF_LIVE
+obj-$(CONFIG_BOOTMETH_VBE_SIMPLE) += vbe_simple.o
+endif
index 39c2c33..d2c42e8 100644 (file)
@@ -9,6 +9,7 @@
 #include <common.h>
 #include <bootdev.h>
 #include <bootflow.h>
+#include <bootmeth.h>
 #include <bootstd.h>
 #include <dm.h>
 #include <asm/test.h>
@@ -90,7 +91,7 @@ static int bootflow_cmd_glob(struct unit_test_state *uts)
        ut_assertok(bootstd_test_drop_bootdev_order(uts));
 
        console_record_reset_enable();
-       ut_assertok(run_command("bootflow scan -l", 0));
+       ut_assertok(run_command("bootflow scan -lG", 0));
        ut_assert_nextline("Scanning for bootflows in all bootdevs");
        ut_assert_nextline("Seq  Method       State   Uclass    Part  Name                      Filename");
        ut_assert_nextlinen("---");
@@ -122,7 +123,7 @@ static int bootflow_cmd_scan_e(struct unit_test_state *uts)
        ut_assertok(bootstd_test_drop_bootdev_order(uts));
 
        console_record_reset_enable();
-       ut_assertok(run_command("bootflow scan -ale", 0));
+       ut_assertok(run_command("bootflow scan -aleG", 0));
        ut_assert_nextline("Scanning for bootflows in all bootdevs");
        ut_assert_nextline("Seq  Method       State   Uclass    Part  Name                      Filename");
        ut_assert_nextlinen("---");
@@ -233,7 +234,7 @@ static int bootflow_iter(struct unit_test_state *uts)
 
        /* The first device is mmc2.bootdev which has no media */
        ut_asserteq(-EPROTONOSUPPORT,
-                   bootflow_scan_first(&iter, BOOTFLOWF_ALL, &bflow));
+                   bootflow_scan_first(&iter, BOOTFLOWF_ALL | BOOTFLOWF_SKIP_GLOBAL, &bflow));
        ut_asserteq(2, iter.num_methods);
        ut_asserteq(0, iter.cur_method);
        ut_asserteq(0, iter.part);
@@ -242,7 +243,7 @@ static int bootflow_iter(struct unit_test_state *uts)
        ut_asserteq(0, bflow.err);
 
        /*
-        * This shows MEDIA even though there is none, since int
+        * This shows MEDIA even though there is none, since in
         * bootdev_find_in_blk() we call part_get_info() which returns
         * -EPROTONOSUPPORT. Ideally it would return -EEOPNOTSUPP and we would
         * know.
@@ -384,6 +385,44 @@ static int bootflow_iter_disable(struct unit_test_state *uts)
 }
 BOOTSTD_TEST(bootflow_iter_disable, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
 
+/* Check 'bootflow scan' with a bootmeth ordering including a global bootmeth */
+static int bootflow_scan_glob_bootmeth(struct unit_test_state *uts)
+{
+       ut_assertok(bootstd_test_drop_bootdev_order(uts));
+
+       /*
+        * Make sure that the -G flag makes the scan fail, since this is not
+        * supported when an ordering is provided
+        */
+       console_record_reset_enable();
+       ut_assertok(bootmeth_set_order("efi firmware0"));
+       ut_assertok(run_command("bootflow scan -lG", 0));
+       ut_assert_nextline("Scanning for bootflows in all bootdevs");
+       ut_assert_nextline(
+               "Seq  Method       State   Uclass    Part  Name                      Filename");
+       ut_assert_nextlinen("---");
+       ut_assert_nextlinen("---");
+       ut_assert_nextline("(0 bootflows, 0 valid)");
+       ut_assert_console_end();
+
+       ut_assertok(run_command("bootflow scan -l", 0));
+       ut_assert_nextline("Scanning for bootflows in all bootdevs");
+       ut_assert_nextline(
+               "Seq  Method       State   Uclass    Part  Name                      Filename");
+       ut_assert_nextlinen("---");
+       ut_assert_nextline("Scanning global bootmeth 'firmware0':");
+       ut_assert_nextline("Scanning bootdev 'mmc2.bootdev':");
+       ut_assert_nextline("Scanning bootdev 'mmc1.bootdev':");
+       ut_assert_nextline("Scanning bootdev 'mmc0.bootdev':");
+       ut_assert_nextline("No more bootdevs");
+       ut_assert_nextlinen("---");
+       ut_assert_nextline("(0 bootflows, 0 valid)");
+       ut_assert_console_end();
+
+       return 0;
+}
+BOOTSTD_TEST(bootflow_scan_glob_bootmeth, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
+
 /* Check 'bootflow boot' to boot a selected bootflow */
 static int bootflow_cmd_boot(struct unit_test_state *uts)
 {
index 5d2e87b..ae21629 100644 (file)
@@ -23,8 +23,9 @@ static int bootmeth_cmd_list(struct unit_test_state *uts)
        ut_assert_nextlinen("---");
        ut_assert_nextline("    0    0  syslinux            Syslinux boot from a block device");
        ut_assert_nextline("    1    1  efi                 EFI boot from an .efi file");
+       ut_assert_nextline(" glob    2  firmware0           VBE simple");
        ut_assert_nextlinen("---");
-       ut_assert_nextline("(2 bootmeths)");
+       ut_assert_nextline("(3 bootmeths)");
        ut_assert_console_end();
 
        return 0;
@@ -56,8 +57,9 @@ static int bootmeth_cmd_order(struct unit_test_state *uts)
        ut_assert_nextlinen("---");
        ut_assert_nextline("    0    0  syslinux            Syslinux boot from a block device");
        ut_assert_nextline("    -    1  efi                 EFI boot from an .efi file");
+       ut_assert_nextline(" glob    2  firmware0           VBE simple");
        ut_assert_nextlinen("---");
-       ut_assert_nextline("(2 bootmeths)");
+       ut_assert_nextline("(3 bootmeths)");
        ut_assert_console_end();
 
        /* Check the -a flag with the reverse order */
@@ -68,8 +70,9 @@ static int bootmeth_cmd_order(struct unit_test_state *uts)
        ut_assert_nextlinen("---");
        ut_assert_nextline("    1    0  syslinux            Syslinux boot from a block device");
        ut_assert_nextline("    0    1  efi                 EFI boot from an .efi file");
+       ut_assert_nextline(" glob    2  firmware0           VBE simple");
        ut_assert_nextlinen("---");
-       ut_assert_nextline("(2 bootmeths)");
+       ut_assert_nextline("(3 bootmeths)");
        ut_assert_console_end();
 
        /* Now reset the order to empty, which should show all of them again */
@@ -77,7 +80,7 @@ static int bootmeth_cmd_order(struct unit_test_state *uts)
        ut_assert_console_end();
        ut_assertnull(env_get("bootmeths"));
        ut_assertok(run_command("bootmeth list", 0));
-       ut_assert_skip_to_line("(2 bootmeths)");
+       ut_assert_skip_to_line("(3 bootmeths)");
 
        /* Try reverse order */
        ut_assertok(run_command("bootmeth order \"efi syslinux\"", 0));
@@ -93,6 +96,20 @@ static int bootmeth_cmd_order(struct unit_test_state *uts)
        ut_asserteq_str("efi syslinux", env_get("bootmeths"));
        ut_assert_console_end();
 
+       /* Try with global bootmeths */
+       ut_assertok(run_command("bootmeth order \"efi firmware0\"", 0));
+       ut_assert_console_end();
+       ut_assertok(run_command("bootmeth list", 0));
+       ut_assert_nextline("Order  Seq  Name                Description");
+       ut_assert_nextlinen("---");
+       ut_assert_nextline("    0    1  efi                 EFI boot from an .efi file");
+       ut_assert_nextline(" glob    2  firmware0           VBE simple");
+       ut_assert_nextlinen("---");
+       ut_assert_nextline("(2 bootmeths)");
+       ut_assertnonnull(env_get("bootmeths"));
+       ut_asserteq_str("efi firmware0", env_get("bootmeths"));
+       ut_assert_console_end();
+
        return 0;
 }
 BOOTSTD_TEST(bootmeth_cmd_order, UT_TESTF_DM | UT_TESTF_SCAN_FDT);