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");

Reply via email to