Message ID | 20200308214442.v2.17.I19e38d6d49d8a7ac5fbe8a724e5ab3e71f857208@changeid |
---|---|
State | Superseded |
Headers | show |
Series | dm: Add programmatic generation of ACPI tables (part A) | expand |
Hi Simon, -----"Simon Glass" <sjg at 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 at 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
Hi Wolfgang, On Tue, 10 Mar 2020 at 03:26, Wolfgang Wallner < wolfgang.wallner at br-automation.com> wrote: > > Hi Simon, > > -----"Simon Glass" <sjg at 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 at 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. That's right. The point of this is to only include it in U-Boot proper. Actually I should use $SPL here so will fix that. Regards, Simon
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/ 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 + * + * 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 */ + 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);
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> --- 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