aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJiang Liu <jiang.liu@linux.intel.com>2014-06-09 04:19:38 -0400
committerThomas Gleixner <tglx@linutronix.de>2014-06-21 17:05:41 -0400
commit2e0ad0e2c13534f1a0e7f63661e666c281e09b66 (patch)
treed42fffe85649f23929153492a99531b2227f4c29 /arch
parent2c0a6894df19515baf9d2bf0076a2b57c8b51efb (diff)
x86, ACPI, irq: Fix possible eror in GSI to IRQ mapping for legacy IRQ
A default identity mapping between GSI and IRQ is built for legacy IRQs. So when overriding the default identity mapping for legacy IRQs, we should also invalidate isa_irq_to_gsi[gsi] when setting isa_irq_to_gsi[irq] = gsi. Otherwise there may be two entries with the same GSI in the isa_irq_to_gsi array, and acpi_isa_irq_to_gsi() may give wrong result. 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-10-git-send-email-jiang.liu@linux.intel.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/acpi/boot.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 298f79616f1c..f3bafcd32b98 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -366,6 +366,13 @@ static void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger,
366 366
367 mp_save_irq(&mp_irq); 367 mp_save_irq(&mp_irq);
368 368
369 /*
370 * Reset default identity mapping if gsi is also an legacy IRQ,
371 * otherwise there will be more than one entry with the same GSI
372 * and acpi_isa_irq_to_gsi() may give wrong result.
373 */
374 if (gsi < NR_IRQS_LEGACY && isa_irq_to_gsi[gsi] == gsi)
375 isa_irq_to_gsi[gsi] = ACPI_INVALID_GSI;
369 isa_irq_to_gsi[bus_irq] = gsi; 376 isa_irq_to_gsi[bus_irq] = gsi;
370} 377}
371 378
@@ -621,7 +628,8 @@ EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
621 628
622int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi) 629int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
623{ 630{
624 if (isa_irq < NR_IRQS_LEGACY) { 631 if (isa_irq < NR_IRQS_LEGACY &&
632 isa_irq_to_gsi[isa_irq] != ACPI_INVALID_GSI) {
625 *gsi = isa_irq_to_gsi[isa_irq]; 633 *gsi = isa_irq_to_gsi[isa_irq];
626 return 0; 634 return 0;
627 } 635 }