summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-09-29 22:52:24 +0000
committerjhb <jhb@FreeBSD.org>2016-09-29 22:52:24 +0000
commit6a05272ab86f04ddbc4fb75adb38f4aab96220e9 (patch)
tree3b2ec95fdb543f73c7424029636c16a609215e26
parentc57a25c7a19b2dc6292bce631239d7930ebfc01d (diff)
downloadFreeBSD-src-6a05272ab86f04ddbc4fb75adb38f4aab96220e9.zip
FreeBSD-src-6a05272ab86f04ddbc4fb75adb38f4aab96220e9.tar.gz
MFC 303721: Permit the name of the /dev/iov entry to be set by the driver.
The PCI_IOV option creates character devices in /dev/iov for each PF device driver that registers support for creating VFs. By default the character device is named after the PF device (e.g. /dev/iov/foo0). This change adds a variant of pci_iov_attach() called pci_iov_attach_name() that allows the name of the /dev/iov entry to be specified by the driver. To preserve the ABI, this version does not modify the existing PCI_IOV_ATTACH kobj method as was done in HEAD. Instead, a new PCI_IOV_ATTACH_NAME method has been added that accepts the name as an additional parameter. The PCI bus driver now provides an implementation of PCI_IOV_ATTACH_NAME. A default implementation of PCI_IOV_ATTACH is provided that calls PCI_IOV_ATTACH_NAME passing 'device_get_nameunit(dev)' as the name. Sponsored by: Chelsio Communications
-rw-r--r--share/man/man9/Makefile1
-rw-r--r--share/man/man9/pci.925
-rw-r--r--sys/dev/pci/pci.c2
-rw-r--r--sys/dev/pci/pci_if.m16
-rw-r--r--sys/dev/pci/pci_iov.c18
-rw-r--r--sys/dev/pci/pci_iov.h7
-rw-r--r--sys/dev/pci/pci_private.h3
7 files changed, 65 insertions, 7 deletions
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index 58b35f6..251a0d9 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -1303,6 +1303,7 @@ MLINKS+=pci.9 pci_alloc_msi.9 \
pci.9 pci_get_vpd_ident.9 \
pci.9 pci_get_vpd_readonly.9 \
pci.9 pci_iov_attach.9 \
+ pci.9 pci_iov_attach_name.9 \
pci.9 pci_iov_detach.9 \
pci.9 pci_msi_count.9 \
pci.9 pci_msix_count.9 \
diff --git a/share/man/man9/pci.9 b/share/man/man9/pci.9
index a53f971..161f9aa 100644
--- a/share/man/man9/pci.9
+++ b/share/man/man9/pci.9
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 24, 2016
+.Dd August 3, 2016
.Dt PCI 9
.Os
.Sh NAME
@@ -50,6 +50,7 @@
.Nm pci_get_vpd_ident ,
.Nm pci_get_vpd_readonly ,
.Nm pci_iov_attach ,
+.Nm pci_iov_attach_name ,
.Nm pci_iov_detach ,
.Nm pci_msi_count ,
.Nm pci_msix_count ,
@@ -152,6 +153,14 @@
.Ft int
.Fn pci_iov_attach "device_t dev" "nvlist_t *pf_schema" "nvlist_t *vf_schema"
.Ft int
+.Fo pci_iov_attach_name
+.Fa "device_t dev"
+.Fa "nvlist_t *pf_schema"
+.Fa "nvlist_t *vf_schema"
+.Fa "const char *fmt"
+.Fa "..."
+.Fc
+.Ft int
.Fn pci_iov_detach "device_t dev"
.Sh DESCRIPTION
The
@@ -595,6 +604,20 @@ and is responsible for freeing them.
The driver must never free the schemas itself.
.Pp
The
+.Fn pci_iov_attach_name
+function is a variant of
+.Fn pci_iov_attach
+that allows the name of the associated character device in
+.Pa /dev/iov
+to be specified by
+.Fa fmt .
+The
+.Fn pci_iov_attach
+function uses the name of
+.Fa dev
+as the device name.
+.Pp
+The
.Fn pci_iov_detach
function is used to advise the SR-IOV infrastructure that the driver for the
given device is attempting to detach and that all SR-IOV resources for the
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 784dd00..3a5a938 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -195,7 +195,7 @@ static device_method_t pci_methods[] = {
DEVMETHOD(pci_alloc_devinfo, pci_alloc_devinfo_method),
DEVMETHOD(pci_child_added, pci_child_added_method),
#ifdef PCI_IOV
- DEVMETHOD(pci_iov_attach, pci_iov_attach_method),
+ DEVMETHOD(pci_iov_attach_name, pci_iov_attach_method),
DEVMETHOD(pci_iov_detach, pci_iov_detach_method),
DEVMETHOD(pci_create_iov_child, pci_create_iov_child_method),
#endif
diff --git a/sys/dev/pci/pci_if.m b/sys/dev/pci/pci_if.m
index 5f8415f..027e618 100644
--- a/sys/dev/pci/pci_if.m
+++ b/sys/dev/pci/pci_if.m
@@ -51,6 +51,14 @@ CODE {
device_printf(bus, "PCI_IOV not implemented on this bus.\n");
return (NULL);
}
+
+ static int
+ compat_iov_attach(device_t bus, device_t dev, struct nvlist *pf_schema,
+ struct nvlist *vf_schema)
+ {
+ return (PCI_IOV_ATTACH_NAME(bus, dev, pf_schema, vf_schema,
+ device_get_nameunit(dev)));
+ }
};
HEADER {
@@ -235,6 +243,14 @@ METHOD int iov_attach {
device_t child;
struct nvlist *pf_schema;
struct nvlist *vf_schema;
+} DEFAULT compat_iov_attach;
+
+METHOD int iov_attach_name {
+ device_t dev;
+ device_t child;
+ struct nvlist *pf_schema;
+ struct nvlist *vf_schema;
+ const char *name;
};
METHOD int iov_detach {
diff --git a/sys/dev/pci/pci_iov.c b/sys/dev/pci/pci_iov.c
index bba99f6..19e51df 100644
--- a/sys/dev/pci/pci_iov.c
+++ b/sys/dev/pci/pci_iov.c
@@ -98,8 +98,22 @@ static nvlist_t *pci_iov_get_pf_subsystem_schema(void);
static nvlist_t *pci_iov_get_vf_subsystem_schema(void);
int
+pci_iov_attach_name(device_t dev, struct nvlist *pf_schema,
+ struct nvlist *vf_schema, const char *fmt, ...)
+{
+ char buf[NAME_MAX + 1];
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+ return (PCI_IOV_ATTACH_NAME(device_get_parent(dev), dev, pf_schema,
+ vf_schema, buf));
+}
+
+int
pci_iov_attach_method(device_t bus, device_t dev, nvlist_t *pf_schema,
- nvlist_t *vf_schema)
+ nvlist_t *vf_schema, const char *name)
{
device_t pcib;
struct pci_devinfo *dinfo;
@@ -149,7 +163,7 @@ pci_iov_attach_method(device_t bus, device_t dev, nvlist_t *pf_schema,
iov->iov_schema = schema;
iov->iov_cdev = make_dev(&iov_cdevsw, device_get_unit(dev),
- UID_ROOT, GID_WHEEL, 0600, "iov/%s", device_get_nameunit(dev));
+ UID_ROOT, GID_WHEEL, 0600, "iov/%s", name);
if (iov->iov_cdev == NULL) {
error = ENOMEM;
diff --git a/sys/dev/pci/pci_iov.h b/sys/dev/pci/pci_iov.h
index fd2f8fb..09a182d 100644
--- a/sys/dev/pci/pci_iov.h
+++ b/sys/dev/pci/pci_iov.h
@@ -33,11 +33,14 @@
struct nvlist;
+int pci_iov_attach_name(device_t dev, struct nvlist *pf_schema,
+ struct nvlist *vf_schema, const char *fmt, ...) __printflike(4, 5);
+
static __inline int
pci_iov_attach(device_t dev, struct nvlist *pf_schema, struct nvlist *vf_schema)
{
- return (PCI_IOV_ATTACH(device_get_parent(dev), dev, pf_schema,
- vf_schema));
+ return (PCI_IOV_ATTACH_NAME(device_get_parent(dev), dev, pf_schema,
+ vf_schema, device_get_nameunit(dev)));
}
static __inline int
diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h
index a9958ca..b0f1481 100644
--- a/sys/dev/pci/pci_private.h
+++ b/sys/dev/pci/pci_private.h
@@ -158,7 +158,8 @@ struct resource *pci_alloc_multi_resource(device_t dev, device_t child,
rman_res_t count, u_long num, u_int flags);
int pci_iov_attach_method(device_t bus, device_t dev,
- struct nvlist *pf_schema, struct nvlist *vf_schema);
+ struct nvlist *pf_schema, struct nvlist *vf_schema,
+ const char *name);
int pci_iov_detach_method(device_t bus, device_t dev);
device_t pci_create_iov_child_method(device_t bus, device_t pf,
OpenPOWER on IntegriCloud