iommu/vt-d: Move pfsid and ats_qdep calculation to device probe path
authorLu Baolu <baolu.lu@linux.intel.com>
Thu, 13 Apr 2023 04:06:32 +0000 (12:06 +0800)
committerJoerg Roedel <jroedel@suse.de>
Thu, 13 Apr 2023 10:05:47 +0000 (12:05 +0200)
They should be part of the per-device iommu private data initialization.

Reviewed-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20230324120234.313643-5-baolu.lu@linux.intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/iommu.c

index a6f07c74da2d0de31833ff17a203003bb715c52d..6d77b4072fdd94298452e992999ef59d0f998574 100644 (file)
@@ -1406,20 +1406,6 @@ static void iommu_enable_pci_caps(struct device_domain_info *info)
                return;
 
        pdev = to_pci_dev(info->dev);
-       /* For IOMMU that supports device IOTLB throttling (DIT), we assign
-        * PFSID to the invalidation desc of a VF such that IOMMU HW can gauge
-        * queue depth at PF level. If DIT is not set, PFSID will be treated as
-        * reserved, which should be set to 0.
-        */
-       if (!ecap_dit(info->iommu->ecap))
-               info->pfsid = 0;
-       else {
-               struct pci_dev *pf_pdev;
-
-               /* pdev will be returned if device is not a vf */
-               pf_pdev = pci_physfn(pdev);
-               info->pfsid = pci_dev_id(pf_pdev);
-       }
 
        /* The PCIe spec, in its wisdom, declares that the behaviour of
           the device if you enable PASID support after ATS support is
@@ -1438,7 +1424,6 @@ static void iommu_enable_pci_caps(struct device_domain_info *info)
            !pci_enable_ats(pdev, VTD_PAGE_SHIFT)) {
                info->ats_enabled = 1;
                domain_update_iotlb(info->domain);
-               info->ats_qdep = pci_ats_queue_depth(pdev);
        }
 }
 
@@ -4521,6 +4506,17 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
                    dmar_ats_supported(pdev, iommu)) {
                        info->ats_supported = 1;
                        info->dtlb_extra_inval = dev_needs_extra_dtlb_flush(pdev);
+
+                       /*
+                        * For IOMMU that supports device IOTLB throttling
+                        * (DIT), we assign PFSID to the invalidation desc
+                        * of a VF such that IOMMU HW can gauge queue depth
+                        * at PF level. If DIT is not set, PFSID will be
+                        * treated as reserved, which should be set to 0.
+                        */
+                       if (ecap_dit(iommu->ecap))
+                               info->pfsid = pci_dev_id(pci_physfn(pdev));
+                       info->ats_qdep = pci_ats_queue_depth(pdev);
                }
                if (sm_supported(iommu)) {
                        if (pasid_supported(iommu)) {