aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaura Abbott <lauraa@codeaurora.org>2014-03-14 15:52:24 -0400
committerCatalin Marinas <catalin.marinas@arm.com>2014-03-24 06:26:10 -0400
commit214fdbe74a096c3aeb7af81d7900e2ab966b10d6 (patch)
tree9bef4aca60368bb390ae6172af3c00ae029a5769
parent6e8d7968e92f7668a2a615773ad3940f0219dcbd (diff)
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>
-rw-r--r--arch/arm64/mm/dma-mapping.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index 81eea3d3249f..5bba6be1a3f1 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -30,6 +30,16 @@
30struct dma_map_ops *dma_ops; 30struct dma_map_ops *dma_ops;
31EXPORT_SYMBOL(dma_ops); 31EXPORT_SYMBOL(dma_ops);
32 32
33static pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot,
34 bool coherent)
35{
36 if (dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs))
37 return pgprot_writecombine(prot);
38 else if (!coherent)
39 return pgprot_dmacoherent(prot);
40 return prot;
41}
42
33static void *__dma_alloc_coherent(struct device *dev, size_t size, 43static void *__dma_alloc_coherent(struct device *dev, size_t size,
34 dma_addr_t *dma_handle, gfp_t flags, 44 dma_addr_t *dma_handle, gfp_t flags,
35 struct dma_attrs *attrs) 45 struct dma_attrs *attrs)
@@ -104,7 +114,7 @@ static void *__dma_alloc_noncoherent(struct device *dev, size_t size,
104 for (i = 0; i < (size >> PAGE_SHIFT); i++) 114 for (i = 0; i < (size >> PAGE_SHIFT); i++)
105 map[i] = page + i; 115 map[i] = page + i;
106 coherent_ptr = vmap(map, size >> PAGE_SHIFT, VM_MAP, 116 coherent_ptr = vmap(map, size >> PAGE_SHIFT, VM_MAP,
107 pgprot_dmacoherent(pgprot_default)); 117 __get_dma_pgprot(attrs, pgprot_default, false));
108 kfree(map); 118 kfree(map);
109 if (!coherent_ptr) 119 if (!coherent_ptr)
110 goto no_map; 120 goto no_map;
@@ -250,7 +260,7 @@ static int __swiotlb_mmap_noncoherent(struct device *dev,
250 void *cpu_addr, dma_addr_t dma_addr, size_t size, 260 void *cpu_addr, dma_addr_t dma_addr, size_t size,
251 struct dma_attrs *attrs) 261 struct dma_attrs *attrs)
252{ 262{
253 vma->vm_page_prot = pgprot_dmacoherent(vma->vm_page_prot); 263 vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot, false);
254 return __dma_common_mmap(dev, vma, cpu_addr, dma_addr, size); 264 return __dma_common_mmap(dev, vma, cpu_addr, dma_addr, size);
255} 265}
256 266