Module Name: src Committed By: mrg Date: Sat Sep 24 23:12:54 UTC 2016
Modified Files: src/distrib/sets/lists/base: shl.mi src/distrib/sets/lists/debug: shl.mi src/lib/libpci: pci.3 pci.h pci_drvname.c shlib_version src/sys/dev/pci: pci_usrreq.c pciio.h src/usr.sbin/pcictl: pcictl.c Log Message: introduce a better pci_drvname() and PCI_IOC_DRVNAME as pciio_drvnameonbus() and PCI_IOC_DRVNAMEONBUS. the new ones also take a (autoconf) PCI bus number, which allows lookups for any device on any pci bus node. use this in pcictl which current reports the wrong values sometimes. up next: use these in libpciaccess. To generate a diff of this commit: cvs rdiff -u -r1.786 -r1.787 src/distrib/sets/lists/base/shl.mi cvs rdiff -u -r1.146 -r1.147 src/distrib/sets/lists/debug/shl.mi cvs rdiff -u -r1.12 -r1.13 src/lib/libpci/pci.3 cvs rdiff -u -r1.8 -r1.9 src/lib/libpci/pci.h cvs rdiff -u -r1.1 -r1.2 src/lib/libpci/pci_drvname.c cvs rdiff -u -r1.4 -r1.5 src/lib/libpci/shlib_version cvs rdiff -u -r1.29 -r1.30 src/sys/dev/pci/pci_usrreq.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/pci/pciio.h cvs rdiff -u -r1.21 -r1.22 src/usr.sbin/pcictl/pcictl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/base/shl.mi diff -u src/distrib/sets/lists/base/shl.mi:1.786 src/distrib/sets/lists/base/shl.mi:1.787 --- src/distrib/sets/lists/base/shl.mi:1.786 Sat Sep 24 20:13:48 2016 +++ src/distrib/sets/lists/base/shl.mi Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -# $NetBSD: shl.mi,v 1.786 2016/09/24 20:13:48 christos Exp $ +# $NetBSD: shl.mi,v 1.787 2016/09/24 23:12:54 mrg Exp $ # # Note: Don't delete entries from here - mark them as "obsolete" instead, # unless otherwise stated below. @@ -432,7 +432,7 @@ ./usr/lib/libpcap.so.5.1 base-net-shlib compatfile ./usr/lib/libpci.so base-sys-shlib compatfile ./usr/lib/libpci.so.2 base-sys-shlib compatfile -./usr/lib/libpci.so.2.1 base-sys-shlib compatfile +./usr/lib/libpci.so.2.2 base-sys-shlib compatfile ./usr/lib/libperfuse.so base-perfuse-shlib compatfile ./usr/lib/libperfuse.so.0 base-perfuse-shlib compatfile ./usr/lib/libperfuse.so.0.0 base-perfuse-shlib compatfile Index: src/distrib/sets/lists/debug/shl.mi diff -u src/distrib/sets/lists/debug/shl.mi:1.146 src/distrib/sets/lists/debug/shl.mi:1.147 --- src/distrib/sets/lists/debug/shl.mi:1.146 Sat Sep 24 20:13:48 2016 +++ src/distrib/sets/lists/debug/shl.mi Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -# $NetBSD: shl.mi,v 1.146 2016/09/24 20:13:48 christos Exp $ +# $NetBSD: shl.mi,v 1.147 2016/09/24 23:12:54 mrg Exp $ ./usr/libdata/debug/lib base-sys-usr debug,dynamicroot,compatdir ./usr/libdata/debug/lib/libblacklist.so.0.0.debug comp-sys-debug debug,dynamicroot ./usr/libdata/debug/lib/libc.so.12.205.debug comp-sys-debug debug,dynamicroot @@ -152,7 +152,7 @@ ./usr/libdata/debug/usr/lib/libpam.so.4.0.debug comp-sys-debug debug,compatfile,pam ./usr/libdata/debug/usr/lib/libpanel.so.1.0.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libpcap.so.5.1.debug comp-net-debug debug,compatfile -./usr/libdata/debug/usr/lib/libpci.so.2.1.debug comp-sys-debug debug,compatfile +./usr/libdata/debug/usr/lib/libpci.so.2.2.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libperfuse.so.0.0.debug comp-perfuse-debug debug,compatfile ./usr/libdata/debug/usr/lib/libposix.so.0.1.debug comp-sys-debug debug,compatfile ./usr/libdata/debug/usr/lib/libppath.so.0.0.debug comp-sys-debug debug,compatfile Index: src/lib/libpci/pci.3 diff -u src/lib/libpci/pci.3:1.12 src/lib/libpci/pci.3:1.13 --- src/lib/libpci/pci.3:1.12 Sat Jan 23 07:21:18 2016 +++ src/lib/libpci/pci.3 Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -.\" $NetBSD: pci.3,v 1.12 2016/01/23 07:21:18 wiz Exp $ +.\" $NetBSD: pci.3,v 1.13 2016/09/24 23:12:54 mrg Exp $ .\" .\" Copyright 2001 Wasabi Systems, Inc. .\" All rights reserved. @@ -33,7 +33,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd December 16, 2014 +.Dd September 23, 2016 .Dt PCI 3 .Os .Sh NAME @@ -61,6 +61,8 @@ .Fn pci_conf_print "int pcifd" "unsigned int bus" "unsigned int dev" "unsigned int func" .Ft int .Fn pci_drvname "int pcifd" "unsigned int dev" "unsigned int func" "char *drvname" "size_t len" +.Ft int +.Fn pci_drvnameonbus "int pcifd" "u_int bus" "u_int dev" "u_int func" "char *drvname" "size_t len" .Sh DESCRIPTION The .Nm @@ -151,6 +153,10 @@ into using .Fa len as the buffer length. +.It Fn pci_drvnameonbus +Just like +.Fn pci_drvname +but also allows looking up via PCI bus number. .El .Sh RETURN VALUES The Index: src/lib/libpci/pci.h diff -u src/lib/libpci/pci.h:1.8 src/lib/libpci/pci.h:1.9 --- src/lib/libpci/pci.h:1.8 Sat Jan 23 01:26:14 2016 +++ src/lib/libpci/pci.h Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: pci.h,v 1.8 2016/01/23 01:26:14 dholland Exp $ */ +/* $NetBSD: pci.h,v 1.9 2016/09/24 23:12:54 mrg Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -59,6 +59,8 @@ int pcidev_conf_write(int, unsigned int, /* pci_drvname.c */ int pci_drvname(int, unsigned int, unsigned int, char *, size_t); +int pci_drvnameonbus(int, unsigned int, unsigned int, unsigned int, char *, + size_t); /* pci_subr.c */ void pci_devinfo(pcireg_t, pcireg_t, int, char *, size_t); Index: src/lib/libpci/pci_drvname.c diff -u src/lib/libpci/pci_drvname.c:1.1 src/lib/libpci/pci_drvname.c:1.2 --- src/lib/libpci/pci_drvname.c:1.1 Fri Jul 25 01:38:26 2014 +++ src/lib/libpci/pci_drvname.c Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_drvname.c,v 1.1 2014/07/25 01:38:26 mrg Exp $ */ +/* $NetBSD: pci_drvname.c,v 1.2 2016/09/24 23:12:54 mrg Exp $ */ /* * Copyright (c) 2014 Matthew R. Green @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pci_drvname.c,v 1.1 2014/07/25 01:38:26 mrg Exp $"); +__RCSID("$NetBSD: pci_drvname.c,v 1.2 2016/09/24 23:12:54 mrg Exp $"); #include <sys/types.h> #include <sys/ioctl.h> @@ -60,3 +60,27 @@ pci_drvname(int fd, u_int device, u_int strlcpy(name, drvname.name, len); return 0; } + +/* + * pci_drvnameonbus: + * + * What's the driver name for a PCI device on any PCI bus? + */ +int +pci_drvnameonbus(int fd, u_int bus, u_int device, u_int func, char *name, + size_t len) +{ + struct pciio_drvnameonbus drvname; + int rv; + + drvname.bus = bus; + drvname.device = device; + drvname.function = func; + + rv = ioctl(fd, PCI_IOC_DRVNAMEONBUS, &drvname); + if (rv == -1) + return -1; + + strlcpy(name, drvname.name, len); + return 0; +} Index: src/lib/libpci/shlib_version diff -u src/lib/libpci/shlib_version:1.4 src/lib/libpci/shlib_version:1.5 --- src/lib/libpci/shlib_version:1.4 Fri Jul 25 01:38:26 2014 +++ src/lib/libpci/shlib_version Sat Sep 24 23:12:54 2016 @@ -1,5 +1,5 @@ -# $NetBSD: shlib_version,v 1.4 2014/07/25 01:38:26 mrg Exp $ +# $NetBSD: shlib_version,v 1.5 2016/09/24 23:12:54 mrg Exp $ # Remember to update distrib/sets/lists/base/shl.* when changing # major=2 -minor=1 +minor=2 Index: src/sys/dev/pci/pci_usrreq.c diff -u src/sys/dev/pci/pci_usrreq.c:1.29 src/sys/dev/pci/pci_usrreq.c:1.30 --- src/sys/dev/pci/pci_usrreq.c:1.29 Mon Aug 24 23:55:04 2015 +++ src/sys/dev/pci/pci_usrreq.c Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_usrreq.c,v 1.29 2015/08/24 23:55:04 pooka Exp $ */ +/* $NetBSD: pci_usrreq.c,v 1.30 2016/09/24 23:12:54 mrg Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pci_usrreq.c,v 1.29 2015/08/24 23:55:04 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_usrreq.c,v 1.30 2016/09/24 23:12:54 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_pci.h" @@ -80,6 +80,7 @@ pciioctl(dev_t dev, u_long cmd, void *da struct pciio_bdf_cfgreg *bdfr; struct pciio_businfo *binfo; struct pciio_drvname *dname; + struct pciio_drvnameonbus *dnameonbus; pcitag_t tag; switch (cmd) { @@ -120,6 +121,29 @@ pciioctl(dev_t dev, u_long cmd, void *da sizeof dname->name); return 0; + case PCI_IOC_DRVNAMEONBUS: + dnameonbus = data; + int i; + + for (i = 0; i < pci_cd.cd_ndevs; i++) { + sc = device_lookup_private(&pci_cd, i); + if (sc->sc_bus == dnameonbus->bus) + break; /* found the right bus */ + } + if (i == pci_cd.cd_ndevs || sc == NULL) + return ENXIO; + if (dnameonbus->device >= sc->sc_maxndevs || + dnameonbus->function > 7) + return EINVAL; + + child = &sc->PCI_SC_DEVICESC(dnameonbus->device, + dnameonbus->function); + if (!child->c_dev) + return ENXIO; + strlcpy(dnameonbus->name, device_xname(child->c_dev), + sizeof dnameonbus->name); + return 0; + default: return ENOTTY; } Index: src/sys/dev/pci/pciio.h diff -u src/sys/dev/pci/pciio.h:1.4 src/sys/dev/pci/pciio.h:1.5 --- src/sys/dev/pci/pciio.h:1.4 Fri Jul 25 01:38:26 2014 +++ src/sys/dev/pci/pciio.h Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: pciio.h,v 1.4 2014/07/25 01:38:26 mrg Exp $ */ +/* $NetBSD: pciio.h,v 1.5 2016/09/24 23:12:54 mrg Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -97,17 +97,24 @@ struct pciio_businfo { * pciio_drvname: * * Driver info for a PCI device (autoconfiguration node) instance. - * Must be run on the correct bus. */ +/* The old drvname must be run on the correct bus. */ #define PCI_IO_DRVNAME_LEN 16 struct pciio_drvname { u_int device; /* in: device number */ u_int function; /* in: function number */ char name[PCI_IO_DRVNAME_LEN]; }; - #define PCI_IOC_DRVNAME _IOWR('P', 5, struct pciio_drvname) +struct pciio_drvnameonbus { + u_int bus; /* in: (autoconf) bus number */ + u_int device; /* in: device number */ + u_int function; /* in: function number */ + char name[PCI_IO_DRVNAME_LEN]; +}; +#define PCI_IOC_DRVNAMEONBUS _IOWR('P', 5, struct pciio_drvnameonbus) + #endif /* _DEV_PCI_PCIIO_H_ */ Index: src/usr.sbin/pcictl/pcictl.c diff -u src/usr.sbin/pcictl/pcictl.c:1.21 src/usr.sbin/pcictl/pcictl.c:1.22 --- src/usr.sbin/pcictl/pcictl.c:1.21 Mon Sep 1 07:11:19 2014 +++ src/usr.sbin/pcictl/pcictl.c Sat Sep 24 23:12:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: pcictl.c,v 1.21 2014/09/01 07:11:19 manu Exp $ */ +/* $NetBSD: pcictl.c,v 1.22 2016/09/24 23:12:54 mrg Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -446,7 +446,8 @@ scan_pci_list(u_int bus, u_int dev, u_in } if (print_names) { char drvname[16]; - if (pci_drvname(pcifd, dev, func, drvname, sizeof drvname) == 0) + if (pci_drvnameonbus(pcifd, bus, dev, func, drvname, + sizeof drvname) == 0) printf(" [%s]", drvname); } printf("\n");