Retrieve PASID width from iommufd_backend_get_device_info() and store it in HostIOMMUDeviceCaps for later use.
Reviewed-by: Jonathan Cameron <[email protected]> Reviewed-by: Eric Auger <[email protected]> Tested-by: Zhangfei Gao <[email protected]> Signed-off-by: Shameer Kolothum <[email protected]> --- backends/iommufd.c | 6 +++++- hw/arm/smmuv3-accel.c | 3 ++- hw/vfio/iommufd.c | 7 +++++-- include/system/host_iommu_device.h | 3 +++ include/system/iommufd.h | 3 ++- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/backends/iommufd.c b/backends/iommufd.c index e68a2c934f..6381f9664b 100644 --- a/backends/iommufd.c +++ b/backends/iommufd.c @@ -388,7 +388,8 @@ bool iommufd_backend_get_dirty_bitmap(IOMMUFDBackend *be, bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, uint32_t *type, void *data, uint32_t len, - uint64_t *caps, Error **errp) + uint64_t *caps, uint8_t *max_pasid_log2, + Error **errp) { struct iommu_hw_info info = { .size = sizeof(info), @@ -407,6 +408,9 @@ bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, g_assert(caps); *caps = info.out_capabilities; + if (max_pasid_log2) { + *max_pasid_log2 = info.out_max_pasid_log2; + } return true; } diff --git a/hw/arm/smmuv3-accel.c b/hw/arm/smmuv3-accel.c index c46510150e..caa4a1d82d 100644 --- a/hw/arm/smmuv3-accel.c +++ b/hw/arm/smmuv3-accel.c @@ -122,7 +122,8 @@ smmuv3_accel_hw_compatible(SMMUv3State *s, HostIOMMUDeviceIOMMUFD *idev, uint64_t caps; if (!iommufd_backend_get_device_info(idev->iommufd, idev->devid, &data_type, - &info, sizeof(info), &caps, errp)) { + &info, sizeof(info), &caps, NULL, + errp)) { return false; } diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index 2ab52723c6..212970e2e2 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -366,7 +366,8 @@ static bool iommufd_cdev_autodomains_get(VFIODevice *vbasedev, * instead. */ if (!iommufd_backend_get_device_info(vbasedev->iommufd, vbasedev->devid, - &type, NULL, 0, &hw_caps, errp)) { + &type, NULL, 0, &hw_caps, NULL, + errp)) { return false; } @@ -901,19 +902,21 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, HostIOMMUDeviceCaps *caps = &hiod->caps; VendorCaps *vendor_caps = &caps->vendor_caps; enum iommu_hw_info_type type; + uint8_t max_pasid_log2; uint64_t hw_caps; hiod->agent = opaque; if (!iommufd_backend_get_device_info(vdev->iommufd, vdev->devid, &type, vendor_caps, sizeof(*vendor_caps), - &hw_caps, errp)) { + &hw_caps, &max_pasid_log2, errp)) { return false; } hiod->name = g_strdup(vdev->name); caps->type = type; caps->hw_caps = hw_caps; + caps->max_pasid_log2 = max_pasid_log2; idev = HOST_IOMMU_DEVICE_IOMMUFD(hiod); idev->iommufd = vdev->iommufd; diff --git a/include/system/host_iommu_device.h b/include/system/host_iommu_device.h index ab849a4a82..bfb2b60478 100644 --- a/include/system/host_iommu_device.h +++ b/include/system/host_iommu_device.h @@ -30,6 +30,8 @@ typedef union VendorCaps { * @hw_caps: host platform IOMMU capabilities (e.g. on IOMMUFD this represents * the @out_capabilities value returned from IOMMU_GET_HW_INFO ioctl) * + * @max_pasid_log2: width of PASIDs supported by host IOMMU device + * * @vendor_caps: host platform IOMMU vendor specific capabilities (e.g. on * IOMMUFD this represents a user-space buffer filled by kernel * with host IOMMU @type specific hardware information data) @@ -37,6 +39,7 @@ typedef union VendorCaps { typedef struct HostIOMMUDeviceCaps { uint32_t type; uint64_t hw_caps; + uint8_t max_pasid_log2; VendorCaps vendor_caps; } HostIOMMUDeviceCaps; #endif diff --git a/include/system/iommufd.h b/include/system/iommufd.h index 41e216c677..aa78bf1e1d 100644 --- a/include/system/iommufd.h +++ b/include/system/iommufd.h @@ -71,7 +71,8 @@ int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id, hwaddr iova, uint64_t size); bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, uint32_t *type, void *data, uint32_t len, - uint64_t *caps, Error **errp); + uint64_t *caps, uint8_t *max_pasid_log2, + Error **errp); bool iommufd_backend_alloc_hwpt(IOMMUFDBackend *be, uint32_t dev_id, uint32_t pt_id, uint32_t flags, uint32_t data_type, uint32_t data_len, -- 2.43.0
