mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 14:19:09 -04:00
dma-mapping-fast: Remap contiguous pages only when needed
When a CPU mapping is determined for the contiguous pages allocated with DMA_ATTR_FORCE_CONTIGUOUS, the pages are remapped into the vmalloc space, independent of the device's coherency settings. In cases where the device accessing the memory is I/O coherent this is unnecessary, as the kernel logical mappings can be used for coherent CPU accesses. Thus, only remap the contiguous pages when the CPU needs an uncached mapping to access the memory--when the device is non I/O coherent--or when the pages are in high memory. Change-Id: I6179adbfbda5cb639c1da87c72424ddbee9821f1 Signed-off-by: Isaac J. Manjarres <isaacm@codeaurora.org>
This commit is contained in:
parent
7c6f0d6195
commit
67bc6af94a
1 changed files with 10 additions and 5 deletions
|
|
@ -630,13 +630,18 @@ static void *__fast_smmu_alloc_contiguous(struct device *dev, size_t size,
|
|||
size, prot))
|
||||
goto release_iova;
|
||||
|
||||
coherent_addr = dma_common_contiguous_remap(page, size, remap_prot,
|
||||
if (!is_coherent || PageHighMem(page)) {
|
||||
coherent_addr = dma_common_contiguous_remap(page, size,
|
||||
remap_prot,
|
||||
__fast_smmu_alloc_contiguous);
|
||||
if (!coherent_addr)
|
||||
goto release_mapping;
|
||||
if (!coherent_addr)
|
||||
goto release_mapping;
|
||||
|
||||
if (!is_coherent)
|
||||
__dma_flush_area(page_to_virt(page), size);
|
||||
if (!is_coherent)
|
||||
__dma_flush_area(page_to_virt(page), size);
|
||||
} else {
|
||||
coherent_addr = page_address(page);
|
||||
}
|
||||
|
||||
*handle = iova;
|
||||
return coherent_addr;
|
||||
|
|
|
|||
Loading…
Reference in a new issue