From: Liu Yi L <yi.l.liu@xxxxxxxxx> This patch adds VFIO pasid alloc/free support to allow host intercept in PASID allocation for VM by adding VFIO implementation of DualStageIOMMUOps.pasid_alloc/free callbacks. Cc: Kevin Tian <kevin.tian@xxxxxxxxx> Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> Cc: Peter Xu <peterx@xxxxxxxxxx> Cc: Eric Auger <eric.auger@xxxxxxxxxx> Cc: Yi Sun <yi.y.sun@xxxxxxxxxxxxxxx> Cc: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> Cc: Alex Williamson <alex.williamson@xxxxxxxxxx> Signed-off-by: Liu Yi L <yi.l.liu@xxxxxxxxx> --- hw/vfio/common.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index a07824b..014f4e7 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -1179,7 +1179,49 @@ static int vfio_get_iommu_type(VFIOContainer *container, return -EINVAL; } +static int vfio_ds_iommu_pasid_alloc(DualStageIOMMUObject *dsi_obj, + uint32_t min, uint32_t max, uint32_t *pasid) +{ + VFIOContainer *container = container_of(dsi_obj, VFIOContainer, dsi_obj); + struct vfio_iommu_type1_pasid_request req; + unsigned long argsz; + + argsz = sizeof(req); + req.argsz = argsz; + req.flags = VFIO_IOMMU_PASID_ALLOC; + req.alloc_pasid.min = min; + req.alloc_pasid.max = max; + + if (ioctl(container->fd, VFIO_IOMMU_PASID_REQUEST, &req)) { + error_report("%s: %d, alloc failed", __func__, -errno); + return -errno; + } + *pasid = req.alloc_pasid.result; + return 0; +} + +static int vfio_ds_iommu_pasid_free(DualStageIOMMUObject *dsi_obj, + uint32_t pasid) +{ + VFIOContainer *container = container_of(dsi_obj, VFIOContainer, dsi_obj); + struct vfio_iommu_type1_pasid_request req; + unsigned long argsz; + + argsz = sizeof(req); + req.argsz = argsz; + req.flags = VFIO_IOMMU_PASID_FREE; + req.free_pasid = pasid; + + if (ioctl(container->fd, VFIO_IOMMU_PASID_REQUEST, &req)) { + error_report("%s: %d, free failed", __func__, -errno); + return -errno; + } + return 0; +} + static struct DualStageIOMMUOps vfio_ds_iommu_ops = { + .pasid_alloc = vfio_ds_iommu_pasid_alloc, + .pasid_free = vfio_ds_iommu_pasid_free, }; static int vfio_get_iommu_info(VFIOContainer *container, -- 2.7.4