Commit 60574d1e authored by Keith Busch's avatar Keith Busch Committed by Greg Kroah-Hartman
Browse files

acpi: Create subtable parsing infrastructure



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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Tested-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
Tested-by: default avatarBrice Goglin <Brice.Goglin@inria.fr>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c03a0fd0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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);

+7 −7
Original line number Diff line number Diff line
@@ -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;

+18 −18
Original line number Diff line number Diff line
@@ -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? */

+8 −8
Original line number Diff line number Diff line
@@ -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))
Loading