The PCI device may have a DMA requester on another bus, such as VMD
subdevices needing to use the VMD endpoint. This case requires the real
DMA device when mapping to IOMMU.

Signed-off-by: Jon Derrick <jonathan.derr...@intel.com>
---
 drivers/iommu/intel-iommu.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 0c8d81f..01a1b0f 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -782,6 +782,8 @@ static struct intel_iommu *device_to_iommu(struct device 
*dev, u8 *bus, u8 *devf
                        return NULL;
 #endif
 
+               pdev = pci_real_dma_dev(dev);
+
                /* VFs aren't listed in scope tables; we need to look up
                 * the PF instead to find the IOMMU. */
                pf_pdev = pci_physfn(pdev);
@@ -2428,6 +2430,13 @@ static struct dmar_domain *find_domain(struct device 
*dev)
                     dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO))
                return NULL;
 
+       if (dev_is_pci(dev)) {
+               struct pci_dev *pdev;
+
+               pdev = pci_real_dma_dev(to_pci_dev(dev));
+               dev = &pdev->dev;
+       }
+
        /* No lock here, assumes no domain exit in normal case */
        info = dev->archdata.iommu;
        if (likely(info))
-- 
1.8.3.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to