]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
acpi: Add a central location for table version numbers
authorSimon Glass <sjg@chromium.org>
Wed, 8 Apr 2020 22:57:38 +0000 (16:57 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Thu, 16 Apr 2020 06:36:28 +0000 (14:36 +0800)
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@chromium.org>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
include/acpi/acpi_table.h
lib/Makefile
lib/acpi/Makefile [new file with mode: 0644]
lib/acpi/acpi_table.c [new file with mode: 0644]
test/dm/acpi.c

index dd7489581366c340d1bd5235acc4299cbc9722b1..fdd7682c89727f898fb37a8aaf6c67b75d27757e 100644 (file)
@@ -202,6 +202,26 @@ struct __packed acpi_fadt {
        struct acpi_gen_regaddr x_gpe1_blk;
 };
 
+/* FADT TABLE Revision values - note these do not match the ACPI revision */
+#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,46 @@ 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_NHLT,
+       ACPITAB_RSDP,
+       ACPITAB_RSDT,
+       ACPITAB_SLIT,
+       ACPITAB_SPCR,
+       ACPITAB_SPMI,
+       ACPITAB_SRAT,
+       ACPITAB_SSDT,
+       ACPITAB_TCPA,
+       ACPITAB_TPM2,
+       ACPITAB_VFCT,
+       ACPITAB_XSDT,
+
+       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>
index 32bf3f36931e50610ad9a7dd312ca0b9e132d4a9..5f88d92850f90ba224e2585dbc8a79844616d0da 100644 (file)
@@ -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 (file)
index 0000000..660491e
--- /dev/null
@@ -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 (file)
index 0000000..3268430
--- /dev/null
@@ -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;
+       }
+}
index 3677cdd0cc5b54e52cc9f34920df205eacd0256e..85c846b0d7fa1b7eb66d0e35132e014ba506fec9 100644 (file)
@@ -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);