In order to cascade guest CFGI_CD, let's add PASID cache invalidation
per PASID.

Signed-off-by: Eric Auger <eric.au...@redhat.com>

---

v12 -> v13:
- Fix !(info->flags & IOMMU_INV_PASID_FLAGS_PASID) check
---
 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c 
b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index ed64699a4a0d..45adfe4da11b 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -2999,9 +2999,19 @@ arm_smmu_cache_invalidate(struct iommu_domain *domain, 
struct device *dev,
                } else {
                        return -EINVAL;
                }
-       }
-       if (inv_info->cache & IOMMU_CACHE_INV_TYPE_PASID ||
-           inv_info->cache & IOMMU_CACHE_INV_TYPE_DEV_IOTLB) {
+       } else if (inv_info->cache & IOMMU_CACHE_INV_TYPE_PASID) {
+               if (inv_info->granularity == IOMMU_INV_GRANU_PASID) {
+                       struct iommu_inv_pasid_info *info =
+                               &inv_info->granu.pasid_info;
+
+                       if (!(info->flags & IOMMU_INV_PASID_FLAGS_PASID))
+                               return -EINVAL;
+
+                       arm_smmu_sync_cd(smmu_domain, info->pasid, true);
+               } else {
+                       return -ENOENT;
+               }
+       } else { /* IOMMU_CACHE_INV_TYPE_DEV_IOTLB */
                return -ENOENT;
        }
        return 0;
-- 
2.21.3

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

Reply via email to