From: Dave Jiang KEYP ACPI table can be parsed using the common fw_table handlers. Add additional support to detect and parse the table. Signed-off-by: Dave Jiang Co-developed-by: Xu Yilun Signed-off-by: Xu Yilun Signed-off-by: Dan Williams --- include/linux/acpi.h | 3 +++ include/linux/fw_table.h | 1 + drivers/acpi/tables.c | 12 +++++++++++- lib/fw_table.c | 9 +++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 5ff5d99f6ead..3bfcd9c5d4e4 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -234,6 +234,9 @@ int acpi_table_parse_madt(enum acpi_madt_type id, int __init_or_acpilib acpi_table_parse_cedt(enum acpi_cedt_type id, acpi_tbl_entry_handler_arg handler_arg, void *arg); +int __init_or_acpilib +acpi_table_parse_keyp(enum acpi_keyp_type id, + acpi_tbl_entry_handler_arg handler_arg, void *arg); int acpi_parse_mcfg (struct acpi_table_header *header); void acpi_table_print_madt_entry (struct acpi_subtable_header *madt); diff --git a/include/linux/fw_table.h b/include/linux/fw_table.h index 9bd605b87c4c..293252cb0b7e 100644 --- a/include/linux/fw_table.h +++ b/include/linux/fw_table.h @@ -36,6 +36,7 @@ union acpi_subtable_headers { struct acpi_prmt_module_header prmt; struct acpi_cedt_header cedt; struct acpi_cdat_header cdat; + struct acpi_keyp_common_header keyp; }; int acpi_parse_entries_array(char *id, unsigned long table_size, diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 57fc8bc56166..4162386d9672 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c @@ -299,6 +299,16 @@ acpi_table_parse_cedt(enum acpi_cedt_type id, } EXPORT_SYMBOL_ACPI_LIB(acpi_table_parse_cedt); +int __init_or_acpilib +acpi_table_parse_keyp(enum acpi_keyp_type id, + acpi_tbl_entry_handler_arg handler_arg, void *arg) +{ + return __acpi_table_parse_entries(ACPI_SIG_KEYP, + sizeof(struct acpi_table_keyp), id, + NULL, handler_arg, arg, 0); +} +EXPORT_SYMBOL_ACPI_LIB(acpi_table_parse_keyp); + int __init acpi_table_parse_entries(char *id, unsigned long table_size, int entry_id, acpi_tbl_entry_handler handler, @@ -408,7 +418,7 @@ static const char table_sigs[][ACPI_NAMESEG_SIZE] __nonstring_array __initconst ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT, ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_CEDT, ACPI_SIG_AGDI, - ACPI_SIG_NBFT, ACPI_SIG_SWFT}; + ACPI_SIG_NBFT, ACPI_SIG_SWFT, ACPI_SIG_KEYP}; #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header) diff --git a/lib/fw_table.c b/lib/fw_table.c index 16291814450e..147e3895e94c 100644 --- a/lib/fw_table.c +++ b/lib/fw_table.c @@ -20,6 +20,7 @@ enum acpi_subtable_type { ACPI_SUBTABLE_PRMT, ACPI_SUBTABLE_CEDT, CDAT_SUBTABLE, + ACPI_SUBTABLE_KEYP, }; struct acpi_subtable_entry { @@ -41,6 +42,8 @@ acpi_get_entry_type(struct acpi_subtable_entry *entry) return entry->hdr->cedt.type; case CDAT_SUBTABLE: return entry->hdr->cdat.type; + case ACPI_SUBTABLE_KEYP: + return entry->hdr->keyp.type; } return 0; } @@ -61,6 +64,8 @@ acpi_get_entry_length(struct acpi_subtable_entry *entry) __le16 length = (__force __le16)entry->hdr->cdat.length; return le16_to_cpu(length); + case ACPI_SUBTABLE_KEYP: + return entry->hdr->keyp.length; } } return 0; @@ -80,6 +85,8 @@ acpi_get_subtable_header_length(struct acpi_subtable_entry *entry) return sizeof(entry->hdr->cedt); case CDAT_SUBTABLE: return sizeof(entry->hdr->cdat); + case ACPI_SUBTABLE_KEYP: + return sizeof(entry->hdr->keyp); } return 0; } @@ -95,6 +102,8 @@ acpi_get_subtable_type(char *id) return ACPI_SUBTABLE_CEDT; if (strncmp(id, ACPI_SIG_CDAT, 4) == 0) return CDAT_SUBTABLE; + if (strncmp(id, ACPI_SIG_KEYP, 4) == 0) + return ACPI_SUBTABLE_KEYP; return ACPI_SUBTABLE_COMMON; } -- 2.25.1