Hi, On 07/23/2018 12:44 PM, Liu, Yi L wrote: >> From: Lu Baolu [mailto:baolu.lu@xxxxxxxxxxxxxxx] >> Sent: Sunday, July 22, 2018 2:09 PM >> >> With the Intel IOMMU supporting PASID granularity isolation and protection, a >> mediated device could be isolated and protected by an IOMMU unit. We need to >> allocate a new group instead of a PCI group. > Existing vfio mdev framework also allocates an iommu group for mediate device. > > mdev_probe() > |_ mdev_attach_iommu() > |_ iommu_group_alloc() When external components ask iommu to allocate a group for a device, it will call pci_device_group in Intel IOMMU driver's @device_group callback. In another word, current Intel IOMMU driver doesn't aware the mediated device and treat all devices as PCI ones. This patch extends the @device_group call back to make it aware of a mediated device. Best regards, Lu Baolu > > IMHO, this patch actually do a wrapper to the group allocation API. The reason is: it > is not necessary to apply the group allocation rules when the allocation is for mediated > device. Instead, just allocate a new one for it. :) > > Thanks, > Yi Liu >> Cc: Ashok Raj <ashok.raj@xxxxxxxxx> >> Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> >> Cc: Kevin Tian <kevin.tian@xxxxxxxxx> >> Cc: Liu Yi L <yi.l.liu@xxxxxxxxx> >> Signed-off-by: Sanjay Kumar <sanjay.k.kumar@xxxxxxxxx> >> Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> >> --- >> drivers/iommu/intel-iommu.c | 13 ++++++++++++- >> 1 file changed, 12 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index >> 3ede34a..57ccfc4 100644 >> --- a/drivers/iommu/intel-iommu.c >> +++ b/drivers/iommu/intel-iommu.c >> @@ -5276,6 +5276,17 @@ static void intel_iommu_put_resv_regions(struct device >> *dev, >> } >> } >> >> +static struct iommu_group *intel_iommu_device_group(struct device *dev) >> +{ >> + if (dev_is_pci(dev)) >> + return pci_device_group(dev); >> + >> + if (dev_is_mdev(dev)) >> + return iommu_group_alloc(); >> + >> + return ERR_PTR(-EINVAL); >> +} >> + >> #ifdef CONFIG_INTEL_IOMMU_SVM >> int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct intel_svm_dev >> *sdev) { @@ -5370,7 +5381,7 @@ const struct iommu_ops intel_iommu_ops = { >> .remove_device = intel_iommu_remove_device, >> .get_resv_regions = intel_iommu_get_resv_regions, >> .put_resv_regions = intel_iommu_put_resv_regions, >> - .device_group = pci_device_group, >> + .device_group = intel_iommu_device_group, >> .pgsize_bitmap = INTEL_IOMMU_PGSIZES, >> }; >> >> -- >> 2.7.4 >