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> 11#include <asm/io.h> 12 13void *dma_alloc_coherent(struct device *dev, size_t size, 14 dma_addr_t *dma_handle, int gfp) 15{ 16 void *ret; 17 /* ignore region specifiers */ 18 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); 19 20 if (dev == NULL || (*dev->dma_mask < 0xffffffff)) 21 gfp |= GFP_DMA; 22 ret = (void *)__get_free_pages(gfp, get_order(size)); 23 24 if (ret != NULL) { 25 memset(ret, 0, size); 26 *dma_handle = virt_to_phys(ret); 27 } 28 return ret; 29} 30 31void dma_free_coherent(struct device *dev, size_t size, 32 void *vaddr, dma_addr_t dma_handle) 33{ 34 free_pages((unsigned long)vaddr, get_order(size)); 35} 36