From 7f3257ab64e8bf0a3738696e53fea55b452f9641 Mon Sep 17 00:00:00 2001 From: Len Brown Date: Wed, 17 Sep 2003 20:58:41 -0700 Subject: [PATCH] [ACPI] Handle systems that specify non-ACPI-compliant SCI over-rides (Jun Nakajima) --- arch/i386/kernel/mpparse.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index fb9aba75d2f2b..f3cad0f982810 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c @@ -1019,8 +1019,6 @@ void __init mp_config_acpi_legacy_irqs (void) } } -/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */ - extern FADT_DESCRIPTOR acpi_fadt; void __init mp_config_ioapic_for_sci(int irq) @@ -1029,6 +1027,7 @@ void __init mp_config_ioapic_for_sci(int irq) int ioapic_pin; struct acpi_table_madt *madt; struct acpi_table_int_src_ovr *entry = NULL; + acpi_interrupt_flags flags; void *madt_end; acpi_status status; @@ -1052,15 +1051,12 @@ void __init mp_config_ioapic_for_sci(int irq) * See the note at the end of ACPI 2.0b section * 5.2.10.8 for what this is about. */ - if (entry->bus_irq != entry->global_irq) { - acpi_fadt.sci_int = entry->global_irq; - irq = entry->global_irq; - break; - } - else - return; + flags = entry->flags; + acpi_fadt.sci_int = entry->global_irq; + irq = entry->global_irq; + break; } - + entry = (struct acpi_table_int_src_ovr *) ((unsigned long) entry + entry->header.length); } @@ -1070,7 +1066,13 @@ void __init mp_config_ioapic_for_sci(int irq) ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start; - io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, level triggered + if (flags.polarity == 0) + flags.polarity = 0x3; /* Active low */ + if (flags.trigger == 0) + flags.trigger = 0x3; /* Level-triggered */ + + io_apic_set_pci_routing(ioapic, ioapic_pin, irq, + (flags.trigger >> 1) , (flags.polarity >> 1)); } #ifdef CONFIG_ACPI_PCI -- 2.53.0