summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-03-05 16:03:44 +0000
committerjhb <jhb@FreeBSD.org>2009-03-05 16:03:44 +0000
commit95e639db1b991fdc54d20f37e7074d73033bdcd8 (patch)
tree10d7597a79ed7d66a0ce328ab6140e588b1bf33e
parent0bda83f9a749c51dbba8ab3683b65c05ebb8cc93 (diff)
downloadFreeBSD-src-95e639db1b991fdc54d20f37e7074d73033bdcd8.zip
FreeBSD-src-95e639db1b991fdc54d20f37e7074d73033bdcd8.tar.gz
At least one BIOS bogusly includes duplicate entries for I/O APICs. The
bogus entries have a starting IRQ that is invalid (> 255, so won't fit into a PCI intline config register). It had the side effect of breaking MSI by "claiming" several IRQs in the MSI range. Fix this by ignoring such I/O APICs. MFC after: 2 weeks
-rw-r--r--sys/amd64/acpica/madt.c4
-rw-r--r--sys/i386/acpica/madt.c4
2 files changed, 8 insertions, 0 deletions
diff --git a/sys/amd64/acpica/madt.c b/sys/amd64/acpica/madt.c
index 7bcf0e6..a8df55d 100644
--- a/sys/amd64/acpica/madt.c
+++ b/sys/amd64/acpica/madt.c
@@ -483,6 +483,10 @@ madt_parse_apics(ACPI_SUBTABLE_HEADER *entry, void *arg __unused)
apic->Id);
if (ioapics[apic->Id].io_apic != NULL)
panic("%s: Double APIC ID %u", __func__, apic->Id);
+ if (apic->GlobalIrqBase >= FIRST_MSI_INT) {
+ printf("MADT: Ignoring bogus I/O APIC ID %u", apic->Id);
+ break;
+ }
ioapics[apic->Id].io_apic = ioapic_create(apic->Address,
apic->Id, apic->GlobalIrqBase);
ioapics[apic->Id].io_vector = apic->GlobalIrqBase;
diff --git a/sys/i386/acpica/madt.c b/sys/i386/acpica/madt.c
index 3e53cf0..e604829 100644
--- a/sys/i386/acpica/madt.c
+++ b/sys/i386/acpica/madt.c
@@ -482,6 +482,10 @@ madt_parse_apics(ACPI_SUBTABLE_HEADER *entry, void *arg __unused)
apic->Id);
if (ioapics[apic->Id].io_apic != NULL)
panic("%s: Double APIC ID %u", __func__, apic->Id);
+ if (apic->GlobalIrqBase >= FIRST_MSI_INT) {
+ printf("MADT: Ignoring bogus I/O APIC ID %u", apic->Id);
+ break;
+ }
ioapics[apic->Id].io_apic = ioapic_create(apic->Address,
apic->Id, apic->GlobalIrqBase);
ioapics[apic->Id].io_vector = apic->GlobalIrqBase;
OpenPOWER on IntegriCloud