Commit 76236838 authored by Joao Martins's avatar Joao Martins Committed by Jason Gunthorpe

iommufd: Add capabilities to IOMMU_GET_HW_INFO

Extend IOMMUFD_CMD_GET_HW_INFO op to query generic iommu capabilities for a
given device.

Capabilities are IOMMU agnostic and use device_iommu_capable() API passing
one of the IOMMU_CAP_*. Enumerate IOMMU_CAP_DIRTY_TRACKING for now in the
out_capabilities field returned back to userspace.

Link: https://lore.kernel.org/r/20231024135109.73787-9-joao.m.martins@oracle.comSigned-off-by: default avatarJoao Martins <joao.m.martins@oracle.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent b9a60d6f
...@@ -1185,6 +1185,10 @@ int iommufd_get_hw_info(struct iommufd_ucmd *ucmd) ...@@ -1185,6 +1185,10 @@ int iommufd_get_hw_info(struct iommufd_ucmd *ucmd)
*/ */
cmd->data_len = data_len; cmd->data_len = data_len;
cmd->out_capabilities = 0;
if (device_iommu_capable(idev->dev, IOMMU_CAP_DIRTY_TRACKING))
cmd->out_capabilities |= IOMMU_HW_CAP_DIRTY_TRACKING;
rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd)); rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
out_free: out_free:
kfree(data); kfree(data);
......
...@@ -418,6 +418,20 @@ enum iommu_hw_info_type { ...@@ -418,6 +418,20 @@ enum iommu_hw_info_type {
IOMMU_HW_INFO_TYPE_INTEL_VTD, IOMMU_HW_INFO_TYPE_INTEL_VTD,
}; };
/**
* enum iommufd_hw_capabilities
* @IOMMU_HW_CAP_DIRTY_TRACKING: IOMMU hardware support for dirty tracking
* If available, it means the following APIs
* are supported:
*
* IOMMU_HWPT_GET_DIRTY_BITMAP
* IOMMU_HWPT_SET_DIRTY_TRACKING
*
*/
enum iommufd_hw_capabilities {
IOMMU_HW_CAP_DIRTY_TRACKING = 1 << 0,
};
/** /**
* struct iommu_hw_info - ioctl(IOMMU_GET_HW_INFO) * struct iommu_hw_info - ioctl(IOMMU_GET_HW_INFO)
* @size: sizeof(struct iommu_hw_info) * @size: sizeof(struct iommu_hw_info)
...@@ -429,6 +443,8 @@ enum iommu_hw_info_type { ...@@ -429,6 +443,8 @@ enum iommu_hw_info_type {
* the iommu type specific hardware information data * the iommu type specific hardware information data
* @out_data_type: Output the iommu hardware info type as defined in the enum * @out_data_type: Output the iommu hardware info type as defined in the enum
* iommu_hw_info_type. * iommu_hw_info_type.
* @out_capabilities: Output the generic iommu capability info type as defined
* in the enum iommu_hw_capabilities.
* @__reserved: Must be 0 * @__reserved: Must be 0
* *
* Query an iommu type specific hardware information data from an iommu behind * Query an iommu type specific hardware information data from an iommu behind
...@@ -453,6 +469,7 @@ struct iommu_hw_info { ...@@ -453,6 +469,7 @@ struct iommu_hw_info {
__aligned_u64 data_uptr; __aligned_u64 data_uptr;
__u32 out_data_type; __u32 out_data_type;
__u32 __reserved; __u32 __reserved;
__aligned_u64 out_capabilities;
}; };
#define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO) #define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment