ACPI: Teach ACPI table parsing about the CEDT header format
authorDan Williams <dan.j.williams@intel.com>
Fri, 29 Oct 2021 19:51:37 +0000 (12:51 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 15 Nov 2021 19:02:59 +0000 (11:02 -0800)
The CEDT adds yet one more unique subtable header type where the length
is a 16-bit value. Extend the subtable helpers to detect this scenario.

Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Len Brown <lenb@kernel.org>
Tested-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/163553709742.2509508.5177761945441327574.stgit@dwillia2-desk3.amr.corp.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/acpi/tables.c
include/linux/acpi.h

index b80a3de655d79c0dbc340c4609a24df52c44b7fa..8d052b65f6bc1cdf6e0e0e6f07e4454a9b60d5eb 100644 (file)
@@ -41,6 +41,7 @@ enum acpi_subtable_type {
        ACPI_SUBTABLE_COMMON,
        ACPI_SUBTABLE_HMAT,
        ACPI_SUBTABLE_PRMT,
+       ACPI_SUBTABLE_CEDT,
 };
 
 struct acpi_subtable_entry {
@@ -226,6 +227,8 @@ acpi_get_entry_type(struct acpi_subtable_entry *entry)
                return entry->hdr->hmat.type;
        case ACPI_SUBTABLE_PRMT:
                return 0;
+       case ACPI_SUBTABLE_CEDT:
+               return entry->hdr->cedt.type;
        }
        return 0;
 }
@@ -240,6 +243,8 @@ acpi_get_entry_length(struct acpi_subtable_entry *entry)
                return entry->hdr->hmat.length;
        case ACPI_SUBTABLE_PRMT:
                return entry->hdr->prmt.length;
+       case ACPI_SUBTABLE_CEDT:
+               return entry->hdr->cedt.length;
        }
        return 0;
 }
@@ -254,6 +259,8 @@ acpi_get_subtable_header_length(struct acpi_subtable_entry *entry)
                return sizeof(entry->hdr->hmat);
        case ACPI_SUBTABLE_PRMT:
                return sizeof(entry->hdr->prmt);
+       case ACPI_SUBTABLE_CEDT:
+               return sizeof(entry->hdr->cedt);
        }
        return 0;
 }
@@ -265,6 +272,8 @@ acpi_get_subtable_type(char *id)
                return ACPI_SUBTABLE_HMAT;
        if (strncmp(id, ACPI_SIG_PRMT, 4) == 0)
                return ACPI_SUBTABLE_PRMT;
+       if (strncmp(id, ACPI_SIG_CEDT, 4) == 0)
+               return ACPI_SUBTABLE_CEDT;
        return ACPI_SUBTABLE_COMMON;
 }
 
index edfa3c8f356245b7e84c29df2301cf2e62b77757..6b7f181d51e235ef8c9666fc84e0f110b91d1392 100644 (file)
@@ -133,6 +133,7 @@ union acpi_subtable_headers {
        struct acpi_subtable_header common;
        struct acpi_hmat_structure hmat;
        struct acpi_prmt_module_header prmt;
+       struct acpi_cedt_header cedt;
 };
 
 typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);