| From b77e8f435337baa1cd15852fb9db3f6d26cd8eb7 Mon Sep 17 00:00:00 2001 |
| From: Jiang Liu <jiang.liu@linux.intel.com> |
| Date: Mon, 27 Oct 2014 13:21:33 +0800 |
| Subject: ACPI, irq, x86: Return IRQ instead of GSI in mp_register_gsi() |
| |
| From: Jiang Liu <jiang.liu@linux.intel.com> |
| |
| commit b77e8f435337baa1cd15852fb9db3f6d26cd8eb7 upstream. |
| |
| Function mp_register_gsi() returns blindly the GSI number for the ACPI |
| SCI interrupt. That causes a regression when the GSI for ACPI SCI is |
| shared with other devices. |
| |
| The regression was caused by commit 84245af7297ced9e8fe "x86, irq, ACPI: |
| Change __acpi_register_gsi to return IRQ number instead of GSI" and |
| exposed on a SuperMicro system, which shares one GSI between ACPI SCI |
| and PCI device, with following failure: |
| |
| http://sourceforge.net/p/linux1394/mailman/linux1394-user/?viewmonth=201410 |
| [ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low |
| level) |
| [ 2.699224] firewire_ohci 0000:06:00.0: failed to allocate interrupt |
| 20 |
| |
| Return mp_map_gsi_to_irq(gsi, 0) instead of the GSI number. |
| |
| Reported-and-Tested-by: Daniel Robbins <drobbins@funtoo.org> |
| 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: Benjamin Herrenschmidt <benh@kernel.crashing.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: Borislav Petkov <bp@alien8.de> |
| Cc: Len Brown <len.brown@intel.com> |
| Cc: Pavel Machek <pavel@ucw.cz> |
| Link: http://lkml.kernel.org/r/1414387308-27148-4-git-send-email-jiang.liu@linux.intel.com |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/acpi/boot.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/acpi/boot.c |
| +++ b/arch/x86/kernel/acpi/boot.c |
| @@ -397,7 +397,7 @@ static int mp_register_gsi(struct device |
| |
| /* Don't set up the ACPI SCI because it's already set up */ |
| if (acpi_gbl_FADT.sci_interrupt == gsi) |
| - return gsi; |
| + return mp_map_gsi_to_irq(gsi, IOAPIC_MAP_ALLOC); |
| |
| trigger = trigger == ACPI_EDGE_SENSITIVE ? 0 : 1; |
| polarity = polarity == ACPI_ACTIVE_HIGH ? 0 : 1; |