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 ---