Hi Maxime,

> -----Original Message-----
> From: Maxime Coquelin <maxime.coque...@redhat.com>
> Sent: Tuesday, January 26, 2021 1:14 AM
> To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; olivier.m...@6wind.com;
> amore...@redhat.com; david.march...@redhat.com
> Cc: Maxime Coquelin <maxime.coque...@redhat.com>
> Subject: [PATCH v3 02/44] bus/vdev: add driver IOVA VA mode requirement
> 
> This patch adds driver flag in vdev bus driver so that
> vdev drivers can require VA IOVA mode to be used, which
> for example the case of Virtio-user PMD.
> 
> The patch implements the .get_iommu_class() callback, that
> is called before devices probing to determine the IOVA mode
> to be used.
> 
> It also adds a check right before the device is probed to
> ensure compatible IOVa mode has been selected.

s/IOVa/IOVA

> 
> Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
> ---
>  drivers/bus/vdev/rte_bus_vdev.h |  4 ++++
>  drivers/bus/vdev/vdev.c         | 29 +++++++++++++++++++++++++++++
>  2 files changed, 33 insertions(+)
> 
> diff --git a/drivers/bus/vdev/rte_bus_vdev.h b/drivers/bus/vdev/rte_bus_vdev.h
> index f99a41f825..c8b41e649c 100644
> --- a/drivers/bus/vdev/rte_bus_vdev.h
> +++ b/drivers/bus/vdev/rte_bus_vdev.h
> @@ -113,8 +113,12 @@ struct rte_vdev_driver {
>       rte_vdev_remove_t *remove;       /**< Virtual device remove function. */
>       rte_vdev_dma_map_t *dma_map;     /**< Virtual device DMA map function.
> */
>       rte_vdev_dma_unmap_t *dma_unmap; /**< Virtual device DMA unmap function.
> */
> +     uint32_t drv_flags;                /**< Flags RTE_VDEV_DRV_*. */

I remember David mentioned that the comment above should be consistent with 
others, which
also makes sense to me

Thanks,
Chenbo

>  };
> 
> +/** Device driver needs IOVA as VA and cannot work with IOVA as PA */
> +#define RTE_VDEV_DRV_NEED_IOVA_AS_VA 0x0001
> +
>  /**
>   * Register a virtual device driver.
>   *
> diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
> index acfd78828f..9a673347ae 100644
> --- a/drivers/bus/vdev/vdev.c
> +++ b/drivers/bus/vdev/vdev.c
> @@ -189,6 +189,7 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev)
>  {
>       const char *name;
>       struct rte_vdev_driver *driver;
> +     enum rte_iova_mode iova_mode;
>       int ret;
> 
>       if (rte_dev_is_probed(&dev->device))
> @@ -199,6 +200,14 @@ vdev_probe_all_drivers(struct rte_vdev_device *dev)
> 
>       if (vdev_parse(name, &driver))
>               return -1;
> +
> +     iova_mode = rte_eal_iova_mode();
> +     if ((driver->drv_flags & RTE_VDEV_DRV_NEED_IOVA_AS_VA) && (iova_mode ==
> RTE_IOVA_PA)) {
> +             VDEV_LOG(ERR, "%s requires VA IOVA mode but current mode is PA,
> not initializing",
> +                             name);
> +             return -1;
> +     }
> +
>       ret = driver->probe(dev);
>       if (ret == 0)
>               dev->device.driver = &driver->driver;
> @@ -594,6 +603,25 @@ vdev_unplug(struct rte_device *dev)
>       return rte_vdev_uninit(dev->name);
>  }
> 
> +static enum rte_iova_mode
> +vdev_get_iommu_class(void)
> +{
> +     const char *name;
> +     struct rte_vdev_device *dev;
> +     struct rte_vdev_driver *driver;
> +
> +     TAILQ_FOREACH(dev, &vdev_device_list, next) {
> +             name = rte_vdev_device_name(dev);
> +             if (vdev_parse(name, &driver))
> +                     continue;
> +
> +             if (driver->drv_flags & RTE_VDEV_DRV_NEED_IOVA_AS_VA)
> +                     return RTE_IOVA_VA;
> +     }
> +
> +     return RTE_IOVA_DC;
> +}
> +
>  static struct rte_bus rte_vdev_bus = {
>       .scan = vdev_scan,
>       .probe = vdev_probe,
> @@ -603,6 +631,7 @@ static struct rte_bus rte_vdev_bus = {
>       .parse = vdev_parse,
>       .dma_map = vdev_dma_map,
>       .dma_unmap = vdev_dma_unmap,
> +     .get_iommu_class = vdev_get_iommu_class,
>       .dev_iterate = rte_vdev_dev_iterate,
>  };
> 
> --
> 2.29.2

Reply via email to