The get_pasid_info callback retrieves PASID capability information when the HostIOMMUDevice backend supports it. Currently, only the Linux IOMMUFD backend provides this information.
This will be used by a subsequent patch to synthesize a PASID capability for vfio-pci devices behind a vIOMMU that supports PASID. Signed-off-by: Shameer Kolothum <[email protected]> --- backends/iommufd.c | 17 +++++++++++++++++ include/system/host_iommu_device.h | 15 +++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/backends/iommufd.c b/backends/iommufd.c index 6381f9664b..f1707eadc6 100644 --- a/backends/iommufd.c +++ b/backends/iommufd.c @@ -538,11 +538,28 @@ static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int cap, Error **errp) } } +static bool hiod_iommufd_get_pasid_info(HostIOMMUDevice *hiod, + PasidInfo *pasid_info) +{ + HostIOMMUDeviceCaps *caps = &hiod->caps; + + if (!caps->max_pasid_log2) { + return false; + } + + g_assert(pasid_info); + pasid_info->exec_perm = (caps->hw_caps & IOMMU_HW_CAP_PCI_PASID_EXEC); + pasid_info->priv_mod = (caps->hw_caps & IOMMU_HW_CAP_PCI_PASID_PRIV); + pasid_info->max_pasid_log2 = caps->max_pasid_log2; + return true; +} + static void hiod_iommufd_class_init(ObjectClass *oc, const void *data) { HostIOMMUDeviceClass *hioc = HOST_IOMMU_DEVICE_CLASS(oc); hioc->get_cap = hiod_iommufd_get_cap; + hioc->get_pasid_info = hiod_iommufd_get_pasid_info; }; static const TypeInfo types[] = { diff --git a/include/system/host_iommu_device.h b/include/system/host_iommu_device.h index bfb2b60478..4fbada638f 100644 --- a/include/system/host_iommu_device.h +++ b/include/system/host_iommu_device.h @@ -59,6 +59,12 @@ struct HostIOMMUDevice { #endif }; +typedef struct PasidInfo { + bool exec_perm; + bool priv_mod; + uint8_t max_pasid_log2; +} PasidInfo; + /** * struct HostIOMMUDeviceClass - The base class for all host IOMMU devices. * @@ -116,6 +122,15 @@ struct HostIOMMUDeviceClass { * @hiod: handle to the host IOMMU device */ uint64_t (*get_page_size_mask)(HostIOMMUDevice *hiod); + /** + * @get_pasid_info: Return the PASID information associated with the Host + * IOMMU device. + * + * @pasid_info: If success, returns the PASID related information. + * + * Returns: true on success, false on failure. + */ + bool (*get_pasid_info)(HostIOMMUDevice *hiod, PasidInfo *pasid_info); }; /* -- 2.43.0
