[PATCH 017/108] acpi: Add a central location for table version numbers
Simon Glass
sjg at chromium.org
Mon Jan 27 06:05:24 CET 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>
---
arch/sandbox/include/asm/acpi_table.h | 9 ++++
include/acpi_table.h | 53 ++++++++++++++++++++++++
lib/Makefile | 1 +
lib/acpi/Makefile | 4 ++
lib/acpi/acpi_table.c | 59 +++++++++++++++++++++++++++
test/dm/acpi.c | 14 +++++++
6 files changed, 140 insertions(+)
create mode 100644 arch/sandbox/include/asm/acpi_table.h
create mode 100644 lib/acpi/Makefile
create mode 100644 lib/acpi/acpi_table.c
diff --git a/arch/sandbox/include/asm/acpi_table.h b/arch/sandbox/include/asm/acpi_table.h
new file mode 100644
index 0000000000..921c7f4201
--- /dev/null
+++ b/arch/sandbox/include/asm/acpi_table.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2019 Google LLC
+ */
+
+#ifndef __ASM_ACPI_TABLE_H__
+#define __ASM_ACPI_TABLE_H__
+
+#endif /* __ASM_ACPI_TABLE_H__ */
diff --git a/include/acpi_table.h b/include/acpi_table.h
index dd74895813..91496ac047 100644
--- a/include/acpi_table.h
+++ b/include/acpi_table.h
@@ -202,6 +202,18 @@ 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
+
+/* 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 +403,47 @@ struct __packed acpi_spcr {
u32 reserved2;
};
+/* Tables defined by ACPI and generated by U-Boot */
+enum acpi_tables {
+ ACPITAB_BERT,
+ ACPITAB_DBG2,
+ ACPITAB_DMAR,
+ ACPITAB_DSDT,
+ ACPITAB_FACS,
+ ACPITAB_FADT,
+ ACPITAB_HEST,
+ ACPITAB_HPET,
+ ACPITAB_IVRS,
+ ACPITAB_MADT,
+ ACPITAB_MCFG,
+ ACPITAB_RSDP,
+ ACPITAB_RSDT,
+ ACPITAB_SLIT,
+ ACPITAB_SRAT,
+ ACPITAB_SSDT,
+ ACPITAB_TCPA,
+ ACPITAB_TPM2,
+ ACPITAB_XSDT,
+ ACPITAB_ECDT,
+
+ /* Additional proprietary tables */
+ ACPITAB_VFCT,
+ ACPITAB_NHLT,
+ ACPITAB_SPMI,
+
+ 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 e82e32dfe9..46fe03003d 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -5,6 +5,7 @@
ifndef CONFIG_SPL_BUILD
+obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi/
obj-$(CONFIG_EFI) += efi/
obj-$(CONFIG_EFI_LOADER) += efi_driver/
obj-$(CONFIG_EFI_LOADER) += efi_loader/
diff --git a/lib/acpi/Makefile b/lib/acpi/Makefile
new file mode 100644
index 0000000000..660491ef71
--- /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 0000000000..971191f428
--- /dev/null
+++ b/lib/acpi/acpi_table.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for ACPI table generation
+ *
+ * Copyright 2019 Google LLC
+ */
+
+#include <common.h>
+#include <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: /* ACPI 3.0: 2, ACPI 4.0/5.0: 3, ACPI 6.2b/6.3: 5 */
+ return 2;
+ case ACPITAB_MCFG:
+ return 1;
+ case ACPITAB_TCPA:
+ 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 upto 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 upto 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;
+ default:
+ return -EINVAL;
+ }
+}
diff --git a/test/dm/acpi.c b/test/dm/acpi.c
index e3519d4689..e65295b7ca 100644
--- a/test/dm/acpi.c
+++ b/test/dm/acpi.c
@@ -7,6 +7,7 @@
*/
#include <common.h>
+#include <acpi_table.h>
#include <dm.h>
#include <dm/acpi.h>
#include <dm/test.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.25.0.341.g760bfbb309-goog
More information about the U-Boot
mailing list