diff options
author | Laura Abbott <lauraa@codeaurora.org> | 2014-03-14 15:52:24 -0400 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2014-03-24 06:26:10 -0400 |
commit | 214fdbe74a096c3aeb7af81d7900e2ab966b10d6 (patch) | |
tree | 9bef4aca60368bb390ae6172af3c00ae029a5769 | |
parent | 6e8d7968e92f7668a2a615773ad3940f0219dcbd (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.c | 14 |
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 @@ | |||
30 | struct dma_map_ops *dma_ops; | 30 | struct dma_map_ops *dma_ops; |
31 | EXPORT_SYMBOL(dma_ops); | 31 | EXPORT_SYMBOL(dma_ops); |
32 | 32 | ||
33 | static 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 | |||
33 | static void *__dma_alloc_coherent(struct device *dev, size_t size, | 43 | static 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 | ||