]>
Commit | Line | Data |
---|---|---|
5641686c GU |
1 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | |
3 | * License. See the file COPYING in the main directory of this archive | |
4 | * for more details. | |
5 | */ | |
6 | ||
7 | #undef DEBUG | |
8 | ||
9f4df96b | 9 | #include <linux/dma-map-ops.h> |
5641686c GU |
10 | #include <linux/device.h> |
11 | #include <linux/kernel.h> | |
b12c8a70 | 12 | #include <linux/platform_device.h> |
5641686c GU |
13 | #include <linux/scatterlist.h> |
14 | #include <linux/slab.h> | |
15 | #include <linux/vmalloc.h> | |
16 | #include <linux/export.h> | |
17 | ||
ca15ca40 | 18 | #include <asm/cacheflush.h> |
5641686c | 19 | |
b60f187f | 20 | #if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE) |
69878ef4 CH |
21 | void arch_dma_prep_coherent(struct page *page, size_t size) |
22 | { | |
23 | cache_push(page_to_phys(page), size); | |
24 | } | |
25 | ||
419e2f18 | 26 | pgprot_t pgprot_dmacoherent(pgprot_t prot) |
5641686c | 27 | { |
34dc63a5 CH |
28 | if (CPU_IS_040_OR_060) { |
29 | pgprot_val(prot) &= ~_PAGE_CACHE040; | |
30 | pgprot_val(prot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S; | |
31 | } else { | |
32 | pgprot_val(prot) |= _PAGE_NOCACHE030; | |
5641686c | 33 | } |
34dc63a5 | 34 | return prot; |
5641686c | 35 | } |
66d857b0 | 36 | #else |
9eb8be60 CH |
37 | void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, |
38 | gfp_t gfp, unsigned long attrs) | |
5641686c GU |
39 | { |
40 | void *ret; | |
5641686c GU |
41 | |
42 | if (dev == NULL || (*dev->dma_mask < 0xffffffff)) | |
43 | gfp |= GFP_DMA; | |
44 | ret = (void *)__get_free_pages(gfp, get_order(size)); | |
45 | ||
46 | if (ret != NULL) { | |
47 | memset(ret, 0, size); | |
48 | *dma_handle = virt_to_phys(ret); | |
49 | } | |
50 | return ret; | |
51 | } | |
52 | ||
9eb8be60 | 53 | void arch_dma_free(struct device *dev, size_t size, void *vaddr, |
00085f1e | 54 | dma_addr_t dma_handle, unsigned long attrs) |
5641686c GU |
55 | { |
56 | free_pages((unsigned long)vaddr, get_order(size)); | |
57 | } | |
58 | ||
b60f187f | 59 | #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */ |
5641686c | 60 | |
56e35f9c CH |
61 | void arch_sync_dma_for_device(phys_addr_t handle, size_t size, |
62 | enum dma_data_direction dir) | |
5641686c GU |
63 | { |
64 | switch (dir) { | |
d2661c62 | 65 | case DMA_BIDIRECTIONAL: |
5641686c GU |
66 | case DMA_TO_DEVICE: |
67 | cache_push(handle, size); | |
68 | break; | |
69 | case DMA_FROM_DEVICE: | |
70 | cache_clear(handle, size); | |
71 | break; | |
72 | default: | |
7c79e1ee GU |
73 | pr_err_ratelimited("dma_sync_single_for_device: unsupported dir %u\n", |
74 | dir); | |
5641686c GU |
75 | break; |
76 | } | |
77 | } |