summaryrefslogtreecommitdiffstats
path: root/sys/pci/pci.c
diff options
context:
space:
mode:
authorse <se@FreeBSD.org>1995-02-25 17:26:22 +0000
committerse <se@FreeBSD.org>1995-02-25 17:26:22 +0000
commitf69a6c86317ff90bce1b2a1635e84dc9c463740b (patch)
treee22eb35e21dd035dda7cfe3d37657c1ceb6598bb /sys/pci/pci.c
parent0da562d454ac7b6119c29ad4ccd4c09a2a4c1022 (diff)
downloadFreeBSD-src-f69a6c86317ff90bce1b2a1635e84dc9c463740b.zip
FreeBSD-src-f69a6c86317ff90bce1b2a1635e84dc9c463740b.tar.gz
Deal with systems, that lack a fully decoded PCI configuration space.
Submitted by: <wolf@kintaro.cologne.de> Wolfgang Stanglmeier
Diffstat (limited to 'sys/pci/pci.c')
-rw-r--r--sys/pci/pci.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/sys/pci/pci.c b/sys/pci/pci.c
index a3ddeb8..e17b7f5 100644
--- a/sys/pci/pci.c
+++ b/sys/pci/pci.c
@@ -1,6 +1,6 @@
/**************************************************************************
**
-** $Id: pci.c,v 1.14 1995/02/14 23:33:38 se Exp $
+** $Id: pci.c,v 1.15 1995/02/22 14:17:15 se Exp $
**
** General subroutines for the PCI bus on 80*86 systems.
** pci_configure ()
@@ -36,7 +36,7 @@
***************************************************************************
*/
-#define PCI_PATCHLEVEL "pl2 95/02/21"
+#define PCI_PATCHLEVEL "pl3 95/02/25"
#include <pci.h>
#if NPCI > 0
@@ -166,6 +166,8 @@ static u_long pci_irq = PCI_IRQ;
** May be called more than once.
** Any device is attached only once.
** (Attached devices are remembered in pci_seen.)
+** Has to take care of mirrored devices, which are
+** entailed by incomplete decoding of pci address lines.
**
**---------------------------------------------------------
*/
@@ -244,6 +246,24 @@ void pci_configure()
dvp = NULL;
};
+ /*
+ ** check for mirrored devices.
+ */
+ if (device >= 8) {
+ pcici_t tag0;
+ pcidi_t type0;
+ tag0 = pcibus.pb_tag (bus, device & 0x07, 0);
+ type0 = pcibus.pb_read (tag0, PCI_ID_REG);
+ if (type==type0) {
+#ifndef PCI_QUIET
+ if (dvp==NULL) continue;
+ printf ("%s? <%s> mirrored on pci%d:%d\n",
+ dvp->pd_name, name, bus, device);
+#endif
+ continue;
+ };
+ };
+
if (dvp==NULL) {
#ifndef PCI_QUIET
if (pci_conf_count)
OpenPOWER on IntegriCloud