summaryrefslogtreecommitdiff
path: root/sys/arch/i386/pci
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2006-12-20 18:59:51 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2006-12-20 18:59:51 +0000
commitc064cb7b47291b8b485229c7e4c279cf24d0fc01 (patch)
treee2a7364eeb709781ed9633d76034d4167187059a /sys/arch/i386/pci
parent2bf796bb9c8fafdb4a7ac51877aad5f41ccf32f6 (diff)
Don't bail out on a bad interrupt line if we have a valid apic interrupt pin
for a pci device.
Diffstat (limited to 'sys/arch/i386/pci')
-rw-r--r--sys/arch/i386/pci/pci_machdep.c76
1 files changed, 43 insertions, 33 deletions
diff --git a/sys/arch/i386/pci/pci_machdep.c b/sys/arch/i386/pci/pci_machdep.c
index e998ae914f9..397f3661a41 100644
--- a/sys/arch/i386/pci/pci_machdep.c
+++ b/sys/arch/i386/pci/pci_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pci_machdep.c,v 1.36 2006/12/11 19:47:37 kettenis Exp $ */
+/* $OpenBSD: pci_machdep.c,v 1.37 2006/12/20 18:59:50 kettenis Exp $ */
/* $NetBSD: pci_machdep.c,v 1.28 1997/06/06 23:29:17 thorpej Exp $ */
/*-
@@ -431,6 +431,45 @@ pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
ihp->line = line;
ihp->pin = pin;
+
+#if NIOAPIC > 0
+ pci_decompose_tag (pc, intrtag, &bus, &dev, &func);
+
+ if (!(ihp->line & PCI_INT_VIA_ISA) && mp_busses != NULL) {
+ /*
+ * Assumes 1:1 mapping between PCI bus numbers and
+ * the numbers given by the MP bios.
+ * XXX Is this a valid assumption?
+ */
+ int mpspec_pin = (dev<<2)|(pin-1);
+
+ for (mip = mp_busses[bus].mb_intrs; mip != NULL; mip=mip->next) {
+ if (mip->bus_pin == mpspec_pin) {
+ ihp->line = mip->ioapic_ih | line;
+ return 0;
+ }
+ }
+ if (mip == NULL && pa->pa_bridgetag) {
+ int bridgebus, bridgedev;
+
+ pci_decompose_tag(pc, *pa->pa_bridgetag,
+ &bridgebus, &bridgedev, NULL);
+ mpspec_pin = (bridgedev << 2)|((pin + dev - 1) & 0x3);
+ for (mip = mp_busses[bridgebus].mb_intrs; mip != NULL;
+ mip = mip->next) {
+ if (mip->bus_pin == mpspec_pin) {
+ ihp->line = mip->ioapic_ih | line;
+ return 0;
+ }
+ }
+ }
+ /*
+ * No explicit PCI mapping found. This is not fatal,
+ * we'll try the ISA (or possibly EISA) mappings next.
+ */
+ }
+#endif
+
#if NPCIBIOS > 0
pci_intr_header_fixup(pc, intrtag, ihp);
line = ihp->line & APIC_INT_LINE_MASK;
@@ -464,36 +503,7 @@ pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
}
}
#if NIOAPIC > 0
- pci_decompose_tag (pc, intrtag, &bus, &dev, &func);
-
if (!(ihp->line & PCI_INT_VIA_ISA) && mp_busses != NULL) {
- /*
- * Assumes 1:1 mapping between PCI bus numbers and
- * the numbers given by the MP bios.
- * XXX Is this a valid assumption?
- */
- int mpspec_pin = (dev<<2)|(pin-1);
-
- for (mip = mp_busses[bus].mb_intrs; mip != NULL; mip=mip->next) {
- if (mip->bus_pin == mpspec_pin) {
- ihp->line = mip->ioapic_ih | line;
- return 0;
- }
- }
- if (mip == NULL && pa->pa_bridgetag) {
- int bridgebus, bridgedev;
-
- pci_decompose_tag(pc, *pa->pa_bridgetag,
- &bridgebus, &bridgedev, NULL);
- mpspec_pin = (bridgedev << 2)|((pin + dev - 1) & 0x3);
- for (mip = mp_busses[bridgebus].mb_intrs; mip != NULL;
- mip = mip->next) {
- if (mip->bus_pin == mpspec_pin) {
- ihp->line = mip->ioapic_ih | line;
- return 0;
- }
- }
- }
if (mip == NULL && mp_isa_bus) {
for (mip = mp_isa_bus->mb_intrs; mip != NULL;
mip = mip->next) {
@@ -534,9 +544,6 @@ pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih)
static char irqstr[64];
int line = ih.line & APIC_INT_LINE_MASK;
- if (line == 0 || line >= ICU_LEN || line == 2)
- panic("pci_intr_string: bogus handle 0x%x", line);
-
#if NIOAPIC > 0
if (ih.line & APIC_INT_VIA_APIC) {
snprintf(irqstr, sizeof irqstr, "apic %d int %d (irq %d)",
@@ -545,6 +552,9 @@ pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih)
}
#endif
+ if (line == 0 || line >= ICU_LEN || line == 2)
+ panic("pci_intr_string: bogus handle 0x%x", line);
+
snprintf(irqstr, sizeof irqstr, "irq %d", line);
return (irqstr);
}