[PATCH v4 21/31] acpi: Add a central location for table version numbers

Simon Glass sjg at chromium.org
Wed Apr 8 05:00:57 CEST 2020


Each ACPI table has its own version number. Add the version numbers in a
single function so we can keep them consistent and easily see what
versions are supported.

Start a new acpi_table file in a generic directory to house this function.
We can move things over to this file from x86 as needed.

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

Changes in v4:
- Move ACPI makefile line outside the ifdef CONFIG_SPL_BUILD
- Add a comment about the MADT table version
- Add SPCR
- Update comment to include tables defined or reserved by ACPI

Changes in v3:
- Fix file comment for acpi_table.c
- Fix a few typos

Changes in v2:
- Move the sandbox acpi_table.h header file to an earlier patch
- Use #defines for MADT and MCFG version numbers

 include/acpi/acpi_table.h | 62 +++++++++++++++++++++++++++++++++++++++
 lib/Makefile              |  1 +
 lib/acpi/Makefile         |  4 +++
 lib/acpi/acpi_table.c     | 62 +++++++++++++++++++++++++++++++++++++++
 test/dm/acpi.c            | 14 +++++++++
 5 files changed, 143 insertions(+)
 create mode 100644 lib/acpi/Makefile
 create mode 100644 lib/acpi/acpi_table.c

diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h
index dd748958136..286ff2a20d6 100644
--- a/include/acpi/acpi_table.h
+++ b/include/acpi/acpi_table.h
@@ -202,6 +202,26 @@ struct __packed acpi_fadt {
 	struct acpi_gen_regaddr x_gpe1_blk;
 };
 
+/* FADT TABLE Revision values */
+#define ACPI_FADT_REV_ACPI_1_0		1
+#define ACPI_FADT_REV_ACPI_2_0		3
+#define ACPI_FADT_REV_ACPI_3_0		4
+#define ACPI_FADT_REV_ACPI_4_0		4
+#define ACPI_FADT_REV_ACPI_5_0		5
+#define ACPI_FADT_REV_ACPI_6_0		6
+
+/* MADT TABLE Revision values - note these do not match the ACPI revision */
+#define ACPI_MADT_REV_ACPI_3_0		2
+#define ACPI_MADT_REV_ACPI_4_0		3
+#define ACPI_MADT_REV_ACPI_5_0		3
+#define ACPI_MADT_REV_ACPI_6_0		5
+
+#define ACPI_MCFG_REV_ACPI_3_0		1
+
+/* IVRS Revision Field */
+#define IVRS_FORMAT_FIXED	0x01	/* Type 10h & 11h only */
+#define IVRS_FORMAT_MIXED	0x02	/* Type 10h, 11h, & 40h */
+
 /* FACS flags */
 #define ACPI_FACS_S4BIOS_F		BIT(0)
 #define ACPI_FACS_64BIT_WAKE_F		BIT(1)
@@ -391,6 +411,48 @@ struct __packed acpi_spcr {
 	u32 reserved2;
 };
 
+/* Tables defined/reserved by ACPI and generated by U-Boot */
+enum acpi_tables {
+	ACPITAB_BERT,
+	ACPITAB_DBG2,
+	ACPITAB_DMAR,
+	ACPITAB_DSDT,
+	ACPITAB_ECDT,
+	ACPITAB_FACS,
+	ACPITAB_FADT,
+	ACPITAB_HEST,
+	ACPITAB_HPET,
+	ACPITAB_IVRS,
+	ACPITAB_MADT,
+	ACPITAB_MCFG,
+	ACPITAB_RSDP,
+	ACPITAB_RSDT,
+	ACPITAB_SLIT,
+	ACPITAB_SPCR,
+	ACPITAB_SRAT,
+	ACPITAB_SSDT,
+	ACPITAB_TCPA,
+	ACPITAB_TPM2,
+	ACPITAB_XSDT,
+
+	/* Additional proprietary tables */
+	ACPITAB_NHLT,
+	ACPITAB_SPMI,
+	ACPITAB_VFCT,
+
+	ACPITAB_COUNT,
+};
+
+/**
+ * acpi_get_table_revision() - Get the revision number generated for a table
+ *
+ * This keeps the version-number information in one place
+ *
+ * @table: ACPI table to check
+ * @return version number that U-Boot generates
+ */
+int acpi_get_table_revision(enum acpi_tables table);
+
 #endif /* !__ACPI__*/
 
 #include <asm/acpi_table.h>
