acpi: Create subtable parsing infrastructure
authorKeith Busch <keith.busch@intel.com>
Mon, 11 Mar 2019 20:55:57 +0000 (14:55 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Apr 2019 16:41:12 +0000 (18:41 +0200)
Parsing entries in an ACPI table had assumed a generic header
structure. There is no standard ACPI header, though, so less common
layouts with different field sizes required custom parsers to go through
their subtable entry list.

Create the infrastructure for adding different table types so parsing
the entries array may be more reused for all ACPI system tables and
the common code doesn't need to be duplicated.

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>
15 files changed:
arch/arm64/kernel/acpi_numa.c
arch/arm64/kernel/smp.c
arch/ia64/kernel/acpi.c
arch/x86/kernel/acpi/boot.c
drivers/acpi/numa.c
drivers/acpi/scan.c
drivers/acpi/tables.c
drivers/irqchip/irq-gic-v2m.c
drivers/irqchip/irq-gic-v3-its-pci-msi.c
drivers/irqchip/irq-gic-v3-its-platform-msi.c
drivers/irqchip/irq-gic-v3-its.c
drivers/irqchip/irq-gic-v3.c
drivers/irqchip/irq-gic.c
drivers/mailbox/pcc.c
include/linux/acpi.h

index eac1d0cc595ca8cc2fda38de34549f02d508c8e1..7ff800045434602507a4a9aefaf50230cee4b289 100644 (file)
@@ -45,7 +45,7 @@ static inline int get_cpu_for_acpi_id(u32 uid)
        return -EINVAL;
 }
 
