iommu/vt-d: Make intel_iommu_enable_pasid() more generic
This moves intel_iommu_enable_pasid() out of the scope of CONFIG_INTEL_IOMMU_SVM with more and more features requiring pasid function. Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
@@ -228,6 +228,7 @@ static LIST_HEAD(global_svm_list);
|
||||
int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct svm_dev_ops *ops)
|
||||
{
|
||||
struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
|
||||
struct device_domain_info *info;
|
||||
struct intel_svm_dev *sdev;
|
||||
struct intel_svm *svm = NULL;
|
||||
struct mm_struct *mm = NULL;
|
||||
@@ -291,13 +292,29 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct svm_dev_
|
||||
}
|
||||
sdev->dev = dev;
|
||||
|
||||
ret = intel_iommu_enable_pasid(iommu, sdev);
|
||||
ret = intel_iommu_enable_pasid(iommu, dev);
|
||||
if (ret || !pasid) {
|
||||
/* If they don't actually want to assign a PASID, this is
|
||||
* just an enabling check/preparation. */
|
||||
kfree(sdev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
info = dev->archdata.iommu;
|
||||
if (!info || !info->pasid_supported) {
|
||||
kfree(sdev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
sdev->did = FLPT_DEFAULT_DID;
|
||||
sdev->sid = PCI_DEVID(info->bus, info->devfn);
|
||||
if (info->ats_enabled) {
|
||||
sdev->dev_iotlb = 1;
|
||||
sdev->qdep = info->ats_qdep;
|
||||
if (sdev->qdep >= QI_DEV_EIOTLB_MAX_INVS)
|
||||
sdev->qdep = 0;
|
||||
}
|
||||
|
||||
/* Finish the setup now we know we're keeping it */
|
||||
sdev->users = 1;
|
||||
sdev->ops = ops;
|
||||
|
Reference in New Issue
Block a user