From 6b78767a4de13116bc44427730bb408f5543b4d9 Mon Sep 17 00:00:00 2001 From: jhb Date: Tue, 11 Nov 2003 18:20:10 +0000 Subject: [PATCH] Some motherboards like to remap the SCI (normally IRQ 9) up to a PCI interrupt such as IRQ 22 or 19. However, the ACPI BIOS still routes interrupts from some PCI devices to the same intpin calling the pin IRQ 22. Thus, ACPI expects to address a single interrupt source via two different names. To work around this, if the SCI is remapped to a non-ISA interrupt (i.e., greater than 15), then we use acpi_OverrideInterruptLevel() function to tell ACPI to use IRQ 22 or 19 rather than IRQ 9 for the SCI. Previously we would change IRQ 22 or 19's name to IRQ 9 when we encountered such an Interrupt Source Override entry in the MADT which routed the SCI properly but left PCI devices mapped to IRQ 22 or 19 w/o a routable interrupt. Tested by: sos --- sys/amd64/acpica/madt.c | 7 ++++++- sys/i386/acpica/madt.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/sys/amd64/acpica/madt.c b/sys/amd64/acpica/madt.c index 436f7ad791db..2ac73e5be832 100644 --- a/sys/amd64/acpica/madt.c +++ b/sys/amd64/acpica/madt.c @@ -536,7 +536,12 @@ madt_parse_interrupt_override(INTERRUPT_SOURCE_OVERRIDE *intr) } if (intr->Source != intr->GlobalSystemInterrupt) { - ioapic_remap_vector(new_ioapic, new_pin, intr->Source); + /* XXX: This assumes that the SCI uses IRQ 9. */ + if (intr->GlobalSystemInterrupt > 15 && intr->Source == 9) + acpi_OverrideInterruptLevel( + intr->GlobalSystemInterrupt); + else + ioapic_remap_vector(new_ioapic, new_pin, intr->Source); if (madt_find_interrupt(intr->Source, &old_ioapic, &old_pin) != 0) printf("MADT: Could not find APIC for source IRQ %d\n", diff --git a/sys/i386/acpica/madt.c b/sys/i386/acpica/madt.c index 436f7ad791db..2ac73e5be832 100644 --- a/sys/i386/acpica/madt.c +++ b/sys/i386/acpica/madt.c @@ -536,7 +536,12 @@ madt_parse_interrupt_override(INTERRUPT_SOURCE_OVERRIDE *intr) } if (intr->Source != intr->GlobalSystemInterrupt) { - ioapic_remap_vector(new_ioapic, new_pin, intr->Source); + /* XXX: This assumes that the SCI uses IRQ 9. */ + if (intr->GlobalSystemInterrupt > 15 && intr->Source == 9) + acpi_OverrideInterruptLevel( + intr->GlobalSystemInterrupt); + else + ioapic_remap_vector(new_ioapic, new_pin, intr->Source); if (madt_find_interrupt(intr->Source, &old_ioapic, &old_pin) != 0) printf("MADT: Could not find APIC for source IRQ %d\n",