[PATCH v4 28/33] bootstd: sandbox: Add a hostfs bootdev

Simon Glass sjg at chromium.org
Sun Mar 6 13:50:11 CET 2022


It is helpful to be able to try out bootstd on sandbox, using host files.
This is easier than using a block device, which must have a filesystem,
partition table, etc.

Add a new driver which provides this feature. For now it is not used in
tests, but it is likely to be useful.

Add notes in the devicetree also, but don't disturb the tests.

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

(no changes since v1)

 arch/sandbox/dts/sandbox.dts  |  4 +++
 arch/sandbox/dts/sandbox.dtsi |  5 ++++
 fs/Kconfig                    |  2 ++
 fs/sandbox/Kconfig            |  2 ++
 fs/sandbox/Makefile           |  1 +
 fs/sandbox/host_bootdev.c     | 56 +++++++++++++++++++++++++++++++++++
 6 files changed, 70 insertions(+)
 create mode 100644 fs/sandbox/Kconfig
 create mode 100644 fs/sandbox/host_bootdev.c

diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index 127f168f02..18fde1c8c6 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -66,6 +66,10 @@
 		fake-host-hwaddr = [00 00 66 44 22 00];
 	};
 
+	host-fs {
+		compatible = "sandbox,bootdev-host";
+	};
+
 	i2c_0: i2c at 0 {
 		#address-cells = <1>;
 		#size-cells = <0>;
diff --git a/arch/sandbox/dts/sandbox.dtsi b/arch/sandbox/dts/sandbox.dtsi
index 66b813faad..6a24a59d33 100644
--- a/arch/sandbox/dts/sandbox.dtsi
+++ b/arch/sandbox/dts/sandbox.dtsi
@@ -16,6 +16,11 @@
 		#sound-dai-cells = <1>;
 	};
 
+	bootstd {
+		compatible = "u-boot,boot-std";
+		filename-prefixes = "./";
+	};
+
 	buttons {
 		compatible = "gpio-keys";
 
diff --git a/fs/Kconfig b/fs/Kconfig
index 620af7f044..3069bcacd3 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -16,6 +16,8 @@ source "fs/fat/Kconfig"
 
 source "fs/jffs2/Kconfig"
 
+source "fs/sandbox/Kconfig"
+
 source "fs/ubifs/Kconfig"
 
 source "fs/cramfs/Kconfig"
diff --git a/fs/sandbox/Kconfig b/fs/sandbox/Kconfig
new file mode 100644
index 0000000000..b2af848242
--- /dev/null
+++ b/fs/sandbox/Kconfig
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
diff --git a/fs/sandbox/Makefile b/fs/sandbox/Makefile
index 06090519bf..880d59dd69 100644
--- a/fs/sandbox/Makefile
+++ b/fs/sandbox/Makefile
@@ -9,3 +9,4 @@
 # Pavel Bartusek, Sysgo Real-Time Solutions AG, pba at sysgo.de
 
 obj-y := sandboxfs.o
+obj-$(CONFIG_$(SPL_TPL_)BOOTSTD) += host_bootdev.o
diff --git a/fs/sandbox/host_bootdev.c b/fs/sandbox/host_bootdev.c
new file mode 100644
index 0000000000..0d12ee4ef7
--- /dev/null
+++ b/fs/sandbox/host_bootdev.c
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Bootdevice for MMC
+ *
+ * Copyright 2021 Google LLC
+ * Written by Simon Glass <sjg at chromium.org>
+ */
+
+#include <common.h>
+#include <bootdev.h>
+#include <bootflow.h>
+#include <bootmeth.h>
+#include <dm.h>
+#include <fs.h>
+
+static int host_get_bootflow(struct udevice *dev, struct bootflow_iter *iter,
+			     struct bootflow *bflow)
+{
+	int ret;
+
+	if (iter->part)
+		return log_msg_ret("max", -ESHUTDOWN);
+
+	bflow->name = strdup(dev->name);
+	if (!bflow->name)
+		return log_msg_ret("name", -ENOMEM);
+
+	ret = bootmeth_check(bflow->method, iter);
+	if (ret)
+		return log_msg_ret("check", ret);
+
+	bflow->state = BOOTFLOWST_MEDIA;
+	bflow->fs_type = FS_TYPE_SANDBOX;
+
+	ret = bootmeth_read_bootflow(bflow->method, bflow);
+	if (ret)
+		return log_msg_ret("method", ret);
+
+	return 0;
+}
+
+struct bootdev_ops host_bootdev_ops = {
+	.get_bootflow	= host_get_bootflow,
+};
+
+static const struct udevice_id host_bootdev_ids[] = {
+	{ .compatible = "sandbox,bootdev-host" },
+	{ }
+};
+
+U_BOOT_DRIVER(host_bootdev) = {
+	.name		= "host_bootdev",
+	.id		= UCLASS_BOOTDEV,
+	.ops		= &host_bootdev_ops,
+	.of_match	= host_bootdev_ids,
+};
-- 
2.35.1.616.g0bdcbb4464-goog



More information about the U-Boot mailing list