@@ -401,10 +401,14 @@ cdx_vfio_map_resource_primary(struct rte_cdx_device *dev)
return -1;
ret = rte_vfio_setup_device(RTE_CDX_BUS_DEVICES_PATH, dev_name,
- &vfio_dev_fd, &device_info);
+ &vfio_dev_fd);
if (ret)
return ret;
+ ret = rte_vfio_get_device_info(vfio_dev_fd, &device_info);
+ if (ret)
+ goto err_vfio_dev_fd;
+
/* allocate vfio_res and get region info */
vfio_res = rte_zmalloc("VFIO_RES", sizeof(*vfio_res), 0);
if (vfio_res == NULL) {
@@ -510,10 +514,14 @@ cdx_vfio_map_resource_secondary(struct rte_cdx_device *dev)
}
ret = rte_vfio_setup_device(RTE_CDX_BUS_DEVICES_PATH, dev_name,
- &vfio_dev_fd, &device_info);
+ &vfio_dev_fd);
if (ret)
return ret;
+ ret = rte_vfio_get_device_info(vfio_dev_fd, &device_info);
+ if (ret)
+ goto err_vfio_dev_fd;
+
/* map MMIO regions */
maps = vfio_res->maps;
@@ -753,10 +753,14 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev)
loc->domain, loc->bus, loc->devid, loc->function);
ret = rte_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr,
- &vfio_dev_fd, &device_info);
+ &vfio_dev_fd);
if (ret)
return ret;
+ ret = rte_vfio_get_device_info(vfio_dev_fd, &device_info);
+ if (ret)
+ goto err_vfio_dev_fd;
+
if (rte_intr_dev_fd_set(dev->intr_handle, vfio_dev_fd))
goto err_vfio_dev_fd;
@@ -962,10 +966,14 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev)
}
ret = rte_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr,
- &vfio_dev_fd, &device_info);
+ &vfio_dev_fd);
if (ret)
return ret;
+ ret = rte_vfio_get_device_info(vfio_dev_fd, &device_info);
+ if (ret)
+ goto err_vfio_dev_fd;
+
ret = pci_vfio_fill_regions(dev, vfio_dev_fd, &device_info);
if (ret)
goto err_vfio_dev_fd;
@@ -1194,12 +1202,14 @@ pci_vfio_ioport_map(struct rte_pci_device *dev, int bar,
if (vfio_dev_fd < 0) {
return -1;
} else if (vfio_dev_fd == 0) {
- if (rte_vfio_get_device_info(rte_pci_get_sysfs_path(), pci_addr,
- &vfio_dev_fd, &device_info) != 0)
+ if (rte_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr,
+ &vfio_dev_fd) != 0)
return -1;
/* save vfio_dev_fd so it can be used during release */
if (rte_intr_dev_fd_set(dev->intr_handle, vfio_dev_fd) != 0)
return -1;
+ if (rte_vfio_get_device_info(vfio_dev_fd, &device_info) != 0)
+ return -1;
if (pci_vfio_fill_regions(dev, vfio_dev_fd, &device_info) != 0)
return -1;
@@ -328,12 +328,19 @@ device_setup(struct rte_platform_device *pdev)
const char *name = pdev->name;
int ret;
- ret = rte_vfio_setup_device(PLATFORM_BUS_DEVICES_PATH, name, &pdev->dev_fd, &dev_info);
+ ret = rte_vfio_setup_device(PLATFORM_BUS_DEVICES_PATH, name, &pdev->dev_fd);
if (ret) {
PLATFORM_LOG_LINE(ERR, "failed to setup %s", name);
return -ENODEV;
}
+ ret = rte_vfio_get_device_info(pdev->dev_fd, &dev_info);
+ if (ret) {
+ PLATFORM_LOG_LINE(ERR, "failed to get device info for %s", name);
+ ret = -ENODEV;
+ goto out;
+ }
+
/* This is an extra check to confirm that platform device was initialized
* by a kernel vfio-platform driver. On kernels that predate vfio-platform
* driver this flag obviously does not exist. In such scenarios this
@@ -25,12 +25,18 @@ vfio_map_dev_obj(const char *path, const char *dev_obj,
struct vfio_device_info d_info = { .argsz = sizeof(d_info) };
struct vfio_region_info reg_info = { .argsz = sizeof(reg_info) };
- ret = rte_vfio_setup_device(path, dev_obj, dev_fd, &d_info);
+ ret = rte_vfio_setup_device(path, dev_obj, dev_fd);
if (ret) {
BCMFS_LOG(ERR, "VFIO Setting for device failed");
return ret;
}
+ ret = rte_vfio_get_device_info(*dev_fd, &d_info);
+ if (ret) {
+ BCMFS_LOG(ERR, "VFIO Getting device info failed");
+ goto map_failed;
+ }
+
/* getting device region info*/
ret = ioctl(*dev_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info);
if (ret < 0) {
@@ -814,8 +814,7 @@ rte_eal_vfio_get_vf_token(__rte_unused rte_uuid_t vf_token)
RTE_EXPORT_INTERNAL_SYMBOL(rte_vfio_setup_device)
int rte_vfio_setup_device(__rte_unused const char *sysfs_base,
__rte_unused const char *dev_addr,
- __rte_unused int *vfio_dev_fd,
- __rte_unused struct vfio_device_info *device_info)
+ __rte_unused int *vfio_dev_fd)
{
rte_errno = ENOTSUP;
return -1;
@@ -55,10 +55,7 @@ struct vfio_device_info;
* device location.
*
* @param vfio_dev_fd
- * VFIO fd.
- *
- * @param device_info
- * Device information.
+ * Pointer to VFIO fd, will be set to the opened device fd on success.
*
* @return
* 0 on success.
@@ -67,7 +64,7 @@ struct vfio_device_info;
*/
__rte_internal
int rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
- int *vfio_dev_fd, struct vfio_device_info *device_info);
+ int *vfio_dev_fd);
/**
* @internal
@@ -187,19 +184,16 @@ rte_vfio_get_group_num(const char *sysfs_base,
* @internal
* Get device information.
*
+ * This function retrieves VFIO device information from an already opened
+ * device. The device must be opened with rte_vfio_setup_device() first.
+ *
* This function is only relevant to Linux and will return an error on BSD.
*
- * @param sysfs_base
- * sysfs path prefix.
- *
- * @param dev_addr
- * device location.
- *
* @param vfio_dev_fd
- * VFIO fd.
+ * VFIO device fd (must be a valid, already opened fd).
*
* @param device_info
- * Device information.
+ * Pointer to device information structure to be filled.
*
* @return
* 0 on success.
@@ -207,8 +201,7 @@ rte_vfio_get_group_num(const char *sysfs_base,
*/
__rte_internal
int
-rte_vfio_get_device_info(const char *sysfs_base, const char *dev_addr,
- int *vfio_dev_fd, struct vfio_device_info *device_info);
+rte_vfio_get_device_info(int vfio_dev_fd, struct vfio_device_info *device_info);
/**
* @internal
@@ -758,7 +758,7 @@ rte_vfio_clear_group(int vfio_group_fd)
RTE_EXPORT_INTERNAL_SYMBOL(rte_vfio_setup_device)
int
rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
- int *vfio_dev_fd, struct vfio_device_info *device_info)
+ int *vfio_dev_fd)
{
struct vfio_group_status group_status = {
.argsz = sizeof(group_status)
@@ -975,7 +975,7 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
*vfio_dev_fd = ioctl(vfio_group_fd, VFIO_GROUP_GET_DEVICE_FD,
dev);
if (*vfio_dev_fd >= 0)
- goto dev_get_info;
+ goto out;
}
/* get a file descriptor for the device */
@@ -992,18 +992,8 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
return -1;
}
- /* test and setup the device */
-dev_get_info:
- ret = ioctl(*vfio_dev_fd, VFIO_DEVICE_GET_INFO, device_info);
- if (ret) {
- EAL_LOG(ERR, "%s cannot get device info, "
- "error %i (%s)", dev_addr, errno,
- strerror(errno));
- close(*vfio_dev_fd);
- close(vfio_group_fd);
- rte_vfio_clear_group(vfio_group_fd);
- return -1;
- }
+ /* device is now set up */
+out:
vfio_group_device_get(vfio_group_fd);
return 0;
@@ -1217,26 +1207,18 @@ vfio_set_iommu_type(int vfio_container_fd)
RTE_EXPORT_INTERNAL_SYMBOL(rte_vfio_get_device_info)
int
-rte_vfio_get_device_info(const char *sysfs_base, const char *dev_addr,
- int *vfio_dev_fd, struct vfio_device_info *device_info)
+rte_vfio_get_device_info(int vfio_dev_fd, struct vfio_device_info *device_info)
{
int ret;
- if (device_info == NULL || *vfio_dev_fd < 0)
+ if (device_info == NULL || vfio_dev_fd < 0)
return -1;
- if (*vfio_dev_fd == 0) {
- ret = rte_vfio_setup_device(sysfs_base, dev_addr,
- vfio_dev_fd, device_info);
- if (ret)
- return -1;
- } else {
- ret = ioctl(*vfio_dev_fd, VFIO_DEVICE_GET_INFO, device_info);
- if (ret) {
- EAL_LOG(ERR, "%s cannot get device info, error %i (%s)",
- dev_addr, errno, strerror(errno));
- return -1;
- }
+ ret = ioctl(vfio_dev_fd, VFIO_DEVICE_GET_INFO, device_info);
+ if (ret) {
+ EAL_LOG(ERR, "Cannot get device info, error %i (%s)",
+ errno, strerror(errno));
+ return -1;
}
return 0;