svn commit: r359096 - in head/sys/compat/linuxkpi/common: include/linux src

Konstantin Belousov kib at FreeBSD.org
Wed Mar 18 22:10:51 UTC 2020


Author: kib
Date: Wed Mar 18 22:10:49 2020
New Revision: 359096
URL: https://svnweb.freebsd.org/changeset/base/359096

Log:
  linuxkpi: Add infrastructure to pass FreeBSD IOV method calls into
  pci_driver methods.
  
  Reviewed by:	hselasky
  Sponsored by:	Mellanox Technologies
  MFC after:	2 weeks

Modified:
  head/sys/compat/linuxkpi/common/include/linux/pci.h
  head/sys/compat/linuxkpi/common/src/linux_pci.c

Modified: head/sys/compat/linuxkpi/common/include/linux/pci.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/pci.h	Wed Mar 18 22:09:16 2020	(r359095)
+++ head/sys/compat/linuxkpi/common/include/linux/pci.h	Wed Mar 18 22:10:49 2020	(r359096)
@@ -37,11 +37,13 @@
 
 #include <sys/param.h>
 #include <sys/bus.h>
+#include <sys/nv.h>
 #include <sys/pciio.h>
 #include <sys/rman.h>
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pci_private.h>
+#include <dev/pci/pci_iov.h>
 
 #include <machine/resource.h>
 
@@ -201,6 +203,11 @@ struct pci_driver {
 	struct device_driver		driver;
 	const struct pci_error_handlers       *err_handler;
 	bool				isdrm;
+	int  (*bsd_iov_init)(device_t dev, uint16_t num_vfs,
+	    const nvlist_t *pf_config);
+	void  (*bsd_iov_uninit)(device_t dev);
+	int  (*bsd_iov_add_vf)(device_t dev, uint16_t vfnum,
+	    const nvlist_t *vf_config);
 };
 
 struct pci_bus {

Modified: head/sys/compat/linuxkpi/common/src/linux_pci.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_pci.c	Wed Mar 18 22:09:16 2020	(r359095)
+++ head/sys/compat/linuxkpi/common/src/linux_pci.c	Wed Mar 18 22:10:49 2020	(r359096)
@@ -65,6 +65,9 @@ static device_detach_t linux_pci_detach;
 static device_suspend_t linux_pci_suspend;
 static device_resume_t linux_pci_resume;
 static device_shutdown_t linux_pci_shutdown;
+static pci_iov_init_t linux_pci_iov_init;
+static pci_iov_uninit_t linux_pci_iov_uninit;
+static pci_iov_add_vf_t linux_pci_iov_add_vf;
 
 static device_method_t pci_methods[] = {
 	DEVMETHOD(device_probe, linux_pci_probe),
@@ -73,6 +76,9 @@ static device_method_t pci_methods[] = {
 	DEVMETHOD(device_suspend, linux_pci_suspend),
 	DEVMETHOD(device_resume, linux_pci_resume),
 	DEVMETHOD(device_shutdown, linux_pci_shutdown),
+	DEVMETHOD(pci_iov_init, linux_pci_iov_init),
+	DEVMETHOD(pci_iov_uninit, linux_pci_iov_uninit),
+	DEVMETHOD(pci_iov_add_vf, linux_pci_iov_add_vf),
 	DEVMETHOD_END
 };
 
@@ -353,6 +359,47 @@ linux_pci_shutdown(device_t dev)
 	if (pdev->pdrv->shutdown != NULL)
 		pdev->pdrv->shutdown(pdev);
 	return (0);
+}
+
+static int
+linux_pci_iov_init(device_t dev, uint16_t num_vfs, const nvlist_t *pf_config)
+{
+	struct pci_dev *pdev;
+	int error;
+
+	linux_set_current(curthread);
+	pdev = device_get_softc(dev);
+	if (pdev->pdrv->bsd_iov_init != NULL)
+		error = pdev->pdrv->bsd_iov_init(dev, num_vfs, pf_config);
+	else
+		error = EINVAL;
+	return (error);
+}
+
+static void
+linux_pci_iov_uninit(device_t dev)
+{
+	struct pci_dev *pdev;
+
+	linux_set_current(curthread);
+	pdev = device_get_softc(dev);
+	if (pdev->pdrv->bsd_iov_uninit != NULL)
+		pdev->pdrv->bsd_iov_uninit(dev);
+}
+
+static int
+linux_pci_iov_add_vf(device_t dev, uint16_t vfnum, const nvlist_t *vf_config)
+{
+	struct pci_dev *pdev;
+	int error;
+
+	linux_set_current(curthread);
+	pdev = device_get_softc(dev);
+	if (pdev->pdrv->bsd_iov_add_vf != NULL)
+		error = pdev->pdrv->bsd_iov_add_vf(dev, vfnum, vf_config);
+	else
+		error = EINVAL;
+	return (error);
 }
 
 static int


More information about the svn-src-all mailing list