[PATCH 017/108] acpi: Add a central location for table version numbers

Bin Meng bmeng.cn at gmail.com
Mon Feb 10 16:29:58 CET 2020


Hi Simon,

On Mon, Jan 27, 2020 at 1:08 PM Simon Glass <sjg at chromium.org> wrote:
>
> 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__ */

I suspect this file should be added in patch [014/108] acpi: Add a
simple sandbox test, otherwise patch [014/108] cannot be built.

> 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;

Why magic number of 2? In the FADT case ACPI_FADT_REV_ACPI_3_0 is used.

> +       case ACPITAB_MCFG:
> +               return 1;

ditto

> +       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);
> --

Regards,
Bin


More information about the U-Boot mailing list