
Hi Simon,
-----"Simon Glass" sjg@chromium.org schrieb: -----
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
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_table.h | 61 +++++++++++++++++++++++++++++++++++++++++++ lib/Makefile | 1 + lib/acpi/Makefile | 4 +++ lib/acpi/acpi_table.c | 60 ++++++++++++++++++++++++++++++++++++++++++ test/dm/acpi.c | 14 ++++++++++ 5 files changed, 140 insertions(+) create mode 100644 lib/acpi/Makefile create mode 100644 lib/acpi/acpi_table.c
diff --git a/include/acpi_table.h b/include/acpi_table.h index dd74895813..ccf6fa04db 100644 --- a/include/acpi_table.h +++ b/include/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 */ +#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,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 15259d0473..9df834c2fd 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -5,6 +5,7 @@
ifndef CONFIG_SPL_BUILD
+obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi/
Is $(SPL_TPL_) needed here? I don't see a CONFIG_SPL_ACPIGEN, and this section of the file is also covered by "ifndef CONFIG_SPL_BUILD".
In any case, would it make sense to generate ACPI-related code for SPL and TPL? As U-Boot does not use ACPI, but only provides it to the kernel, I would assume we only need to handle ACPI tables in the last U-Boot stage before booting a kernel.
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..197f965c08 --- /dev/null +++ b/lib/acpi/acpi_table.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Tests for ACPI table generation
The description here does not really fit, is this maybe a copy/paste mistake?
- 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:
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 */
typo: This
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 */
Nit: "up to" instead of "upto"?
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 */
Nit: "up to" instead of "upto"?
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.1.481.gfbce0eb801-goog
regards, Wolfgang