-static int __init acpi_parse_gicc_pxm(struct acpi_subtable_header *header,
+static int __init acpi_parse_gicc_pxm(union acpi_subtable_headers *header,
                                      const unsigned long end)
 {
        struct acpi_srat_gicc_affinity *pa;
index 824de703896799e44e08785da57fef1ec057ebc8..bb4b3f07761a67e53d85dc5e0f8dabb43314e91c 100644 (file)
@@ -586,7 +586,7 @@ acpi_map_gic_cpu_interface(struct acpi_madt_generic_interrupt *processor)
 }
 
 static int __init
-acpi_parse_gic_cpu_interface(struct acpi_subtable_header *header,
+acpi_parse_gic_cpu_interface(union acpi_subtable_headers *header,
                             const unsigned long end)
 {
        struct acpi_madt_generic_interrupt *processor;
@@ -595,7 +595,7 @@ acpi_parse_gic_cpu_interface(struct acpi_subtable_header *header,
        if (BAD_MADT_GICC_ENTRY(processor, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        acpi_map_gic_cpu_interface(processor);
 
index 41eb281709da1c334226fc652d7184888e48d327..1435e7a1a8cd715643a9ea880c93baeb68d65cbc 100644 (file)
@@ -177,7 +177,7 @@ struct acpi_table_madt *acpi_madt __initdata;
 static u8 has_8259;
 
 static int __init
-acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
+acpi_parse_lapic_addr_ovr(union acpi_subtable_headers * header,
                          const unsigned long end)
 {
        struct acpi_madt_local_apic_override *lapic;
@@ -195,7 +195,7 @@ acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
 }
 
 static int __init
-acpi_parse_lsapic(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_lsapic(union acpi_subtable_headers *header, const unsigned long end)
 {
        struct acpi_madt_local_sapic *lsapic;
 
@@ -216,7 +216,7 @@ acpi_parse_lsapic(struct acpi_subtable_header * header, const unsigned long end)
 }
 
 static int __init
-acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_lapic_nmi(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_local_apic_nmi *lacpi_nmi;
 
@@ -230,7 +230,7 @@ acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long e
 }
 
 static int __init
-acpi_parse_iosapic(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_iosapic(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_io_sapic *iosapic;
 
@@ -245,7 +245,7 @@ acpi_parse_iosapic(struct acpi_subtable_header * header, const unsigned long end
 static unsigned int __initdata acpi_madt_rev;
 
 static int __init
-acpi_parse_plat_int_src(struct acpi_subtable_header * header,
+acpi_parse_plat_int_src(union acpi_subtable_headers * header,
                        const unsigned long end)
 {
        struct acpi_madt_interrupt_source *plintsrc;
@@ -329,7 +329,7 @@ unsigned int get_cpei_target_cpu(void)
 }
 
 static int __init
-acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
+acpi_parse_int_src_ovr(union acpi_subtable_headers * header,
                       const unsigned long end)
 {
        struct acpi_madt_interrupt_override *p;
@@ -350,7 +350,7 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
 }
 
 static int __init
-acpi_parse_nmi_src(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_nmi_src(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_nmi_source *nmi_src;
 
index 8dcbf68907146512a839da60817c6b292c135e47..9fc92e4539d8aee344616336e58dba8d9781b341 100644 (file)
@@ -197,7 +197,7 @@ static int acpi_register_lapic(int id, u32 acpiid, u8 enabled)
 }
 
 static int __init
-acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
+acpi_parse_x2apic(union acpi_subtable_headers *header, const unsigned long end)
 {
        struct acpi_madt_local_x2apic *processor = NULL;
 #ifdef CONFIG_X86_X2APIC
@@ -210,7 +210,7 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
        if (BAD_MADT_ENTRY(processor, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
 #ifdef CONFIG_X86_X2APIC
        apic_id = processor->local_apic_id;
@@ -242,7 +242,7 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end)
 }
 
 static int __init
-acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_lapic(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_local_apic *processor = NULL;
 
@@ -251,7 +251,7 @@ acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
        if (BAD_MADT_ENTRY(processor, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        /* Ignore invalid ID */
        if (processor->id == 0xff)
@@ -272,7 +272,7 @@ acpi_parse_lapic(struct acpi_subtable_header * header, const unsigned long end)
 }
 
 static int __init
-acpi_parse_sapic(struct acpi_subtable_header *header, const unsigned long end)
+acpi_parse_sapic(union acpi_subtable_headers *header, const unsigned long end)
 {
        struct acpi_madt_local_sapic *processor = NULL;
 
@@ -281,7 +281,7 @@ acpi_parse_sapic(struct acpi_subtable_header *header, const unsigned long end)
        if (BAD_MADT_ENTRY(processor, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        acpi_register_lapic((processor->id << 8) | processor->eid,/* APIC ID */
                            processor->processor_id, /* ACPI ID */
@@ -291,7 +291,7 @@ acpi_parse_sapic(struct acpi_subtable_header *header, const unsigned long end)
 }
 
 static int __init
-acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
+acpi_parse_lapic_addr_ovr(union acpi_subtable_headers * header,
                          const unsigned long end)
 {
        struct acpi_madt_local_apic_override *lapic_addr_ovr = NULL;
@@ -301,7 +301,7 @@ acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
        if (BAD_MADT_ENTRY(lapic_addr_ovr, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        acpi_lapic_addr = lapic_addr_ovr->address;
 
@@ -309,7 +309,7 @@ acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
 }
 
 static int __init
-acpi_parse_x2apic_nmi(struct acpi_subtable_header *header,
+acpi_parse_x2apic_nmi(union acpi_subtable_headers *header,
                      const unsigned long end)
 {
        struct acpi_madt_local_x2apic_nmi *x2apic_nmi = NULL;
@@ -319,7 +319,7 @@ acpi_parse_x2apic_nmi(struct acpi_subtable_header *header,
        if (BAD_MADT_ENTRY(x2apic_nmi, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        if (x2apic_nmi->lint != 1)
                printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
@@ -328,7 +328,7 @@ acpi_parse_x2apic_nmi(struct acpi_subtable_header *header,
 }
 
 static int __init
-acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_lapic_nmi(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_local_apic_nmi *lapic_nmi = NULL;
 
@@ -337,7 +337,7 @@ acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long e
        if (BAD_MADT_ENTRY(lapic_nmi, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        if (lapic_nmi->lint != 1)
                printk(KERN_WARNING PREFIX "NMI not connected to LINT 1!\n");
@@ -449,7 +449,7 @@ static int __init mp_register_ioapic_irq(u8 bus_irq, u8 polarity,
 }
 
 static int __init
-acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_ioapic(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_io_apic *ioapic = NULL;
        struct ioapic_domain_cfg cfg = {
@@ -462,7 +462,7 @@ acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
        if (BAD_MADT_ENTRY(ioapic, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        /* Statically assign IRQ numbers for IOAPICs hosting legacy IRQs */
        if (ioapic->global_irq_base < nr_legacy_irqs())
@@ -508,7 +508,7 @@ static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger,
 }
 
 static int __init
-acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
+acpi_parse_int_src_ovr(union acpi_subtable_headers * header,
                       const unsigned long end)
 {
        struct acpi_madt_interrupt_override *intsrc = NULL;
@@ -518,7 +518,7 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
        if (BAD_MADT_ENTRY(intsrc, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) {
                acpi_sci_ioapic_setup(intsrc->source_irq,
@@ -550,7 +550,7 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
 }
 
 static int __init
-acpi_parse_nmi_src(struct acpi_subtable_header * header, const unsigned long end)
+acpi_parse_nmi_src(union acpi_subtable_headers * header, const unsigned long end)
 {
        struct acpi_madt_nmi_source *nmi_src = NULL;
 
@@ -559,7 +559,7 @@ acpi_parse_nmi_src(struct acpi_subtable_header * header, const unsigned long end
        if (BAD_MADT_ENTRY(nmi_src, end))
                return -EINVAL;
 
-       acpi_table_print_madt_entry(header);
+       acpi_table_print_madt_entry(&header->common);
 
        /* TBD: Support nimsrc entries? */
 
index 867f6e3f2b4f42fea98920d5726f24ce398547fc..30995834ad70db1dfa49970dd5f6d826b3f62587 100644 (file)
@@ -339,7 +339,7 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
 }
 
 static int __init
-acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
+acpi_parse_x2apic_affinity(union acpi_subtable_headers *header,
                           const unsigned long end)
 {
        struct acpi_srat_x2apic_cpu_affinity *processor_affinity;
@@ -348,7 +348,7 @@ acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
        if (!processor_affinity)
                return -EINVAL;
 
-       acpi_table_print_srat_entry(header);
+       acpi_table_print_srat_entry(&header->common);
 
        /* let architecture-dependent part to do it */
        acpi_numa_x2apic_affinity_init(processor_affinity);
@@ -357,7 +357,7 @@ acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
 }
 
 static int __init
-acpi_parse_processor_affinity(struct acpi_subtable_header *header,
+acpi_parse_processor_affinity(union acpi_subtable_headers *header,
                              const unsigned long end)
 {
        struct acpi_srat_cpu_affinity *processor_affinity;
@@ -366,7 +366,7 @@ acpi_parse_processor_affinity(struct acpi_subtable_header *header,
        if (!processor_affinity)
                return -EINVAL;
 
-       acpi_table_print_srat_entry(header);
+       acpi_table_print_srat_entry(&header->common);
 
        /* let architecture-dependent part to do it */
        acpi_numa_processor_affinity_init(processor_affinity);
@@ -375,7 +375,7 @@ acpi_parse_processor_affinity(struct acpi_subtable_header *header,
 }
 
 static int __init
-acpi_parse_gicc_affinity(struct acpi_subtable_header *header,
+acpi_parse_gicc_affinity(union acpi_subtable_headers *header,
                         const unsigned long end)
 {
        struct acpi_srat_gicc_affinity *processor_affinity;
@@ -384,7 +384,7 @@ acpi_parse_gicc_affinity(struct acpi_subtable_header *header,
        if (!processor_affinity)
                return -EINVAL;
 
-       acpi_table_print_srat_entry(header);
+       acpi_table_print_srat_entry(&header->common);
 
        /* let architecture-dependent part to do it */
        acpi_numa_gicc_affinity_init(processor_affinity);
@@ -395,7 +395,7 @@ acpi_parse_gicc_affinity(struct acpi_subtable_header *header,
 static int __initdata parsed_numa_memblks;
 
 static int __init
-acpi_parse_memory_affinity(struct acpi_subtable_header * header,
+acpi_parse_memory_affinity(union acpi_subtable_headers * header,
                           const unsigned long end)
 {
        struct acpi_srat_mem_affinity *memory_affinity;
@@ -404,7 +404,7 @@ acpi_parse_memory_affinity(struct acpi_subtable_header * header,
        if (!memory_affinity)
                return -EINVAL;
 
-       acpi_table_print_srat_entry(header);
+       acpi_table_print_srat_entry(&header->common);
 
        /* let architecture-dependent part to do it */
        if (!acpi_numa_memory_affinity_init(memory_affinity))
index 446c959a8f082c3e980179f4be28ec9adfa7865f..f7771a3b4a3e258599b83e01857da07faf5a2bec 100644 (file)
@@ -2241,10 +2241,10 @@ static struct acpi_probe_entry *ape;
 static int acpi_probe_count;
 static DEFINE_MUTEX(acpi_probe_mutex);
 
-static int __init acpi_match_madt(struct acpi_subtable_header *header,
+static int __init acpi_match_madt(union acpi_subtable_headers *header,
                                  const unsigned long end)
 {
-       if (!ape->subtable_valid || ape->subtable_valid(header, ape))
+       if (!ape->subtable_valid || ape->subtable_valid(&header->common, ape))
                if (!ape->probe_subtbl(header, end))
                        acpi_probe_count++;
 
index 8fccbe49612a083602b84e24388c7b06257f5045..7553774a22b761039c3d9e77de9840e10b49918b 100644 (file)
@@ -49,6 +49,15 @@ static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;
 
 static int acpi_apic_instance __initdata;
 
+enum acpi_subtable_type {
+       ACPI_SUBTABLE_COMMON,
+};
+
+struct acpi_subtable_entry {
+       union acpi_subtable_headers *hdr;
+       enum acpi_subtable_type type;
+};
+
 /*
  * Disable table checksum verification for the early stage due to the size
  * limitation of the current x86 early mapping implementation.
@@ -217,6 +226,42 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
        }
 }
 
+static unsigned long __init
+acpi_get_entry_type(struct acpi_subtable_entry *entry)
+{
+       switch (entry->type) {
+       case ACPI_SUBTABLE_COMMON:
+               return entry->hdr->common.type;
+       }
+       return 0;
+}
+
+static unsigned long __init
+acpi_get_entry_length(struct acpi_subtable_entry *entry)
+{
+       switch (entry->type) {
+       case ACPI_SUBTABLE_COMMON:
+               return entry->hdr->common.length;
+       }
+       return 0;
+}
+
+static unsigned long __init
+acpi_get_subtable_header_length(struct acpi_subtable_entry *entry)
+{
+       switch (entry->type) {
+       case ACPI_SUBTABLE_COMMON:
+               return sizeof(entry->hdr->common);
+       }
+       return 0;
+}
+
+static enum acpi_subtable_type __init
+acpi_get_subtable_type(char *id)
+{
+       return ACPI_SUBTABLE_COMMON;
+}
+
 /**
  * acpi_parse_entries_array - for each proc_num find a suitable subtable
  *
@@ -246,8 +291,8 @@ acpi_parse_entries_array(char *id, unsigned long table_size,
                struct acpi_subtable_proc *proc, int proc_num,
                unsigned int max_entries)
 {
-       struct acpi_subtable_header *entry;
-       unsigned long table_end;
+       struct acpi_subtable_entry entry;
+       unsigned long table_end, subtable_len, entry_len;
        int count = 0;
        int errs = 0;
        int i;
@@ -270,19 +315,20 @@ acpi_parse_entries_array(char *id, unsigned long table_size,
 
        /* Parse all entries looking for a match. */
 
-       entry = (struct acpi_subtable_header *)
+       entry.type = acpi_get_subtable_type(id);
+       entry.hdr = (union acpi_subtable_headers *)
            ((unsigned long)table_header + table_size);
+       subtable_len = acpi_get_subtable_header_length(&entry);
 
-       while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) <
-              table_end) {
+       while (((unsigned long)entry.hdr) + subtable_len  < table_end) {
                if (max_entries && count >= max_entries)
                        break;
 
                for (i = 0; i < proc_num; i++) {
-                       if (entry->type != proc[i].id)
+                       if (acpi_get_entry_type(&entry) != proc[i].id)
                                continue;
                        if (!proc[i].handler ||
-                            (!errs && proc[i].handler(entry, table_end))) {
+                            (!errs && proc[i].handler(entry.hdr, table_end))) {
                                errs++;
                                continue;
                        }
@@ -297,13 +343,14 @@ acpi_parse_entries_array(char *id, unsigned long table_size,
                 * If entry->length is 0, break from this loop to avoid
                 * infinite loop.
                 */
-               if (entry->length == 0) {
+               entry_len = acpi_get_entry_length(&entry);
+               if (entry_len == 0) {
                        pr_err("[%4.4s:0x%02x] Invalid zero length\n", id, proc->id);
                        return -EINVAL;
                }
 
-               entry = (struct acpi_subtable_header *)
-                   ((unsigned long)entry + entry->length);
+               entry.hdr = (union acpi_subtable_headers *)
+                   ((unsigned long)entry.hdr + entry_len);
        }
 
        if (max_entries && count > max_entries) {
index f5fe0100f9ffd043d251d96ce473775bfdafd3b4..de14e06fd9ec86c48d340a9a1da78f5d33af5efa 100644 (file)
@@ -446,7 +446,7 @@ static struct fwnode_handle *gicv2m_get_fwnode(struct device *dev)
 }
 
 static int __init
-acpi_parse_madt_msi(struct acpi_subtable_header *header,
+acpi_parse_madt_msi(union acpi_subtable_headers *header,
                    const unsigned long end)
 {
        int ret;
index 8d6d009d1d586f9271c508138bdbc55c064c8f9e..c81d5b81da56d0f54ef73b0415470ea6270e4a61 100644 (file)
@@ -159,7 +159,7 @@ static int __init its_pci_of_msi_init(void)
 #ifdef CONFIG_ACPI
 
 static int __init
-its_pci_msi_parse_madt(struct acpi_subtable_header *header,
+its_pci_msi_parse_madt(union acpi_subtable_headers *header,
                       const unsigned long end)
 {
        struct acpi_madt_generic_translator *its_entry;
index 7b8e87b493fe5defd6ebd5968f92c856c8fdcc8c..9cdcda5bb3bd50b8a7212589fcb4481a3874cd02 100644 (file)
@@ -117,7 +117,7 @@ static int __init its_pmsi_init_one(struct fwnode_handle *fwnode,
 
 #ifdef CONFIG_ACPI
 static int __init
-its_pmsi_parse_madt(struct acpi_subtable_header *header,
+its_pmsi_parse_madt(union acpi_subtable_headers *header,
                        const unsigned long end)
 {
        struct acpi_madt_generic_translator *its_entry;
index 7577755bdcf4f38588438634c7484999a51d927c..128ac893d7e4a42da76c06ed41eb385085012df8 100644 (file)
@@ -3830,13 +3830,13 @@ static int __init acpi_get_its_numa_node(u32 its_id)
        return NUMA_NO_NODE;
 }
 
-static int __init gic_acpi_match_srat_its(struct acpi_subtable_header *header,
+static int __init gic_acpi_match_srat_its(union acpi_subtable_headers *header,
                                          const unsigned long end)
 {
        return 0;
 }
 
-static int __init gic_acpi_parse_srat_its(struct acpi_subtable_header *header,
+static int __init gic_acpi_parse_srat_its(union acpi_subtable_headers *header,
                         const unsigned long end)
 {
        int node;
@@ -3903,7 +3903,7 @@ static int __init acpi_get_its_numa_node(u32 its_id) { return NUMA_NO_NODE; }
 static void __init acpi_its_srat_maps_free(void) { }
 #endif
 
-static int __init gic_acpi_parse_madt_its(struct acpi_subtable_header *header,
+static int __init gic_acpi_parse_madt_its(union acpi_subtable_headers *header,
                                          const unsigned long end)
 {
        struct acpi_madt_generic_translator *its_entry;
index 15e55d32750557ca64cb38b309f4fc5a97f0773e..f44cd89cfc40e031cdabd305d60b222a53fad81d 100644 (file)
@@ -1593,7 +1593,7 @@ gic_acpi_register_redist(phys_addr_t phys_base, void __iomem *redist_base)
 }
 
 static int __init
-gic_acpi_parse_madt_redist(struct acpi_subtable_header *header,
+gic_acpi_parse_madt_redist(union acpi_subtable_headers *header,
                           const unsigned long end)
 {
        struct acpi_madt_generic_redistributor *redist =
@@ -1611,7 +1611,7 @@ gic_acpi_parse_madt_redist(struct acpi_subtable_header *header,
 }
 
 static int __init
-gic_acpi_parse_madt_gicc(struct acpi_subtable_header *header,
+gic_acpi_parse_madt_gicc(union acpi_subtable_headers *header,
                         const unsigned long end)
 {
        struct acpi_madt_generic_interrupt *gicc =
@@ -1653,14 +1653,14 @@ static int __init gic_acpi_collect_gicr_base(void)
        return -ENODEV;
 }
 
-static int __init gic_acpi_match_gicr(struct acpi_subtable_header *header,
+static int __init gic_acpi_match_gicr(union acpi_subtable_headers *header,
                                  const unsigned long end)
 {
        /* Subtable presence means that redist exists, that's it */
        return 0;
 }
 
-static int __init gic_acpi_match_gicc(struct acpi_subtable_header *header,
+static int __init gic_acpi_match_gicc(union acpi_subtable_headers *header,
                                      const unsigned long end)
 {
        struct acpi_madt_generic_interrupt *gicc =
@@ -1726,7 +1726,7 @@ static bool __init acpi_validate_gic_table(struct acpi_subtable_header *header,
        return true;
 }
 
-static int __init gic_acpi_parse_virt_madt_gicc(struct acpi_subtable_header *header,
+static int __init gic_acpi_parse_virt_madt_gicc(union acpi_subtable_headers *header,
                                                const unsigned long end)
 {
        struct acpi_madt_generic_interrupt *gicc =
index fd3110c171bad165737c5bb274f1adda7dbf6daa..c6dbe501897262b460aa290e50501c2ad11ae241 100644 (file)
@@ -1495,7 +1495,7 @@ static struct
 } acpi_data __initdata;
 
 static int __init
-gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
+gic_acpi_parse_madt_cpu(union acpi_subtable_headers *header,
                        const unsigned long end)
 {
        struct acpi_madt_generic_interrupt *processor;
@@ -1527,7 +1527,7 @@ gic_acpi_parse_madt_cpu(struct acpi_subtable_header *header,
 }
 
 /* The things you have to do to just *count* something... */
-static int __init acpi_dummy_func(struct acpi_subtable_header *header,
+static int __init acpi_dummy_func(union acpi_subtable_headers *header,
                                  const unsigned long end)
 {
        return 0;
index 256f18b67e8a6c3adcc720e1a74f133a910d1f09..08a0a3517138e6c78943f7eac9454178726ea9b5 100644 (file)
@@ -382,7 +382,7 @@ static const struct mbox_chan_ops pcc_chan_ops = {
  *
  * This gets called for each entry in the PCC table.
  */
-static int parse_pcc_subspace(struct acpi_subtable_header *header,
+static int parse_pcc_subspace(union acpi_subtable_headers *header,
                const unsigned long end)
 {
        struct acpi_pcct_subspace *ss = (struct acpi_pcct_subspace *) header;
index d5dcebd7aad334e635bfb12a2abc79e09b2323ba..9494d42bf507ea29e5168f11267e990d57fe12cc 100644 (file)
@@ -141,10 +141,13 @@ enum acpi_address_range_id {
 
 
 /* Table Handlers */
+union acpi_subtable_headers {
+       struct acpi_subtable_header common;
+};
 
 typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);
 
-typedef int (*acpi_tbl_entry_handler)(struct acpi_subtable_header *header,
+typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *header,
                                      const unsigned long end);
 
 /* Debugger support */