iommu/amd: Update sanity check when enable PRI/ATS for IOMMU v1 table
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Thu, 25 Aug 2022 06:39:35 +0000 (06:39 +0000)
committerJoerg Roedel <jroedel@suse.de>
Wed, 7 Sep 2022 14:12:34 +0000 (16:12 +0200)
Currently, PPR/ATS can be enabled only if the domain is type
identity mapping. However, when allowing the IOMMU v2 page table
to be used for DMA-API, the check is no longer valid.

Update the sanity check to only apply for when using AMD_IOMMU_V1
page table mode.

Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Link: https://lore.kernel.org/r/20220825063939.8360-6-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/iommu.c

index 771709d1dfff21ab7f41642098ab16ef2336eb99..c882b06e23609c73a30f41b81c1d50fd7542d334 100644 (file)
@@ -1694,7 +1694,7 @@ static void pdev_iommuv2_disable(struct pci_dev *pdev)
        pci_disable_pasid(pdev);
 }
 
-static int pdev_iommuv2_enable(struct pci_dev *pdev)
+static int pdev_pri_ats_enable(struct pci_dev *pdev)
 {
        int ret;
 
@@ -1757,11 +1757,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;