diff mbox series

[v2,21/45] sandbox: Support loading the other FDT

Message ID 20220907022733.66423-22-sjg@chromium.org
State Accepted
Commit 9859d89b6e859a242d083a96950e0c05f60a5152
Delegated to: Tom Rini
Headers show
Series dm: core: Support multiple device trees in ofnode | expand

Commit Message

Simon Glass Sept. 7, 2022, 2:27 a.m. UTC
We need an 'other' FDT which is different from the control FDT, so we can
check that the ofnode tests correctly handle them both.

Add this to the build along with a way to read it into the sandbox state.

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

(no changes since v1)

 arch/sandbox/cpu/state.c         | 26 ++++++++++++++++++++++++
 arch/sandbox/dts/Makefile        |  2 +-
 arch/sandbox/dts/other.dts       | 35 ++++++++++++++++++++++++++++++++
 arch/sandbox/include/asm/state.h | 16 +++++++++++++++
 4 files changed, 78 insertions(+), 1 deletion(-)
 create mode 100644 arch/sandbox/dts/other.dts
diff mbox series

Patch

diff --git a/arch/sandbox/cpu/state.c b/arch/sandbox/cpu/state.c
index 787e0216594..fcc4a337e59 100644
--- a/arch/sandbox/cpu/state.c
+++ b/arch/sandbox/cpu/state.c
@@ -418,6 +418,32 @@  int state_get_rel_filename(const char *rel_path, char *buf, int size)
 	return len;
 }
 
+int state_load_other_fdt(const char **bufp, int *sizep)
+{
+	struct sandbox_state *state = state_get_current();
+	char fname[256];
+	int len, ret;
+
+	/* load the file if needed */
+	if (!state->other_fdt_buf) {
+		len = state_get_rel_filename("arch/sandbox/dts/other.dtb",
+					     fname, sizeof(fname));
+		if (len < 0)
+			return len;
+
+		ret = os_read_file(fname, &state->other_fdt_buf,
+				   &state->other_size);
+		if (ret) {
+			log_err("Cannot read file '%s'\n", fname);
+			return ret;
+		}
+	}
+	*bufp = state->other_fdt_buf;
+	*sizep = state->other_size;
+
+	return 0;
+}
+
 int state_init(void)
 {
 	state = &main_state;
diff --git a/arch/sandbox/dts/Makefile b/arch/sandbox/dts/Makefile
index 6cbc9bbcaa1..b6a88479b22 100644
--- a/arch/sandbox/dts/Makefile
+++ b/arch/sandbox/dts/Makefile
@@ -5,7 +5,7 @@  dtb-$(CONFIG_SANDBOX) += sandbox64.dtb
 else
 dtb-$(CONFIG_SANDBOX) += sandbox.dtb
 endif
-dtb-$(CONFIG_UT_DM) += test.dtb
+dtb-$(CONFIG_UT_DM) += test.dtb other.dtb
 dtb-$(CONFIG_CMD_EXTENSION) += overlay0.dtbo overlay1.dtbo
 
 include $(srctree)/scripts/Makefile.dts
diff --git a/arch/sandbox/dts/other.dts b/arch/sandbox/dts/other.dts
new file mode 100644
index 00000000000..395a7923228
--- /dev/null
+++ b/arch/sandbox/dts/other.dts
@@ -0,0 +1,35 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Other devicetree file for running sandbox tests
+ *
+ * This used for tests which want to check they can access multiple device
+ * trees. This one is loaded and checks are made that it is actually visible.
+ */
+
+/dts-v1/;
+
+/ {
+	compatible = "sandbox-other";
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	node {
+		target = <&target 3 4>;
+
+		subnode {
+			compatible = "sandbox-other2";
+			str-prop = "other";
+		};
+
+		subnode2 {
+		};
+	};
+
+	target: target {
+		compatible = "sandbox-other2";
+		#gpio-cells = <2>;
+		str-prop = "other";
+		reg = <0x8000 0x100>;
+		status = "disabled";
+	};
+};
diff --git a/arch/sandbox/include/asm/state.h b/arch/sandbox/include/asm/state.h
index 12741ee064a..fd42daad51c 100644
--- a/arch/sandbox/include/asm/state.h
+++ b/arch/sandbox/include/asm/state.h
@@ -108,6 +108,9 @@  struct sandbox_state {
 	bool hwspinlock;		/* Hardware Spinlock status */
 	bool allow_memio;		/* Allow readl() etc. to work */
 
+	void *other_fdt_buf;		/* 'other' FDT blob used by tests */
+	int other_size;			/* size of other FDT blob */
+
 	/*
 	 * This struct is getting large.
 	 *
@@ -279,6 +282,19 @@  void state_show(struct sandbox_state *state);
  */
 int state_get_rel_filename(const char *rel_path, char *buf, int size);
 
+/**
+ * state_load_other_fdt() - load the 'other' FDT into a buffer
+ *
+ * This loads the other.dtb file into a buffer. This is typically used in tests.
+ *
+ * @bufp: Place to put allocated buffer pointer. The buffer is read using
+ * os_read_file() which calls os_malloc(), so does affect U-Boot's own malloc()
+ * space
+ * @sizep: Returns the size of the buffer
+ * @return 0 if OK, -ve on error
+ */
+int state_load_other_fdt(const char **bufp, int *sizep);
+
 /**
  * Initialize the test system state
  */