aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorRoger Hardiman <roger@FreeBSD.org>1999-05-31 22:13:37 +0000
committerRoger Hardiman <roger@FreeBSD.org>1999-05-31 22:13:37 +0000
commit153eb46fb658c8922576b76767951a183dc4bc12 (patch)
treed04846c8a6f84cf87f242a1c789e4e629ce93934 /sys/dev
parentdcad3b0027c6b7eadfc4b7593d720bbef0715882 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pci/pci.c48
-rw-r--r--sys/dev/pci/pcivar.h8
2 files changed, 54 insertions, 2 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 8bc9c1df2cad..2c86832374d8 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pci.c,v 1.106 1999/05/30 16:53:36 phk Exp $
+ * $Id: pci.c,v 1.107 1999/05/31 11:29:01 phk Exp $
*
*/
@@ -555,6 +555,52 @@ pci_conf_match(struct pci_match_conf *matches, int num_matches,
return(1);
}
+/*
+ * Locate the parent of a PCI device by scanning the PCI devlist
+ * and return the entry for the parent.
+ * For devices on PCI Bus 0 (the host bus), this is the PCI Host.
+ * For devices on secondary PCI busses, this is that bus' PCI-PCI Bridge.
+ */
+
+pcicfgregs *
+pci_devlist_get_parent(pcicfgregs *cfg)
+{
+ struct devlist *devlist_head;
+ struct pci_devinfo *dinfo;
+ pcicfgregs *bridge_cfg;
+ int i;
+
+ dinfo = STAILQ_FIRST(devlist_head = &pci_devq);
+
+ /* If the device is on PCI bus 0, look for the host */
+ if (cfg->bus == 0) {
+ for (i = 0; (dinfo != NULL) && (i < pci_numdevs);
+ dinfo = STAILQ_NEXT(dinfo, pci_links), i++) {
+ bridge_cfg = &dinfo->cfg;
+ if (bridge_cfg->baseclass == PCIC_BRIDGE
+ && bridge_cfg->subclass == PCIS_BRIDGE_HOST
+ && bridge_cfg->bus == cfg->bus) {
+ return bridge_cfg;
+ }
+ }
+ }
+
+ /* If the device is not on PCI bus 0, look for the PCI-PCI bridge */
+ if (cfg->bus > 0) {
+ for (i = 0; (dinfo != NULL) && (i < pci_numdevs);
+ dinfo = STAILQ_NEXT(dinfo, pci_links), i++) {
+ bridge_cfg = &dinfo->cfg;
+ if (bridge_cfg->baseclass == PCIC_BRIDGE
+ && bridge_cfg->subclass == PCIS_BRIDGE_PCI
+ && bridge_cfg->secondarybus == cfg->bus) {
+ return bridge_cfg;
+ }
+ }
+ }
+
+ return NULL;
+}
+
static int
pci_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
{
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index 29d82a3c1108..f1c6f5e4d744 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pcivar.h,v 1.32 1999/05/18 20:48:38 peter Exp $
+ * $Id: pcivar.h,v 1.33 1999/05/20 15:33:33 gallatin Exp $
*
*/
@@ -185,6 +185,9 @@ vm_offset_t pci_cvt_to_dense (vm_offset_t);
vm_offset_t pci_cvt_to_bwx (vm_offset_t);
#endif /* __alpha__ */
+/* low level devlist operations for the 2.2 compatibility code in pci.c */
+pcicfgregs * pci_devlist_get_parent(pcicfgregs *cfg);
+
#ifdef _SYS_BUS_H_
#include "pci_if.h"
@@ -325,6 +328,9 @@ int pci_map_int_right(pcici_t cfg, pci_inthand_t *handler, void *arg,
intrmask_t *maskptr, u_int flags);
int pci_unmap_int (pcici_t tag);
+pcici_t pci_get_parent_from_tag(pcici_t tag);
+int pci_get_bus_from_tag(pcici_t tag);
+
struct module;
int compat_pci_handler (struct module *, int, void *);
#define COMPAT_PCI_DRIVER(name, pcidata) \