Commit 0ab36de2 authored by David Woodhouse's avatar David Woodhouse

intel-iommu: Use domain_pfn_mapping() in __intel_map_single()

Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 61df7443
...@@ -2477,14 +2477,12 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr, ...@@ -2477,14 +2477,12 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr,
return 0; return 0;
iommu = domain_get_iommu(domain); iommu = domain_get_iommu(domain);
size = aligned_size((u64)paddr, size); size = aligned_size(paddr, size) >> VTD_PAGE_SHIFT;
iova = __intel_alloc_iova(hwdev, domain, size, pdev->dma_mask); iova = __intel_alloc_iova(hwdev, domain, size << VTD_PAGE_SHIFT, pdev->dma_mask);
if (!iova) if (!iova)
goto error; goto error;
start_paddr = (phys_addr_t)iova->pfn_lo << PAGE_SHIFT;
/* /*
* Check if DMAR supports zero-length reads on write only * Check if DMAR supports zero-length reads on write only
* mappings.. * mappings..
...@@ -2500,20 +2498,20 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr, ...@@ -2500,20 +2498,20 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr,
* might have two guest_addr mapping to the same host paddr, but this * might have two guest_addr mapping to the same host paddr, but this
* is not a big problem * is not a big problem
*/ */
ret = domain_page_mapping(domain, start_paddr, ret = domain_pfn_mapping(domain, mm_to_dma_pfn(iova->pfn_lo),
((u64)paddr) & PHYSICAL_PAGE_MASK, paddr >> VTD_PAGE_SHIFT, size, prot);
size, prot);
if (ret) if (ret)
goto error; goto error;
start_paddr = (phys_addr_t)iova->pfn_lo << PAGE_SHIFT;
/* it's a non-present to present mapping. Only flush if caching mode */ /* it's a non-present to present mapping. Only flush if caching mode */
if (cap_caching_mode(iommu->cap)) if (cap_caching_mode(iommu->cap))
iommu_flush_iotlb_psi(iommu, 0, start_paddr, iommu_flush_iotlb_psi(iommu, 0, start_paddr, size);
size >> VTD_PAGE_SHIFT);
else else
iommu_flush_write_buffer(iommu); iommu_flush_write_buffer(iommu);
return start_paddr + ((u64)paddr & (~PAGE_MASK)); return start_paddr + (paddr & (~PAGE_MASK));
error: error:
if (iova) if (iova)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment