at v4.6 1.7 kB view raw
1/* 2 * lib/dma-noop.c 3 * 4 * Simple DMA noop-ops that map 1:1 with memory 5 */ 6#include <linux/export.h> 7#include <linux/mm.h> 8#include <linux/dma-mapping.h> 9#include <linux/scatterlist.h> 10 11static void *dma_noop_alloc(struct device *dev, size_t size, 12 dma_addr_t *dma_handle, gfp_t gfp, 13 struct dma_attrs *attrs) 14{ 15 void *ret; 16 17 ret = (void *)__get_free_pages(gfp, get_order(size)); 18 if (ret) 19 *dma_handle = virt_to_phys(ret); 20 return ret; 21} 22 23static void dma_noop_free(struct device *dev, size_t size, 24 void *cpu_addr, dma_addr_t dma_addr, 25 struct dma_attrs *attrs) 26{ 27 free_pages((unsigned long)cpu_addr, get_order(size)); 28} 29 30static dma_addr_t dma_noop_map_page(struct device *dev, struct page *page, 31 unsigned long offset, size_t size, 32 enum dma_data_direction dir, 33 struct dma_attrs *attrs) 34{ 35 return page_to_phys(page) + offset; 36} 37 38static int dma_noop_map_sg(struct device *dev, struct scatterlist *sgl, int nents, 39 enum dma_data_direction dir, struct dma_attrs *attrs) 40{ 41 int i; 42 struct scatterlist *sg; 43 44 for_each_sg(sgl, sg, nents, i) { 45 void *va; 46 47 BUG_ON(!sg_page(sg)); 48 va = sg_virt(sg); 49 sg_dma_address(sg) = (dma_addr_t)virt_to_phys(va); 50 sg_dma_len(sg) = sg->length; 51 } 52 53 return nents; 54} 55 56static int dma_noop_mapping_error(struct device *dev, dma_addr_t dma_addr) 57{ 58 return 0; 59} 60 61static int dma_noop_supported(struct device *dev, u64 mask) 62{ 63 return 1; 64} 65 66struct dma_map_ops dma_noop_ops = { 67 .alloc = dma_noop_alloc, 68 .free = dma_noop_free, 69 .map_page = dma_noop_map_page, 70 .map_sg = dma_noop_map_sg, 71 .mapping_error = dma_noop_mapping_error, 72 .dma_supported = dma_noop_supported, 73}; 74 75EXPORT_SYMBOL(dma_noop_ops);