aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/acpi
diff options
context:
space:
mode:
authorJiang Liu <jiang.liu@linux.intel.com>2014-06-09 04:19:54 -0400
committerThomas Gleixner <tglx@linutronix.de>2014-06-21 17:05:42 -0400
commitca7e28aa4ff34fdd6622d915682b2765453c5ddd (patch)
treea9a9b6b0bf28d3988e0ed1712b23d87564e59b68 /arch/x86/kernel/acpi
parent44767bfaaed782d6d635ecbb13f3980041e6f33e (diff)
x86, ACPI, irq: Provide basic irqdomain support
Enhance ACPI driver to provide basic irqdomain support for IOAPIC. We will build identity mapping for IOAPICs hosting legacy IRQs, otherwise dynamically allocate IRQ numbers for IOAPIC pins on demand. Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: Paul Gortmaker <paul.gortmaker@windriver.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Grant Likely <grant.likely@linaro.org> Cc: Rafael J. Wysocki <rjw@rjwysocki.net> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Len Brown <len.brown@intel.com> Cc: Pavel Machek <pavel@ucw.cz> Link: http://lkml.kernel.org/r/1402302011-23642-26-git-send-email-jiang.liu@linux.intel.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/acpi')
-rw-r--r--arch/x86/kernel/acpi/boot.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index f86b4bae4640..8d9aee1e67e8 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -31,6 +31,7 @@
31#include <linux/module.h> 31#include <linux/module.h>
32#include <linux/dmi.h> 32#include <linux/dmi.h>
33#include <linux/irq.h> 33#include <linux/irq.h>
34#include <linux/irqdomain.h>
34#include <linux/slab.h> 35#include <linux/slab.h>
35#include <linux/bootmem.h> 36#include <linux/bootmem.h>
36#include <linux/ioport.h> 37#include <linux/ioport.h>
@@ -449,10 +450,16 @@ static int mp_register_gsi(struct device *dev, u32 gsi, int trigger,
449 return irq; 450 return irq;
450} 451}
451 452
453static struct irq_domain_ops acpi_irqdomain_ops;
454
452static int __init 455static int __init
453acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end) 456acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
454{ 457{
455 struct acpi_madt_io_apic *ioapic = NULL; 458 struct acpi_madt_io_apic *ioapic = NULL;
459 struct ioapic_domain_cfg cfg = {
460 .type = IOAPIC_DOMAIN_DYNAMIC,
461 .ops = &acpi_irqdomain_ops,
462 };
456 463
457 ioapic = (struct acpi_madt_io_apic *)header; 464 ioapic = (struct acpi_madt_io_apic *)header;
458 465
@@ -461,8 +468,12 @@ acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end)
461 468
462 acpi_table_print_madt_entry(header); 469 acpi_table_print_madt_entry(header);
463 470
464 mp_register_ioapic(ioapic->id, 471 /* Statically assign IRQ numbers for IOAPICs hosting legacy IRQs */
465 ioapic->address, ioapic->global_irq_base, NULL); 472 if (ioapic->global_irq_base < nr_legacy_irqs())
473 cfg.type = IOAPIC_DOMAIN_LEGACY;
474
475 mp_register_ioapic(ioapic->id, ioapic->address, ioapic->global_irq_base,
476 &cfg);
466 477
467 return 0; 478 return 0;
468} 479}