diff options
Diffstat (limited to 'arch/x86/kernel/amd_iommu.c')
-rw-r--r-- | arch/x86/kernel/amd_iommu.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 5662e226b0c9..a7b6dec6fc3f 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -344,7 +344,7 @@ static int iommu_map(struct protection_domain *dom, | |||
344 | u64 __pte, *pte, *page; | 344 | u64 __pte, *pte, *page; |
345 | 345 | ||
346 | bus_addr = PAGE_ALIGN(bus_addr); | 346 | bus_addr = PAGE_ALIGN(bus_addr); |
347 | phys_addr = PAGE_ALIGN(bus_addr); | 347 | phys_addr = PAGE_ALIGN(phys_addr); |
348 | 348 | ||
349 | /* only support 512GB address spaces for now */ | 349 | /* only support 512GB address spaces for now */ |
350 | if (bus_addr > IOMMU_MAP_SIZE_L3 || !(prot & IOMMU_PROT_MASK)) | 350 | if (bus_addr > IOMMU_MAP_SIZE_L3 || !(prot & IOMMU_PROT_MASK)) |
@@ -600,7 +600,7 @@ static void dma_ops_free_pagetable(struct dma_ops_domain *dma_dom) | |||
600 | continue; | 600 | continue; |
601 | 601 | ||
602 | p2 = IOMMU_PTE_PAGE(p1[i]); | 602 | p2 = IOMMU_PTE_PAGE(p1[i]); |
603 | for (j = 0; j < 512; ++i) { | 603 | for (j = 0; j < 512; ++j) { |
604 | if (!IOMMU_PTE_PRESENT(p2[j])) | 604 | if (!IOMMU_PTE_PRESENT(p2[j])) |
605 | continue; | 605 | continue; |
606 | p3 = IOMMU_PTE_PAGE(p2[j]); | 606 | p3 = IOMMU_PTE_PAGE(p2[j]); |
@@ -910,7 +910,7 @@ static void dma_ops_domain_unmap(struct amd_iommu *iommu, | |||
910 | if (address >= dom->aperture_size) | 910 | if (address >= dom->aperture_size) |
911 | return; | 911 | return; |
912 | 912 | ||
913 | WARN_ON(address & 0xfffULL || address > dom->aperture_size); | 913 | WARN_ON(address & ~PAGE_MASK || address >= dom->aperture_size); |
914 | 914 | ||
915 | pte = dom->pte_pages[IOMMU_PTE_L1_INDEX(address)]; | 915 | pte = dom->pte_pages[IOMMU_PTE_L1_INDEX(address)]; |
916 | pte += IOMMU_PTE_L0_INDEX(address); | 916 | pte += IOMMU_PTE_L0_INDEX(address); |
@@ -922,8 +922,8 @@ static void dma_ops_domain_unmap(struct amd_iommu *iommu, | |||
922 | 922 | ||
923 | /* | 923 | /* |
924 | * This function contains common code for mapping of a physically | 924 | * This function contains common code for mapping of a physically |
925 | * contiguous memory region into DMA address space. It is uses by all | 925 | * contiguous memory region into DMA address space. It is used by all |
926 | * mapping functions provided by this IOMMU driver. | 926 | * mapping functions provided with this IOMMU driver. |
927 | * Must be called with the domain lock held. | 927 | * Must be called with the domain lock held. |
928 | */ | 928 | */ |
929 | static dma_addr_t __map_single(struct device *dev, | 929 | static dma_addr_t __map_single(struct device *dev, |
@@ -983,7 +983,8 @@ static void __unmap_single(struct amd_iommu *iommu, | |||
983 | dma_addr_t i, start; | 983 | dma_addr_t i, start; |
984 | unsigned int pages; | 984 | unsigned int pages; |
985 | 985 | ||
986 | if ((dma_addr == 0) || (dma_addr + size > dma_dom->aperture_size)) | 986 | if ((dma_addr == bad_dma_address) || |
987 | (dma_addr + size > dma_dom->aperture_size)) | ||
987 | return; | 988 | return; |
988 | 989 | ||
989 | pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); | 990 | pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); |