diff options
| author | Roger Hardiman <roger@FreeBSD.org> | 1999-05-31 22:13:37 +0000 |
|---|---|---|
| committer | Roger Hardiman <roger@FreeBSD.org> | 1999-05-31 22:13:37 +0000 |
| commit | 153eb46fb658c8922576b76767951a183dc4bc12 (patch) | |
| tree | d04846c8a6f84cf87f242a1c789e4e629ce93934 /sys/dev | |
| parent | dcad3b0027c6b7eadfc4b7593d720bbef0715882 (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/pci/pci.c | 48 | ||||
| -rw-r--r-- | sys/dev/pci/pcivar.h | 8 |
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) \ |
