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
This commit is contained in:
jhb 2003-11-11 18:20:10 +00:00
parent 042bc8606d
commit 6b78767a4d
2 changed files with 12 additions and 2 deletions

View File

@ -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",

View File

@ -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",