arm64: Support DMA_ATTR_WRITE_COMBINE
DMA_ATTR_WRITE_COMBINE is currently ignored. Set the pgprot appropriately for non coherent opperations. Signed-off-by: Laura Abbott <lauraa@codeaurora.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
6e8d7968e9
commit
214fdbe74a
|
@ -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,
|
||||||
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,
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue