All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
@ 2020-04-19 20:36 Simon Glass
  2020-04-19 20:36 ` [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree Simon Glass
                   ` (10 more replies)
  0 siblings, 11 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

This is split from the original series in an attempt to get things applied
in chunks.

v7 is just a rebase as requested

Changes in v7:
- Rebase to master

Changes in v5:
- Drop bisectability changes

Changes in v4:
- Put 'interrupts-extended' property on one line
- Rename acpi-probed to linux,probed
- Note that linux,probed is an out-of-tree feature
- Separate out the log newline
- Update comment in acpi_inc_align() to show the alignment
- Put back cast on table_compute_checksum()
- Rename list_fact() to list_fadt()
- Add a comment to dump_hdr()

Changes in v3:
- Drop mention of PRIC
- Rename acpi,desc to acpi,ddn
- Correct description of acpi,probed
- Drop hid-descr-addr
- Just add the device.txt binding file in this patch
- Change the example to ELAN
- Add a pointer to information about acpi,compatible
- Rename acpi_align_large() to acpi_align64()
- Fix 'RSDP' typo
- Fix 'XDST' typo
- Move acpi_align_large() out of dm_test_acpi_setup_base_tables()
- Beef up the comment explaining how the unaligned address is used

Changes in v2:
- Fix definition of HID
- Infer hid-over-i2c CID value
- Add the hid-over-i2c binding document
- Drop definition of ACPI_TABLE_CREATOR
- Make _acpi_write_dev_tables() static and switch argument order
- Generalise the ACPI function recursion with acpi_recurse_method()

Simon Glass (9):
  acpi: Add a binding for ACPI settings in the device tree
  acpi: Add a method to write tables for a device
  acpi: Convert part of acpi_table to use acpi_ctx
  x86: Allow devices to write ACPI tables
  acpi: Drop code for missing XSDT from acpi_write_rsdp()
  acpi: Move acpi_add_table() to generic code
  acpi: Put table-setup code in its own function
  acpi: Move the xsdt pointer to acpi_ctx
  acpi: Add an acpi command

 arch/sandbox/dts/test.dts              |   4 +
 arch/sandbox/include/asm/global_data.h |   1 +
 arch/x86/include/asm/global_data.h     |   1 +
 arch/x86/lib/acpi_table.c              | 239 +++++--------------------
 cmd/Kconfig                            |  14 ++
 cmd/Makefile                           |   1 +
 cmd/acpi.c                             | 186 +++++++++++++++++++
 doc/device-tree-bindings/device.txt    |  36 ++++
 drivers/core/acpi.c                    |  62 +++++++
 include/acpi/acpi_table.h              |  65 +++++++
 include/dm/acpi.h                      |  37 ++++
 lib/acpi/acpi_table.c                  | 174 +++++++++++++++++-
 test/dm/acpi.c                         | 238 +++++++++++++++++++++++-
 13 files changed, 855 insertions(+), 203 deletions(-)
 create mode 100644 cmd/acpi.c
 create mode 100644 doc/device-tree-bindings/device.txt

-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-21 12:25   ` Bin Meng
  2020-04-21 13:07   ` Antwort: " Wolfgang Wallner
  2020-04-19 20:36 ` [PATCH v7 2/9] acpi: Add a method to write tables for a device Simon Glass
                   ` (9 subsequent siblings)
  10 siblings, 2 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

Devices need to report various identifiers in the ACPI tables. Rather than
hard-coding these in drivers it is typically better to put them in the
device tree.

Add a binding file to describe this.

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

Changes in v7: None
Changes in v5: None
Changes in v4:
- Put 'interrupts-extended' property on one line
- Rename acpi-probed to linux,probed
- Note that linux,probed is an out-of-tree feature

Changes in v3:
- Drop mention of PRIC
- Rename acpi,desc to acpi,ddn
- Correct description of acpi,probed
- Drop hid-descr-addr
- Just add the device.txt binding file in this patch
- Change the example to ELAN
- Add a pointer to information about acpi,compatible

Changes in v2:
- Fix definition of HID
- Infer hid-over-i2c CID value
- Add the hid-over-i2c binding document

 doc/device-tree-bindings/device.txt | 36 +++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 doc/device-tree-bindings/device.txt

diff --git a/doc/device-tree-bindings/device.txt b/doc/device-tree-bindings/device.txt
new file mode 100644
index 0000000000..27bd3978d9
--- /dev/null
+++ b/doc/device-tree-bindings/device.txt
@@ -0,0 +1,36 @@
+Devices
+=======
+
+Device bindings are described by their own individual binding files.
+
+U-Boot provides for some optional properties which are documented here. See
+also hid-over-i2c.txt which describes HID devices. See also
+Documentation/firmware-guide/acpi/enumeration.rst in the Linux kernel for
+the acpi,compatible property.
+
+ - acpi,has-power-resource : (boolean) true if this device has a power resource.
+    This causes an ACPI PowerResource to be written containing the properties
+    provided by this binding, to describe how to handle powering the device up
+    and down using GPIOs
+ - acpi,compatible : compatible string to report
+ - acpi,ddn : Contains the string to use as the _DDN (DOS (Disk Operating
+    System) Device Name)
+ - acpi,hid : Contains the string to use as the HID (Hardware ID)
+    identifier _HID
+ - acpi,uid : _UID value for device
+ - linux,probed : Tells U-Boot to add 'linux,probed' to the ACPI tables so that
+    Linux will only load the driver if the device can be detected (e.g. on I2C
+    bus). Note that this is an out-of-tree Linux feature.
+
+
+Example
+-------
+
+elan_touchscreen: elan-touchscreen at 10 {
+	compatible = "i2c-chip";
+	reg = <0x10>;
+	acpi,hid = "ELAN0001";
+	acpi,ddn = "ELAN Touchscreen";
+	interrupts-extended = <&acpi_gpe GPIO_21_IRQ IRQ_TYPE_EDGE_FALLING>;
+	linux,probed;
+};
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 2/9] acpi: Add a method to write tables for a device
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
  2020-04-19 20:36 ` [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-19 20:36 ` [PATCH v7 3/9] acpi: Convert part of acpi_table to use acpi_ctx Simon Glass
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

A device may want to write out ACPI tables to describe itself to Linux.
Add a method to permit this.

Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v7: None
Changes in v5:
- Drop bisectability changes

Changes in v4:
- Separate out the log newline

Changes in v3: None
Changes in v2:
- Drop definition of ACPI_TABLE_CREATOR
- Make _acpi_write_dev_tables() static and switch argument order
- Generalise the ACPI function recursion with acpi_recurse_method()

 arch/sandbox/dts/test.dts |  4 +++
 arch/x86/lib/acpi_table.c |  9 -----
 drivers/core/acpi.c       | 62 ++++++++++++++++++++++++++++++++
 include/acpi/acpi_table.h | 10 ++++++
 include/dm/acpi.h         | 30 ++++++++++++++++
 lib/acpi/acpi_table.c     | 13 +++++--
 test/dm/acpi.c            | 74 +++++++++++++++++++++++++++++++++++++--
 7 files changed, 187 insertions(+), 15 deletions(-)

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index df9f1835c9..4bccfbe6e1 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -226,6 +226,10 @@
 		compatible = "denx,u-boot-acpi-test";
 	};
 
+	acpi-test2 {
+		compatible = "denx,u-boot-acpi-test";
+	};
+
 	clocks {
 		clk_fixed: clk-fixed {
 			compatible = "fixed-clock";
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index 9346e165d8..235fc2268b 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -60,15 +60,6 @@ static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
 			sizeof(struct acpi_rsdp));
 }
 
-void acpi_fill_header(struct acpi_table_header *header, char *signature)
-{
-	memcpy(header->signature, signature, 4);
-	memcpy(header->oem_id, OEM_ID, 6);
-	memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
-	header->oem_revision = U_BOOT_BUILD_DATE;
-	memcpy(header->aslc_id, ASLC_ID, 4);
-}
-
 static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
 {
 	struct acpi_table_header *header = &(rsdt->header);
diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c
index ba50d688fe..e09905cf2a 100644
--- a/drivers/core/acpi.c
+++ b/drivers/core/acpi.c
@@ -11,8 +11,17 @@
 #include <common.h>
 #include <dm.h>
 #include <dm/acpi.h>
+#include <dm/device-internal.h>
 #include <dm/root.h>
 
+/* Type of method to call */
+enum method_t {
+	METHOD_WRITE_TABLES,
+};
+
+/* Prototype for all methods */
+typedef int (*acpi_method)(const struct udevice *dev, struct acpi_ctx *ctx);
+
 int acpi_copy_name(char *out_name, const char *name)
 {
 	strncpy(out_name, name, ACPI_NAME_LEN);
@@ -31,3 +40,56 @@ int acpi_get_name(const struct udevice *dev, char *out_name)
 
 	return -ENOSYS;
 }
+
+acpi_method acpi_get_method(struct udevice *dev, enum method_t method)
+{
+	struct acpi_ops *aops;
+
+	aops = device_get_acpi_ops(dev);
+	if (aops) {
+		switch (method) {
+		case METHOD_WRITE_TABLES:
+			return aops->write_tables;
+		}
+	}
+
+	return NULL;
+}
+
+int acpi_recurse_method(struct acpi_ctx *ctx, struct udevice *parent,
+			enum method_t method)
+{
+	struct udevice *dev;
+	acpi_method func;
+	int ret;
+
+	func = acpi_get_method(parent, method);
+	if (func) {
+		log_debug("\n");
+		log_debug("- %s %p\n", parent->name, func);
+		ret = device_ofdata_to_platdata(parent);
+		if (ret)
+			return log_msg_ret("ofdata", ret);
+		ret = func(parent, ctx);
+		if (ret)
+			return log_msg_ret("func", ret);
+	}
+	device_foreach_child(dev, parent) {
+		ret = acpi_recurse_method(ctx, dev, method);
+		if (ret)
+			return log_msg_ret("recurse", ret);
+	}
+
+	return 0;
+}
+
+int acpi_write_dev_tables(struct acpi_ctx *ctx)
+{
+	int ret;
+
+	log_debug("Writing device tables\n");
+	ret = acpi_recurse_method(ctx, dm_root(), METHOD_WRITE_TABLES);
+	log_debug("Writing finished, err=%d\n", ret);
+
+	return ret;
+}
diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h
index 194be9aa58..a2bd929c92 100644
--- a/include/acpi/acpi_table.h
+++ b/include/acpi/acpi_table.h
@@ -505,6 +505,16 @@ int acpi_get_table_revision(enum acpi_tables table);
  */
 int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags);
 
+/**
+ * acpi_fill_header() - Set up a new table header
+ *
+ * This sets all fields except length, revision, checksum and aslc_revision
+ *
+ * @header: ACPI header to update
+ * @signature: Table signature to use (4 characters)
+ */
+void acpi_fill_header(struct acpi_table_header *header, char *signature);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
diff --git a/include/dm/acpi.h b/include/dm/acpi.h
index 49257914ff..69d69d7f42 100644
--- a/include/dm/acpi.h
+++ b/include/dm/acpi.h
@@ -24,6 +24,17 @@
 
 #if !defined(__ACPI__)
 
+/**
+ * struct acpi_ctx - Context used for writing ACPI tables
+ *
+ * This contains a few useful pieces of information used when writing
+ *
+ * @current: Current address for writing
+ */
+struct acpi_ctx {
+	void *current;
+};
+
 /**
  * struct acpi_ops - ACPI operations supported by driver model
  */
@@ -38,6 +49,15 @@ struct acpi_ops {
 	 *	other error
 	 */
 	int (*get_name)(const struct udevice *dev, char *out_name);
+
+	/**
+	 * write_tables() - Write out any tables required by this device
+	 *
+	 * @dev: Device to write
+	 * @ctx: ACPI context to use
+	 * @return 0 if OK, -ve on error
+	 */
+	int (*write_tables)(const struct udevice *dev, struct acpi_ctx *ctx);
 };
 
 #define device_get_acpi_ops(dev)	((dev)->driver->acpi_ops)
@@ -72,6 +92,16 @@ int acpi_get_name(const struct udevice *dev, char *out_name);
  */
 int acpi_copy_name(char *out_name, const char *name);
 
+/**
+ * acpi_write_dev_tables() - Write ACPI tables required by devices
+ *
+ * This scans through all devices and tells them to write any tables they want
+ * to write.
+ *
+ * @return 0 if OK, -ve if any device returned an error
+ */
+int acpi_write_dev_tables(struct acpi_ctx *ctx);
+
 #endif /* __ACPI__ */
 
 #endif
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index 4633dcb948..372f19b16d 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -9,9 +9,8 @@
 #include <acpi/acpi_table.h>
 #include <dm.h>
 #include <cpu.h>
+#include <version.h>
 
-/* Temporary change to ensure bisectability */
-#ifndef CONFIG_SANDBOX
 int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags)
 {
 	struct acpi_table_header *header = &dmar->header;
@@ -37,7 +36,6 @@ int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags)
 
 	return 0;
 }
-#endif
 
 int acpi_get_table_revision(enum acpi_tables table)
 {
@@ -91,3 +89,12 @@ int acpi_get_table_revision(enum acpi_tables table)
 		return -EINVAL;
 	}
 }
