diff options
author | Jiang Liu <jiang.liu@linux.intel.com> | 2014-06-09 04:19:38 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2014-06-21 17:05:41 -0400 |
commit | 2e0ad0e2c13534f1a0e7f63661e666c281e09b66 (patch) | |
tree | d42fffe85649f23929153492a99531b2227f4c29 /arch | |
parent | 2c0a6894df19515baf9d2bf0076a2b57c8b51efb (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.c | 10 |
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 | ||
622 | int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi) | 629 | int 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 | } |