From: Anatoly Burakov <anatoly.burakov@intel.com>
Date: Fri, 13 Jun 2014 14:52:48 +0000 (+0100)
Subject: pci: enable vfio device binding
X-Git-Tag: spdx-start~10728
X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=5da473e965c2f621225d03fa7f7c7c80800272be;p=dpdk.git

pci: enable vfio device binding

Add support for binding VFIO devices if RTE_PCI_DRV_NEED_MAPPING is set
for this driver. Try VFIO first, if not mapped then try IGB_UIO too.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: HuilongX Xu <huilongx.xu@intel.com>
Tested-by: Waterman Cao <waterman.cao@intel.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---

diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
index c7cd38e71d..3b94b6fb54 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -393,6 +393,30 @@ error:
 	return -1;
 }
 
+static int
+pci_map_device(struct rte_pci_device *dev)
+{
+	int ret, mapped = 0;
+
+	/* try mapping the NIC resources using VFIO if it exists */
+#ifdef VFIO_PRESENT
+	if (pci_vfio_is_enabled()) {
+		ret = pci_vfio_map_resource(dev);
+		if (ret == 0)
+			mapped = 1;
+		else if (ret < 0)
+			return ret;
+	}
+#endif
+	/* map resources for devices that use igb_uio */
+	if (!mapped) {
+		ret = pci_uio_map_resource(dev);
+		if (ret != 0)
+			return ret;
+	}
+	return 0;
+}
+
 /*
  * If vendor/device ID match, call the devinit() function of the
  * driver.
@@ -400,8 +424,8 @@ error:
 int
 rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *dev)
 {
+	int ret;
 	struct rte_pci_id *id_table;
-	int ret = 0;
 
 	for (id_table = dr->id_table ; id_table->vendor_id != 0; id_table++) {
 
@@ -437,7 +461,7 @@ rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_device *d
 
 		if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) {
 			/* map resources for devices that use igb_uio */
-			ret = pci_uio_map_resource(dev);
+			ret = pci_map_device(dev);
 			if (ret != 0)
 				return ret;
 		} else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND &&
@@ -474,5 +498,21 @@ rte_eal_pci_init(void)
 		RTE_LOG(ERR, EAL, "%s(): Cannot scan PCI bus\n", __func__);
 		return -1;
 	}
+#ifdef VFIO_PRESENT
+	pci_vfio_enable();
+
+	if (pci_vfio_is_enabled()) {
+
+		/* if we are primary process, create a thread to communicate with
+		 * secondary processes. the thread will use a socket to wait for
+		 * requests from secondary process to send open file descriptors,
+		 * because VFIO does not allow multiple open descriptors on a group or
+		 * VFIO container.
+		 */
+		if (internal_config.process_type == RTE_PROC_PRIMARY &&
+				pci_vfio_mp_sync_setup() < 0)
+			return -1;
+	}
+#endif
 	return 0;
 }