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>
This commit is contained in:
parent
2f4adfad0a
commit
5da473e965
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user