diff options
author | Takashi Iwai <tiwai@suse.de> | 2008-12-01 18:02:17 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2008-12-01 18:02:17 +0100 |
commit | 3af4182cc5be7d5505f9801ee3297373f1872446 (patch) | |
tree | 214348d40ed547a72f9612a7e5c94a01afded812 /arch/x86/kernel/amd_iommu.c | |
parent | f5d4c67e41a262f0cdfaec1bb0fa8e5952187ef9 (diff) | |
parent | c07f62e5f18123103459ff74e86af1518a5b8af5 (diff) |
Merge branch 'upstream' into topic/asoc
Diffstat (limited to 'arch/x86/kernel/amd_iommu.c')
-rw-r--r-- | arch/x86/kernel/amd_iommu.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index a8fd9ebdc8e..e4899e0e878 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c @@ -50,7 +50,7 @@ static int dma_ops_unity_map(struct dma_ops_domain *dma_dom, /* returns !0 if the IOMMU is caching non-present entries in its TLB */ static int iommu_has_npcache(struct amd_iommu *iommu) { - return iommu->cap & IOMMU_CAP_NPCACHE; + return iommu->cap & (1UL << IOMMU_CAP_NPCACHE); } /**************************************************************************** @@ -536,6 +536,9 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, { address >>= PAGE_SHIFT; iommu_area_free(dom->bitmap, address, pages); + + if (address >= dom->next_bit) + dom->need_flush = true; } /**************************************************************************** @@ -992,8 +995,10 @@ static void __unmap_single(struct amd_iommu *iommu, dma_ops_free_addresses(dma_dom, dma_addr, pages); - if (amd_iommu_unmap_flush) + if (amd_iommu_unmap_flush || dma_dom->need_flush) { iommu_flush_pages(iommu, dma_dom->domain.id, dma_addr, size); + dma_dom->need_flush = false; + } } /* |