Path: blob/master/arch/cris/arch-v32/drivers/pci/dma.c
15131 views
/*1* Dynamic DMA mapping support.2*3* On cris there is no hardware dynamic DMA address translation,4* so consistent alloc/free are merely page allocation/freeing.5* The rest of the dynamic DMA mapping interface is implemented6* in asm/pci.h.7*8* Borrowed from i386.9*/1011#include <linux/types.h>12#include <linux/mm.h>13#include <linux/string.h>14#include <linux/pci.h>15#include <linux/gfp.h>16#include <asm/io.h>1718void *dma_alloc_coherent(struct device *dev, size_t size,19dma_addr_t *dma_handle, gfp_t gfp)20{21void *ret;22int order = get_order(size);23/* ignore region specifiers */24gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);2526if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))27return ret;2829if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))30gfp |= GFP_DMA;3132ret = (void *)__get_free_pages(gfp, order);3334if (ret != NULL) {35memset(ret, 0, size);36*dma_handle = virt_to_phys(ret);37}38return ret;39}4041void dma_free_coherent(struct device *dev, size_t size,42void *vaddr, dma_addr_t dma_handle)43{44int order = get_order(size);4546if (!dma_release_from_coherent(dev, order, vaddr))47free_pages((unsigned long)vaddr, order);48}49505152