dma-mapping.c (9938b04472d5c59f8bd8152a548533a8599596a2) | dma-mapping.c (00085f1efa387a8ce100e3734920f7639c80caa3) |
---|---|
1/* 2 * Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch> 3 * Copyright (C) 2009 Wind River Systems Inc 4 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com 5 * 6 * Based on DMA code from MIPS. 7 * 8 * This file is subject to the terms and conditions of the GNU General Public --- 45 unchanged lines hidden (view full) --- 54 case DMA_TO_DEVICE: 55 break; 56 default: 57 BUG(); 58 } 59} 60 61static void *nios2_dma_alloc(struct device *dev, size_t size, | 1/* 2 * Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch> 3 * Copyright (C) 2009 Wind River Systems Inc 4 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com 5 * 6 * Based on DMA code from MIPS. 7 * 8 * This file is subject to the terms and conditions of the GNU General Public --- 45 unchanged lines hidden (view full) --- 54 case DMA_TO_DEVICE: 55 break; 56 default: 57 BUG(); 58 } 59} 60 61static void *nios2_dma_alloc(struct device *dev, size_t size, |
62 dma_addr_t *dma_handle, gfp_t gfp, struct dma_attrs *attrs) | 62 dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs) |
63{ 64 void *ret; 65 66 /* ignore region specifiers */ 67 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); 68 69 /* optimized page clearing */ 70 gfp |= __GFP_ZERO; --- 8 unchanged lines hidden (view full) --- 79 (unsigned long) ret + size); 80 ret = UNCAC_ADDR(ret); 81 } 82 83 return ret; 84} 85 86static void nios2_dma_free(struct device *dev, size_t size, void *vaddr, | 63{ 64 void *ret; 65 66 /* ignore region specifiers */ 67 gfp &= ~(__GFP_DMA | __GFP_HIGHMEM); 68 69 /* optimized page clearing */ 70 gfp |= __GFP_ZERO; --- 8 unchanged lines hidden (view full) --- 79 (unsigned long) ret + size); 80 ret = UNCAC_ADDR(ret); 81 } 82 83 return ret; 84} 85 86static void nios2_dma_free(struct device *dev, size_t size, void *vaddr, |
87 dma_addr_t dma_handle, struct dma_attrs *attrs) | 87 dma_addr_t dma_handle, unsigned long attrs) |
88{ 89 unsigned long addr = (unsigned long) CAC_ADDR((unsigned long) vaddr); 90 91 free_pages(addr, get_order(size)); 92} 93 94static int nios2_dma_map_sg(struct device *dev, struct scatterlist *sg, 95 int nents, enum dma_data_direction direction, | 88{ 89 unsigned long addr = (unsigned long) CAC_ADDR((unsigned long) vaddr); 90 91 free_pages(addr, get_order(size)); 92} 93 94static int nios2_dma_map_sg(struct device *dev, struct scatterlist *sg, 95 int nents, enum dma_data_direction direction, |
96 struct dma_attrs *attrs) | 96 unsigned long attrs) |
97{ 98 int i; 99 100 for_each_sg(sg, sg, nents, i) { 101 void *addr; 102 103 addr = sg_virt(sg); 104 if (addr) { 105 __dma_sync_for_device(addr, sg->length, direction); 106 sg->dma_address = sg_phys(sg); 107 } 108 } 109 110 return nents; 111} 112 113static dma_addr_t nios2_dma_map_page(struct device *dev, struct page *page, 114 unsigned long offset, size_t size, 115 enum dma_data_direction direction, | 97{ 98 int i; 99 100 for_each_sg(sg, sg, nents, i) { 101 void *addr; 102 103 addr = sg_virt(sg); 104 if (addr) { 105 __dma_sync_for_device(addr, sg->length, direction); 106 sg->dma_address = sg_phys(sg); 107 } 108 } 109 110 return nents; 111} 112 113static dma_addr_t nios2_dma_map_page(struct device *dev, struct page *page, 114 unsigned long offset, size_t size, 115 enum dma_data_direction direction, |
116 struct dma_attrs *attrs) | 116 unsigned long attrs) |
117{ 118 void *addr = page_address(page) + offset; 119 120 __dma_sync_for_device(addr, size, direction); 121 return page_to_phys(page) + offset; 122} 123 124static void nios2_dma_unmap_page(struct device *dev, dma_addr_t dma_address, 125 size_t size, enum dma_data_direction direction, | 117{ 118 void *addr = page_address(page) + offset; 119 120 __dma_sync_for_device(addr, size, direction); 121 return page_to_phys(page) + offset; 122} 123 124static void nios2_dma_unmap_page(struct device *dev, dma_addr_t dma_address, 125 size_t size, enum dma_data_direction direction, |
126 struct dma_attrs *attrs) | 126 unsigned long attrs) |
127{ 128 __dma_sync_for_cpu(phys_to_virt(dma_address), size, direction); 129} 130 131static void nios2_dma_unmap_sg(struct device *dev, struct scatterlist *sg, 132 int nhwentries, enum dma_data_direction direction, | 127{ 128 __dma_sync_for_cpu(phys_to_virt(dma_address), size, direction); 129} 130 131static void nios2_dma_unmap_sg(struct device *dev, struct scatterlist *sg, 132 int nhwentries, enum dma_data_direction direction, |
133 struct dma_attrs *attrs) | 133 unsigned long attrs) |
134{ 135 void *addr; 136 int i; 137 138 if (direction == DMA_TO_DEVICE) 139 return; 140 141 for_each_sg(sg, sg, nhwentries, i) { --- 56 unchanged lines hidden --- | 134{ 135 void *addr; 136 int i; 137 138 if (direction == DMA_TO_DEVICE) 139 return; 140 141 for_each_sg(sg, sg, nhwentries, i) { --- 56 unchanged lines hidden --- |