iommu: Add IOMMU_CAP_ENFORCE_CACHE_COHERENCY
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 29 Nov 2022 20:29:24 +0000 (16:29 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 29 Nov 2022 20:34:15 +0000 (16:34 -0400)
This queries if a domain linked to a device should expect to support
enforce_cache_coherency() so iommufd can negotiate the rules for when a
domain should be shared or not.

For iommufd a device that declares IOMMU_CAP_ENFORCE_CACHE_COHERENCY will
not be attached to a domain that does not support it.

Link: https://lore.kernel.org/r/1-v6-a196d26f289e+11787-iommufd_jgg@nvidia.com
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Tested-by: Yi Liu <yi.l.liu@intel.com>
Tested-by: Lixiao Yang <lixiao.yang@intel.com>
Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Yu He <yu.he@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/iommu/amd/iommu.c
drivers/iommu/intel/iommu.c
include/linux/iommu.h

index 45299eb7e8e306abc50cefafa43fbcf972a53a9e..240c535e317cc7338bc8cc455571045f37e096a7 100644 (file)
@@ -2278,6 +2278,8 @@ static bool amd_iommu_capable(struct device *dev, enum iommu_cap cap)
                return false;
        case IOMMU_CAP_PRE_BOOT_PROTECTION:
                return amdr_ivrs_remap_support;
+       case IOMMU_CAP_ENFORCE_CACHE_COHERENCY:
+               return true;
        default:
                break;
        }
index f298e51d5aa67ab4ee40ef4cba3e1ce652d39828..157c972741107660b351b9f7c99b49dc12deec77 100644 (file)
@@ -4450,14 +4450,20 @@ static bool intel_iommu_enforce_cache_coherency(struct iommu_domain *domain)
 
 static bool intel_iommu_capable(struct device *dev, enum iommu_cap cap)
 {
-       if (cap == IOMMU_CAP_CACHE_COHERENCY)
+       struct device_domain_info *info = dev_iommu_priv_get(dev);
+
+       switch (cap) {
+       case IOMMU_CAP_CACHE_COHERENCY:
                return true;
-       if (cap == IOMMU_CAP_INTR_REMAP)
+       case IOMMU_CAP_INTR_REMAP:
                return irq_remapping_enabled == 1;
-       if (cap == IOMMU_CAP_PRE_BOOT_PROTECTION)
+       case IOMMU_CAP_PRE_BOOT_PROTECTION:
                return dmar_platform_optin();
-
-       return false;
+       case IOMMU_CAP_ENFORCE_CACHE_COHERENCY:
+               return ecap_sc_support(info->iommu->ecap);
+       default:
+               return false;
+       }
 }
 
 static struct iommu_device *intel_iommu_probe_device(struct device *dev)
index 68d7d304cdb761ebaa7c143c8e34736d722ef550..a09fd32d8cc273ba3e43025186eb7e4db04f7612 100644 (file)
@@ -124,6 +124,11 @@ enum iommu_cap {
        IOMMU_CAP_NOEXEC,               /* IOMMU_NOEXEC flag */
        IOMMU_CAP_PRE_BOOT_PROTECTION,  /* Firmware says it used the IOMMU for
                                           DMA protection and we should too */
+       /*
+        * Per-device flag indicating if enforce_cache_coherency() will work on
+        * this device.
+        */
+       IOMMU_CAP_ENFORCE_CACHE_COHERENCY,
 };
 
 /* These are the possible reserved region types */