Message ID | 20181105073408.21815-3-baolu.lu@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio/mdev: IOMMU aware mediated device | expand |
Hi, On 11/5/18 8:34 AM, Lu Baolu wrote: > Add the response to IOMMU_DEV_ATTR_AUXD_CAPABILITY capability query > through iommu_get_dev_attr(). commit title: Advertise auxiliary domain capability? > > 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: Liu Yi L <yi.l.liu@intel.com> > --- > drivers/iommu/intel-iommu.c | 38 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) > > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c > index 5e149d26ea9b..298f7a3fafe8 100644 > --- a/drivers/iommu/intel-iommu.c > +++ b/drivers/iommu/intel-iommu.c > @@ -5167,6 +5167,24 @@ static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, > return phys; > } > > +static inline bool scalable_mode_support(void) > +{ > + struct dmar_drhd_unit *drhd; > + struct intel_iommu *iommu; > + bool ret = true; > + > + rcu_read_lock(); > + for_each_active_iommu(iommu, drhd) { > + if (!sm_supported(iommu)) { > + ret = false; > + break; > + } > + } > + rcu_read_unlock(); > + > + return ret; > +} > + > static bool intel_iommu_capable(enum iommu_cap cap) > { > if (cap == IOMMU_CAP_CACHE_COHERENCY) > @@ -5331,6 +5349,25 @@ struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) > } > #endif /* CONFIG_INTEL_IOMMU_SVM */ > > +static int intel_iommu_get_dev_attr(struct device *dev, > + enum iommu_dev_attr attr, void *data) > +{ > + int ret = 0; > + bool *auxd_capable; nit: could be local to the case as other cases may use other datatypes. > + > + switch (attr) { > + case IOMMU_DEV_ATTR_AUXD_CAPABILITY: > + auxd_capable = data; > + *auxd_capable = scalable_mode_support(); > + break; > + default: > + ret = -EINVAL; > + break; > + } > + > + return ret; > +} > + > const struct iommu_ops intel_iommu_ops = { > .capable = intel_iommu_capable, > .domain_alloc = intel_iommu_domain_alloc, > @@ -5345,6 +5382,7 @@ const struct iommu_ops intel_iommu_ops = { > .get_resv_regions = intel_iommu_get_resv_regions, > .put_resv_regions = intel_iommu_put_resv_regions, > .device_group = pci_device_group, > + .get_dev_attr = intel_iommu_get_dev_attr, > .pgsize_bitmap = INTEL_IOMMU_PGSIZES, > }; > > Thanks Eric
Hi, On 11/23/18 6:49 PM, Auger Eric wrote: > Hi, > > On 11/5/18 8:34 AM, Lu Baolu wrote: >> Add the response to IOMMU_DEV_ATTR_AUXD_CAPABILITY capability query >> through iommu_get_dev_attr(). > > commit title: Advertise auxiliary domain capability? Yes. I should make it consistent. Thanks. >> >> 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: Liu Yi L <yi.l.liu@intel.com> >> --- >> drivers/iommu/intel-iommu.c | 38 +++++++++++++++++++++++++++++++++++++ >> 1 file changed, 38 insertions(+) >> >> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c >> index 5e149d26ea9b..298f7a3fafe8 100644 >> --- a/drivers/iommu/intel-iommu.c >> +++ b/drivers/iommu/intel-iommu.c >> @@ -5167,6 +5167,24 @@ static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, >> return phys; >> } >> >> +static inline bool scalable_mode_support(void) >> +{ >> + struct dmar_drhd_unit *drhd; >> + struct intel_iommu *iommu; >> + bool ret = true; >> + >> + rcu_read_lock(); >> + for_each_active_iommu(iommu, drhd) { >> + if (!sm_supported(iommu)) { >> + ret = false; >> + break; >> + } >> + } >> + rcu_read_unlock(); >> + >> + return ret; >> +} >> + >> static bool intel_iommu_capable(enum iommu_cap cap) >> { >> if (cap == IOMMU_CAP_CACHE_COHERENCY) >> @@ -5331,6 +5349,25 @@ struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) >> } >> #endif /* CONFIG_INTEL_IOMMU_SVM */ >> >> +static int intel_iommu_get_dev_attr(struct device *dev, >> + enum iommu_dev_attr attr, void *data) >> +{ >> + int ret = 0; >> + bool *auxd_capable; > nit: could be local to the case as other cases may use other datatypes. I have thought about this. Making it local to the case needs extra "{}". That's the reason I put it here. We can change it later when we need other datatypes. >> + >> + switch (attr) { >> + case IOMMU_DEV_ATTR_AUXD_CAPABILITY: >> + auxd_capable = data; >> + *auxd_capable = scalable_mode_support(); >> + break; >> + default: >> + ret = -EINVAL; >> + break; >> + } >> + >> + return ret; >> +} >> + >> const struct iommu_ops intel_iommu_ops = { >> .capable = intel_iommu_capable, >> .domain_alloc = intel_iommu_domain_alloc, >> @@ -5345,6 +5382,7 @@ const struct iommu_ops intel_iommu_ops = { >> .get_resv_regions = intel_iommu_get_resv_regions, >> .put_resv_regions = intel_iommu_put_resv_regions, >> .device_group = pci_device_group, >> + .get_dev_attr = intel_iommu_get_dev_attr, >> .pgsize_bitmap = INTEL_IOMMU_PGSIZES, >> }; >> >> > Thanks > > Eric > > Best regards, Lu Baolu
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 5e149d26ea9b..298f7a3fafe8 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -5167,6 +5167,24 @@ static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, return phys; } +static inline bool scalable_mode_support(void) +{ + struct dmar_drhd_unit *drhd; + struct intel_iommu *iommu; + bool ret = true; + + rcu_read_lock(); + for_each_active_iommu(iommu, drhd) { + if (!sm_supported(iommu)) { + ret = false; + break; + } + } + rcu_read_unlock(); + + return ret; +} + static bool intel_iommu_capable(enum iommu_cap cap) { if (cap == IOMMU_CAP_CACHE_COHERENCY) @@ -5331,6 +5349,25 @@ struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) } #endif /* CONFIG_INTEL_IOMMU_SVM */ +static int intel_iommu_get_dev_attr(struct device *dev, + enum iommu_dev_attr attr, void *data) +{ + int ret = 0; + bool *auxd_capable; + + switch (attr) { + case IOMMU_DEV_ATTR_AUXD_CAPABILITY: + auxd_capable = data; + *auxd_capable = scalable_mode_support(); + break; + default: + ret = -EINVAL; + break; + } + + return ret; +} + const struct iommu_ops intel_iommu_ops = { .capable = intel_iommu_capable, .domain_alloc = intel_iommu_domain_alloc, @@ -5345,6 +5382,7 @@ const struct iommu_ops intel_iommu_ops = { .get_resv_regions = intel_iommu_get_resv_regions, .put_resv_regions = intel_iommu_put_resv_regions, .device_group = pci_device_group, + .get_dev_attr = intel_iommu_get_dev_attr, .pgsize_bitmap = INTEL_IOMMU_PGSIZES, };