Commit c3436d42 authored by Nicolin Chen's avatar Nicolin Chen Committed by Jason Gunthorpe
Browse files

iommu: Pass in a driver-level user data structure to viommu_init op

The new type of vIOMMU for tegra241-cmdqv allows user space VM to use one
of its virtual command queue HW resources exclusively. This requires user
space to mmap the corresponding MMIO page from kernel space for direct HW
control.

To forward the mmap info (offset and length), iommufd should add a driver
specific data structure to the IOMMUFD_CMD_VIOMMU_ALLOC ioctl, for driver
to output the info during the vIOMMU initialization back to user space.

Similar to the existing ioctls and their IOMMU handlers, add a user_data
to viommu_init op to bridge between iommufd and drivers.

Link: https://patch.msgid.link/r/90bd5637dab7f5507c7a64d2c4826e70431e45a4.1752126748.git.nicolinc@nvidia.com


Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: default avatarPranjal Shrivastava <praan@google.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarVasant Hegde <vasant.hegde@amd.com>
Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 3fcf56a2
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -419,7 +419,8 @@ size_t arm_smmu_get_viommu_size(struct device *dev,
}

int arm_vsmmu_init(struct iommufd_viommu *viommu,
		   struct iommu_domain *parent_domain)
		   struct iommu_domain *parent_domain,
		   const struct iommu_user_data *user_data)
{
	struct arm_vsmmu *vsmmu = container_of(viommu, struct arm_vsmmu, core);
	struct arm_smmu_device *smmu =
+2 −1
Original line number Diff line number Diff line
@@ -1038,7 +1038,8 @@ void *arm_smmu_hw_info(struct device *dev, u32 *length,
size_t arm_smmu_get_viommu_size(struct device *dev,
				enum iommu_viommu_type viommu_type);
int arm_vsmmu_init(struct iommufd_viommu *viommu,
		   struct iommu_domain *parent_domain);
		   struct iommu_domain *parent_domain,
		   const struct iommu_user_data *user_data);
int arm_smmu_attach_prepare_vmaster(struct arm_smmu_attach_state *state,
				    struct arm_smmu_nested_domain *nested_domain);
void arm_smmu_attach_commit_vmaster(struct arm_smmu_attach_state *state);
+2 −1
Original line number Diff line number Diff line
@@ -779,7 +779,8 @@ static size_t mock_get_viommu_size(struct device *dev,
}

static int mock_viommu_init(struct iommufd_viommu *viommu,
			    struct iommu_domain *parent_domain)
			    struct iommu_domain *parent_domain,
			    const struct iommu_user_data *user_data)
{
	struct mock_iommu_device *mock_iommu = container_of(
		viommu->iommu_dev, struct mock_iommu_device, iommu_dev);
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ 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);
	rc = ops->viommu_init(viommu, hwpt_paging->common.domain, NULL);
	if (rc)
		goto out_put_hwpt;

+2 −1
Original line number Diff line number Diff line
@@ -700,7 +700,8 @@ struct iommu_ops {
	size_t (*get_viommu_size)(struct device *dev,
				  enum iommu_viommu_type viommu_type);
	int (*viommu_init)(struct iommufd_viommu *viommu,
			   struct iommu_domain *parent_domain);
			   struct iommu_domain *parent_domain,
			   const struct iommu_user_data *user_data);

	const struct iommu_domain_ops *default_domain_ops;
	unsigned long pgsize_bitmap;