iommu/vt-d: Support IOMMU_DEV_FEAT_IOPF
authorJean-Philippe Brucker <jean-philippe@linaro.org>
Thu, 1 Apr 2021 15:47:13 +0000 (17:47 +0200)
committerJoerg Roedel <jroedel@suse.de>
Wed, 7 Apr 2021 08:54:29 +0000 (10:54 +0200)
Allow drivers to query and enable IOMMU_DEV_FEAT_IOPF, which amounts to
checking whether PRI is enabled.

Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Link: https://lore.kernel.org/r/20210401154718.307519-5-jean-philippe@linaro.org
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/iommu.c

index be5ea16ca26ff6cea611ffdab69fdc299ad04254..1ea0f0bd69736fab4dc03ba0f44464f5fa5a128f 100644 (file)
@@ -5311,6 +5311,8 @@ static int siov_find_pci_dvsec(struct pci_dev *pdev)
 static bool
 intel_iommu_dev_has_feat(struct device *dev, enum iommu_dev_features feat)
 {
+       struct device_domain_info *info = get_domain_info(dev);
+
        if (feat == IOMMU_DEV_FEAT_AUX) {
                int ret;
 
@@ -5325,13 +5327,13 @@ intel_iommu_dev_has_feat(struct device *dev, enum iommu_dev_features feat)
                return !!siov_find_pci_dvsec(to_pci_dev(dev));
        }
 
-       if (feat == IOMMU_DEV_FEAT_SVA) {
-               struct device_domain_info *info = get_domain_info(dev);
+       if (feat == IOMMU_DEV_FEAT_IOPF)
+               return info && info->pri_supported;
 
+       if (feat == IOMMU_DEV_FEAT_SVA)
                return info && (info->iommu->flags & VTD_FLAG_SVM_CAPABLE) &&
                        info->pasid_supported && info->pri_supported &&
                        info->ats_supported;
-       }
 
        return false;
 }
@@ -5342,6 +5344,9 @@ intel_iommu_dev_enable_feat(struct device *dev, enum iommu_dev_features feat)
        if (feat == IOMMU_DEV_FEAT_AUX)
                return intel_iommu_enable_auxd(dev);
 
+       if (feat == IOMMU_DEV_FEAT_IOPF)
+               return intel_iommu_dev_has_feat(dev, feat) ? 0 : -ENODEV;
+
        if (feat == IOMMU_DEV_FEAT_SVA) {
                struct device_domain_info *info = get_domain_info(dev);