This adds the Intel vt-d specific ops to initialize a PASID consumer. Cc: Ashok Raj <ashok.raj@xxxxxxxxx> Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> Cc: Kevin Tian <kevin.tian@xxxxxxxxx> Signed-off-by: Liu Yi L <yi.l.liu@xxxxxxxxx> Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> --- drivers/iommu/intel-iommu.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 49a278a699b0..769b7059d52f 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -5597,6 +5597,35 @@ static int intel_iommu_domain_get_attr(struct iommu_domain *domain, return ret; } +static int intel_iommu_pasid_init(struct iommu_pasid *pasid) +{ + struct dmar_drhd_unit *drhd; + struct intel_iommu *iommu = NULL, *temp; + + /* + * Iterate the iommu units and get a scalable mode capable one + * for virtual command usages. Return failure if scalable mode + * doesn't support by any unit. + */ + rcu_read_lock(); + for_each_active_iommu(temp, drhd) { + if (sm_supported(temp)) { + iommu = temp; + break; + } + } + rcu_read_unlock(); + + if (!iommu) + return -ENODEV; + + pasid->max = intel_pasid_max_id; + pasid->min = PASID_MIN; + pasid->priv = iommu; + + return 0; +} + const struct iommu_ops intel_iommu_ops = { .capable = intel_iommu_capable, .domain_alloc = intel_iommu_domain_alloc, @@ -5616,6 +5645,7 @@ const struct iommu_ops intel_iommu_ops = { .domain_get_attr = intel_iommu_domain_get_attr, .get_dev_attr = intel_iommu_get_dev_attr, .set_dev_attr = intel_iommu_set_dev_attr, + .pasid_init = intel_iommu_pasid_init, .pgsize_bitmap = INTEL_IOMMU_PGSIZES, }; -- 2.17.1