summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2006-12-11 19:47:37 +0000
committerkettenis <kettenis@openbsd.org>2006-12-11 19:47:37 +0000
commit85de8e564c28b1e912bd971f0349ffb887593d06 (patch)
tree701ca8718601f74aa292350b50fc2019dbac55da
parentdo not bus_space_map devices which are at address 0; ok kettenis (diff)
downloadwireguard-openbsd-85de8e564c28b1e912bd971f0349ffb887593d06.tar.xz
wireguard-openbsd-85de8e564c28b1e912bd971f0349ffb887593d06.zip
On i386, swizzle interrupts for devices for which we don't have explicit
inetrrupt routing information. ok deraadt@
-rw-r--r--sys/arch/i386/pci/pci_machdep.c16
-rw-r--r--sys/dev/pci/pci.c3
-rw-r--r--sys/dev/pci/pcivar.h4
3 files changed, 20 insertions, 3 deletions
diff --git a/sys/arch/i386/pci/pci_machdep.c b/sys/arch/i386/pci/pci_machdep.c
index 79c7b6779b8..e998ae914f9 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.35 2006/11/11 21:47:52 kettenis Exp $ */
+/* $OpenBSD: pci_machdep.c,v 1.36 2006/12/11 19:47:37 kettenis Exp $ */
/* $NetBSD: pci_machdep.c,v 1.28 1997/06/06 23:29:17 thorpej Exp $ */
/*-
@@ -480,6 +480,20 @@ pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
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) {
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 8483da534db..143952ea170 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pci.c,v 1.47 2006/10/04 19:27:44 kettenis Exp $ */
+/* $OpenBSD: pci.c,v 1.48 2006/12/11 19:47:37 kettenis Exp $ */
/* $NetBSD: pci.c,v 1.31 1997/06/06 23:48:04 thorpej Exp $ */
/*
@@ -271,6 +271,7 @@ pci_probe_device(struct pci_softc *sc, pcitag_t tag,
pa.pa_tag = tag;
pa.pa_id = id;
pa.pa_class = class;
+ pa.pa_bridgetag = sc->sc_bridgetag;
/* This is a simplification of the NetBSD code.
We don't support turning off I/O or memory
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index f2e3f4fc25b..27396b2c348 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pcivar.h,v 1.48 2006/04/07 01:04:49 brad Exp $ */
+/* $OpenBSD: pcivar.h,v 1.49 2006/12/11 19:47:37 kettenis Exp $ */
/* $NetBSD: pcivar.h,v 1.23 1997/06/06 23:48:05 thorpej Exp $ */
/*
@@ -112,6 +112,8 @@ struct pci_attach_args {
pcitag_t pa_tag;
pcireg_t pa_id, pa_class;
+ pcitag_t *pa_bridgetag;
+
/*
* Interrupt information.
*