diff options
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 a8fd9ebdc8e2..331b318304eb 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, | |||
| 50 | /* returns !0 if the IOMMU is caching non-present entries in its TLB */ | 50 | /* returns !0 if the IOMMU is caching non-present entries in its TLB */ |
| 51 | static int iommu_has_npcache(struct amd_iommu *iommu) | 51 | static int iommu_has_npcache(struct amd_iommu *iommu) |
| 52 | { | 52 | { |
| 53 | return iommu->cap & IOMMU_CAP_NPCACHE; | 53 | return iommu->cap & (1UL << IOMMU_CAP_NPCACHE); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | /**************************************************************************** | 56 | /**************************************************************************** |
| @@ -536,6 +536,9 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, | |||
| 536 | { | 536 | { |
| 537 | address >>= PAGE_SHIFT; | 537 | address >>= PAGE_SHIFT; |
| 538 | iommu_area_free(dom->bitmap, address, pages); | 538 | iommu_area_free(dom->bitmap, address, pages); |
| 539 | |||
| 540 | if (address + pages >= dom->next_bit) | ||
| 541 | dom->need_flush = true; | ||
| 539 | } | 542 | } |
| 540 | 543 | ||
| 541 | /**************************************************************************** | 544 | /**************************************************************************** |
| @@ -992,8 +995,10 @@ static void __unmap_single(struct amd_iommu *iommu, | |||
| 992 | 995 | ||
| 993 | dma_ops_free_addresses(dma_dom, dma_addr, pages); | 996 | dma_ops_free_addresses(dma_dom, dma_addr, pages); |
| 994 | 997 | ||
| 995 | if (amd_iommu_unmap_flush) | 998 | if (amd_iommu_unmap_flush || dma_dom->need_flush) { |
| 996 | iommu_flush_pages(iommu, dma_dom->domain.id, dma_addr, size); | 999 | iommu_flush_pages(iommu, dma_dom->domain.id, dma_addr, size); |
| 1000 | dma_dom->need_flush = false; | ||
| 1001 | } | ||
| 997 | } | 1002 | } |
| 998 | 1003 | ||
| 999 | /* | 1004 | /* |
