]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommufd/viommu: Allow driver-specific user data for a vIOMMU object
authorNicolin Chen <nicolinc@nvidia.com>
Thu, 10 Jul 2025 05:58:59 +0000 (22:58 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 10 Jul 2025 15:38:51 +0000 (12:38 -0300)
The new type of vIOMMU for tegra241-cmdqv driver needs a driver-specific
user data. So, add data_len/uptr to the iommu_viommu_alloc uAPI and pass
it in via the viommu_init iommu op.

Link: https://patch.msgid.link/r/2315b0e164b355746387e960745ac9154caec124.1752126748.git.nicolinc@nvidia.com
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Acked-by: Pranjal Shrivastava <praan@google.com>
Acked-by: Alok Tiwari <alok.a.tiwari@oracle.com>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/iommufd/viommu.c
include/uapi/linux/iommufd.h

index 2009a421efae28c72cc217276a09f9fc5ea68c4f..c0365849f84917831152ee9930466301b93aa355 100644 (file)
@@ -17,6 +17,11 @@ void iommufd_viommu_destroy(struct iommufd_object *obj)
 int iommufd_viommu_alloc_ioctl(struct iommufd_ucmd *ucmd)
 {
        struct iommu_viommu_alloc *cmd = ucmd->cmd;
+       const struct iommu_user_data user_data = {
+               .type = cmd->type,
+               .uptr = u64_to_user_ptr(cmd->data_uptr),
+               .len = cmd->data_len,
+       };
        struct iommufd_hwpt_paging *hwpt_paging;
        struct iommufd_viommu *viommu;
        struct iommufd_device *idev;
@@ -84,7 +89,8 @@ int iommufd_viommu_alloc_ioctl(struct iommufd_ucmd *ucmd)
         */
        viommu->iommu_dev = __iommu_get_iommu_dev(idev->dev);
 
-       rc = ops->viommu_init(viommu, hwpt_paging->common.domain, NULL);
+       rc = ops->viommu_init(viommu, hwpt_paging->common.domain,
+                             user_data.len ? &user_data : NULL);
        if (rc)
                goto out_put_hwpt;
 
index 4bc05e4621c1d703ffc5d832b729ff364ce4edc4..04eee77335cff07740ec1e042b2ec8ffa71352f2 100644 (file)
@@ -965,6 +965,9 @@ enum iommu_viommu_type {
  * @dev_id: The device's physical IOMMU will be used to back the virtual IOMMU
  * @hwpt_id: ID of a nesting parent HWPT to associate to
  * @out_viommu_id: Output virtual IOMMU ID for the allocated object
+ * @data_len: Length of the type specific data
+ * @__reserved: Must be 0
+ * @data_uptr: User pointer to a driver-specific virtual IOMMU data
  *
  * Allocate a virtual IOMMU object, representing the underlying physical IOMMU's
  * virtualization support that is a security-isolated slice of the real IOMMU HW
@@ -985,6 +988,9 @@ struct iommu_viommu_alloc {
        __u32 dev_id;
        __u32 hwpt_id;
        __u32 out_viommu_id;
+       __u32 data_len;
+       __u32 __reserved;
+       __aligned_u64 data_uptr;
 };
 #define IOMMU_VIOMMU_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VIOMMU_ALLOC)