diff options
author | Yinghai Lu <yinghai@kernel.org> | 2010-02-10 04:20:05 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2010-02-10 16:47:39 -0500 |
commit | 18dce6ba5c8c6bd0f3ab4efa4cbdd698dab5c40a (patch) | |
tree | 03deca24435fade73b13573020dc751204f3b963 /arch/x86/kernel/acpi/boot.c | |
parent | 318f6b228ba88a394ef560efc1bfe028ad5ae6b6 (diff) |
x86: Fix SCI on IOAPIC != 0
Thomas Renninger <trenn@suse.de> reported on IBM x3330
booting a latest kernel on this machine results in:
PCI: PCI BIOS revision 2.10 entry at 0xfd61c, last bus=1
PCI: Using configuration type 1 for base access bio: create slab <bio-0> at 0
ACPI: SCI (IRQ30) allocation failed
ACPI Exception: AE_NOT_ACQUIRED, Unable to install System Control Interrupt handler (20090903/evevent-161)
ACPI: Unable to start the ACPI Interpreter
Later all kind of devices fail...
and bisect it down to this commit:
commit b9c61b70075c87a8612624736faf4a2de5b1ed30
x86/pci: update pirq_enable_irq() to setup io apic routing
it turns out we need to set irq routing for the sci on ioapic1 early.
-v2: make it work without sparseirq too.
-v3: fix checkpatch.pl warning, and cc to stable
Reported-by: Thomas Renninger <trenn@suse.de>
Bisected-by: Thomas Renninger <trenn@suse.de>
Tested-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <1265793639-15071-2-git-send-email-yinghai@kernel.org>
Cc: stable@kernel.org
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/x86/kernel/acpi/boot.c')
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 0acbcdfa5ca4..5c96b75c6ea8 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -446,6 +446,12 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) | |||
446 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) | 446 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) |
447 | { | 447 | { |
448 | *irq = gsi; | 448 | *irq = gsi; |
449 | |||
450 | #ifdef CONFIG_X86_IO_APIC | ||
451 | if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) | ||
452 | setup_IO_APIC_irq_extra(gsi); | ||
453 | #endif | ||
454 | |||
449 | return 0; | 455 | return 0; |
450 | } | 456 | } |
451 | 457 | ||
@@ -473,7 +479,8 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | |||
473 | plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); | 479 | plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); |
474 | } | 480 | } |
475 | #endif | 481 | #endif |
476 | acpi_gsi_to_irq(plat_gsi, &irq); | 482 | irq = plat_gsi; |
483 | |||
477 | return irq; | 484 | return irq; |
478 | } | 485 | } |
479 | 486 | ||