acpi: Add HMAT to generic parsing tables
authorKeith Busch <keith.busch@intel.com>
Mon, 11 Mar 2019 20:55:58 +0000 (14:55 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Apr 2019 16:41:20 +0000 (18:41 +0200)
The Heterogeneous Memory Attribute Table (HMAT) header has different
field lengths than the existing parsing uses. Add the HMAT type to the
parsing rules so it may be generically parsed.

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Tested-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Keith Busch <keith.busch@intel.com>
Tested-by: Brice Goglin <Brice.Goglin@inria.fr>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/acpi/tables.c
include/linux/acpi.h

index 7553774a22b761039c3d9e77de9840e10b49918b..3d0da38f94c62455a12665875073b7418c35f60f 100644 (file)
@@ -51,6 +51,7 @@ static int acpi_apic_instance __initdata;
 
 enum acpi_subtable_type {
        ACPI_SUBTABLE_COMMON,
+       ACPI_SUBTABLE_HMAT,
 };
 
 struct acpi_subtable_entry {
@@ -232,6 +233,8 @@ acpi_get_entry_type(struct acpi_subtable_entry *entry)
        switch (entry->type) {
        case ACPI_SUBTABLE_COMMON:
                return entry->hdr->common.type;
+       case ACPI_SUBTABLE_HMAT:
+               return entry->hdr->hmat.type;
        }
        return 0;
 }
@@ -242,6 +245,8 @@ acpi_get_entry_length(struct acpi_subtable_entry *entry)
        switch (entry->type) {
        case ACPI_SUBTABLE_COMMON:
                return entry->hdr->common.length;
+       case ACPI_SUBTABLE_HMAT:
+               return entry->hdr->hmat.length;
        }
        return 0;
 }
@@ -252,6 +257,8 @@ acpi_get_subtable_header_length(struct acpi_subtable_entry *entry)
        switch (entry->type) {
        case ACPI_SUBTABLE_COMMON:
                return sizeof(entry->hdr->common);
+       case ACPI_SUBTABLE_HMAT:
+               return sizeof(entry->hdr->hmat);
        }
        return 0;
 }
@@ -259,6 +266,8 @@ acpi_get_subtable_header_length(struct acpi_subtable_entry *entry)
 static enum acpi_subtable_type __init
 acpi_get_subtable_type(char *id)
 {
+       if (strncmp(id, ACPI_SIG_HMAT, 4) == 0)
+               return ACPI_SUBTABLE_HMAT;
        return ACPI_SUBTABLE_COMMON;
 }
 
index 9494d42bf507ea29e5168f11267e990d57fe12cc..7c7515b0767eb28a4043bf7643a927c685656e4b 100644 (file)
@@ -143,6 +143,7 @@ enum acpi_address_range_id {
 /* Table Handlers */
 union acpi_subtable_headers {
        struct acpi_subtable_header common;
+       struct acpi_hmat_structure hmat;
 };
 
 typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);