Currently, PPR/ATS can be enabled only if the domain is type
identity mapping. However, when we allow the IOMMU v2 page table
to be used for DMA-API, the sanity check needs to be updated to
only apply for the case when using AMD_IOMMU_V1 page table mode.

Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpa...@amd.com>
---
 drivers/iommu/amd/iommu.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 6f3e42495709..f3800efdbb29 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -1549,7 +1549,7 @@ static int pri_reset_while_enabled(struct pci_dev *pdev)
        return 0;
 }
 
-static int pdev_iommuv2_enable(struct pci_dev *pdev)
+static int pdev_pri_ats_enable(struct pci_dev *pdev)
 {
        bool reset_enable;
        int reqs, ret;
@@ -1624,11 +1624,19 @@ static int attach_device(struct device *dev,
                struct iommu_domain *def_domain = iommu_get_dma_domain(dev);
 
                ret = -EINVAL;
-               if (def_domain->type != IOMMU_DOMAIN_IDENTITY)
+
+               /*
+                * In case of using AMD_IOMMU_V1 page table mode, and the device
+                * is enabling for PPR/ATS support (using v2 table),
+                * we need to make sure that the domain type is identity map.
+                */
+               if ((amd_iommu_pgtable == AMD_IOMMU_V1) &&
+                   def_domain->type != IOMMU_DOMAIN_IDENTITY) {
                        goto out;
+               }
 
                if (dev_data->iommu_v2) {
-                       if (pdev_iommuv2_enable(pdev) != 0)
+                       if (pdev_pri_ats_enable(pdev) != 0)
                                goto out;
 
                        dev_data->ats.enabled = true;
-- 
2.17.1

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

Reply via email to