From 0aee83cc1ddea0b13e38a48586abf4b84269afcf Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 3 Aug 2016 17:09:12 +0000 Subject: [PATCH] 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. Reviewed by: rstone MFC after: 1 month Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D7400 --- share/man/man9/Makefile | 1 + share/man/man9/pci.9 | 25 ++++++++++++++++++++++++- sys/dev/pci/pci_if.m | 1 + sys/dev/pci/pci_iov.c | 18 ++++++++++++++++-- sys/dev/pci/pci_iov.h | 5 ++++- sys/dev/pci/pci_private.h | 3 ++- 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index 58b35f6b4e4b..251a0d9e840a 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 a53f971ad0bb..161f9aa13292 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_if.m b/sys/dev/pci/pci_if.m index 5f8415fddda7..11fa5d75d920 100644 --- a/sys/dev/pci/pci_if.m +++ b/sys/dev/pci/pci_if.m @@ -235,6 +235,7 @@ METHOD int iov_attach { 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 bba99f620a4e..db8a035f21aa 100644 --- a/sys/dev/pci/pci_iov.c +++ b/sys/dev/pci/pci_iov.c @@ -97,9 +97,23 @@ static void pci_iov_build_vf_schema(nvlist_t *schema, 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(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 fd2f8fba8876..297ae07f4c57 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)); + 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 a9958ca627db..b0f1481810c7 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,