Commit 214fdbe7 authored by Laura Abbott's avatar Laura Abbott Committed by Catalin Marinas

arm64: Support DMA_ATTR_WRITE_COMBINE

DMA_ATTR_WRITE_COMBINE is currently ignored. Set the pgprot
appropriately for non coherent opperations.
Signed-off-by: default avatarLaura Abbott <lauraa@codeaurora.org>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 6e8d7968
...@@ -30,6 +30,16 @@ ...@@ -30,6 +30,16 @@
struct dma_map_ops *dma_ops; struct dma_map_ops *dma_ops;
EXPORT_SYMBOL(dma_ops); EXPORT_SYMBOL(dma_ops);
static pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot,
bool coherent)
{
if (dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs))
return pgprot_writecombine(prot);
else if (!coherent)
return pgprot_dmacoherent(prot);
return prot;
}
static void *__dma_alloc_coherent(struct device *dev, size_t size, static void *__dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flags, dma_addr_t *dma_handle, gfp_t flags,
struct dma_attrs *attrs) struct dma_attrs *attrs)
...@@ -104,7 +114,7 @@ static void *__dma_alloc_noncoherent(struct device *dev, size_t size, ...@@ -104,7 +114,7 @@ static void *__dma_alloc_noncoherent(struct device *dev, size_t size,
for (i = 0; i < (size >> PAGE_SHIFT); i++) for (i = 0; i < (size >> PAGE_SHIFT); i++)
map[i] = page + i; map[i] = page + i;
coherent_ptr = vmap(map, size >> PAGE_SHIFT, VM_MAP, coherent_ptr = vmap(map, size >> PAGE_SHIFT, VM_MAP,
pgprot_dmacoherent(pgprot_default)); __get_dma_pgprot(attrs, pgprot_default, false));
kfree(map); kfree(map);
if (!coherent_ptr) if (!coherent_ptr)
goto no_map; goto no_map;
...@@ -250,7 +260,7 @@ static int __swiotlb_mmap_noncoherent(struct device *dev, ...@@ -250,7 +260,7 @@ static int __swiotlb_mmap_noncoherent(struct device *dev,
void *cpu_addr, dma_addr_t dma_addr, size_t size, void *cpu_addr, dma_addr_t dma_addr, size_t size,
struct dma_attrs *attrs) struct dma_attrs *attrs)
{ {
vma->vm_page_prot = pgprot_dmacoherent(vma->vm_page_prot); vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot, false);
return __dma_common_mmap(dev, vma, cpu_addr, dma_addr, size); return __dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
} }
......
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