|
3 | 3 | * Copyright (C) 2004 - 2007 Paul Mundt
|
4 | 4 | */
|
5 | 5 | #include <linux/mm.h>
|
6 |
| -#include <linux/init.h> |
7 | 6 | #include <linux/dma-noncoherent.h>
|
8 |
| -#include <linux/module.h> |
9 | 7 | #include <asm/cacheflush.h>
|
10 | 8 | #include <asm/addrspace.h>
|
11 | 9 |
|
12 |
| -void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, |
13 |
| - gfp_t gfp, unsigned long attrs) |
| 10 | +void arch_dma_prep_coherent(struct page *page, size_t size) |
14 | 11 | {
|
15 |
| - void *ret, *ret_nocache; |
16 |
| - int order = get_order(size); |
17 |
| - |
18 |
| - gfp |= __GFP_ZERO; |
19 |
| - |
20 |
| - ret = (void *)__get_free_pages(gfp, order); |
21 |
| - if (!ret) |
22 |
| - return NULL; |
23 |
| - |
24 |
| - /* |
25 |
| - * Pages from the page allocator may have data present in |
26 |
| - * cache. So flush the cache before using uncached memory. |
27 |
| - */ |
28 |
| - arch_sync_dma_for_device(virt_to_phys(ret), size, |
29 |
| - DMA_BIDIRECTIONAL); |
30 |
| - |
31 |
| - ret_nocache = (void __force *)ioremap(virt_to_phys(ret), size); |
32 |
| - if (!ret_nocache) { |
33 |
| - free_pages((unsigned long)ret, order); |
34 |
| - return NULL; |
35 |
| - } |
36 |
| - |
37 |
| - split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order); |
38 |
| - |
39 |
| - *dma_handle = virt_to_phys(ret); |
40 |
| - if (!WARN_ON(!dev)) |
41 |
| - *dma_handle -= PFN_PHYS(dev->dma_pfn_offset); |
42 |
| - |
43 |
| - return ret_nocache; |
44 |
| -} |
45 |
| - |
46 |
| -void arch_dma_free(struct device *dev, size_t size, void *vaddr, |
47 |
| - dma_addr_t dma_handle, unsigned long attrs) |
48 |
| -{ |
49 |
| - int order = get_order(size); |
50 |
| - unsigned long pfn = (dma_handle >> PAGE_SHIFT); |
51 |
| - int k; |
52 |
| - |
53 |
| - if (!WARN_ON(!dev)) |
54 |
| - pfn += dev->dma_pfn_offset; |
55 |
| - |
56 |
| - for (k = 0; k < (1 << order); k++) |
57 |
| - __free_pages(pfn_to_page(pfn + k), 0); |
58 |
| - |
59 |
| - iounmap(vaddr); |
| 12 | + __flush_purge_region(page_address(page), size); |
60 | 13 | }
|
61 | 14 |
|
62 | 15 | void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
|
|
0 commit comments