]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Dynamic DMA mapping support. | |
3 | * | |
4 | * We never have any address translations to worry about, so this | |
5 | * is just alloc/free. | |
6 | */ | |
7 | ||
8 | #include <linux/types.h> | |
9 | #include <linux/mm.h> | |
10 | #include <linux/string.h> | |
85e026bc | 11 | #include <linux/device.h> |
1da177e4 LT |
12 | #include <asm/io.h> |
13 | ||
14 | void *dma_alloc_coherent(struct device *dev, size_t size, | |
15 | dma_addr_t *dma_handle, int gfp) | |
16 | { | |
17 | void *ret; | |
18 | /* ignore region specifiers */ | |
19 | gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); | |
20 | ||
21 | if (dev == NULL || (*dev->dma_mask < 0xffffffff)) | |
22 | gfp |= GFP_DMA; | |
23 | ret = (void *)__get_free_pages(gfp, get_order(size)); | |
24 | ||
25 | if (ret != NULL) { | |
26 | memset(ret, 0, size); | |
27 | *dma_handle = virt_to_phys(ret); | |
28 | } | |
29 | return ret; | |
30 | } | |
31 | ||
32 | void dma_free_coherent(struct device *dev, size_t size, | |
33 | void *vaddr, dma_addr_t dma_handle) | |
34 | { | |
35 | free_pages((unsigned long)vaddr, get_order(size)); | |
36 | } |