On 1/11/26 8:53 PM, Shameer Kolothum wrote:
> 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]>
Reviewed-by: Eric Auger <[email protected]>
Eric
> ---
> 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);
> };
>
> /*