aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKimball Murray <kimball.murray@gmail.com>2006-10-10 17:20:33 -0400
committerLen Brown <len.brown@intel.com>2006-10-14 02:01:26 -0400
commit281ea49b0c294649a6de47a6f8fbe5611137726b (patch)
tree16c4ead22db0bd9825e7ac1ca542fe82387a071e
parentb4bd8c66435a8cdf8c90334fb3b517a23ff2ab95 (diff)
ACPI: SCI interrupt source override
The Linux group at Stratus Technologies has come across an issue with SCI routing under ACPI. We were bitten by this when we made an x86_64 platform whose BIOS provides an Interrupt Source Override for the SCI itself. Apparently the override has no effect for the System Control Interrupt, and this appears to be because of the way the SCI is setup in the ACPI code. It does not handle the case where busirq != gsi. The code that sets up the SCI routing assumes that bus irq == global irq. So there is simply no provision for telling it otherwise. The attached patch provides this mechanism. This patch provided by David Bulkow, was tested on an i386 platform, which does not use the SCI override, and also on an x86_64 platform which does use an override. Signed-off-by: David Bulkow <david.bulkow@stratus.com> Cc: Andi Kleen <ak@muc.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--arch/i386/kernel/acpi/boot.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
index 92f79cdd9a48..ab974ff97073 100644
--- a/arch/i386/kernel/acpi/boot.c
+++ b/arch/i386/kernel/acpi/boot.c
@@ -332,7 +332,7 @@ acpi_parse_ioapic(acpi_table_entry_header * header, const unsigned long end)
332/* 332/*
333 * Parse Interrupt Source Override for the ACPI SCI 333 * Parse Interrupt Source Override for the ACPI SCI
334 */ 334 */
335static void acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger) 335static void acpi_sci_ioapic_setup(u32 bus_irq, u32 gsi, u16 polarity, u16 trigger)
336{ 336{
337 if (trigger == 0) /* compatible SCI trigger is level */ 337 if (trigger == 0) /* compatible SCI trigger is level */
338 trigger = 3; 338 trigger = 3;
@@ -352,13 +352,13 @@ static void acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger)
352 * If GSI is < 16, this will update its flags, 352 * If GSI is < 16, this will update its flags,
353 * else it will create a new mp_irqs[] entry. 353 * else it will create a new mp_irqs[] entry.
354 */ 354 */
355 mp_override_legacy_irq(gsi, polarity, trigger, gsi); 355 mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
356 356
357 /* 357 /*
358 * stash over-ride to indicate we've been here 358 * stash over-ride to indicate we've been here
359 * and for later update of acpi_fadt 359 * and for later update of acpi_fadt
360 */ 360 */
361 acpi_sci_override_gsi = gsi; 361 acpi_sci_override_gsi = bus_irq;
362 return; 362 return;
363} 363}
364 364
@@ -376,7 +376,7 @@ acpi_parse_int_src_ovr(acpi_table_entry_header * header,
376 acpi_table_print_madt_entry(header); 376 acpi_table_print_madt_entry(header);
377 377
378 if (intsrc->bus_irq == acpi_fadt.sci_int) { 378 if (intsrc->bus_irq == acpi_fadt.sci_int) {
379 acpi_sci_ioapic_setup(intsrc->global_irq, 379 acpi_sci_ioapic_setup(intsrc->bus_irq, intsrc->global_irq,
380 intsrc->flags.polarity, 380 intsrc->flags.polarity,
381 intsrc->flags.trigger); 381 intsrc->flags.trigger);
382 return 0; 382 return 0;
@@ -879,7 +879,7 @@ static int __init acpi_parse_madt_ioapic_entries(void)
879 * pretend we got one so we can set the SCI flags. 879 * pretend we got one so we can set the SCI flags.
880 */ 880 */
881 if (!acpi_sci_override_gsi) 881 if (!acpi_sci_override_gsi)
882 acpi_sci_ioapic_setup(acpi_fadt.sci_int, 0, 0); 882 acpi_sci_ioapic_setup(acpi_fadt.sci_int, acpi_fadt.sci_int, 0, 0);
883 883
884 /* Fill in identity legacy mapings where no override */ 884 /* Fill in identity legacy mapings where no override */
885 mp_config_acpi_legacy_irqs(); 885 mp_config_acpi_legacy_irqs();