Commit-ID:  2e0ad0e2c13534f1a0e7f63661e666c281e09b66
Gitweb:     http://git.kernel.org/tip/2e0ad0e2c13534f1a0e7f63661e666c281e09b66
Author:     Jiang Liu <jiang....@linux.intel.com>
AuthorDate: Mon, 9 Jun 2014 16:19:38 +0800
Committer:  Thomas Gleixner <t...@linutronix.de>
CommitDate: Sat, 21 Jun 2014 23:05:41 +0200

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....@linux.intel.com>
Cc: Konrad Rzeszutek Wilk <konrad.w...@oracle.com>
Cc: Tony Luck <tony.l...@intel.com>
Cc: Joerg Roedel <j...@8bytes.org>
Cc: Paul Gortmaker <paul.gortma...@windriver.com>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org>
Cc: Grant Likely <grant.lik...@linaro.org>
Cc: Rafael J. Wysocki <r...@rjwysocki.net>
Cc: Bjorn Helgaas <bhelg...@google.com>
Cc: Randy Dunlap <rdun...@infradead.org>
Cc: Yinghai Lu <ying...@kernel.org>
Cc: Len Brown <len.br...@intel.com>
Cc: Pavel Machek <pa...@ucw.cz>
Link: 
http://lkml.kernel.org/r/1402302011-23642-10-git-send-email-jiang....@linux.intel.com
Signed-off-by: Thomas Gleixner <t...@linutronix.de>
---
 arch/x86/kernel/acpi/boot.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 298f796..f3bafcd 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,
 
        mp_save_irq(&mp_irq);
 
+       /*
+        * Reset default identity mapping if gsi is also an legacy IRQ,
+        * otherwise there will be more than one entry with the same GSI
+        * and acpi_isa_irq_to_gsi() may give wrong result.
+        */
+       if (gsi < NR_IRQS_LEGACY && isa_irq_to_gsi[gsi] == gsi)
+               isa_irq_to_gsi[gsi] = ACPI_INVALID_GSI;
        isa_irq_to_gsi[bus_irq] = gsi;
 }
 
@@ -621,7 +628,8 @@ EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
 
 int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
 {
-       if (isa_irq < NR_IRQS_LEGACY) {
+       if (isa_irq < NR_IRQS_LEGACY &&
+           isa_irq_to_gsi[isa_irq] != ACPI_INVALID_GSI) {
                *gsi = isa_irq_to_gsi[isa_irq];
                return 0;
        }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to