iommu/vt-d: Support enforce_cache_coherency only for empty domains
[platform/kernel/linux-rpi.git] / drivers / iommu / intel / iommu.c
index 4c37073..744e4e6 100644 (file)
@@ -2204,6 +2204,8 @@ __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
                        attr |= DMA_FL_PTE_DIRTY;
        }
 
+       domain->has_mappings = true;
+
        pteval = ((phys_addr_t)phys_pfn << VTD_PAGE_SHIFT) | attr;
 
        while (nr_pages > 0) {
@@ -4309,7 +4311,8 @@ static bool intel_iommu_enforce_cache_coherency(struct iommu_domain *domain)
                return true;
 
        spin_lock_irqsave(&dmar_domain->lock, flags);
-       if (!domain_support_force_snooping(dmar_domain)) {
+       if (!domain_support_force_snooping(dmar_domain) ||
+           (!dmar_domain->use_first_level && dmar_domain->has_mappings)) {
                spin_unlock_irqrestore(&dmar_domain->lock, flags);
                return false;
        }