On Thu, May 25, 2023 at 12:09 PM Nipun Gupta <nipun.gu...@amd.com> wrote:
>
> AMD CDX bus can use VFIO interface for mapping and unmapping
> of DMA addresses in the IOMMU. This change adds the callback
> support for map and unmap APIs as well as fetching the IOMMU
> class.
>
> Signed-off-by: Nipun Gupta <nipun.gu...@amd.com>
> Acked-by: Ferruh Yigit <ferruh.yi...@amd.com>
> ---
>  drivers/bus/cdx/cdx.c | 40 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 40 insertions(+)
>
> diff --git a/drivers/bus/cdx/cdx.c b/drivers/bus/cdx/cdx.c
> index 1ddb5a92f7..64ea879f3b 100644
> --- a/drivers/bus/cdx/cdx.c
> +++ b/drivers/bus/cdx/cdx.c
> @@ -502,12 +502,52 @@ cdx_find_device(const struct rte_device *start, 
> rte_dev_cmp_t cmp,
>         return NULL;
>  }
>
> +static int
> +cdx_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len)
> +{
> +       struct rte_cdx_device *cdx_dev = RTE_DEV_TO_CDX_DEV(dev);
> +
> +       if (!cdx_dev) {
> +               rte_errno = EINVAL;
> +               return -1;
> +       }


RTE_DEV_TO_CDX_DEV() applies an offset to dev.
Checking dev != NULL is probably a better check.

But on the other hand, calling this dma_map op will be done through
dev->bus->dma_map.
So checking dev is useless too.


> +
> +       return rte_vfio_container_dma_map(RTE_VFIO_DEFAULT_CONTAINER_FD,
> +                                         (uintptr_t)addr, iova, len);
> +}
> +
> +static int
> +cdx_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len)
> +{
> +       struct rte_cdx_device *cdx_dev = RTE_DEV_TO_CDX_DEV(dev);
> +
> +       if (!cdx_dev) {
> +               rte_errno = EINVAL;
> +               return -1;
> +       }

Idem.


> +
> +       return rte_vfio_container_dma_unmap(RTE_VFIO_DEFAULT_CONTAINER_FD,
> +                                           (uintptr_t)addr, iova, len);
> +}
> +
> +static enum rte_iova_mode
> +cdx_get_iommu_class(void)
> +{
> +       if (TAILQ_EMPTY(&rte_cdx_bus.device_list))
> +               return RTE_IOVA_DC;
> +
> +       return RTE_IOVA_VA;
> +}
> +
>  struct rte_cdx_bus rte_cdx_bus = {
>         .bus = {
>                 .scan = cdx_scan,
>                 .probe = cdx_probe,
>                 .find_device = cdx_find_device,
>                 .parse = cdx_parse,
> +               .dma_map = cdx_dma_map,
> +               .dma_unmap = cdx_dma_unmap,
> +               .get_iommu_class = cdx_get_iommu_class,
>         },
>         .device_list = TAILQ_HEAD_INITIALIZER(rte_cdx_bus.device_list),
>         .driver_list = TAILQ_HEAD_INITIALIZER(rte_cdx_bus.driver_list),
> --
> 2.17.1
>


-- 
David Marchand

Reply via email to