diff --git a/lib/Makefile b/lib/Makefile
index 15259d0473c..5bd6f57482e 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -58,6 +58,7 @@ obj-$(CONFIG_TPM_V1) += tpm-v1.o
 obj-$(CONFIG_TPM_V2) += tpm-v2.o
 endif
 
+obj-$(CONFIG_$(SPL_)ACPIGEN) += acpi/
 obj-$(CONFIG_$(SPL_)RSA) += rsa/
 obj-$(CONFIG_SHA1) += sha1.o
 obj-$(CONFIG_SHA256) += sha256.o
diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile
new file mode 100644
index 00000000000..660491ef711
--- /dev/null
+++ b/lib/acpi/Makefile
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+
+obj-y += acpi_table.o
diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c
new file mode 100644
index 00000000000..3268430cd1e
--- /dev/null
+++ b/lib/acpi/acpi_table.c
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Generic code used to generate ACPI tables
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include <common.h>
+#include <acpi/acpi_table.h>
+
+int acpi_get_table_revision(enum acpi_tables table)
+{
+	switch (table) {
+	case ACPITAB_FADT:
+		return ACPI_FADT_REV_ACPI_3_0;
+	case ACPITAB_MADT:
+		return ACPI_MADT_REV_ACPI_3_0;
+	case ACPITAB_MCFG:
+		return ACPI_MCFG_REV_ACPI_3_0;
+	case ACPITAB_TCPA:
+		/* This version and the rest are open-coded */
+		return 2;
+	case ACPITAB_TPM2:
+		return 4;
+	case ACPITAB_SSDT: /* ACPI 3.0 upto 6.3: 2 */
+		return 2;
+	case ACPITAB_SRAT: /* ACPI 2.0: 1, ACPI 3.0: 2, ACPI 4.0 to 6.3: 3 */
+		return 1; /* TODO Should probably be upgraded to 2 */
+	case ACPITAB_DMAR:
+		return 1;
+	case ACPITAB_SLIT: /* ACPI 2.0 upto 6.3: 1 */
+		return 1;
+	case ACPITAB_SPMI: /* IMPI 2.0 */
+		return 5;
+	case ACPITAB_HPET: /* Currently 1. Table added in ACPI 2.0 */
+		return 1;
+	case ACPITAB_VFCT: /* ACPI 2.0/3.0/4.0: 1 */
+		return 1;
+	case ACPITAB_IVRS:
+		return IVRS_FORMAT_FIXED;
+	case ACPITAB_DBG2:
+		return 0;
+	case ACPITAB_FACS: /* ACPI 2.0/3.0: 1, ACPI 4.0 to 6.3: 2 */
+		return 1;
+	case ACPITAB_RSDT: /* ACPI 1.0 upto 6.3: 1 */
+		return 1;
+	case ACPITAB_XSDT: /* ACPI 2.0 upto 6.3: 1 */
+		return 1;
+	case ACPITAB_RSDP: /* ACPI 2.0 upto 6.3: 2 */
+		return 2;
+	case ACPITAB_HEST:
+		return 1;
+	case ACPITAB_NHLT:
+		return 5;
+	case ACPITAB_BERT:
+		return 1;
+	case ACPITAB_SPCR:
+		return 2;
+	default:
+		return -EINVAL;
+	}
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index 429993b9cc0..e5510e4323b 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -8,6 +8,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <acpi/acpi_table.h>
 #include <dm/acpi.h>
 #include <dm/test.h>
 #include <test/ut.h>
@@ -53,3 +54,16 @@ static int dm_test_acpi_get_name(struct unit_test_state *uts)
 	return 0;
 }
 DM_TEST(dm_test_acpi_get_name, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* Test acpi_get_table_revision() */
+static int dm_test_acpi_get_table_revision(struct unit_test_state *uts)
+{
+	ut_asserteq(1, acpi_get_table_revision(ACPITAB_MCFG));
+	ut_asserteq(2, acpi_get_table_revision(ACPITAB_RSDP));
+	ut_asserteq(4, acpi_get_table_revision(ACPITAB_TPM2));
+	ut_asserteq(-EINVAL, acpi_get_table_revision(ACPITAB_COUNT));
+
+	return 0;
+}
+DM_TEST(dm_test_acpi_get_table_revision,
+	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.26.0.292.g33ef6b2f38-goog



More information about the U-Boot mailing list