+
+void acpi_fill_header(struct acpi_table_header *header, char *signature)
+{
+	memcpy(header->signature, signature, 4);
+	memcpy(header->oem_id, OEM_ID, 6);
+	memcpy(header->oem_table_id, OEM_TABLE_ID, 8);
+	header->oem_revision = U_BOOT_BUILD_DATE;
+	memcpy(header->aslc_id, ASLC_ID, 4);
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index e7b8abd556..fb7b7e46b2 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -8,12 +8,26 @@
 
 #include <common.h>
 #include <dm.h>
+#include <version.h>
 #include <acpi/acpi_table.h>
 #include <dm/acpi.h>
 #include <dm/test.h>
 #include <test/ut.h>
 
 #define ACPI_TEST_DEV_NAME	"ABCD"
+#define BUF_SIZE		4096
+
+static int testacpi_write_tables(const struct udevice *dev,
+				 struct acpi_ctx *ctx)
+{
+	struct acpi_dmar *dmar;
+
+	dmar = (struct acpi_dmar *)ctx->current;
+	acpi_create_dmar(dmar, DMAR_INTR_REMAP);
+	ctx->current += sizeof(struct acpi_dmar);
+
+	return 0;
+}
 
 static int testacpi_get_name(const struct udevice *dev, char *out_name)
 {
@@ -22,6 +36,7 @@ static int testacpi_get_name(const struct udevice *dev, char *out_name)
 
 struct acpi_ops testacpi_ops = {
 	.get_name	= testacpi_get_name,
+	.write_tables	= testacpi_write_tables,
 };
 
 static const struct udevice_id testacpi_ids[] = {
@@ -68,8 +83,6 @@ static int dm_test_acpi_get_table_revision(struct unit_test_state *uts)
 DM_TEST(dm_test_acpi_get_table_revision,
 	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 
-/* Temporary change to ensure bisectability */
-#ifndef CONFIG_SANDBOX
 /* Test acpi_create_dmar() */
 static int dm_test_acpi_create_dmar(struct unit_test_state *uts)
 {
@@ -82,4 +95,59 @@ static int dm_test_acpi_create_dmar(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_acpi_create_dmar, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-#endif
+
+/* Test acpi_fill_header() */
+static int dm_test_acpi_fill_header(struct unit_test_state *uts)
+{
+	struct acpi_table_header hdr;
+
+	/* Make sure these 5 fields are not changed */
+	hdr.length = 0x11;
+	hdr.revision = 0x22;
+	hdr.checksum = 0x33;
+	hdr.aslc_revision = 0x44;
+	acpi_fill_header(&hdr, "ABCD");
+
+	ut_asserteq_mem("ABCD", hdr.signature, sizeof(hdr.signature));
+	ut_asserteq(0x11, hdr.length);
+	ut_asserteq(0x22, hdr.revision);
+	ut_asserteq(0x33, hdr.checksum);
+	ut_asserteq_mem(OEM_ID, hdr.oem_id, sizeof(hdr.oem_id));
+	ut_asserteq_mem(OEM_TABLE_ID, hdr.oem_table_id,
+			sizeof(hdr.oem_table_id));
+	ut_asserteq(U_BOOT_BUILD_DATE, hdr.oem_revision);
+	ut_asserteq_mem(ASLC_ID, hdr.aslc_id, sizeof(hdr.aslc_id));
+	ut_asserteq(0x44, hdr.aslc_revision);
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_fill_header, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test ACPI write_tables() */
+static int dm_test_acpi_write_tables(struct unit_test_state *uts)
+{
+	struct acpi_dmar *dmar;
+	struct acpi_ctx ctx;
+	void *buf;
+
+	buf = malloc(BUF_SIZE);
+	ut_assertnonnull(buf);
+
+	ctx.current = buf;
+	ut_assertok(acpi_write_dev_tables(&ctx));
+	dmar = buf;
+
+	/*
+	 * We should have two dmar tables, one for each "denx,u-boot-acpi-test"
+	 * device
+	 */
+	ut_asserteq_ptr(dmar + 2, ctx.current);
+	ut_asserteq(DMAR_INTR_REMAP, dmar->flags);
+	ut_asserteq(32 - 1, dmar->host_address_width);
+
+	ut_asserteq(DMAR_INTR_REMAP, dmar[1].flags);
+	ut_asserteq(32 - 1, dmar[1].host_address_width);
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_write_tables, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 3/9] acpi: Convert part of acpi_table to use acpi_ctx
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
  2020-04-19 20:36 ` [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree Simon Glass
  2020-04-19 20:36 ` [PATCH v7 2/9] acpi: Add a method to write tables for a device Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-19 20:36 ` [PATCH v7 4/9] x86: Allow devices to write ACPI tables Simon Glass
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

The current code uses an address but a pointer would result in fewer
casts. Also it repeats the alignment code in a lot of places so this would
be better done in a helper function.

Update write_acpi_tables() to make use of the new acpi_ctx structure,
adding a few helpers to clean things up.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
---

Changes in v7: None
Changes in v5: None
Changes in v4:
- Update comment in acpi_inc_align() to show the alignment

Changes in v3:
- Rename acpi_align_large() to acpi_align64()

Changes in v2: None

 arch/x86/lib/acpi_table.c | 88 +++++++++++++++++++--------------------
 include/acpi/acpi_table.h | 36 ++++++++++++++++
 lib/acpi/acpi_table.c     | 24 ++++++++++-
 test/dm/acpi.c            | 28 +++++++++++++
 4 files changed, 130 insertions(+), 46 deletions(-)

diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index 235fc2268b..b73cc64339 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -10,6 +10,7 @@
 #include <cpu.h>
 #include <dm.h>
 #include <dm/uclass-internal.h>
+#include <mapmem.h>
 #include <serial.h>
 #include <version.h>
 #include <acpi/acpi_table.h>
@@ -19,6 +20,7 @@
 #include <asm/mpspec.h>
 #include <asm/tables.h>
 #include <asm/arch/global_nvs.h>
+#include <dm/acpi.h>
 
 /*
  * IASL compiles the dsdt entries and writes the hex values
@@ -478,9 +480,9 @@ static void acpi_create_spcr(struct acpi_spcr *spcr)
 /*
  * QEMU's version of write_acpi_tables is defined in drivers/misc/qfw.c
  */
-ulong write_acpi_tables(ulong start)
+ulong write_acpi_tables(ulong start_addr)
 {
-	u32 current;
+	struct acpi_ctx sctx, *ctx = &sctx;
 	struct acpi_rsdp *rsdp;
 	struct acpi_rsdt *rsdt;
 	struct acpi_xsdt *xsdt;
@@ -491,60 +493,61 @@ ulong write_acpi_tables(ulong start)
 	struct acpi_madt *madt;
 	struct acpi_csrt *csrt;
 	struct acpi_spcr *spcr;
+	void *start;
+	ulong addr;
 	int i;
 
-	current = start;
+	start = map_sysmem(start_addr, 0);
+	ctx->current = start;
 
 	/* Align ACPI tables to 16 byte */
-	current = ALIGN(current, 16);
+	acpi_align(ctx);
 
-	debug("ACPI: Writing ACPI tables at %lx\n", start);
+	debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
 
 	/* We need at least an RSDP and an RSDT Table */
-	rsdp = (struct acpi_rsdp *)current;
-	current += sizeof(struct acpi_rsdp);
-	current = ALIGN(current, 16);
-	rsdt = (struct acpi_rsdt *)current;
-	current += sizeof(struct acpi_rsdt);
-	current = ALIGN(current, 16);
-	xsdt = (struct acpi_xsdt *)current;
-	current += sizeof(struct acpi_xsdt);
+	rsdp = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
+	rsdt = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
+	xsdt = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
 	/*
 	 * Per ACPI spec, the FACS table address must be aligned to a 64 byte
 	 * boundary (Windows checks this, but Linux does not).
 	 */
-	current = ALIGN(current, 64);
+	acpi_align64(ctx);
 
 	/* clear all table memory */
-	memset((void *)start, 0, current - start);
+	memset((void *)start, 0, ctx->current - start);
 
 	acpi_write_rsdp(rsdp, rsdt, xsdt);
 	acpi_write_rsdt(rsdt);
 	acpi_write_xsdt(xsdt);
 
 	debug("ACPI:    * FACS\n");
-	facs = (struct acpi_facs *)current;
-	current += sizeof(struct acpi_facs);
-	current = ALIGN(current, 16);
+	facs = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_facs));
 
 	acpi_create_facs(facs);
 
 	debug("ACPI:    * DSDT\n");
-	dsdt = (struct acpi_table_header *)current;
+	dsdt = ctx->current;
 	memcpy(dsdt, &AmlCode, sizeof(struct acpi_table_header));
-	current += sizeof(struct acpi_table_header);
-	memcpy((char *)current,
+	acpi_inc(ctx, sizeof(struct acpi_table_header));
+	memcpy(ctx->current,
 	       (char *)&AmlCode + sizeof(struct acpi_table_header),
 	       dsdt->length - sizeof(struct acpi_table_header));
-	current += dsdt->length - sizeof(struct acpi_table_header);
-	current = ALIGN(current, 16);
+	acpi_inc_align(ctx, dsdt->length - sizeof(struct acpi_table_header));
 
 	/* Pack GNVS into the ACPI table area */
 	for (i = 0; i < dsdt->length; i++) {
 		u32 *gnvs = (u32 *)((u32)dsdt + i);
 		if (*gnvs == ACPI_GNVS_ADDR) {
-			debug("Fix up global NVS in DSDT to 0x%08x\n", current);
-			*gnvs = current;
+			ulong addr = (ulong)map_to_sysmem(ctx->current);
+
+			debug("Fix up global NVS in DSDT to %#08lx\n", addr);
+			*gnvs = addr;
 			break;
 		}
 	}
@@ -554,51 +557,46 @@ ulong write_acpi_tables(ulong start)
 	dsdt->checksum = table_compute_checksum((void *)dsdt, dsdt->length);
 
 	/* Fill in platform-specific global NVS variables */
-	acpi_create_gnvs((struct acpi_global_nvs *)current);
-	current += sizeof(struct acpi_global_nvs);
-	current = ALIGN(current, 16);
+	acpi_create_gnvs(ctx->current);
+	acpi_inc_align(ctx, sizeof(struct acpi_global_nvs));
 
 	debug("ACPI:    * FADT\n");
-	fadt = (struct acpi_fadt *)current;
-	current += sizeof(struct acpi_fadt);
-	current = ALIGN(current, 16);
+	fadt = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_fadt));
 	acpi_create_fadt(fadt, facs, dsdt);
 	acpi_add_table(rsdp, fadt);
 
 	debug("ACPI:    * MADT\n");
-	madt = (struct acpi_madt *)current;
+	madt = ctx->current;
 	acpi_create_madt(madt);
-	current += madt->header.length;
+	acpi_inc_align(ctx, madt->header.length);
 	acpi_add_table(rsdp, madt);
-	current = ALIGN(current, 16);
 
 	debug("ACPI:    * MCFG\n");
-	mcfg = (struct acpi_mcfg *)current;
+	mcfg = ctx->current;
 	acpi_create_mcfg(mcfg);
-	current += mcfg->header.length;
+	acpi_inc_align(ctx, mcfg->header.length);
 	acpi_add_table(rsdp, mcfg);
-	current = ALIGN(current, 16);
 
 	debug("ACPI:    * CSRT\n");
-	csrt = (struct acpi_csrt *)current;
+	csrt = ctx->current;
 	acpi_create_csrt(csrt);
-	current += csrt->header.length;
+	acpi_inc_align(ctx, csrt->header.length);
 	acpi_add_table(rsdp, csrt);
-	current = ALIGN(current, 16);
 
 	debug("ACPI:    * SPCR\n");
-	spcr = (struct acpi_spcr *)current;
+	spcr = ctx->current;
 	acpi_create_spcr(spcr);
-	current += spcr->header.length;
+	acpi_inc_align(ctx, spcr->header.length);
 	acpi_add_table(rsdp, spcr);
-	current = ALIGN(current, 16);
 
-	debug("current = %x\n", current);
+	addr = map_to_sysmem(ctx->current);
+	debug("current = %lx\n", addr);
 
 	acpi_rsdp_addr = (unsigned long)rsdp;
 	debug("ACPI: done\n");
 
-	return current;
+	return addr;
 }
 
 ulong acpi_get_rsdp_addr(void)
diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h
index a2bd929c92..6fd4c5241a 100644
--- a/include/acpi/acpi_table.h
+++ b/include/acpi/acpi_table.h
@@ -23,6 +23,8 @@
 
 #if !defined(__ACPI__)
 
+struct acpi_ctx;
+
 /*
  * RSDP (Root System Description Pointer)
  * Note: ACPI 1.0 didn't have length, xsdt_address, and ext_checksum
@@ -515,6 +517,40 @@ int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags);
  */
 void acpi_fill_header(struct acpi_table_header *header, char *signature);
 
+/**
+ * acpi_align() - Align the ACPI output pointer to a 16-byte boundary
+ *
+ * @ctx: ACPI context
+ */
+void acpi_align(struct acpi_ctx *ctx);
+
+/**
+ * acpi_align64() - Align the ACPI output pointer to a 64-byte boundary
+ *
+ * @ctx: ACPI context
+ */
+void acpi_align64(struct acpi_ctx *ctx);
+
+/**
+ * acpi_inc() - Increment the ACPI output pointer by a bit
+ *
+ * The pointer is NOT aligned afterwards.
+ *
+ * @ctx: ACPI context
+ * @amount: Amount to increment by
+ */
+void acpi_inc(struct acpi_ctx *ctx, uint amount);
+
+/**
+ * acpi_inc_align() - Increment the ACPI output pointer by a bit and align
+ *
+ * The pointer is aligned afterwards to a 16-byte boundary
+ *
+ * @ctx: ACPI context
+ * @amount: Amount to increment by
+ */
+void acpi_inc_align(struct acpi_ctx *ctx, uint amount);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index 372f19b16d..07d9bbb0af 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -6,10 +6,11 @@
  */
 
 #include <common.h>
-#include <acpi/acpi_table.h>
 #include <dm.h>
 #include <cpu.h>
 #include <version.h>
+#include <acpi/acpi_table.h>
+#include <dm/acpi.h>
 
 int acpi_create_dmar(struct acpi_dmar *dmar, enum dmar_flags flags)
 {
@@ -98,3 +99,24 @@ void acpi_fill_header(struct acpi_table_header *header, char *signature)
 	header->oem_revision = U_BOOT_BUILD_DATE;
 	memcpy(header->aslc_id, ASLC_ID, 4);
 }
+
+void acpi_align(struct acpi_ctx *ctx)
+{
+	ctx->current = (void *)ALIGN((ulong)ctx->current, 16);
+}
+
+void acpi_align64(struct acpi_ctx *ctx)
+{
+	ctx->current = (void *)ALIGN((ulong)ctx->current, 64);
+}
+
+void acpi_inc(struct acpi_ctx *ctx, uint amount)
+{
+	ctx->current += amount;
+}
+
+void acpi_inc_align(struct acpi_ctx *ctx, uint amount)
+{
+	ctx->current += amount;
+	acpi_align(ctx);
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index fb7b7e46b2..59aee1f614 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -151,3 +151,31 @@ static int dm_test_acpi_write_tables(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_acpi_write_tables, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test basic ACPI functions */
+static int dm_test_acpi_basic(struct unit_test_state *uts)
+{
+	struct acpi_ctx ctx;
+
+	/* Check align works */
+	ctx.current = (void *)5;
+	acpi_align(&ctx);
+	ut_asserteq_ptr((void *)16, ctx.current);
+
+	/* Check that align does nothing if already aligned */
+	acpi_align(&ctx);
+	ut_asserteq_ptr((void *)16, ctx.current);
+	acpi_align64(&ctx);
+	ut_asserteq_ptr((void *)64, ctx.current);
+	acpi_align64(&ctx);
+	ut_asserteq_ptr((void *)64, ctx.current);
+
+	/* Check incrementing */
+	acpi_inc(&ctx, 3);
+	ut_asserteq_ptr((void *)67, ctx.current);
+	acpi_inc_align(&ctx, 3);
+	ut_asserteq_ptr((void *)80, ctx.current);
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_basic, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 4/9] x86: Allow devices to write ACPI tables
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (2 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 3/9] acpi: Convert part of acpi_table to use acpi_ctx Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-19 20:36 ` [PATCH v7 5/9] acpi: Drop code for missing XSDT from acpi_write_rsdp() Simon Glass
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

Call the new core function to permit devices to write their own ACPI
tables. These tables will appear after all other tables.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
---

Changes in v7: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/x86/lib/acpi_table.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index b73cc64339..d8622da394 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -590,6 +590,8 @@ ulong write_acpi_tables(ulong start_addr)
 	acpi_inc_align(ctx, spcr->header.length);
 	acpi_add_table(rsdp, spcr);
 
+	acpi_write_dev_tables(ctx);
+
 	addr = map_to_sysmem(ctx->current);
 	debug("current = %lx\n", addr);
 
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 5/9] acpi: Drop code for missing XSDT from acpi_write_rsdp()
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (3 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 4/9] x86: Allow devices to write ACPI tables Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-19 20:36 ` [PATCH v7 6/9] acpi: Move acpi_add_table() to generic code Simon Glass
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

We don't actually support tables without an XSDT so we can drop this dead
code.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
---

Changes in v7: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 arch/x86/lib/acpi_table.c | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index d8622da394..de1acb0ebb 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -42,19 +42,8 @@ static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
 	rsdp->length = sizeof(struct acpi_rsdp);
 	rsdp->rsdt_address = (u32)rsdt;
 
-	/*
-	 * Revision: ACPI 1.0: 0, ACPI 2.0/3.0/4.0: 2
-	 *
-	 * Some OSes expect an XSDT to be present for RSD PTR revisions >= 2.
-	 * If we don't have an ACPI XSDT, force ACPI 1.0 (and thus RSD PTR
-	 * revision 0)
-	 */
-	if (xsdt == NULL) {
-		rsdp->revision = ACPI_RSDP_REV_ACPI_1_0;
-	} else {
-		rsdp->xsdt_address = (u64)(u32)xsdt;
-		rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
-	}
+	rsdp->xsdt_address = (u64)(u32)xsdt;
+	rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
 
 	/* Calculate checksums */
 	rsdp->checksum = table_compute_checksum((void *)rsdp, 20);
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 6/9] acpi: Move acpi_add_table() to generic code
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (4 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 5/9] acpi: Drop code for missing XSDT from acpi_write_rsdp() Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-19 20:36 ` [PATCH v7 7/9] acpi: Put table-setup code in its own function Simon Glass
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

Move this code to a generic location so that we can test it with sandbox.
This requires adding a few new fields to acpi_ctx, so drop the local
variables used in the original code.

Also use mapmem to avoid pointer-to-address casts which don't work on
sandbox.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
---

Changes in v7: None
Changes in v5: None
Changes in v4: None
Changes in v3:
- Fix 'RSDP' typo

Changes in v2: None

 arch/x86/lib/acpi_table.c | 83 +++++----------------------------------
 include/acpi/acpi_table.h |  9 +++++
 include/dm/acpi.h         |  5 +++
 lib/acpi/acpi_table.c     | 61 ++++++++++++++++++++++++++++
 test/dm/acpi.c            |  4 ++
 5 files changed, 89 insertions(+), 73 deletions(-)

diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index de1acb0ebb..ff8cee51d6 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -83,67 +83,6 @@ static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
 			sizeof(struct acpi_xsdt));
 }
 
-/**
- * Add an ACPI table to the RSDT (and XSDT) structure, recalculate length
- * and checksum.
- */
-static void acpi_add_table(struct acpi_rsdp *rsdp, void *table)
-{
-	int i, entries_num;
-	struct acpi_rsdt *rsdt;
-	struct acpi_xsdt *xsdt;
-
-	/* The RSDT is mandatory while the XSDT is not */
-	rsdt = (struct acpi_rsdt *)rsdp->rsdt_address;
-
-	/* This should always be MAX_ACPI_TABLES */
-	entries_num = ARRAY_SIZE(rsdt->entry);
-
-	for (i = 0; i < entries_num; i++) {
-		if (rsdt->entry[i] == 0)
-			break;
-	}
-
-	if (i >= entries_num) {
-		debug("ACPI: Error: too many tables\n");
-		return;
-	}
-
-	/* Add table to the RSDT */
-	rsdt->entry[i] = (u32)table;
-
-	/* Fix RSDT length or the kernel will assume invalid entries */
-	rsdt->header.length = sizeof(struct acpi_table_header) +
-				sizeof(u32) * (i + 1);
-
-	/* Re-calculate checksum */
-	rsdt->header.checksum = 0;
-	rsdt->header.checksum = table_compute_checksum((u8 *)rsdt,
-			rsdt->header.length);
-
-	/* The RSDT is mandatory while the XSDT is not */
-	if (!rsdp->xsdt_address)
-		return;
-
-	/*
-	 * And now the same thing for the XSDT. We use the same index as for
-	 * now we want the XSDT and RSDT to always be in sync in U-Boot
-	 */
-	xsdt = (struct acpi_xsdt *)((u32)rsdp->xsdt_address);
-
-	/* Add table to the XSDT */
-	xsdt->entry[i] = (u64)(u32)table;
-
-	/* Fix XSDT length */
-	xsdt->header.length = sizeof(struct acpi_table_header) +
-				sizeof(u64) * (i + 1);
-
-	/* Re-calculate checksum */
-	xsdt->header.checksum = 0;
-	xsdt->header.checksum = table_compute_checksum((u8 *)xsdt,
-			xsdt->header.length);
-}
-
 static void acpi_create_facs(struct acpi_facs *facs)
 {
 	memset((void *)facs, 0, sizeof(struct acpi_facs));
@@ -472,8 +411,6 @@ static void acpi_create_spcr(struct acpi_spcr *spcr)
 ulong write_acpi_tables(ulong start_addr)
 {
 	struct acpi_ctx sctx, *ctx = &sctx;
-	struct acpi_rsdp *rsdp;
-	struct acpi_rsdt *rsdt;
 	struct acpi_xsdt *xsdt;
 	struct acpi_facs *facs;
 	struct acpi_table_header *dsdt;
@@ -495,9 +432,9 @@ ulong write_acpi_tables(ulong start_addr)
 	debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
 
 	/* We need at least an RSDP and an RSDT Table */
-	rsdp = ctx->current;
+	ctx->rsdp = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
-	rsdt = ctx->current;
+	ctx->rsdt = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
 	xsdt = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
@@ -510,8 +447,8 @@ ulong write_acpi_tables(ulong start_addr)
 	/* clear all table memory */
 	memset((void *)start, 0, ctx->current - start);
 
-	acpi_write_rsdp(rsdp, rsdt, xsdt);
-	acpi_write_rsdt(rsdt);
+	acpi_write_rsdp(ctx->rsdp, ctx->rsdt, xsdt);
+	acpi_write_rsdt(ctx->rsdt);
 	acpi_write_xsdt(xsdt);
 
 	debug("ACPI:    * FACS\n");
@@ -553,38 +490,38 @@ ulong write_acpi_tables(ulong start_addr)
 	fadt = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_fadt));
 	acpi_create_fadt(fadt, facs, dsdt);
-	acpi_add_table(rsdp, fadt);
+	acpi_add_table(ctx, fadt);
 
 	debug("ACPI:    * MADT\n");
 	madt = ctx->current;
 	acpi_create_madt(madt);
 	acpi_inc_align(ctx, madt->header.length);
-	acpi_add_table(rsdp, madt);
+	acpi_add_table(ctx, madt);
 
 	debug("ACPI:    * MCFG\n");
 	mcfg = ctx->current;
 	acpi_create_mcfg(mcfg);
 	acpi_inc_align(ctx, mcfg->header.length);
-	acpi_add_table(rsdp, mcfg);
+	acpi_add_table(ctx, mcfg);
 
 	debug("ACPI:    * CSRT\n");
 	csrt = ctx->current;
 	acpi_create_csrt(csrt);
 	acpi_inc_align(ctx, csrt->header.length);
-	acpi_add_table(rsdp, csrt);
+	acpi_add_table(ctx, csrt);
 
 	debug("ACPI:    * SPCR\n");
 	spcr = ctx->current;
 	acpi_create_spcr(spcr);
 	acpi_inc_align(ctx, spcr->header.length);
-	acpi_add_table(rsdp, spcr);
+	acpi_add_table(ctx, spcr);
 
 	acpi_write_dev_tables(ctx);
 
 	addr = map_to_sysmem(ctx->current);
 	debug("current = %lx\n", addr);
 
-	acpi_rsdp_addr = (unsigned long)rsdp;
+	acpi_rsdp_addr = (unsigned long)ctx->rsdp;
 	debug("ACPI: done\n");
 
 	return addr;
diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h
index 6fd4c5241a..55349c0bb6 100644
--- a/include/acpi/acpi_table.h
+++ b/include/acpi/acpi_table.h
@@ -551,6 +551,15 @@ void acpi_inc(struct acpi_ctx *ctx, uint amount);
  */
 void acpi_inc_align(struct acpi_ctx *ctx, uint amount);
 
+/**
+ * acpi_add_table() - Add a new table to the RSDP and XSDT
+ *
+ * @ctx: ACPI context
+ * @table: Table to add
+ * @return 0 if OK, -E2BIG if too many tables
+ */
+int acpi_add_table(struct acpi_ctx *ctx, void *table);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
diff --git a/include/dm/acpi.h b/include/dm/acpi.h
index 69d69d7f42..c6c63b8183 100644
--- a/include/dm/acpi.h
+++ b/include/dm/acpi.h
@@ -30,9 +30,14 @@
  * This contains a few useful pieces of information used when writing
  *
  * @current: Current address for writing
+ * @rsdp: Pointer to the Root System Description Pointer, typically used when
+ *	adding a new table. The RSDP holds pointers to the RSDT and XSDT.
+ * @rsdt: Pointer to the Root System Description Table
  */
 struct acpi_ctx {
 	void *current;
+	struct acpi_rsdp *rsdp;
+	struct acpi_rsdt *rsdt;
 };
 
 /**
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index 07d9bbb0af..5311ae9368 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -8,6 +8,8 @@
 #include <common.h>
 #include <dm.h>
 #include <cpu.h>
+#include <mapmem.h>
+#include <tables_csum.h>
 #include <version.h>
 #include <acpi/acpi_table.h>
 #include <dm/acpi.h>
@@ -120,3 +122,62 @@ void acpi_inc_align(struct acpi_ctx *ctx, uint amount)
 	ctx->current += amount;
 	acpi_align(ctx);
 }
+
+/**
+ * Add an ACPI table to the RSDT (and XSDT) structure, recalculate length
+ * and checksum.
+ */
+int acpi_add_table(struct acpi_ctx *ctx, void *table)
+{
+	int i, entries_num;
+	struct acpi_rsdt *rsdt;
+	struct acpi_xsdt *xsdt;
+
+	/* The RSDT is mandatory while the XSDT is not */
+	rsdt = ctx->rsdt;
+
+	/* This should always be MAX_ACPI_TABLES */
+	entries_num = ARRAY_SIZE(rsdt->entry);
+
+	for (i = 0; i < entries_num; i++) {
+		if (rsdt->entry[i] == 0)
+			break;
+	}
+
+	if (i >= entries_num) {
+		debug("ACPI: Error: too many tables\n");
+		return -E2BIG;
+	}
+
+	/* Add table to the RSDT */
+	rsdt->entry[i] = map_to_sysmem(table);
+
+	/* Fix RSDT length or the kernel will assume invalid entries */
+	rsdt->header.length = sizeof(struct acpi_table_header) +
+				(sizeof(u32) * (i + 1));
+
+	/* Re-calculate checksum */
+	rsdt->header.checksum = 0;
+	rsdt->header.checksum = table_compute_checksum((u8 *)rsdt,
+						       rsdt->header.length);
+
+	/*
+	 * And now the same thing for the XSDT. We use the same index as for
+	 * now we want the XSDT and RSDT to always be in sync in U-Boot
+	 */
+	xsdt = (struct acpi_xsdt *)((uintptr_t)ctx->rsdp->xsdt_address);
+
+	/* Add table to the XSDT */
+	xsdt->entry[i] = map_to_sysmem(table);
+
+	/* Fix XSDT length */
+	xsdt->header.length = sizeof(struct acpi_table_header) +
+				(sizeof(u64) * (i + 1));
+
+	/* Re-calculate checksum */
+	xsdt->header.checksum = 0;
+	xsdt->header.checksum = table_compute_checksum((u8 *)xsdt,
+						       xsdt->header.length);
+
+	return 0;
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index 59aee1f614..ffc611efb8 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -21,10 +21,14 @@ static int testacpi_write_tables(const struct udevice *dev,
 				 struct acpi_ctx *ctx)
 {
 	struct acpi_dmar *dmar;
+	int ret;
 
 	dmar = (struct acpi_dmar *)ctx->current;
 	acpi_create_dmar(dmar, DMAR_INTR_REMAP);
 	ctx->current += sizeof(struct acpi_dmar);
+	ret = acpi_add_table(ctx, dmar);
+	if (ret)
+		return log_msg_ret("add", ret);
 
 	return 0;
 }
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 7/9] acpi: Put table-setup code in its own function
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (5 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 6/9] acpi: Move acpi_add_table() to generic code Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-23  9:38   ` Bin Meng
  2020-04-19 20:36 ` [PATCH v7 8/9] acpi: Move the xsdt pointer to acpi_ctx Simon Glass
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

We always write three basic tables to ACPI at the start. Move this into
its own function, along with acpi_fill_header(), so we can write a test
for this code.

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

Changes in v7: None
Changes in v5: None
Changes in v4:
- Put back cast on table_compute_checksum()

Changes in v3:
- Fix 'XDST' typo
- Move acpi_align_large() out of dm_test_acpi_setup_base_tables()
- Beef up the comment explaining how the unaligned address is used

Changes in v2: None

 arch/x86/lib/acpi_table.c | 72 +-----------------------------------
 include/acpi/acpi_table.h | 10 +++++
 lib/acpi/acpi_table.c     | 77 +++++++++++++++++++++++++++++++++++++++
 test/dm/acpi.c            | 58 ++++++++++++++++++++++++++++-
 4 files changed, 144 insertions(+), 73 deletions(-)

diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index ff8cee51d6..600bde2f5f 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -31,58 +31,6 @@ extern const unsigned char AmlCode[];
 /* ACPI RSDP address to be used in boot parameters */
 static ulong acpi_rsdp_addr;
 
-static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
-			    struct acpi_xsdt *xsdt)
-{
-	memset(rsdp, 0, sizeof(struct acpi_rsdp));
-
-	memcpy(rsdp->signature, RSDP_SIG, 8);
-	memcpy(rsdp->oem_id, OEM_ID, 6);
-
-	rsdp->length = sizeof(struct acpi_rsdp);
-	rsdp->rsdt_address = (u32)rsdt;
-
-	rsdp->xsdt_address = (u64)(u32)xsdt;
-	rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
-
-	/* Calculate checksums */
-	rsdp->checksum = table_compute_checksum((void *)rsdp, 20);
-	rsdp->ext_checksum = table_compute_checksum((void *)rsdp,
-			sizeof(struct acpi_rsdp));
-}
-
-static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
-{
-	struct acpi_table_header *header = &(rsdt->header);
-
-	/* Fill out header fields */
-	acpi_fill_header(header, "RSDT");
-	header->length = sizeof(struct acpi_rsdt);
-	header->revision = 1;
-
-	/* Entries are filled in later, we come with an empty set */
-
-	/* Fix checksum */
-	header->checksum = table_compute_checksum((void *)rsdt,
-			sizeof(struct acpi_rsdt));
-}
-
-static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
-{
-	struct acpi_table_header *header = &(xsdt->header);
-
-	/* Fill out header fields */
-	acpi_fill_header(header, "XSDT");
-	header->length = sizeof(struct acpi_xsdt);
-	header->revision = 1;
-
-	/* Entries are filled in later, we come with an empty set */
-
-	/* Fix checksum */
-	header->checksum = table_compute_checksum((void *)xsdt,
-			sizeof(struct acpi_xsdt));
-}
-
 static void acpi_create_facs(struct acpi_facs *facs)
 {
 	memset((void *)facs, 0, sizeof(struct acpi_facs));
@@ -411,7 +359,6 @@ static void acpi_create_spcr(struct acpi_spcr *spcr)
 ulong write_acpi_tables(ulong start_addr)
 {
 	struct acpi_ctx sctx, *ctx = &sctx;
-	struct acpi_xsdt *xsdt;
 	struct acpi_facs *facs;
 	struct acpi_table_header *dsdt;
 	struct acpi_fadt *fadt;
@@ -424,33 +371,16 @@ ulong write_acpi_tables(ulong start_addr)
 	int i;
 
 	start = map_sysmem(start_addr, 0);
-	ctx->current = start;
-
-	/* Align ACPI tables to 16 byte */
-	acpi_align(ctx);
 
 	debug("ACPI: Writing ACPI tables at %lx\n", start_addr);
 
-	/* We need at least an RSDP and an RSDT Table */
-	ctx->rsdp = ctx->current;
-	acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
-	ctx->rsdt = ctx->current;
-	acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
-	xsdt = ctx->current;
-	acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
+	acpi_setup_base_tables(ctx, start);
 	/*
 	 * Per ACPI spec, the FACS table address must be aligned to a 64 byte
 	 * boundary (Windows checks this, but Linux does not).
 	 */
 	acpi_align64(ctx);
 
-	/* clear all table memory */
-	memset((void *)start, 0, ctx->current - start);
-
-	acpi_write_rsdp(ctx->rsdp, ctx->rsdt, xsdt);
-	acpi_write_rsdt(ctx->rsdt);
-	acpi_write_xsdt(xsdt);
-
 	debug("ACPI:    * FACS\n");
 	facs = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_facs));
diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h
index 55349c0bb6..3681c5c8ed 100644
--- a/include/acpi/acpi_table.h
+++ b/include/acpi/acpi_table.h
@@ -560,6 +560,16 @@ void acpi_inc_align(struct acpi_ctx *ctx, uint amount);
  */
 int acpi_add_table(struct acpi_ctx *ctx, void *table);
 
+/**
+ * acpi_setup_base_tables() - Set up context along with RSDP, RSDT and XSDT
+ *
+ * Set up the context with the given start position. Some basic tables are
+ * always needed, so set them up as well.
+ *
+ * @ctx: Context to set up
+ */
+void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index 5311ae9368..85193c49e4 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -181,3 +181,80 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table)
 
 	return 0;
 }
+
+static void acpi_write_rsdp(struct acpi_rsdp *rsdp, struct acpi_rsdt *rsdt,
+			    struct acpi_xsdt *xsdt)
+{
+	memset(rsdp, 0, sizeof(struct acpi_rsdp));
+
+	memcpy(rsdp->signature, RSDP_SIG, 8);
+	memcpy(rsdp->oem_id, OEM_ID, 6);
+
+	rsdp->length = sizeof(struct acpi_rsdp);
+	rsdp->rsdt_address = map_to_sysmem(rsdt);
+
+	rsdp->xsdt_address = map_to_sysmem(xsdt);
+	rsdp->revision = ACPI_RSDP_REV_ACPI_2_0;
+
+	/* Calculate checksums */
+	rsdp->checksum = table_compute_checksum(rsdp, 20);
+	rsdp->ext_checksum = table_compute_checksum(rsdp,
+						    sizeof(struct acpi_rsdp));
+}
+
+static void acpi_write_rsdt(struct acpi_rsdt *rsdt)
+{
+	struct acpi_table_header *header = &rsdt->header;
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "RSDT");
+	header->length = sizeof(struct acpi_rsdt);
+	header->revision = 1;
+
+	/* Entries are filled in later, we come with an empty set */
+
+	/* Fix checksum */
+	header->checksum = table_compute_checksum(rsdt,
+						  sizeof(struct acpi_rsdt));
+}
+
+static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
+{
+	struct acpi_table_header *header = &xsdt->header;
+
+	/* Fill out header fields */
+	acpi_fill_header(header, "XSDT");
+	header->length = sizeof(struct acpi_xsdt);
+	header->revision = 1;
+
+	/* Entries are filled in later, we come with an empty set */
+
+	/* Fix checksum */
+	header->checksum = table_compute_checksum(xsdt,
+						  sizeof(struct acpi_xsdt));
+}
+
+void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start)
+{
+	struct acpi_xsdt *xsdt;
+
+	ctx->current = start;
+
+	/* Align ACPI tables to 16 byte */
+	acpi_align(ctx);
+
+	/* We need at least an RSDP and an RSDT Table */
+	ctx->rsdp = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
+	ctx->rsdt = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
+	xsdt = ctx->current;
+	acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
+
+	/* clear all table memory */
+	memset((void *)start, '\0', ctx->current - start);
+
+	acpi_write_rsdp(ctx->rsdp, ctx->rsdt, xsdt);
+	acpi_write_rsdt(ctx->rsdt);
+	acpi_write_xsdt(xsdt);
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index ffc611efb8..beb1b6da73 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -8,6 +8,9 @@
 
 #include <common.h>
 #include <dm.h>
+#include <malloc.h>
+#include <mapmem.h>
+#include <tables_csum.h>
 #include <version.h>
 #include <acpi/acpi_table.h>
 #include <dm/acpi.h>
@@ -137,9 +140,9 @@ static int dm_test_acpi_write_tables(struct unit_test_state *uts)
 	buf = malloc(BUF_SIZE);
 	ut_assertnonnull(buf);
 
-	ctx.current = buf;
+	acpi_setup_base_tables(&ctx, buf);
+	dmar = ctx.current;
 	ut_assertok(acpi_write_dev_tables(&ctx));
-	dmar = buf;
 
 	/*
 	 * We should have two dmar tables, one for each "denx,u-boot-acpi-test"
@@ -152,6 +155,11 @@ static int dm_test_acpi_write_tables(struct unit_test_state *uts)
 	ut_asserteq(DMAR_INTR_REMAP, dmar[1].flags);
 	ut_asserteq(32 - 1, dmar[1].host_address_width);
 
+	/* Check that the pointers were added correctly */
+	ut_asserteq(map_to_sysmem(dmar), ctx.rsdt->entry[0]);
+	ut_asserteq(map_to_sysmem(dmar + 1), ctx.rsdt->entry[1]);
+	ut_asserteq(0, ctx.rsdt->entry[2]);
+
 	return 0;
 }
 DM_TEST(dm_test_acpi_write_tables, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
@@ -183,3 +191,49 @@ static int dm_test_acpi_basic(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_acpi_basic, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test acpi_setup_base_tables */
+static int dm_test_acpi_setup_base_tables(struct unit_test_state *uts)
+{
+	struct acpi_rsdp *rsdp;
+	struct acpi_rsdt *rsdt;
+	struct acpi_xsdt *xsdt;
+	struct acpi_ctx ctx;
+	void *buf, *end;
+
+	/*
+	 * Use an unaligned address deliberately, by allocating an aligned
+	 * address and then adding 4 to it
+	 */
+	buf = memalign(64, BUF_SIZE);
+	ut_assertnonnull(buf);
+	acpi_setup_base_tables(&ctx, buf + 4);
+
+	rsdp = buf + 16;
+	ut_asserteq_ptr(rsdp, ctx.rsdp);
+	ut_assertok(memcmp(RSDP_SIG, rsdp->signature, sizeof(rsdp->signature)));
+	ut_asserteq(sizeof(*rsdp), rsdp->length);
+	ut_assertok(table_compute_checksum(rsdp, 20));
+	ut_assertok(table_compute_checksum(rsdp, sizeof(*rsdp)));
+
+	rsdt = PTR_ALIGN((void *)rsdp + sizeof(*rsdp), 16);
+	ut_asserteq_ptr(rsdt, ctx.rsdt);
+	ut_assertok(memcmp("RSDT", rsdt->header.signature, ACPI_NAME_LEN));
+	ut_asserteq(sizeof(*rsdt), rsdt->header.length);
+	ut_assertok(table_compute_checksum(rsdt, sizeof(*rsdt)));
+
+	xsdt = PTR_ALIGN((void *)rsdt + sizeof(*rsdt), 16);
+	ut_assertok(memcmp("XSDT", xsdt->header.signature, ACPI_NAME_LEN));
+	ut_asserteq(sizeof(*xsdt), xsdt->header.length);
+	ut_assertok(table_compute_checksum(xsdt, sizeof(*xsdt)));
+
+	end = PTR_ALIGN((void *)xsdt + sizeof(*xsdt), 64);
+	ut_asserteq_ptr(end, ctx.current);
+
+	ut_asserteq(map_to_sysmem(rsdt), rsdp->rsdt_address);
+	ut_asserteq(map_to_sysmem(xsdt), rsdp->xsdt_address);
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_setup_base_tables,
+	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 8/9] acpi: Move the xsdt pointer to acpi_ctx
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (6 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 7/9] acpi: Put table-setup code in its own function Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-19 20:36 ` [PATCH v7 9/9] acpi: Add an acpi command Simon Glass
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

Put this in the context along with the other important pointers.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
---

Changes in v7: None
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 include/dm/acpi.h     |  2 ++
 lib/acpi/acpi_table.c | 10 ++++------
 test/dm/acpi.c        |  5 +++++
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/include/dm/acpi.h b/include/dm/acpi.h
index c6c63b8183..7563a4c60a 100644
--- a/include/dm/acpi.h
+++ b/include/dm/acpi.h
@@ -33,11 +33,13 @@
  * @rsdp: Pointer to the Root System Description Pointer, typically used when
  *	adding a new table. The RSDP holds pointers to the RSDT and XSDT.
  * @rsdt: Pointer to the Root System Description Table
+ * @xsdt: Pointer to the Extended System Description Table
  */
 struct acpi_ctx {
 	void *current;
 	struct acpi_rsdp *rsdp;
 	struct acpi_rsdt *rsdt;
+	struct acpi_xsdt *xsdt;
 };
 
 /**
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index 85193c49e4..9d2b49f8ba 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -165,7 +165,7 @@ int acpi_add_table(struct acpi_ctx *ctx, void *table)
 	 * And now the same thing for the XSDT. We use the same index as for
 	 * now we want the XSDT and RSDT to always be in sync in U-Boot
 	 */
-	xsdt = (struct acpi_xsdt *)((uintptr_t)ctx->rsdp->xsdt_address);
+	xsdt = ctx->xsdt;
 
 	/* Add table to the XSDT */
 	xsdt->entry[i] = map_to_sysmem(table);
@@ -236,8 +236,6 @@ static void acpi_write_xsdt(struct acpi_xsdt *xsdt)
 
 void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start)
 {
-	struct acpi_xsdt *xsdt;
-
 	ctx->current = start;
 
 	/* Align ACPI tables to 16 byte */
@@ -248,13 +246,13 @@ void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start)
 	acpi_inc_align(ctx, sizeof(struct acpi_rsdp));
 	ctx->rsdt = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_rsdt));
-	xsdt = ctx->current;
+	ctx->xsdt = ctx->current;
 	acpi_inc_align(ctx, sizeof(struct acpi_xsdt));
 
 	/* clear all table memory */
 	memset((void *)start, '\0', ctx->current - start);
 
-	acpi_write_rsdp(ctx->rsdp, ctx->rsdt, xsdt);
+	acpi_write_rsdp(ctx->rsdp, ctx->rsdt, ctx->xsdt);
 	acpi_write_rsdt(ctx->rsdt);
-	acpi_write_xsdt(xsdt);
+	acpi_write_xsdt(ctx->xsdt);
 }
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index beb1b6da73..a29c3cab3e 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -160,6 +160,10 @@ static int dm_test_acpi_write_tables(struct unit_test_state *uts)
 	ut_asserteq(map_to_sysmem(dmar + 1), ctx.rsdt->entry[1]);
 	ut_asserteq(0, ctx.rsdt->entry[2]);
 
+	ut_asserteq(map_to_sysmem(dmar), ctx.xsdt->entry[0]);
+	ut_asserteq(map_to_sysmem(dmar + 1), ctx.xsdt->entry[1]);
+	ut_asserteq(0, ctx.xsdt->entry[2]);
+
 	return 0;
 }
 DM_TEST(dm_test_acpi_write_tables, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
@@ -223,6 +227,7 @@ static int dm_test_acpi_setup_base_tables(struct unit_test_state *uts)
 	ut_assertok(table_compute_checksum(rsdt, sizeof(*rsdt)));
 
 	xsdt = PTR_ALIGN((void *)rsdt + sizeof(*rsdt), 16);
+	ut_asserteq_ptr(xsdt, ctx.xsdt);
 	ut_assertok(memcmp("XSDT", xsdt->header.signature, ACPI_NAME_LEN));
 	ut_asserteq(sizeof(*xsdt), xsdt->header.length);
 	ut_assertok(table_compute_checksum(xsdt, sizeof(*xsdt)));
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 9/9] acpi: Add an acpi command
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (7 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 8/9] acpi: Move the xsdt pointer to acpi_ctx Simon Glass
@ 2020-04-19 20:36 ` Simon Glass
  2020-04-21 17:42 ` [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Andy Shevchenko
  2020-04-29 18:09 ` Heinrich Schuchardt
  10 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-19 20:36 UTC (permalink / raw)
  To: u-boot

It is useful to dump ACPI tables in U-Boot to see what has been generated.
Add a command to handle this.

To allow the command to find the tables, add a position into the global
data.

Support subcommands to list and dump the tables.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
---

Changes in v7:
- Rebase to master

Changes in v5: None
Changes in v4:
- Rename list_fact() to list_fadt()
- Add a comment to dump_hdr()

Changes in v3: None
Changes in v2: None

 arch/sandbox/include/asm/global_data.h |   1 +
 arch/x86/include/asm/global_data.h     |   1 +
 cmd/Kconfig                            |  14 ++
 cmd/Makefile                           |   1 +
 cmd/acpi.c                             | 186 +++++++++++++++++++++++++
 lib/acpi/acpi_table.c                  |   1 +
 test/dm/acpi.c                         |  73 ++++++++++
 7 files changed, 277 insertions(+)
 create mode 100644 cmd/acpi.c

diff --git a/arch/sandbox/include/asm/global_data.h b/arch/sandbox/include/asm/global_data.h
index f4ce72d566..f95ddb058a 100644
--- a/arch/sandbox/include/asm/global_data.h
+++ b/arch/sandbox/include/asm/global_data.h
@@ -13,6 +13,7 @@
 struct arch_global_data {
 	uint8_t		*ram_buf;	/* emulated RAM buffer */
 	void		*text_base;	/* pointer to base of text region */
+	ulong acpi_start;		/* Start address of ACPI tables */
 };
 
 #include <asm-generic/global_data.h>
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f4c1839104..4aee2f3e8c 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -123,6 +123,7 @@ struct arch_global_data {
 #ifdef CONFIG_FSP_VERSION2
 	struct fsp_header *fsp_s_hdr;	/* Pointer to FSP-S header */
 #endif
+	ulong acpi_start;		/* Start address of ACPI tables */
 };
 
 #endif
diff --git a/cmd/Kconfig b/cmd/Kconfig
index faa133da65..dd6dce8d20 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -190,6 +190,20 @@ comment "Commands"
 
 menu "Info commands"
 
+config CMD_ACPI
+	bool "acpi"
+	default y if ACPIGEN
+	help
+	  List and dump ACPI tables. ACPI (Advanced Configuration and Power
+	  Interface) is used mostly on x86 for providing information to the
+	  Operating System about devices in the system. The tables are set up
+	  by the firmware, typically U-Boot but possibly an earlier firmware
+	  module, if U-Boot is chain-loaded from something else. ACPI tables
+	  can also include code, to perform hardware-specific tasks required
+	  by the Operating Systems. This allows some amount of separation
+	  between the firmware and OS, and is particularly useful when you
+	  want to make hardware changes without the OS needing to be adjusted.
+
 config CMD_BDI
 	bool "bdinfo"
 	default y
diff --git a/cmd/Makefile b/cmd/Makefile
index f1dd513a4b..15a9693ed0 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -11,6 +11,7 @@ obj-y += help.o
 obj-y += version.o
 
 # command
+obj-$(CONFIG_CMD_ACPI) += acpi.o
 obj-$(CONFIG_CMD_AES) += aes.o
 obj-$(CONFIG_CMD_AB_SELECT) += ab_select.o
 obj-$(CONFIG_CMD_ADC) += adc.o
diff --git a/cmd/acpi.c b/cmd/acpi.c
new file mode 100644
index 0000000000..203bd93bd5
--- /dev/null
+++ b/cmd/acpi.c
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+#include <common.h>
+#include <command.h>
+#include <mapmem.h>
+#include <acpi/acpi_table.h>
+#include <asm/acpi_table.h>
+#include <dm/acpi.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * dump_hdr() - Dump an ACPI header
+ *
+ * If the header is for FACS then it shows the revision information as well
+ *
+ * @hdr: ACPI header to dump
+ */
+static void dump_hdr(struct acpi_table_header *hdr)
+{
+	bool has_hdr = memcmp(hdr->signature, "FACS", ACPI_NAME_LEN);
+
+	printf("%.*s %08lx %06x", ACPI_NAME_LEN, hdr->signature,
+	       (ulong)map_to_sysmem(hdr), hdr->length);
+	if (has_hdr) {
+		printf(" (v%02d %.6s %.8s %u %.4s %d)\n", hdr->revision,
+		       hdr->oem_id, hdr->oem_table_id, hdr->oem_revision,
+		       hdr->aslc_id, hdr->aslc_revision);
+	} else {
+		printf("\n");
+	}
+}
+
+/**
+ * find_table() - Look up an ACPI table
+ *
+ * @sig: Signature of table (4 characters, upper case)
+ * @return pointer to table header, or NULL if not found
+ */
+struct acpi_table_header *find_table(const char *sig)
+{
+	struct acpi_rsdp *rsdp;
+	struct acpi_rsdt *rsdt;
+	int len, i, count;
+
+	rsdp = map_sysmem(gd->arch.acpi_start, 0);
+	if (!rsdp)
+		return NULL;
+	rsdt = map_sysmem(rsdp->rsdt_address, 0);
+	len = rsdt->header.length - sizeof(rsdt->header);
+	count = len / sizeof(u32);
+	for (i = 0; i < count; i++) {
+		struct acpi_table_header *hdr;
+
+		hdr = map_sysmem(rsdt->entry[i], 0);
+		if (!memcmp(hdr->signature, sig, ACPI_NAME_LEN))
+			return hdr;
+		if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN)) {
+			struct acpi_fadt *fadt = (struct acpi_fadt *)hdr;
+
+			if (!memcmp(sig, "DSDT", ACPI_NAME_LEN) && fadt->dsdt)
+				return map_sysmem(fadt->dsdt, 0);
+			if (!memcmp(sig, "FACS", ACPI_NAME_LEN) &&
+			    fadt->firmware_ctrl)
+				return map_sysmem(fadt->firmware_ctrl, 0);
+		}
+	}
+
+	return NULL;
+}
+
+static int dump_table_name(const char *sig)
+{
+	struct acpi_table_header *hdr;
+
+	hdr = find_table(sig);
+	if (!hdr)
+		return -ENOENT;
+	printf("%.*s @ %08lx\n", ACPI_NAME_LEN, hdr->signature,
+	       (ulong)map_to_sysmem(hdr));
+	print_buffer(0, hdr, 1, hdr->length, 0);
+
+	return 0;
+}
+
+static void list_fadt(struct acpi_fadt *fadt)
+{
+	if (fadt->dsdt)
+		dump_hdr(map_sysmem(fadt->dsdt, 0));
+	if (fadt->firmware_ctrl)
+		dump_hdr(map_sysmem(fadt->firmware_ctrl, 0));
+}
+
+static int list_rsdt(struct acpi_rsdt *rsdt, struct acpi_xsdt *xsdt)
+{
+	int len, i, count;
+
+	dump_hdr(&rsdt->header);
+	if (xsdt)
+		dump_hdr(&xsdt->header);
+	len = rsdt->header.length - sizeof(rsdt->header);
+	count = len / sizeof(u32);
+	for (i = 0; i < count; i++) {
+		struct acpi_table_header *hdr;
+
+		if (!rsdt->entry[i])
+			break;
+		hdr = map_sysmem(rsdt->entry[i], 0);
+		dump_hdr(hdr);
+		if (!memcmp(hdr->signature, "FACP", ACPI_NAME_LEN))
+			list_fadt((struct acpi_fadt *)hdr);
+		if (xsdt) {
+			if (xsdt->entry[i] != rsdt->entry[i]) {
+				printf("   (xsdt mismatch %llx)\n",
+				       xsdt->entry[i]);
+			}
+		}
+	}
+
+	return 0;
+}
+
+static int list_rsdp(struct acpi_rsdp *rsdp)
+{
+	struct acpi_rsdt *rsdt;
+	struct acpi_xsdt *xsdt;
+
+	printf("RSDP %08lx %06x (v%02d %.6s)\n", (ulong)map_to_sysmem(rsdp),
+	       rsdp->length, rsdp->revision, rsdp->oem_id);
+	rsdt = map_sysmem(rsdp->rsdt_address, 0);
+	xsdt = map_sysmem(rsdp->xsdt_address, 0);
+	list_rsdt(rsdt, xsdt);
+
+	return 0;
+}
+
+static int do_acpi_list(cmd_tbl_t *cmdtp, int flag, int argc,
+			char *const argv[])
+{
+	struct acpi_rsdp *rsdp;
+
+	rsdp = map_sysmem(gd->arch.acpi_start, 0);
+	if (!rsdp) {
+		printf("No ACPI tables present\n");
+		return 0;
+	}
+	printf("ACPI tables start at %lx\n", gd->arch.acpi_start);
+	list_rsdp(rsdp);
+
+	return 0;
+}
+
+static int do_acpi_dump(cmd_tbl_t *cmdtp, int flag, int argc,
+			char *const argv[])
+{
+	const char *name;
+	char sig[ACPI_NAME_LEN];
+	int ret;
+
+	if (argc < 2)
+		return CMD_RET_USAGE;
+	name = argv[1];
+	if (strlen(name) != ACPI_NAME_LEN) {
+		printf("Table name '%s' must be four characters\n", name);
+		return CMD_RET_FAILURE;
+	}
+	str_to_upper(name, sig, -1);
+	ret = dump_table_name(sig);
+	if (ret) {
+		printf("Table '%.*s' not found\n", ACPI_NAME_LEN, sig);
+		return CMD_RET_FAILURE;
+	}
+
+	return 0;
+}
+
+static char acpi_help_text[] =
+	"list - list ACPI tables\n"
+	"acpi dump <name> - Dump ACPI table";
+
+U_BOOT_CMD_WITH_SUBCMDS(acpi, "ACPI tables", acpi_help_text,
+	U_BOOT_SUBCMD_MKENT(list, 1, 1, do_acpi_list),
+	U_BOOT_SUBCMD_MKENT(dump, 2, 1, do_acpi_dump));
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
index 9d2b49f8ba..5abf1cad50 100644
--- a/lib/acpi/acpi_table.c
+++ b/lib/acpi/acpi_table.c
@@ -240,6 +240,7 @@ void acpi_setup_base_tables(struct acpi_ctx *ctx, void *start)
 
 	/* Align ACPI tables to 16 byte */
 	acpi_align(ctx);
+	gd->arch.acpi_start = map_to_sysmem(ctx->current);
 
 	/* We need at least an RSDP and an RSDT Table */
 	ctx->rsdp = ctx->current;
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index a29c3cab3e..176d207a55 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -7,9 +7,11 @@
  */
 
 #include <common.h>
+#include <console.h>
 #include <dm.h>
 #include <malloc.h>
 #include <mapmem.h>
+#include <version.h>
 #include <tables_csum.h>
 #include <version.h>
 #include <acpi/acpi_table.h>
@@ -212,6 +214,7 @@ static int dm_test_acpi_setup_base_tables(struct unit_test_state *uts)
 	buf = memalign(64, BUF_SIZE);
 	ut_assertnonnull(buf);
 	acpi_setup_base_tables(&ctx, buf + 4);
+	ut_asserteq(map_to_sysmem(PTR_ALIGN(buf + 4, 16)), gd->arch.acpi_start);
 
 	rsdp = buf + 16;
 	ut_asserteq_ptr(rsdp, ctx.rsdp);
@@ -242,3 +245,73 @@ static int dm_test_acpi_setup_base_tables(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_acpi_setup_base_tables,
 	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test 'acpi list' command */
+static int dm_test_acpi_cmd_list(struct unit_test_state *uts)
+{
+	struct acpi_ctx ctx;
+	ulong addr;
+	void *buf;
+
+	buf = memalign(16, BUF_SIZE);
+	ut_assertnonnull(buf);
+	acpi_setup_base_tables(&ctx, buf);
+
+	ut_assertok(acpi_write_dev_tables(&ctx));
+
+	console_record_reset();
+	run_command("acpi list", 0);
+	addr = (ulong)map_to_sysmem(buf);
+	ut_assert_nextline("ACPI tables start at %lx", addr);
+	ut_assert_nextline("RSDP %08lx %06lx (v02 U-BOOT)", addr,
+			   sizeof(struct acpi_rsdp));
+	addr = ALIGN(addr + sizeof(struct acpi_rsdp), 16);
+	ut_assert_nextline("RSDT %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
+			   addr, sizeof(struct acpi_table_header) +
+			   2 * sizeof(u32), U_BOOT_BUILD_DATE);
+	addr = ALIGN(addr + sizeof(struct acpi_rsdt), 16);
+	ut_assert_nextline("XSDT %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
+			   addr, sizeof(struct acpi_table_header) +
+			   2 * sizeof(u64), U_BOOT_BUILD_DATE);
+	addr = ALIGN(addr + sizeof(struct acpi_xsdt), 64);
+	ut_assert_nextline("DMAR %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
+			   addr, sizeof(struct acpi_dmar), U_BOOT_BUILD_DATE);
+	addr = ALIGN(addr + sizeof(struct acpi_dmar), 16);
+	ut_assert_nextline("DMAR %08lx %06lx (v01 U-BOOT U-BOOTBL %u INTL 0)",
+			   addr, sizeof(struct acpi_dmar), U_BOOT_BUILD_DATE);
+	ut_assert_console_end();
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_cmd_list, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test 'acpi dump' command */
+static int dm_test_acpi_cmd_dump(struct unit_test_state *uts)
+{
+	struct acpi_ctx ctx;
+	ulong addr;
+	void *buf;
+
+	buf = memalign(16, BUF_SIZE);
+	ut_assertnonnull(buf);
+	acpi_setup_base_tables(&ctx, buf);
+
+	ut_assertok(acpi_write_dev_tables(&ctx));
+
+	/* First search for a non-existent table */
+	console_record_reset();
+	run_command("acpi dump rdst", 0);
+	ut_assert_nextline("Table 'RDST' not found");
+	ut_assert_console_end();
+
+	/* Now a real table */
+	console_record_reset();
+	run_command("acpi dump dmar", 0);
+	addr = ALIGN(map_to_sysmem(ctx.xsdt) + sizeof(struct acpi_xsdt), 64);
+	ut_assert_nextline("DMAR @ %08lx", addr);
+	ut_assert_nextlines_are_dump(0x30);
+	ut_assert_console_end();
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_cmd_dump, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.26.1.301.g55bc3eb7cb9-goog

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree
  2020-04-19 20:36 ` [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree Simon Glass
@ 2020-04-21 12:25   ` Bin Meng
  2020-04-21 12:29     ` Andy Shevchenko
  2020-04-21 13:07   ` Antwort: " Wolfgang Wallner
  1 sibling, 1 reply; 27+ messages in thread
From: Bin Meng @ 2020-04-21 12:25 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang, Andy,

On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
>
> Devices need to report various identifiers in the ACPI tables. Rather than
> hard-coding these in drivers it is typically better to put them in the
> device tree.
>
> Add a binding file to describe this.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>

Do you have any comments against this patch?

Regards,
Bin

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree
  2020-04-21 12:25   ` Bin Meng
@ 2020-04-21 12:29     ` Andy Shevchenko
  0 siblings, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2020-04-21 12:29 UTC (permalink / raw)
  To: u-boot

On Tue, Apr 21, 2020 at 3:28 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Wolfgang, Andy,
>
> On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
> >
> > Devices need to report various identifiers in the ACPI tables. Rather than
> > hard-coding these in drivers it is typically better to put them in the
> > device tree.
> >
> > Add a binding file to describe this.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
>
> Do you have any comments against this patch?

As long as it doesn't mention PRP0001, I'm fine with it.


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Antwort: Re: [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree
  2020-04-19 20:36 ` [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree Simon Glass
  2020-04-21 12:25   ` Bin Meng
@ 2020-04-21 13:07   ` Wolfgang Wallner
  2020-04-21 14:40     ` Andy Shevchenko
  2020-04-21 14:56     ` Antwort: Re: " Wolfgang Wallner
  1 sibling, 2 replies; 27+ messages in thread
From: Wolfgang Wallner @ 2020-04-21 13:07 UTC (permalink / raw)
  To: u-boot

Hi Bin,

-----"Bin Meng" <bmeng.cn@gmail.com> schrieb: -----

>Betreff: Re: [PATCH v7 1/9] acpi: Add a binding for ACPI settings in
>the device tree
>
>Hi Wolfgang, Andy,
>
>On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
>>
>> Devices need to report various identifiers in the ACPI tables.
>Rather than
>> hard-coding these in drivers it is typically better to put them in
>the
>> device tree.
>>
>> Add a binding file to describe this.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>
>Do you have any comments against this patch?

I'm fine with the patch as it is.

However, two remarks:

 1) I proposed some rewording in [1].
    I'm fine with dropping it, I just point it out to make sure
    that it is deliberately dropped and no just overseen.

 2) In [2] Andy stated that "acpi,compatible" can't work.
    @Andy: did I get this wrong? Is it still fine to add it in
    the binding?

regards, Wolfgang

[1] https://lists.denx.de/pipermail/u-boot/2020-April/406818.html
[2] https://lists.denx.de/pipermail/u-boot/2020-April/406943.html

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree
  2020-04-21 13:07   ` Antwort: " Wolfgang Wallner
@ 2020-04-21 14:40     ` Andy Shevchenko
  2020-04-21 14:56     ` Antwort: Re: " Wolfgang Wallner
  1 sibling, 0 replies; 27+ messages in thread
From: Andy Shevchenko @ 2020-04-21 14:40 UTC (permalink / raw)
  To: u-boot

On Tue, Apr 21, 2020 at 4:07 PM Wolfgang Wallner
<wolfgang.wallner@br-automation.com> wrote:
> >Betreff: Re: [PATCH v7 1/9] acpi: Add a binding for ACPI settings in
> >the device tree
> >
> >Hi Wolfgang, Andy,
> >
> >On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
> >>
> >> Devices need to report various identifiers in the ACPI tables.
> >Rather than
> >> hard-coding these in drivers it is typically better to put them in
> >the
> >> device tree.
> >>
> >> Add a binding file to describe this.
> >>
> >> Signed-off-by: Simon Glass <sjg@chromium.org>
> >> ---
> >>
> >
> >Do you have any comments against this patch?
>
> I'm fine with the patch as it is.
>
> However, two remarks:
>
>  1) I proposed some rewording in [1].
>     I'm fine with dropping it, I just point it out to make sure
>     that it is deliberately dropped and no just overseen.
>
>  2) In [2] Andy stated that "acpi,compatible" can't work.
>     @Andy: did I get this wrong? Is it still fine to add it in
>     the binding?

We can support it in the code, but user should themselves choose how to use it.
This will be half-baked solution, though.

So, I suggest for now to drop it completely.

> [1] https://lists.denx.de/pipermail/u-boot/2020-April/406818.html
> [2] https://lists.denx.de/pipermail/u-boot/2020-April/406943.html



-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Antwort: Re: Re: [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree
  2020-04-21 13:07   ` Antwort: " Wolfgang Wallner
  2020-04-21 14:40     ` Andy Shevchenko
@ 2020-04-21 14:56     ` Wolfgang Wallner
  1 sibling, 0 replies; 27+ messages in thread
From: Wolfgang Wallner @ 2020-04-21 14:56 UTC (permalink / raw)
  To: u-boot

Hi,

-----"Andy Shevchenko" <andy.shevchenko@gmail.com> schrieb: -----

>An: "Wolfgang Wallner" <wolfgang.wallner@br-automation.com>
>Von: "Andy Shevchenko" <andy.shevchenko@gmail.com>
>Datum: 21.04.2020 16:41
>Kopie: "Bin Meng" <bmeng.cn@gmail.com>, "Simon Glass"
><sjg@chromium.org>, "Andy Shevchenko"
><andriy.shevchenko@linux.intel.com>, "U-Boot Mailing List"
><u-boot@lists.denx.de>, "Leif Lindholm" <leif@nuviainc.com>
>Betreff: Re: Re: [PATCH v7 1/9] acpi: Add a binding for ACPI settings
>in the device tree
>
>On Tue, Apr 21, 2020 at 4:07 PM Wolfgang Wallner
><wolfgang.wallner@br-automation.com> wrote:
>> >Betreff: Re: [PATCH v7 1/9] acpi: Add a binding for ACPI settings
>in
>> >the device tree
>> >
>> >Hi Wolfgang, Andy,
>> >
>> >On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org>
>wrote:
>> >>
>> >> Devices need to report various identifiers in the ACPI tables.
>> >Rather than
>> >> hard-coding these in drivers it is typically better to put them
>in
>> >the
>> >> device tree.
>> >>
>> >> Add a binding file to describe this.
>> >>
>> >> Signed-off-by: Simon Glass <sjg@chromium.org>
>> >> ---
>> >>
>> >
>> >Do you have any comments against this patch?
>>
>> I'm fine with the patch as it is.
>>
>> However, two remarks:
>>
>>  1) I proposed some rewording in [1].
>>     I'm fine with dropping it, I just point it out to make sure
>>     that it is deliberately dropped and no just overseen.
>>
>>  2) In [2] Andy stated that "acpi,compatible" can't work.
>>     @Andy: did I get this wrong? Is it still fine to add it in
>>     the binding?
>
>We can support it in the code, but user should themselves choose how
>to use it.
>This will be half-baked solution, though.
>
>So, I suggest for now to drop it completely.

Ok, thanks for clarifying.
That was the only aspect of the the patch I still felt I don't understand enough.
So whether "acpi,compatible" is dropped or not:

Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>


>> [1] https://lists.denx.de/pipermail/u-boot/2020-April/406818.html
>> [2] https://lists.denx.de/pipermail/u-boot/2020-April/406943.html
>

regards, Wolfgang

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (8 preceding siblings ...)
  2020-04-19 20:36 ` [PATCH v7 9/9] acpi: Add an acpi command Simon Glass
@ 2020-04-21 17:42 ` Andy Shevchenko
  2020-04-21 21:37   ` Simon Glass
  2020-04-29 18:09 ` Heinrich Schuchardt
  10 siblings, 1 reply; 27+ messages in thread
From: Andy Shevchenko @ 2020-04-21 17:42 UTC (permalink / raw)
  To: u-boot

On Sun, Apr 19, 2020 at 02:36:48PM -0600, Simon Glass wrote:
> This is split from the original series in an attempt to get things applied
> in chunks.
> 
> v7 is just a rebase as requested

So, overall I have no concerns, except that compatible string in ACPI seems
half-baked solution and, due to PRP0001 awareness (my understanding that it
should not be part of production devices), seems not needed right now.
It means we should require to have _HID and/or _CID.

Code looks fine to me, though.

> Changes in v7:
> - Rebase to master
> 
> Changes in v5:
> - Drop bisectability changes
> 
> Changes in v4:
> - Put 'interrupts-extended' property on one line
> - Rename acpi-probed to linux,probed
> - Note that linux,probed is an out-of-tree feature
> - Separate out the log newline
> - Update comment in acpi_inc_align() to show the alignment
> - Put back cast on table_compute_checksum()
> - Rename list_fact() to list_fadt()
> - Add a comment to dump_hdr()
> 
> Changes in v3:
> - Drop mention of PRIC
> - Rename acpi,desc to acpi,ddn
> - Correct description of acpi,probed
> - Drop hid-descr-addr
> - Just add the device.txt binding file in this patch
> - Change the example to ELAN
> - Add a pointer to information about acpi,compatible
> - Rename acpi_align_large() to acpi_align64()
> - Fix 'RSDP' typo
> - Fix 'XDST' typo
> - Move acpi_align_large() out of dm_test_acpi_setup_base_tables()
> - Beef up the comment explaining how the unaligned address is used
> 
> Changes in v2:
> - Fix definition of HID
> - Infer hid-over-i2c CID value
> - Add the hid-over-i2c binding document
> - Drop definition of ACPI_TABLE_CREATOR
> - Make _acpi_write_dev_tables() static and switch argument order
> - Generalise the ACPI function recursion with acpi_recurse_method()
> 
> Simon Glass (9):
>   acpi: Add a binding for ACPI settings in the device tree
>   acpi: Add a method to write tables for a device
>   acpi: Convert part of acpi_table to use acpi_ctx
>   x86: Allow devices to write ACPI tables
>   acpi: Drop code for missing XSDT from acpi_write_rsdp()
>   acpi: Move acpi_add_table() to generic code
>   acpi: Put table-setup code in its own function
>   acpi: Move the xsdt pointer to acpi_ctx
>   acpi: Add an acpi command
> 
>  arch/sandbox/dts/test.dts              |   4 +
>  arch/sandbox/include/asm/global_data.h |   1 +
>  arch/x86/include/asm/global_data.h     |   1 +
>  arch/x86/lib/acpi_table.c              | 239 +++++--------------------
>  cmd/Kconfig                            |  14 ++
>  cmd/Makefile                           |   1 +
>  cmd/acpi.c                             | 186 +++++++++++++++++++
>  doc/device-tree-bindings/device.txt    |  36 ++++
>  drivers/core/acpi.c                    |  62 +++++++
>  include/acpi/acpi_table.h              |  65 +++++++
>  include/dm/acpi.h                      |  37 ++++
>  lib/acpi/acpi_table.c                  | 174 +++++++++++++++++-
>  test/dm/acpi.c                         | 238 +++++++++++++++++++++++-
>  13 files changed, 855 insertions(+), 203 deletions(-)
>  create mode 100644 cmd/acpi.c
>  create mode 100644 doc/device-tree-bindings/device.txt
> 
> -- 
> 2.26.1.301.g55bc3eb7cb9-goog
> 

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-21 17:42 ` [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Andy Shevchenko
@ 2020-04-21 21:37   ` Simon Glass
  2020-04-23  9:46     ` Bin Meng
  0 siblings, 1 reply; 27+ messages in thread
From: Simon Glass @ 2020-04-21 21:37 UTC (permalink / raw)
  To: u-boot

Hi Andy,

On Tue, 21 Apr 2020 at 11:43, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> On Sun, Apr 19, 2020 at 02:36:48PM -0600, Simon Glass wrote:
> > This is split from the original series in an attempt to get things applied
> > in chunks.
> >
> > v7 is just a rebase as requested
>
> So, overall I have no concerns, except that compatible string in ACPI seems
> half-baked solution and, due to PRP0001 awareness (my understanding that it
> should not be part of production devices), seems not needed right now.
> It means we should require to have _HID and/or _CID.

OK I am really not sure what to say about this. Let's deal with it
when we see the use of it later.

>
> Code looks fine to me, though.
>

OK good. I will send part B soon.

> > Changes in v7:
> > - Rebase to master
> >
> > Changes in v5:
> > - Drop bisectability changes
> >
> > Changes in v4:
> > - Put 'interrupts-extended' property on one line
> > - Rename acpi-probed to linux,probed
> > - Note that linux,probed is an out-of-tree feature
> > - Separate out the log newline
> > - Update comment in acpi_inc_align() to show the alignment
> > - Put back cast on table_compute_checksum()
> > - Rename list_fact() to list_fadt()
> > - Add a comment to dump_hdr()
> >
> > Changes in v3:
> > - Drop mention of PRIC
> > - Rename acpi,desc to acpi,ddn
> > - Correct description of acpi,probed
> > - Drop hid-descr-addr
> > - Just add the device.txt binding file in this patch
> > - Change the example to ELAN
> > - Add a pointer to information about acpi,compatible
> > - Rename acpi_align_large() to acpi_align64()
> > - Fix 'RSDP' typo
> > - Fix 'XDST' typo
> > - Move acpi_align_large() out of dm_test_acpi_setup_base_tables()
> > - Beef up the comment explaining how the unaligned address is used
> >
> > Changes in v2:
> > - Fix definition of HID
> > - Infer hid-over-i2c CID value
> > - Add the hid-over-i2c binding document
> > - Drop definition of ACPI_TABLE_CREATOR
> > - Make _acpi_write_dev_tables() static and switch argument order
> > - Generalise the ACPI function recursion with acpi_recurse_method()
> >
> > Simon Glass (9):
> >   acpi: Add a binding for ACPI settings in the device tree
> >   acpi: Add a method to write tables for a device
> >   acpi: Convert part of acpi_table to use acpi_ctx
> >   x86: Allow devices to write ACPI tables
> >   acpi: Drop code for missing XSDT from acpi_write_rsdp()
> >   acpi: Move acpi_add_table() to generic code
> >   acpi: Put table-setup code in its own function
> >   acpi: Move the xsdt pointer to acpi_ctx
> >   acpi: Add an acpi command
> >
> >  arch/sandbox/dts/test.dts              |   4 +
> >  arch/sandbox/include/asm/global_data.h |   1 +
> >  arch/x86/include/asm/global_data.h     |   1 +
> >  arch/x86/lib/acpi_table.c              | 239 +++++--------------------
> >  cmd/Kconfig                            |  14 ++
> >  cmd/Makefile                           |   1 +
> >  cmd/acpi.c                             | 186 +++++++++++++++++++
> >  doc/device-tree-bindings/device.txt    |  36 ++++
> >  drivers/core/acpi.c                    |  62 +++++++
> >  include/acpi/acpi_table.h              |  65 +++++++
> >  include/dm/acpi.h                      |  37 ++++
> >  lib/acpi/acpi_table.c                  | 174 +++++++++++++++++-
> >  test/dm/acpi.c                         | 238 +++++++++++++++++++++++-
> >  13 files changed, 855 insertions(+), 203 deletions(-)
> >  create mode 100644 cmd/acpi.c
> >  create mode 100644 doc/device-tree-bindings/device.txt
> >
> > --
> > 2.26.1.301.g55bc3eb7cb9-goog
> >
Regards,
Simon

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 7/9] acpi: Put table-setup code in its own function
  2020-04-19 20:36 ` [PATCH v7 7/9] acpi: Put table-setup code in its own function Simon Glass
@ 2020-04-23  9:38   ` Bin Meng
  2020-04-26 19:45     ` Simon Glass
  2020-04-27  6:36     ` Antwort: " Wolfgang Wallner
  0 siblings, 2 replies; 27+ messages in thread
From: Bin Meng @ 2020-04-23  9:38 UTC (permalink / raw)
  To: u-boot

Hi Simon, Wolfgang,

On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
>
> We always write three basic tables to ACPI at the start. Move this into
> its own function, along with acpi_fill_header(), so we can write a test
> for this code.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>

I see Wolfgang gave a RB tag to the v5 patch, so I am going to add
that tag here since no changes between v5 and v7

Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>

But I wonder why this new series is tagged as v7. Do I miss v6?

> ---
>
> Changes in v7: None
> Changes in v5: None
> Changes in v4:
> - Put back cast on table_compute_checksum()
>
> Changes in v3:
> - Fix 'XDST' typo
> - Move acpi_align_large() out of dm_test_acpi_setup_base_tables()
> - Beef up the comment explaining how the unaligned address is used
>
> Changes in v2: None
>
>  arch/x86/lib/acpi_table.c | 72 +-----------------------------------
>  include/acpi/acpi_table.h | 10 +++++
>  lib/acpi/acpi_table.c     | 77 +++++++++++++++++++++++++++++++++++++++
>  test/dm/acpi.c            | 58 ++++++++++++++++++++++++++++-
>  4 files changed, 144 insertions(+), 73 deletions(-)
>

Regards,
Bin

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-21 21:37   ` Simon Glass
@ 2020-04-23  9:46     ` Bin Meng
  2020-04-23  9:58       ` Bin Meng
  0 siblings, 1 reply; 27+ messages in thread
From: Bin Meng @ 2020-04-23  9:46 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On Wed, Apr 22, 2020 at 5:37 AM Simon Glass <sjg@chromium.org> wrote:
>
> Hi Andy,
>
> On Tue, 21 Apr 2020 at 11:43, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> >
> > On Sun, Apr 19, 2020 at 02:36:48PM -0600, Simon Glass wrote:
> > > This is split from the original series in an attempt to get things applied
> > > in chunks.
> > >
> > > v7 is just a rebase as requested
> >
> > So, overall I have no concerns, except that compatible string in ACPI seems
> > half-baked solution and, due to PRP0001 awareness (my understanding that it
> > should not be part of production devices), seems not needed right now.
> > It means we should require to have _HID and/or _CID.
>
> OK I am really not sure what to say about this. Let's deal with it
> when we see the use of it later.
>
> >
> > Code looks fine to me, though.
> >
>
> OK good. I will send part B soon.
>

v7 has been applied to u-boot-x86, thanks!

Regards,
Bin

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-23  9:46     ` Bin Meng
@ 2020-04-23  9:58       ` Bin Meng
  2020-04-27  5:58         ` Bin Meng
  0 siblings, 1 reply; 27+ messages in thread
From: Bin Meng @ 2020-04-23  9:58 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On Thu, Apr 23, 2020 at 5:46 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Simon,
>
> On Wed, Apr 22, 2020 at 5:37 AM Simon Glass <sjg@chromium.org> wrote:
> >
> > Hi Andy,
> >
> > On Tue, 21 Apr 2020 at 11:43, Andy Shevchenko
> > <andriy.shevchenko@linux.intel.com> wrote:
> > >
> > > On Sun, Apr 19, 2020 at 02:36:48PM -0600, Simon Glass wrote:
> > > > This is split from the original series in an attempt to get things applied
> > > > in chunks.
> > > >
> > > > v7 is just a rebase as requested
> > >
> > > So, overall I have no concerns, except that compatible string in ACPI seems
> > > half-baked solution and, due to PRP0001 awareness (my understanding that it
> > > should not be part of production devices), seems not needed right now.
> > > It means we should require to have _HID and/or _CID.
> >
> > OK I am really not sure what to say about this. Let's deal with it
> > when we see the use of it later.
> >
> > >
> > > Code looks fine to me, though.
> > >
> >
> > OK good. I will send part B soon.
> >
>
> v7 has been applied to u-boot-x86, thanks!
>

Unfortunately this series breaks sandbox_spl, please take a look.

https://gitlab.denx.de/u-boot/custodians/u-boot-x86/-/jobs/81615

Regards,
Bin

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 7/9] acpi: Put table-setup code in its own function
  2020-04-23  9:38   ` Bin Meng
@ 2020-04-26 19:45     ` Simon Glass
  2020-04-27  6:36     ` Antwort: " Wolfgang Wallner
  1 sibling, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-26 19:45 UTC (permalink / raw)
  To: u-boot

Hi Bin,

On Thu, 23 Apr 2020 at 03:38, Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Simon, Wolfgang,
>
> On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
> >
> > We always write three basic tables to ACPI at the start. Move this into
> > its own function, along with acpi_fill_header(), so we can write a test
> > for this code.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
>
> I see Wolfgang gave a RB tag to the v5 patch, so I am going to add
> that tag here since no changes between v5 and v7
>
> Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
>
> But I wonder why this new series is tagged as v7. Do I miss v6?

I'm not sure...but I think I might have skipped a version.

Regards,
SImon

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-23  9:58       ` Bin Meng
@ 2020-04-27  5:58         ` Bin Meng
  2020-04-27 17:02           ` Simon Glass
  0 siblings, 1 reply; 27+ messages in thread
From: Bin Meng @ 2020-04-27  5:58 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On Thu, Apr 23, 2020 at 5:58 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Simon,
>
> On Thu, Apr 23, 2020 at 5:46 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> >
> > Hi Simon,
> >
> > On Wed, Apr 22, 2020 at 5:37 AM Simon Glass <sjg@chromium.org> wrote:
> > >
> > > Hi Andy,
> > >
> > > On Tue, 21 Apr 2020 at 11:43, Andy Shevchenko
> > > <andriy.shevchenko@linux.intel.com> wrote:
> > > >
> > > > On Sun, Apr 19, 2020 at 02:36:48PM -0600, Simon Glass wrote:
> > > > > This is split from the original series in an attempt to get things applied
> > > > > in chunks.
> > > > >
> > > > > v7 is just a rebase as requested
> > > >
> > > > So, overall I have no concerns, except that compatible string in ACPI seems
> > > > half-baked solution and, due to PRP0001 awareness (my understanding that it
> > > > should not be part of production devices), seems not needed right now.
> > > > It means we should require to have _HID and/or _CID.
> > >
> > > OK I am really not sure what to say about this. Let's deal with it
> > > when we see the use of it later.
> > >
> > > >
> > > > Code looks fine to me, though.
> > > >
> > >
> > > OK good. I will send part B soon.
> > >
> >
> > v7 has been applied to u-boot-x86, thanks!
> >
>
> Unfortunately this series breaks sandbox_spl, please take a look.
>
> https://gitlab.denx.de/u-boot/custodians/u-boot-x86/-/jobs/81615
>

Did you send out a fix for this series so that I can squash in?

Regards,
Bin

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Antwort: Re: [PATCH v7 7/9] acpi: Put table-setup code in its own function
  2020-04-23  9:38   ` Bin Meng
  2020-04-26 19:45     ` Simon Glass
@ 2020-04-27  6:36     ` Wolfgang Wallner
  2020-04-27  7:10       ` Bin Meng
  1 sibling, 1 reply; 27+ messages in thread
From: Wolfgang Wallner @ 2020-04-27  6:36 UTC (permalink / raw)
  To: u-boot

Hi Bin, Simon,

-----"Simon Glass" <sjg@chromium.org> schrieb: -----
> Betreff: Re: [PATCH v7 7/9] acpi: Put table-setup code in its own function
>
> Hi Bin,
> 
> On Thu, 23 Apr 2020 at 03:38, Bin Meng <bmeng.cn@gmail.com> wrote:
> >
> > Hi Simon, Wolfgang,
> >
> > On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
> > >
> > > We always write three basic tables to ACPI at the start. Move this into
> > > its own function, along with acpi_fill_header(), so we can write a test
> > > for this code.
> > >
> > > Signed-off-by: Simon Glass <sjg@chromium.org>
> >
> > I see Wolfgang gave a RB tag to the v5 patch, so I am going to add
> > that tag here since no changes between v5 and v7
> >
> > Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
> >
> > But I wonder why this new series is tagged as v7. Do I miss v6?
> 
> I'm not sure...but I think I might have skipped a version.

v5 was the last full version of part A of this series.
v6 contained only two fixes for v5, and was applied together with parts of v5.
v7 are the remainig patches of v5.

regards, Wolfgang

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 7/9] acpi: Put table-setup code in its own function
  2020-04-27  6:36     ` Antwort: " Wolfgang Wallner
@ 2020-04-27  7:10       ` Bin Meng
  0 siblings, 0 replies; 27+ messages in thread
From: Bin Meng @ 2020-04-27  7:10 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang,

On Mon, Apr 27, 2020 at 2:36 PM Wolfgang Wallner
<wolfgang.wallner@br-automation.com> wrote:
>
> Hi Bin, Simon,
>
> -----"Simon Glass" <sjg@chromium.org> schrieb: -----
> > Betreff: Re: [PATCH v7 7/9] acpi: Put table-setup code in its own function
> >
> > Hi Bin,
> >
> > On Thu, 23 Apr 2020 at 03:38, Bin Meng <bmeng.cn@gmail.com> wrote:
> > >
> > > Hi Simon, Wolfgang,
> > >
> > > On Mon, Apr 20, 2020 at 4:37 AM Simon Glass <sjg@chromium.org> wrote:
> > > >
> > > > We always write three basic tables to ACPI at the start. Move this into
> > > > its own function, along with acpi_fill_header(), so we can write a test
> > > > for this code.
> > > >
> > > > Signed-off-by: Simon Glass <sjg@chromium.org>
> > >
> > > I see Wolfgang gave a RB tag to the v5 patch, so I am going to add
> > > that tag here since no changes between v5 and v7
> > >
> > > Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
> > >
> > > But I wonder why this new series is tagged as v7. Do I miss v6?
> >
> > I'm not sure...but I think I might have skipped a version.
>
> v5 was the last full version of part A of this series.
> v6 contained only two fixes for v5, and was applied together with parts of v5.
> v7 are the remainig patches of v5.

Ah, yes! Thanks for the information.

Regards,
Bin

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-27  5:58         ` Bin Meng
@ 2020-04-27 17:02           ` Simon Glass
  0 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-04-27 17:02 UTC (permalink / raw)
  To: u-boot

Hi Bin,

On Sun, 26 Apr 2020 at 23:58, Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Simon,
>
> On Thu, Apr 23, 2020 at 5:58 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> >
> > Hi Simon,
> >
> > On Thu, Apr 23, 2020 at 5:46 PM Bin Meng <bmeng.cn@gmail.com> wrote:
> > >
> > > Hi Simon,
> > >
> > > On Wed, Apr 22, 2020 at 5:37 AM Simon Glass <sjg@chromium.org> wrote:
> > > >
> > > > Hi Andy,
> > > >
> > > > On Tue, 21 Apr 2020 at 11:43, Andy Shevchenko
> > > > <andriy.shevchenko@linux.intel.com> wrote:
> > > > >
> > > > > On Sun, Apr 19, 2020 at 02:36:48PM -0600, Simon Glass wrote:
> > > > > > This is split from the original series in an attempt to get things applied
> > > > > > in chunks.
> > > > > >
> > > > > > v7 is just a rebase as requested
> > > > >
> > > > > So, overall I have no concerns, except that compatible string in ACPI seems
> > > > > half-baked solution and, due to PRP0001 awareness (my understanding that it
> > > > > should not be part of production devices), seems not needed right now.
> > > > > It means we should require to have _HID and/or _CID.
> > > >
> > > > OK I am really not sure what to say about this. Let's deal with it
> > > > when we see the use of it later.
> > > >
> > > > >
> > > > > Code looks fine to me, though.
> > > > >
> > > >
> > > > OK good. I will send part B soon.
> > > >
> > >
> > > v7 has been applied to u-boot-x86, thanks!
> > >
> >
> > Unfortunately this series breaks sandbox_spl, please take a look.
> >
> > https://gitlab.denx.de/u-boot/custodians/u-boot-x86/-/jobs/81615
> >
>
> Did you send out a fix for this series so that I can squash in?

Oops, no, I sent out a new series. I will send a fixup patch.

Regards,
Simon

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
                   ` (9 preceding siblings ...)
  2020-04-21 17:42 ` [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Andy Shevchenko
@ 2020-04-29 18:09 ` Heinrich Schuchardt
  2020-05-01 13:14   ` Simon Glass
  10 siblings, 1 reply; 27+ messages in thread
From: Heinrich Schuchardt @ 2020-04-29 18:09 UTC (permalink / raw)
  To: u-boot

On 4/19/20 10:36 PM, Simon Glass wrote:
> This is split from the original series in an attempt to get things applied
> in chunks.
>
> v7 is just a rebase as requested

Hello Simon,

Andrei Warkentin pointed me to a similar development for EDK2:

Dynamic Tables Framework
https://github.com/tianocore/edk2/tree/master/DynamicTablesPkg

Best regards

Heinrich

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A)
  2020-04-29 18:09 ` Heinrich Schuchardt
@ 2020-05-01 13:14   ` Simon Glass
  0 siblings, 0 replies; 27+ messages in thread
From: Simon Glass @ 2020-05-01 13:14 UTC (permalink / raw)
  To: u-boot

Hi Heinrich,

On Wed, 29 Apr 2020 at 12:14, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 4/19/20 10:36 PM, Simon Glass wrote:
> > This is split from the original series in an attempt to get things applied
> > in chunks.
> >
> > v7 is just a rebase as requested
>
> Hello Simon,
>
> Andrei Warkentin pointed me to a similar development for EDK2:
>
> Dynamic Tables Framework
> https://github.com/tianocore/edk2/tree/master/DynamicTablesPkg

Thanks, I had a quick look. Are you thinking we should try to have a
common library for this?

Regards,
Simon

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2020-05-01 13:14 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-19 20:36 [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Simon Glass
2020-04-19 20:36 ` [PATCH v7 1/9] acpi: Add a binding for ACPI settings in the device tree Simon Glass
2020-04-21 12:25   ` Bin Meng
2020-04-21 12:29     ` Andy Shevchenko
2020-04-21 13:07   ` Antwort: " Wolfgang Wallner
2020-04-21 14:40     ` Andy Shevchenko
2020-04-21 14:56     ` Antwort: Re: " Wolfgang Wallner
2020-04-19 20:36 ` [PATCH v7 2/9] acpi: Add a method to write tables for a device Simon Glass
2020-04-19 20:36 ` [PATCH v7 3/9] acpi: Convert part of acpi_table to use acpi_ctx Simon Glass
2020-04-19 20:36 ` [PATCH v7 4/9] x86: Allow devices to write ACPI tables Simon Glass
2020-04-19 20:36 ` [PATCH v7 5/9] acpi: Drop code for missing XSDT from acpi_write_rsdp() Simon Glass
2020-04-19 20:36 ` [PATCH v7 6/9] acpi: Move acpi_add_table() to generic code Simon Glass
2020-04-19 20:36 ` [PATCH v7 7/9] acpi: Put table-setup code in its own function Simon Glass
2020-04-23  9:38   ` Bin Meng
2020-04-26 19:45     ` Simon Glass
2020-04-27  6:36     ` Antwort: " Wolfgang Wallner
2020-04-27  7:10       ` Bin Meng
2020-04-19 20:36 ` [PATCH v7 8/9] acpi: Move the xsdt pointer to acpi_ctx Simon Glass
2020-04-19 20:36 ` [PATCH v7 9/9] acpi: Add an acpi command Simon Glass
2020-04-21 17:42 ` [PATCH v7 0/9] dm: Add programmatic generation of ACPI tables (part A) Andy Shevchenko
2020-04-21 21:37   ` Simon Glass
2020-04-23  9:46     ` Bin Meng
2020-04-23  9:58       ` Bin Meng
2020-04-27  5:58         ` Bin Meng
2020-04-27 17:02           ` Simon Glass
2020-04-29 18:09 ` Heinrich Schuchardt
2020-05-01 13:14   ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.