aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2009-11-26 11:19:58 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-02-15 10:22:20 -0500
commita9c9147eb9b1dba0ce567a41897c7773b4d1b0bc (patch)
tree178938c909f4717c2e599d6f3de954d7ee8a7f21
parent93f1d629e22b08642eb713ad96ac2cb9ade0641c (diff)
ARM: dma-mapping: provide per-cpu type map/unmap functions
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Tested-By: Santosh Shilimkar <santosh.shilimkar@ti.com>
-rw-r--r--arch/arm/include/asm/cacheflush.h9
-rw-r--r--arch/arm/kernel/asm-offsets.c5
-rw-r--r--arch/arm/mm/cache-fa.S26
-rw-r--r--arch/arm/mm/cache-v3.S24
-rw-r--r--arch/arm/mm/cache-v4.S24
-rw-r--r--arch/arm/mm/cache-v4wb.S26
-rw-r--r--arch/arm/mm/cache-v4wt.S25
-rw-r--r--arch/arm/mm/cache-v6.S26
-rw-r--r--arch/arm/mm/cache-v7.S26
-rw-r--r--arch/arm/mm/dma-mapping.c29
-rw-r--r--arch/arm/mm/proc-arm1020.S26
-rw-r--r--arch/arm/mm/proc-arm1020e.S26
-rw-r--r--arch/arm/mm/proc-arm1022.S26
-rw-r--r--arch/arm/mm/proc-arm1026.S26
-rw-r--r--arch/arm/mm/proc-arm920.S26
-rw-r--r--arch/arm/mm/proc-arm922.S26
-rw-r--r--arch/arm/mm/proc-arm925.S26
-rw-r--r--arch/arm/mm/proc-arm926.S26
-rw-r--r--arch/arm/mm/proc-arm940.S26
-rw-r--r--arch/arm/mm/proc-arm946.S26
-rw-r--r--arch/arm/mm/proc-feroceon.S42
-rw-r--r--arch/arm/mm/proc-mohawk.S26
-rw-r--r--arch/arm/mm/proc-xsc3.S26
-rw-r--r--arch/arm/mm/proc-xscale.S41
24 files changed, 598 insertions, 17 deletions
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
index 730aefcfbee3..4c733236e342 100644
--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -213,6 +213,9 @@ struct cpu_cache_fns {
213 void (*coherent_user_range)(unsigned long, unsigned long); 213 void (*coherent_user_range)(unsigned long, unsigned long);
214 void (*flush_kern_dcache_area)(void *, size_t); 214 void (*flush_kern_dcache_area)(void *, size_t);
215 215
216 void (*dma_map_area)(const void *, size_t, int);
217 void (*dma_unmap_area)(const void *, size_t, int);
218
216 void (*dma_inv_range)(const void *, const void *); 219 void (*dma_inv_range)(const void *, const void *);
217 void (*dma_clean_range)(const void *, const void *); 220 void (*dma_clean_range)(const void *, const void *);
218 void (*dma_flush_range)(const void *, const void *); 221 void (*dma_flush_range)(const void *, const void *);
@@ -244,6 +247,8 @@ extern struct cpu_cache_fns cpu_cache;
244 * is visible to DMA, or data written by DMA to system memory is 247 * is visible to DMA, or data written by DMA to system memory is
245 * visible to the CPU. 248 * visible to the CPU.
246 */ 249 */
250#define dmac_map_area cpu_cache.dma_map_area
251#define dmac_unmap_area cpu_cache.dma_unmap_area
247#define dmac_inv_range cpu_cache.dma_inv_range 252#define dmac_inv_range cpu_cache.dma_inv_range
248#define dmac_clean_range cpu_cache.dma_clean_range 253#define dmac_clean_range cpu_cache.dma_clean_range
249#define dmac_flush_range cpu_cache.dma_flush_range 254#define dmac_flush_range cpu_cache.dma_flush_range
@@ -270,10 +275,14 @@ extern void __cpuc_flush_dcache_area(void *, size_t);
270 * is visible to DMA, or data written by DMA to system memory is 275 * is visible to DMA, or data written by DMA to system memory is
271 * visible to the CPU. 276 * visible to the CPU.
272 */ 277 */
278#define dmac_map_area __glue(_CACHE,_dma_map_area)
279#define dmac_unmap_area __glue(_CACHE,_dma_unmap_area)
273#define dmac_inv_range __glue(_CACHE,_dma_inv_range) 280#define dmac_inv_range __glue(_CACHE,_dma_inv_range)
274#define dmac_clean_range __glue(_CACHE,_dma_clean_range) 281#define dmac_clean_range __glue(_CACHE,_dma_clean_range)
275#define dmac_flush_range __glue(_CACHE,_dma_flush_range) 282#define dmac_flush_range __glue(_CACHE,_dma_flush_range)
276 283
284extern void dmac_map_area(const void *, size_t, int);
285extern void dmac_unmap_area(const void *, size_t, int);
277extern void dmac_inv_range(const void *, const void *); 286extern void dmac_inv_range(const void *, const void *);
278extern void dmac_clean_range(const void *, const void *); 287extern void dmac_clean_range(const void *, const void *);
279extern void dmac_flush_range(const void *, const void *); 288extern void dmac_flush_range(const void *, const void *);
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
index 4a881258bb17..883511522fca 100644
--- a/arch/arm/kernel/asm-offsets.c
+++ b/arch/arm/kernel/asm-offsets.c
@@ -12,6 +12,7 @@
12 */ 12 */
13#include <linux/sched.h> 13#include <linux/sched.h>
14#include <linux/mm.h> 14#include <linux/mm.h>
15#include <linux/dma-mapping.h>
15#include <asm/mach/arch.h> 16#include <asm/mach/arch.h>
16#include <asm/thread_info.h> 17#include <asm/thread_info.h>
17#include <asm/memory.h> 18#include <asm/memory.h>
@@ -112,5 +113,9 @@ int main(void)
112#ifdef MULTI_PABORT 113#ifdef MULTI_PABORT
113 DEFINE(PROCESSOR_PABT_FUNC, offsetof(struct processor, _prefetch_abort)); 114 DEFINE(PROCESSOR_PABT_FUNC, offsetof(struct processor, _prefetch_abort));
114#endif 115#endif
116 BLANK();
117 DEFINE(DMA_BIDIRECTIONAL, DMA_BIDIRECTIONAL);
118 DEFINE(DMA_TO_DEVICE, DMA_TO_DEVICE);
119 DEFINE(DMA_FROM_DEVICE, DMA_FROM_DEVICE);
115 return 0; 120 return 0;
116} 121}
diff --git a/arch/arm/mm/cache-fa.S b/arch/arm/mm/cache-fa.S
index a89444a3c016..8ebffdd6fcff 100644
--- a/arch/arm/mm/cache-fa.S
+++ b/arch/arm/mm/cache-fa.S
@@ -205,6 +205,30 @@ ENTRY(fa_dma_flush_range)
205 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer 205 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
206 mov pc, lr 206 mov pc, lr
207 207
208/*
209 * dma_map_area(start, size, dir)
210 * - start - kernel virtual start address
211 * - size - size of region
212 * - dir - DMA direction
213 */
214ENTRY(fa_dma_map_area)
215 add r1, r1, r0
216 cmp r2, #DMA_TO_DEVICE
217 beq fa_dma_clean_range
218 bcs fa_dma_inv_range
219 b fa_dma_flush_range
220ENDPROC(fa_dma_map_area)
221
222/*
223 * dma_unmap_area(start, size, dir)
224 * - start - kernel virtual start address
225 * - size - size of region
226 * - dir - DMA direction
227 */
228ENTRY(fa_dma_unmap_area)
229 mov pc, lr
230ENDPROC(fa_dma_unmap_area)
231
208 __INITDATA 232 __INITDATA
209 233
210 .type fa_cache_fns, #object 234 .type fa_cache_fns, #object
@@ -215,6 +239,8 @@ ENTRY(fa_cache_fns)
215 .long fa_coherent_kern_range 239 .long fa_coherent_kern_range
216 .long fa_coherent_user_range 240 .long fa_coherent_user_range
217 .long fa_flush_kern_dcache_area 241 .long fa_flush_kern_dcache_area
242 .long fa_dma_map_area
243 .long fa_dma_unmap_area
218 .long fa_dma_inv_range 244 .long fa_dma_inv_range
219 .long fa_dma_clean_range 245 .long fa_dma_clean_range
220 .long fa_dma_flush_range 246 .long fa_dma_flush_range
diff --git a/arch/arm/mm/cache-v3.S b/arch/arm/mm/cache-v3.S
index 2a482731ea36..6df52dc014be 100644
--- a/arch/arm/mm/cache-v3.S
+++ b/arch/arm/mm/cache-v3.S
@@ -121,6 +121,28 @@ ENTRY(v3_dma_flush_range)
121ENTRY(v3_dma_clean_range) 121ENTRY(v3_dma_clean_range)
122 mov pc, lr 122 mov pc, lr
123 123
124/*
125 * dma_unmap_area(start, size, dir)
126 * - start - kernel virtual start address
127 * - size - size of region
128 * - dir - DMA direction
129 */
130ENTRY(v3_dma_unmap_area)
131 teq r2, #DMA_TO_DEVICE
132 bne v3_dma_inv_range
133 /* FALLTHROUGH */
134
135/*
136 * dma_map_area(start, size, dir)
137 * - start - kernel virtual start address
138 * - size - size of region
139 * - dir - DMA direction
140 */
141ENTRY(v3_dma_map_area)
142 mov pc, lr
143ENDPROC(v3_dma_unmap_area)
144ENDPROC(v3_dma_map_area)
145
124 __INITDATA 146 __INITDATA
125 147
126 .type v3_cache_fns, #object 148 .type v3_cache_fns, #object
@@ -131,6 +153,8 @@ ENTRY(v3_cache_fns)
131 .long v3_coherent_kern_range 153 .long v3_coherent_kern_range
132 .long v3_coherent_user_range 154 .long v3_coherent_user_range
133 .long v3_flush_kern_dcache_area 155 .long v3_flush_kern_dcache_area
156 .long v3_dma_map_area
157 .long v3_dma_unmap_area
134 .long v3_dma_inv_range 158 .long v3_dma_inv_range
135 .long v3_dma_clean_range 159 .long v3_dma_clean_range
136 .long v3_dma_flush_range 160 .long v3_dma_flush_range
diff --git a/arch/arm/mm/cache-v4.S b/arch/arm/mm/cache-v4.S
index 5c7da3e372e9..df3b423713b9 100644
--- a/arch/arm/mm/cache-v4.S
+++ b/arch/arm/mm/cache-v4.S
@@ -133,6 +133,28 @@ ENTRY(v4_dma_flush_range)
133ENTRY(v4_dma_clean_range) 133ENTRY(v4_dma_clean_range)
134 mov pc, lr 134 mov pc, lr
135 135
136/*
137 * dma_unmap_area(start, size, dir)
138 * - start - kernel virtual start address
139 * - size - size of region
140 * - dir - DMA direction
141 */
142ENTRY(v4_dma_unmap_area)
143 teq r2, #DMA_TO_DEVICE
144 bne v4_dma_inv_range
145 /* FALLTHROUGH */
146
147/*
148 * dma_map_area(start, size, dir)
149 * - start - kernel virtual start address
150 * - size - size of region
151 * - dir - DMA direction
152 */
153ENTRY(v4_dma_map_area)
154 mov pc, lr
155ENDPROC(v4_dma_unmap_area)
156ENDPROC(v4_dma_map_area)
157
136 __INITDATA 158 __INITDATA
137 159
138 .type v4_cache_fns, #object 160 .type v4_cache_fns, #object
@@ -143,6 +165,8 @@ ENTRY(v4_cache_fns)
143 .long v4_coherent_kern_range 165 .long v4_coherent_kern_range
144 .long v4_coherent_user_range 166 .long v4_coherent_user_range
145 .long v4_flush_kern_dcache_area 167 .long v4_flush_kern_dcache_area
168 .long v4_dma_map_area
169 .long v4_dma_unmap_area
146 .long v4_dma_inv_range 170 .long v4_dma_inv_range
147 .long v4_dma_clean_range 171 .long v4_dma_clean_range
148 .long v4_dma_flush_range 172 .long v4_dma_flush_range
diff --git a/arch/arm/mm/cache-v4wb.S b/arch/arm/mm/cache-v4wb.S
index 3dbedf1ec0e7..32e7a7448496 100644
--- a/arch/arm/mm/cache-v4wb.S
+++ b/arch/arm/mm/cache-v4wb.S
@@ -216,6 +216,30 @@ ENTRY(v4wb_dma_clean_range)
216 .globl v4wb_dma_flush_range 216 .globl v4wb_dma_flush_range
217 .set v4wb_dma_flush_range, v4wb_coherent_kern_range 217 .set v4wb_dma_flush_range, v4wb_coherent_kern_range
218 218
219/*
220 * dma_map_area(start, size, dir)
221 * - start - kernel virtual start address
222 * - size - size of region
223 * - dir - DMA direction
224 */
225ENTRY(v4wb_dma_map_area)
226 add r1, r1, r0
227 cmp r2, #DMA_TO_DEVICE
228 beq v4wb_dma_clean_range
229 bcs v4wb_dma_inv_range
230 b v4wb_dma_flush_range
231ENDPROC(v4wb_dma_map_area)
232
233/*
234 * dma_unmap_area(start, size, dir)
235 * - start - kernel virtual start address
236 * - size - size of region
237 * - dir - DMA direction
238 */
239ENTRY(v4wb_dma_unmap_area)
240 mov pc, lr
241ENDPROC(v4wb_dma_unmap_area)
242
219 __INITDATA 243 __INITDATA
220 244
221 .type v4wb_cache_fns, #object 245 .type v4wb_cache_fns, #object
@@ -226,6 +250,8 @@ ENTRY(v4wb_cache_fns)
226 .long v4wb_coherent_kern_range 250 .long v4wb_coherent_kern_range
227 .long v4wb_coherent_user_range 251 .long v4wb_coherent_user_range
228 .long v4wb_flush_kern_dcache_area 252 .long v4wb_flush_kern_dcache_area
253 .long v4wb_dma_map_area
254 .long v4wb_dma_unmap_area
229 .long v4wb_dma_inv_range 255 .long v4wb_dma_inv_range
230 .long v4wb_dma_clean_range 256 .long v4wb_dma_clean_range
231 .long v4wb_dma_flush_range 257 .long v4wb_dma_flush_range
diff --git a/arch/arm/mm/cache-v4wt.S b/arch/arm/mm/cache-v4wt.S
index b3b7410270b4..3d8dad5b2650 100644
--- a/arch/arm/mm/cache-v4wt.S
+++ b/arch/arm/mm/cache-v4wt.S
@@ -172,6 +172,29 @@ ENTRY(v4wt_dma_clean_range)
172 .globl v4wt_dma_flush_range 172 .globl v4wt_dma_flush_range
173 .equ v4wt_dma_flush_range, v4wt_dma_inv_range 173 .equ v4wt_dma_flush_range, v4wt_dma_inv_range
174 174
175/*
176 * dma_unmap_area(start, size, dir)
177 * - start - kernel virtual start address
178 * - size - size of region
179 * - dir - DMA direction
180 */
181ENTRY(v4wt_dma_unmap_area)
182 add r1, r1, r0
183 teq r2, #DMA_TO_DEVICE
184 bne v4wt_dma_inv_range
185 /* FALLTHROUGH */
186
187/*
188 * dma_map_area(start, size, dir)
189 * - start - kernel virtual start address
190 * - size - size of region
191 * - dir - DMA direction
192 */
193ENTRY(v4wt_dma_map_area)
194 mov pc, lr
195ENDPROC(v4wt_dma_unmap_area)
196ENDPROC(v4wt_dma_map_area)
197
175 __INITDATA 198 __INITDATA
176 199
177 .type v4wt_cache_fns, #object 200 .type v4wt_cache_fns, #object
@@ -182,6 +205,8 @@ ENTRY(v4wt_cache_fns)
182 .long v4wt_coherent_kern_range 205 .long v4wt_coherent_kern_range
183 .long v4wt_coherent_user_range 206 .long v4wt_coherent_user_range
184 .long v4wt_flush_kern_dcache_area 207 .long v4wt_flush_kern_dcache_area
208 .long v4wt_dma_map_area
209 .long v4wt_dma_unmap_area
185 .long v4wt_dma_inv_range 210 .long v4wt_dma_inv_range
186 .long v4wt_dma_clean_range 211 .long v4wt_dma_clean_range
187 .long v4wt_dma_flush_range 212 .long v4wt_dma_flush_range
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S
index 4ba0a24ce6f5..6f926dd0e0f7 100644
--- a/arch/arm/mm/cache-v6.S
+++ b/arch/arm/mm/cache-v6.S
@@ -263,6 +263,30 @@ ENTRY(v6_dma_flush_range)
263 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer 263 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
264 mov pc, lr 264 mov pc, lr
265 265
266/*
267 * dma_map_area(start, size, dir)
268 * - start - kernel virtual start address
269 * - size - size of region
270 * - dir - DMA direction
271 */
272ENTRY(v6_dma_map_area)
273 add r1, r1, r0
274 cmp r2, #DMA_TO_DEVICE
275 beq v6_dma_clean_range
276 bcs v6_dma_inv_range
277 b v6_dma_flush_range
278ENDPROC(v6_dma_map_area)
279
280/*
281 * dma_unmap_area(start, size, dir)
282 * - start - kernel virtual start address
283 * - size - size of region
284 * - dir - DMA direction
285 */
286ENTRY(v6_dma_unmap_area)
287 mov pc, lr
288ENDPROC(v6_dma_unmap_area)
289
266 __INITDATA 290 __INITDATA
267 291
268 .type v6_cache_fns, #object 292 .type v6_cache_fns, #object
@@ -273,6 +297,8 @@ ENTRY(v6_cache_fns)
273 .long v6_coherent_kern_range 297 .long v6_coherent_kern_range
274 .long v6_coherent_user_range 298 .long v6_coherent_user_range
275 .long v6_flush_kern_dcache_area 299 .long v6_flush_kern_dcache_area
300 .long v6_dma_map_area
301 .long v6_dma_unmap_area
276 .long v6_dma_inv_range 302 .long v6_dma_inv_range
277 .long v6_dma_clean_range 303 .long v6_dma_clean_range
278 .long v6_dma_flush_range 304 .long v6_dma_flush_range
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
index 9073db849fb4..e30d8bc67182 100644
--- a/arch/arm/mm/cache-v7.S
+++ b/arch/arm/mm/cache-v7.S
@@ -271,6 +271,30 @@ ENTRY(v7_dma_flush_range)
271 mov pc, lr 271 mov pc, lr
272ENDPROC(v7_dma_flush_range) 272ENDPROC(v7_dma_flush_range)
273 273
274/*
275 * dma_map_area(start, size, dir)
276 * - start - kernel virtual start address
277 * - size - size of region
278 * - dir - DMA direction
279 */
280ENTRY(v7_dma_map_area)
281 add r1, r1, r0
282 cmp r2, #DMA_TO_DEVICE
283 beq v7_dma_clean_range
284 bcs v7_dma_inv_range
285 b v7_dma_flush_range
286ENDPROC(v7_dma_map_area)
287
288/*
289 * dma_unmap_area(start, size, dir)
290 * - start - kernel virtual start address
291 * - size - size of region
292 * - dir - DMA direction
293 */
294ENTRY(v7_dma_unmap_area)
295 mov pc, lr
296ENDPROC(v7_dma_unmap_area)
297
274 __INITDATA 298 __INITDATA
275 299
276 .type v7_cache_fns, #object 300 .type v7_cache_fns, #object
@@ -281,6 +305,8 @@ ENTRY(v7_cache_fns)
281 .long v7_coherent_kern_range 305 .long v7_coherent_kern_range
282 .long v7_coherent_user_range 306 .long v7_coherent_user_range
283 .long v7_flush_kern_dcache_area 307 .long v7_flush_kern_dcache_area
308 .long v7_dma_map_area
309 .long v7_dma_unmap_area
284 .long v7_dma_inv_range 310 .long v7_dma_inv_range
285 .long v7_dma_clean_range 311 .long v7_dma_clean_range
286 .long v7_dma_flush_range 312 .long v7_dma_flush_range
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 0d68d2c83cda..efa8efa33f5e 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -406,35 +406,31 @@ EXPORT_SYMBOL(dma_free_coherent);
406 */ 406 */
407static void dma_cache_maint(const void *start, size_t size, int direction) 407static void dma_cache_maint(const void *start, size_t size, int direction)
408{ 408{
409 void (*inner_op)(const void *, const void *);
410 void (*outer_op)(unsigned long, unsigned long); 409 void (*outer_op)(unsigned long, unsigned long);
411 410
412 BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(start + size - 1));
413
414 switch (direction) { 411 switch (direction) {
415 case DMA_FROM_DEVICE: /* invalidate only */ 412 case DMA_FROM_DEVICE: /* invalidate only */
416 inner_op = dmac_inv_range;
417 outer_op = outer_inv_range; 413 outer_op = outer_inv_range;
418 break; 414 break;
419 case DMA_TO_DEVICE: /* writeback only */ 415 case DMA_TO_DEVICE: /* writeback only */
420 inner_op = dmac_clean_range;
421 outer_op = outer_clean_range; 416 outer_op = outer_clean_range;
422 break; 417 break;
423 case DMA_BIDIRECTIONAL: /* writeback and invalidate */ 418 case DMA_BIDIRECTIONAL: /* writeback and invalidate */
424 inner_op = dmac_flush_range;
425 outer_op = outer_flush_range; 419 outer_op = outer_flush_range;
426 break; 420 break;
427 default: 421 default:
428 BUG(); 422 BUG();
429 } 423 }
430 424
431 inner_op(start, start + size);
432 outer_op(__pa(start), __pa(start) + size); 425 outer_op(__pa(start), __pa(start) + size);
433} 426}
434 427
435void ___dma_single_cpu_to_dev(const void *kaddr, size_t size, 428void ___dma_single_cpu_to_dev(const void *kaddr, size_t size,
436 enum dma_data_direction dir) 429 enum dma_data_direction dir)
437{ 430{
431 BUG_ON(!virt_addr_valid(kaddr) || !virt_addr_valid(kaddr + size - 1));
432
433 dmac_map_area(kaddr, size, dir);
438 dma_cache_maint(kaddr, size, dir); 434 dma_cache_maint(kaddr, size, dir);
439} 435}
440EXPORT_SYMBOL(___dma_single_cpu_to_dev); 436EXPORT_SYMBOL(___dma_single_cpu_to_dev);
@@ -442,12 +438,15 @@ EXPORT_SYMBOL(___dma_single_cpu_to_dev);
442void ___dma_single_dev_to_cpu(const void *kaddr, size_t size, 438void ___dma_single_dev_to_cpu(const void *kaddr, size_t size,
443 enum dma_data_direction dir) 439 enum dma_data_direction dir)
444{ 440{
445 /* nothing to do */ 441 BUG_ON(!virt_addr_valid(kaddr) || !virt_addr_valid(kaddr + size - 1));
442
443 dmac_unmap_area(kaddr, size, dir);
446} 444}
447EXPORT_SYMBOL(___dma_single_dev_to_cpu); 445EXPORT_SYMBOL(___dma_single_dev_to_cpu);
448 446
449static void dma_cache_maint_page(struct page *page, unsigned long offset, 447static void dma_cache_maint_page(struct page *page, unsigned long offset,
450 size_t size, void (*op)(const void *, const void *)) 448 size_t size, enum dma_data_direction dir,
449 void (*op)(const void *, size_t, int))
451{ 450{
452 /* 451 /*
453 * A single sg entry may refer to multiple physically contiguous 452 * A single sg entry may refer to multiple physically contiguous
@@ -471,12 +470,12 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset,
471 vaddr = kmap_high_get(page); 470 vaddr = kmap_high_get(page);
472 if (vaddr) { 471 if (vaddr) {
473 vaddr += offset; 472 vaddr += offset;
474 op(vaddr, vaddr + len); 473 op(vaddr, len, dir);
475 kunmap_high(page); 474 kunmap_high(page);
476 } 475 }
477 } else { 476 } else {
478 vaddr = page_address(page) + offset; 477 vaddr = page_address(page) + offset;
479 op(vaddr, vaddr + len); 478 op(vaddr, len, dir);
480 } 479 }
481 offset = 0; 480 offset = 0;
482 page++; 481 page++;
@@ -488,27 +487,23 @@ void ___dma_page_cpu_to_dev(struct page *page, unsigned long off,
488 size_t size, enum dma_data_direction dir) 487 size_t size, enum dma_data_direction dir)
489{ 488{
490 unsigned long paddr; 489 unsigned long paddr;
491 void (*inner_op)(const void *, const void *);
492 void (*outer_op)(unsigned long, unsigned long); 490 void (*outer_op)(unsigned long, unsigned long);
493 491
494 switch (direction) { 492 switch (direction) {
495 case DMA_FROM_DEVICE: /* invalidate only */ 493 case DMA_FROM_DEVICE: /* invalidate only */
496 inner_op = dmac_inv_range;
497 outer_op = outer_inv_range; 494 outer_op = outer_inv_range;
498 break; 495 break;
499 case DMA_TO_DEVICE: /* writeback only */ 496 case DMA_TO_DEVICE: /* writeback only */
500 inner_op = dmac_clean_range;
501 outer_op = outer_clean_range; 497 outer_op = outer_clean_range;
502 break; 498 break;
503 case DMA_BIDIRECTIONAL: /* writeback and invalidate */ 499 case DMA_BIDIRECTIONAL: /* writeback and invalidate */
504 inner_op = dmac_flush_range;
505 outer_op = outer_flush_range; 500 outer_op = outer_flush_range;
506 break; 501 break;
507 default: 502 default:
508 BUG(); 503 BUG();
509 } 504 }
510 505
511 dma_cache_maint_page(page, off, size, inner_op); 506 dma_cache_maint_page(page, off, size, dir, dmac_map_area);
512 507
513 paddr = page_to_phys(page) + off; 508 paddr = page_to_phys(page) + off;
514 outer_op(paddr, paddr + size); 509 outer_op(paddr, paddr + size);
@@ -518,7 +513,7 @@ EXPORT_SYMBOL(___dma_page_cpu_to_dev);
518void ___dma_page_dev_to_cpu(struct page *page, unsigned long off, 513void ___dma_page_dev_to_cpu(struct page *page, unsigned long off,
519 size_t size, enum dma_data_direction dir) 514 size_t size, enum dma_data_direction dir)
520{ 515{
521 /* nothing to do */ 516 dma_cache_maint_page(page, off, size, dir, dmac_unmap_area);
522} 517}
523EXPORT_SYMBOL(___dma_page_dev_to_cpu); 518EXPORT_SYMBOL(___dma_page_dev_to_cpu);
524 519
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S
index 8012e24282b2..c85f5eb42634 100644
--- a/arch/arm/mm/proc-arm1020.S
+++ b/arch/arm/mm/proc-arm1020.S
@@ -330,6 +330,30 @@ ENTRY(arm1020_dma_flush_range)
330 mcr p15, 0, ip, c7, c10, 4 @ drain WB 330 mcr p15, 0, ip, c7, c10, 4 @ drain WB
331 mov pc, lr 331 mov pc, lr
332 332
333/*
334 * dma_map_area(start, size, dir)
335 * - start - kernel virtual start address
336 * - size - size of region
337 * - dir - DMA direction
338 */
339ENTRY(arm1020_dma_map_area)
340 add r1, r1, r0
341 cmp r2, #DMA_TO_DEVICE
342 beq arm1020_dma_clean_range
343 bcs arm1020_dma_inv_range
344 b arm1020_dma_flush_range
345ENDPROC(arm1020_dma_map_area)
346
347/*
348 * dma_unmap_area(start, size, dir)
349 * - start - kernel virtual start address
350 * - size - size of region
351 * - dir - DMA direction
352 */
353ENTRY(arm1020_dma_unmap_area)
354 mov pc, lr
355ENDPROC(arm1020_dma_unmap_area)
356
333ENTRY(arm1020_cache_fns) 357ENTRY(arm1020_cache_fns)
334 .long arm1020_flush_kern_cache_all 358 .long arm1020_flush_kern_cache_all
335 .long arm1020_flush_user_cache_all 359 .long arm1020_flush_user_cache_all
@@ -337,6 +361,8 @@ ENTRY(arm1020_cache_fns)
337 .long arm1020_coherent_kern_range 361 .long arm1020_coherent_kern_range
338 .long arm1020_coherent_user_range 362 .long arm1020_coherent_user_range
339 .long arm1020_flush_kern_dcache_area 363 .long arm1020_flush_kern_dcache_area
364 .long arm1020_dma_map_area
365 .long arm1020_dma_unmap_area
340 .long arm1020_dma_inv_range 366 .long arm1020_dma_inv_range
341 .long arm1020_dma_clean_range 367 .long arm1020_dma_clean_range
342 .long arm1020_dma_flush_range 368 .long arm1020_dma_flush_range
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S
index 41fe25d234f5..5a3cf7620a2c 100644
--- a/arch/arm/mm/proc-arm1020e.S
+++ b/arch/arm/mm/proc-arm1020e.S
@@ -316,6 +316,30 @@ ENTRY(arm1020e_dma_flush_range)
316 mcr p15, 0, ip, c7, c10, 4 @ drain WB 316 mcr p15, 0, ip, c7, c10, 4 @ drain WB
317 mov pc, lr 317 mov pc, lr
318 318
319/*
320 * dma_map_area(start, size, dir)
321 * - start - kernel virtual start address
322 * - size - size of region
323 * - dir - DMA direction
324 */
325ENTRY(arm1020e_dma_map_area)
326 add r1, r1, r0
327 cmp r2, #DMA_TO_DEVICE
328 beq arm1020e_dma_clean_range
329 bcs arm1020e_dma_inv_range
330 b arm1020e_dma_flush_range
331ENDPROC(arm1020e_dma_map_area)
332
333/*
334 * dma_unmap_area(start, size, dir)
335 * - start - kernel virtual start address
336 * - size - size of region
337 * - dir - DMA direction
338 */
339ENTRY(arm1020e_dma_unmap_area)
340 mov pc, lr
341ENDPROC(arm1020e_dma_unmap_area)
342
319ENTRY(arm1020e_cache_fns) 343ENTRY(arm1020e_cache_fns)
320 .long arm1020e_flush_kern_cache_all 344 .long arm1020e_flush_kern_cache_all
321 .long arm1020e_flush_user_cache_all 345 .long arm1020e_flush_user_cache_all
@@ -323,6 +347,8 @@ ENTRY(arm1020e_cache_fns)
323 .long arm1020e_coherent_kern_range 347 .long arm1020e_coherent_kern_range
324 .long arm1020e_coherent_user_range 348 .long arm1020e_coherent_user_range
325 .long arm1020e_flush_kern_dcache_area 349 .long arm1020e_flush_kern_dcache_area
350 .long arm1020e_dma_map_area
351 .long arm1020e_dma_unmap_area
326 .long arm1020e_dma_inv_range 352 .long arm1020e_dma_inv_range
327 .long arm1020e_dma_clean_range 353 .long arm1020e_dma_clean_range
328 .long arm1020e_dma_flush_range 354 .long arm1020e_dma_flush_range
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S
index 20a5b1b31a70..fec8f5878438 100644
--- a/arch/arm/mm/proc-arm1022.S
+++ b/arch/arm/mm/proc-arm1022.S
@@ -305,6 +305,30 @@ ENTRY(arm1022_dma_flush_range)
305 mcr p15, 0, ip, c7, c10, 4 @ drain WB 305 mcr p15, 0, ip, c7, c10, 4 @ drain WB
306 mov pc, lr 306 mov pc, lr
307 307
308/*
309 * dma_map_area(start, size, dir)
310 * - start - kernel virtual start address
311 * - size - size of region
312 * - dir - DMA direction
313 */
314ENTRY(arm1022_dma_map_area)
315 add r1, r1, r0
316 cmp r2, #DMA_TO_DEVICE
317 beq arm1022_dma_clean_range
318 bcs arm1022_dma_inv_range
319 b arm1022_dma_flush_range
320ENDPROC(arm1022_dma_map_area)
321
322/*
323 * dma_unmap_area(start, size, dir)
324 * - start - kernel virtual start address
325 * - size - size of region
326 * - dir - DMA direction
327 */
328ENTRY(arm1022_dma_unmap_area)
329 mov pc, lr
330ENDPROC(arm1022_dma_unmap_area)
331
308ENTRY(arm1022_cache_fns) 332ENTRY(arm1022_cache_fns)
309 .long arm1022_flush_kern_cache_all 333 .long arm1022_flush_kern_cache_all
310 .long arm1022_flush_user_cache_all 334 .long arm1022_flush_user_cache_all
@@ -312,6 +336,8 @@ ENTRY(arm1022_cache_fns)
312 .long arm1022_coherent_kern_range 336 .long arm1022_coherent_kern_range
313 .long arm1022_coherent_user_range 337 .long arm1022_coherent_user_range
314 .long arm1022_flush_kern_dcache_area 338 .long arm1022_flush_kern_dcache_area
339 .long arm1022_dma_map_area
340 .long arm1022_dma_unmap_area
315 .long arm1022_dma_inv_range 341 .long arm1022_dma_inv_range
316 .long arm1022_dma_clean_range 342 .long arm1022_dma_clean_range
317 .long arm1022_dma_flush_range 343 .long arm1022_dma_flush_range
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S
index 96aedb10fcc4..9ece6f666497 100644
--- a/arch/arm/mm/proc-arm1026.S
+++ b/arch/arm/mm/proc-arm1026.S
@@ -299,6 +299,30 @@ ENTRY(arm1026_dma_flush_range)
299 mcr p15, 0, ip, c7, c10, 4 @ drain WB 299 mcr p15, 0, ip, c7, c10, 4 @ drain WB
300 mov pc, lr 300 mov pc, lr
301 301
302/*
303 * dma_map_area(start, size, dir)
304 * - start - kernel virtual start address
305 * - size - size of region
306 * - dir - DMA direction
307 */
308ENTRY(arm1026_dma_map_area)
309 add r1, r1, r0
310 cmp r2, #DMA_TO_DEVICE
311 beq arm1026_dma_clean_range
312 bcs arm1026_dma_inv_range
313 b arm1026_dma_flush_range
314ENDPROC(arm1026_dma_map_area)
315
316/*
317 * dma_unmap_area(start, size, dir)
318 * - start - kernel virtual start address
319 * - size - size of region
320 * - dir - DMA direction
321 */
322ENTRY(arm1026_dma_unmap_area)
323 mov pc, lr
324ENDPROC(arm1026_dma_unmap_area)
325
302ENTRY(arm1026_cache_fns) 326ENTRY(arm1026_cache_fns)
303 .long arm1026_flush_kern_cache_all 327 .long arm1026_flush_kern_cache_all
304 .long arm1026_flush_user_cache_all 328 .long arm1026_flush_user_cache_all
@@ -306,6 +330,8 @@ ENTRY(arm1026_cache_fns)
306 .long arm1026_coherent_kern_range 330 .long arm1026_coherent_kern_range
307 .long arm1026_coherent_user_range 331 .long arm1026_coherent_user_range
308 .long arm1026_flush_kern_dcache_area 332 .long arm1026_flush_kern_dcache_area
333 .long arm1026_dma_map_area
334 .long arm1026_dma_unmap_area
309 .long arm1026_dma_inv_range 335 .long arm1026_dma_inv_range
310 .long arm1026_dma_clean_range 336 .long arm1026_dma_clean_range
311 .long arm1026_dma_flush_range 337 .long arm1026_dma_flush_range
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S
index 471669e2d7cb..6f6ab2747da6 100644
--- a/arch/arm/mm/proc-arm920.S
+++ b/arch/arm/mm/proc-arm920.S
@@ -288,6 +288,30 @@ ENTRY(arm920_dma_flush_range)
288 mcr p15, 0, r0, c7, c10, 4 @ drain WB 288 mcr p15, 0, r0, c7, c10, 4 @ drain WB
289 mov pc, lr 289 mov pc, lr
290 290
291/*
292 * dma_map_area(start, size, dir)
293 * - start - kernel virtual start address
294 * - size - size of region
295 * - dir - DMA direction
296 */
297ENTRY(arm920_dma_map_area)
298 add r1, r1, r0
299 cmp r2, #DMA_TO_DEVICE
300 beq arm920_dma_clean_range
301 bcs arm920_dma_inv_range
302 b arm920_dma_flush_range
303ENDPROC(arm920_dma_map_area)
304
305/*
306 * dma_unmap_area(start, size, dir)
307 * - start - kernel virtual start address
308 * - size - size of region
309 * - dir - DMA direction
310 */
311ENTRY(arm920_dma_unmap_area)
312 mov pc, lr
313ENDPROC(arm920_dma_unmap_area)
314
291ENTRY(arm920_cache_fns) 315ENTRY(arm920_cache_fns)
292 .long arm920_flush_kern_cache_all 316 .long arm920_flush_kern_cache_all
293 .long arm920_flush_user_cache_all 317 .long arm920_flush_user_cache_all
@@ -295,6 +319,8 @@ ENTRY(arm920_cache_fns)
295 .long arm920_coherent_kern_range 319 .long arm920_coherent_kern_range
296 .long arm920_coherent_user_range 320 .long arm920_coherent_user_range
297 .long arm920_flush_kern_dcache_area 321 .long arm920_flush_kern_dcache_area
322 .long arm920_dma_map_area
323 .long arm920_dma_unmap_area
298 .long arm920_dma_inv_range 324 .long arm920_dma_inv_range
299 .long arm920_dma_clean_range 325 .long arm920_dma_clean_range
300 .long arm920_dma_flush_range 326 .long arm920_dma_flush_range
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S
index ee111b00fa41..4e4396b121ca 100644
--- a/arch/arm/mm/proc-arm922.S
+++ b/arch/arm/mm/proc-arm922.S
@@ -290,6 +290,30 @@ ENTRY(arm922_dma_flush_range)
290 mcr p15, 0, r0, c7, c10, 4 @ drain WB 290 mcr p15, 0, r0, c7, c10, 4 @ drain WB
291 mov pc, lr 291 mov pc, lr
292 292
293/*
294 * dma_map_area(start, size, dir)
295 * - start - kernel virtual start address
296 * - size - size of region
297 * - dir - DMA direction
298 */
299ENTRY(arm922_dma_map_area)
300 add r1, r1, r0
301 cmp r2, #DMA_TO_DEVICE
302 beq arm922_dma_clean_range
303 bcs arm922_dma_inv_range
304 b arm922_dma_flush_range
305ENDPROC(arm922_dma_map_area)
306
307/*
308 * dma_unmap_area(start, size, dir)
309 * - start - kernel virtual start address
310 * - size - size of region
311 * - dir - DMA direction
312 */
313ENTRY(arm922_dma_unmap_area)
314 mov pc, lr
315ENDPROC(arm922_dma_unmap_area)
316
293ENTRY(arm922_cache_fns) 317ENTRY(arm922_cache_fns)
294 .long arm922_flush_kern_cache_all 318 .long arm922_flush_kern_cache_all
295 .long arm922_flush_user_cache_all 319 .long arm922_flush_user_cache_all
@@ -297,6 +321,8 @@ ENTRY(arm922_cache_fns)
297 .long arm922_coherent_kern_range 321 .long arm922_coherent_kern_range
298 .long arm922_coherent_user_range 322 .long arm922_coherent_user_range
299 .long arm922_flush_kern_dcache_area 323 .long arm922_flush_kern_dcache_area
324 .long arm922_dma_map_area
325 .long arm922_dma_unmap_area
300 .long arm922_dma_inv_range 326 .long arm922_dma_inv_range
301 .long arm922_dma_clean_range 327 .long arm922_dma_clean_range
302 .long arm922_dma_flush_range 328 .long arm922_dma_flush_range
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S
index 8deb5bde58e4..7c01c5d1108c 100644
--- a/arch/arm/mm/proc-arm925.S
+++ b/arch/arm/mm/proc-arm925.S
@@ -341,6 +341,30 @@ ENTRY(arm925_dma_flush_range)
341 mcr p15, 0, r0, c7, c10, 4 @ drain WB 341 mcr p15, 0, r0, c7, c10, 4 @ drain WB
342 mov pc, lr 342 mov pc, lr
343 343
344/*
345 * dma_map_area(start, size, dir)
346 * - start - kernel virtual start address
347 * - size - size of region
348 * - dir - DMA direction
349 */
350ENTRY(arm925_dma_map_area)
351 add r1, r1, r0
352 cmp r2, #DMA_TO_DEVICE
353 beq arm925_dma_clean_range
354 bcs arm925_dma_inv_range
355 b arm925_dma_flush_range
356ENDPROC(arm925_dma_map_area)
357
358/*
359 * dma_unmap_area(start, size, dir)
360 * - start - kernel virtual start address
361 * - size - size of region
362 * - dir - DMA direction
363 */
364ENTRY(arm925_dma_unmap_area)
365 mov pc, lr
366ENDPROC(arm925_dma_unmap_area)
367
344ENTRY(arm925_cache_fns) 368ENTRY(arm925_cache_fns)
345 .long arm925_flush_kern_cache_all 369 .long arm925_flush_kern_cache_all
346 .long arm925_flush_user_cache_all 370 .long arm925_flush_user_cache_all
@@ -348,6 +372,8 @@ ENTRY(arm925_cache_fns)
348 .long arm925_coherent_kern_range 372 .long arm925_coherent_kern_range
349 .long arm925_coherent_user_range 373 .long arm925_coherent_user_range
350 .long arm925_flush_kern_dcache_area 374 .long arm925_flush_kern_dcache_area
375 .long arm925_dma_map_area
376 .long arm925_dma_unmap_area
351 .long arm925_dma_inv_range 377 .long arm925_dma_inv_range
352 .long arm925_dma_clean_range 378 .long arm925_dma_clean_range
353 .long arm925_dma_flush_range 379 .long arm925_dma_flush_range
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S
index 64db6e275a44..72a01a4b80ab 100644
--- a/arch/arm/mm/proc-arm926.S
+++ b/arch/arm/mm/proc-arm926.S
@@ -304,6 +304,30 @@ ENTRY(arm926_dma_flush_range)
304 mcr p15, 0, r0, c7, c10, 4 @ drain WB 304 mcr p15, 0, r0, c7, c10, 4 @ drain WB
305 mov pc, lr 305 mov pc, lr
306 306
307/*
308 * dma_map_area(start, size, dir)
309 * - start - kernel virtual start address
310 * - size - size of region
311 * - dir - DMA direction
312 */
313ENTRY(arm926_dma_map_area)
314 add r1, r1, r0
315 cmp r2, #DMA_TO_DEVICE
316 beq arm926_dma_clean_range
317 bcs arm926_dma_inv_range
318 b arm926_dma_flush_range
319ENDPROC(arm926_dma_map_area)
320
321/*
322 * dma_unmap_area(start, size, dir)
323 * - start - kernel virtual start address
324 * - size - size of region
325 * - dir - DMA direction
326 */
327ENTRY(arm926_dma_unmap_area)
328 mov pc, lr
329ENDPROC(arm926_dma_unmap_area)
330
307ENTRY(arm926_cache_fns) 331ENTRY(arm926_cache_fns)
308 .long arm926_flush_kern_cache_all 332 .long arm926_flush_kern_cache_all
309 .long arm926_flush_user_cache_all 333 .long arm926_flush_user_cache_all
@@ -311,6 +335,8 @@ ENTRY(arm926_cache_fns)
311 .long arm926_coherent_kern_range 335 .long arm926_coherent_kern_range
312 .long arm926_coherent_user_range 336 .long arm926_coherent_user_range
313 .long arm926_flush_kern_dcache_area 337 .long arm926_flush_kern_dcache_area
338 .long arm926_dma_map_area
339 .long arm926_dma_unmap_area
314 .long arm926_dma_inv_range 340 .long arm926_dma_inv_range
315 .long arm926_dma_clean_range 341 .long arm926_dma_clean_range
316 .long arm926_dma_flush_range 342 .long arm926_dma_flush_range
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S
index 8196b9f401fb..6bb58fca7270 100644
--- a/arch/arm/mm/proc-arm940.S
+++ b/arch/arm/mm/proc-arm940.S
@@ -233,6 +233,30 @@ ENTRY(arm940_dma_flush_range)
233 mcr p15, 0, ip, c7, c10, 4 @ drain WB 233 mcr p15, 0, ip, c7, c10, 4 @ drain WB
234 mov pc, lr 234 mov pc, lr
235 235
236/*
237 * dma_map_area(start, size, dir)
238 * - start - kernel virtual start address
239 * - size - size of region
240 * - dir - DMA direction
241 */
242ENTRY(arm940_dma_map_area)
243 add r1, r1, r0
244 cmp r2, #DMA_TO_DEVICE
245 beq arm940_dma_clean_range
246 bcs arm940_dma_inv_range
247 b arm940_dma_flush_range
248ENDPROC(arm940_dma_map_area)
249
250/*
251 * dma_unmap_area(start, size, dir)
252 * - start - kernel virtual start address
253 * - size - size of region
254 * - dir - DMA direction
255 */
256ENTRY(arm940_dma_unmap_area)
257 mov pc, lr
258ENDPROC(arm940_dma_unmap_area)
259
236ENTRY(arm940_cache_fns) 260ENTRY(arm940_cache_fns)
237 .long arm940_flush_kern_cache_all 261 .long arm940_flush_kern_cache_all
238 .long arm940_flush_user_cache_all 262 .long arm940_flush_user_cache_all
@@ -240,6 +264,8 @@ ENTRY(arm940_cache_fns)
240 .long arm940_coherent_kern_range 264 .long arm940_coherent_kern_range
241 .long arm940_coherent_user_range 265 .long arm940_coherent_user_range
242 .long arm940_flush_kern_dcache_area 266 .long arm940_flush_kern_dcache_area
267 .long arm940_dma_map_area
268 .long arm940_dma_unmap_area
243 .long arm940_dma_inv_range 269 .long arm940_dma_inv_range
244 .long arm940_dma_clean_range 270 .long arm940_dma_clean_range
245 .long arm940_dma_flush_range 271 .long arm940_dma_flush_range
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S
index 9a951239c86c..ac0f9ba719d7 100644
--- a/arch/arm/mm/proc-arm946.S
+++ b/arch/arm/mm/proc-arm946.S
@@ -275,6 +275,30 @@ ENTRY(arm946_dma_flush_range)
275 mcr p15, 0, r0, c7, c10, 4 @ drain WB 275 mcr p15, 0, r0, c7, c10, 4 @ drain WB
276 mov pc, lr 276 mov pc, lr
277 277
278/*
279 * dma_map_area(start, size, dir)
280 * - start - kernel virtual start address
281 * - size - size of region
282 * - dir - DMA direction
283 */
284ENTRY(arm946_dma_map_area)
285 add r1, r1, r0
286 cmp r2, #DMA_TO_DEVICE
287 beq arm946_dma_clean_range
288 bcs arm946_dma_inv_range
289 b arm946_dma_flush_range
290ENDPROC(arm946_dma_map_area)
291
292/*
293 * dma_unmap_area(start, size, dir)
294 * - start - kernel virtual start address
295 * - size - size of region
296 * - dir - DMA direction
297 */
298ENTRY(arm946_dma_unmap_area)
299 mov pc, lr
300ENDPROC(arm946_dma_unmap_area)
301
278ENTRY(arm946_cache_fns) 302ENTRY(arm946_cache_fns)
279 .long arm946_flush_kern_cache_all 303 .long arm946_flush_kern_cache_all
280 .long arm946_flush_user_cache_all 304 .long arm946_flush_user_cache_all
@@ -282,6 +306,8 @@ ENTRY(arm946_cache_fns)
282 .long arm946_coherent_kern_range 306 .long arm946_coherent_kern_range
283 .long arm946_coherent_user_range 307 .long arm946_coherent_user_range
284 .long arm946_flush_kern_dcache_area 308 .long arm946_flush_kern_dcache_area
309 .long arm946_dma_map_area
310 .long arm946_dma_unmap_area
285 .long arm946_dma_inv_range 311 .long arm946_dma_inv_range
286 .long arm946_dma_clean_range 312 .long arm946_dma_clean_range
287 .long arm946_dma_flush_range 313 .long arm946_dma_flush_range
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S
index dbc39383e66a..97e1d784f152 100644
--- a/arch/arm/mm/proc-feroceon.S
+++ b/arch/arm/mm/proc-feroceon.S
@@ -367,6 +367,44 @@ ENTRY(feroceon_range_dma_flush_range)
367 mcr p15, 0, r0, c7, c10, 4 @ drain WB 367 mcr p15, 0, r0, c7, c10, 4 @ drain WB
368 mov pc, lr 368 mov pc, lr
369 369
370/*
371 * dma_map_area(start, size, dir)
372 * - start - kernel virtual start address
373 * - size - size of region
374 * - dir - DMA direction
375 */
376ENTRY(feroceon_dma_map_area)
377 add r1, r1, r0
378 cmp r2, #DMA_TO_DEVICE
379 beq feroceon_dma_clean_range
380 bcs feroceon_dma_inv_range
381 b feroceon_dma_flush_range
382ENDPROC(feroceon_dma_map_area)
383
384/*
385 * dma_map_area(start, size, dir)
386 * - start - kernel virtual start address
387 * - size - size of region
388 * - dir - DMA direction
389 */
390ENTRY(feroceon_range_dma_map_area)
391 add r1, r1, r0
392 cmp r2, #DMA_TO_DEVICE
393 beq feroceon_range_dma_clean_range
394 bcs feroceon_range_dma_inv_range
395 b feroceon_range_dma_flush_range
396ENDPROC(feroceon_range_dma_map_area)
397
398/*
399 * dma_unmap_area(start, size, dir)
400 * - start - kernel virtual start address
401 * - size - size of region
402 * - dir - DMA direction
403 */
404ENTRY(feroceon_dma_unmap_area)
405 mov pc, lr
406ENDPROC(feroceon_dma_unmap_area)
407
370ENTRY(feroceon_cache_fns) 408ENTRY(feroceon_cache_fns)
371 .long feroceon_flush_kern_cache_all 409 .long feroceon_flush_kern_cache_all
372 .long feroceon_flush_user_cache_all 410 .long feroceon_flush_user_cache_all
@@ -374,6 +412,8 @@ ENTRY(feroceon_cache_fns)
374 .long feroceon_coherent_kern_range 412 .long feroceon_coherent_kern_range
375 .long feroceon_coherent_user_range 413 .long feroceon_coherent_user_range
376 .long feroceon_flush_kern_dcache_area 414 .long feroceon_flush_kern_dcache_area
415 .long feroceon_dma_map_area
416 .long feroceon_dma_unmap_area
377 .long feroceon_dma_inv_range 417 .long feroceon_dma_inv_range
378 .long feroceon_dma_clean_range 418 .long feroceon_dma_clean_range
379 .long feroceon_dma_flush_range 419 .long feroceon_dma_flush_range
@@ -385,6 +425,8 @@ ENTRY(feroceon_range_cache_fns)
385 .long feroceon_coherent_kern_range 425 .long feroceon_coherent_kern_range
386 .long feroceon_coherent_user_range 426 .long feroceon_coherent_user_range
387 .long feroceon_range_flush_kern_dcache_area 427 .long feroceon_range_flush_kern_dcache_area
428 .long feroceon_range_dma_map_area
429 .long feroceon_dma_unmap_area
388 .long feroceon_range_dma_inv_range 430 .long feroceon_range_dma_inv_range
389 .long feroceon_range_dma_clean_range 431 .long feroceon_range_dma_clean_range
390 .long feroceon_range_dma_flush_range 432 .long feroceon_range_dma_flush_range
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S
index 9674d36cc97d..55b7fbec6548 100644
--- a/arch/arm/mm/proc-mohawk.S
+++ b/arch/arm/mm/proc-mohawk.S
@@ -268,6 +268,30 @@ ENTRY(mohawk_dma_flush_range)
268 mcr p15, 0, r0, c7, c10, 4 @ drain WB 268 mcr p15, 0, r0, c7, c10, 4 @ drain WB
269 mov pc, lr 269 mov pc, lr
270 270
271/*
272 * dma_map_area(start, size, dir)
273 * - start - kernel virtual start address
274 * - size - size of region
275 * - dir - DMA direction
276 */
277ENTRY(mohawk_dma_map_area)
278 add r1, r1, r0
279 cmp r2, #DMA_TO_DEVICE
280 beq mohawk_dma_clean_range
281 bcs mohawk_dma_inv_range
282 b mohawk_dma_flush_range
283ENDPROC(mohawk_dma_map_area)
284
285/*
286 * dma_unmap_area(start, size, dir)
287 * - start - kernel virtual start address
288 * - size - size of region
289 * - dir - DMA direction
290 */
291ENTRY(mohawk_dma_unmap_area)
292 mov pc, lr
293ENDPROC(mohawk_dma_unmap_area)
294
271ENTRY(mohawk_cache_fns) 295ENTRY(mohawk_cache_fns)
272 .long mohawk_flush_kern_cache_all 296 .long mohawk_flush_kern_cache_all
273 .long mohawk_flush_user_cache_all 297 .long mohawk_flush_user_cache_all
@@ -275,6 +299,8 @@ ENTRY(mohawk_cache_fns)
275 .long mohawk_coherent_kern_range 299 .long mohawk_coherent_kern_range
276 .long mohawk_coherent_user_range 300 .long mohawk_coherent_user_range
277 .long mohawk_flush_kern_dcache_area 301 .long mohawk_flush_kern_dcache_area
302 .long mohawk_dma_map_area
303 .long mohawk_dma_unmap_area
278 .long mohawk_dma_inv_range 304 .long mohawk_dma_inv_range
279 .long mohawk_dma_clean_range 305 .long mohawk_dma_clean_range
280 .long mohawk_dma_flush_range 306 .long mohawk_dma_flush_range
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S
index 96456f548798..4e4ce889b3e6 100644
--- a/arch/arm/mm/proc-xsc3.S
+++ b/arch/arm/mm/proc-xsc3.S
@@ -304,6 +304,30 @@ ENTRY(xsc3_dma_flush_range)
304 mcr p15, 0, r0, c7, c10, 4 @ data write barrier 304 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
305 mov pc, lr 305 mov pc, lr
306 306
307/*
308 * dma_map_area(start, size, dir)
309 * - start - kernel virtual start address
310 * - size - size of region
311 * - dir - DMA direction
312 */
313ENTRY(xsc3_dma_map_area)
314 add r1, r1, r0
315 cmp r2, #DMA_TO_DEVICE
316 beq xsc3_dma_clean_range
317 bcs xsc3_dma_inv_range
318 b xsc3_dma_flush_range
319ENDPROC(xsc3_dma_map_area)
320
321/*
322 * dma_unmap_area(start, size, dir)
323 * - start - kernel virtual start address
324 * - size - size of region
325 * - dir - DMA direction
326 */
327ENTRY(xsc3_dma_unmap_area)
328 mov pc, lr
329ENDPROC(xsc3_dma_unmap_area)
330
307ENTRY(xsc3_cache_fns) 331ENTRY(xsc3_cache_fns)
308 .long xsc3_flush_kern_cache_all 332 .long xsc3_flush_kern_cache_all
309 .long xsc3_flush_user_cache_all 333 .long xsc3_flush_user_cache_all
@@ -311,6 +335,8 @@ ENTRY(xsc3_cache_fns)
311 .long xsc3_coherent_kern_range 335 .long xsc3_coherent_kern_range
312 .long xsc3_coherent_user_range 336 .long xsc3_coherent_user_range
313 .long xsc3_flush_kern_dcache_area 337 .long xsc3_flush_kern_dcache_area
338 .long xsc3_dma_map_area
339 .long xsc3_dma_unmap_area
314 .long xsc3_dma_inv_range 340 .long xsc3_dma_inv_range
315 .long xsc3_dma_clean_range 341 .long xsc3_dma_clean_range
316 .long xsc3_dma_flush_range 342 .long xsc3_dma_flush_range
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S
index 93df47265f2d..a7999f94bf27 100644
--- a/arch/arm/mm/proc-xscale.S
+++ b/arch/arm/mm/proc-xscale.S
@@ -363,6 +363,43 @@ ENTRY(xscale_dma_flush_range)
363 mcr p15, 0, r0, c7, c10, 4 @ Drain Write (& Fill) Buffer 363 mcr p15, 0, r0, c7, c10, 4 @ Drain Write (& Fill) Buffer
364 mov pc, lr 364 mov pc, lr
365 365
366/*
367 * dma_map_area(start, size, dir)
368 * - start - kernel virtual start address
369 * - size - size of region
370 * - dir - DMA direction
371 */
372ENTRY(xscale_dma_map_area)
373 add r1, r1, r0
374 cmp r2, #DMA_TO_DEVICE
375 beq xscale_dma_clean_range
376 bcs xscale_dma_inv_range
377 b xscale_dma_flush_range
378ENDPROC(xscale_dma_map_area)
379
380/*
381 * dma_map_area(start, size, dir)
382 * - start - kernel virtual start address
383 * - size - size of region
384 * - dir - DMA direction
385 */
386ENTRY(xscale_dma_a0_map_area)
387 add r1, r1, r0
388 teq r2, #DMA_TO_DEVICE
389 beq xscale_dma_clean_range
390 b xscale_dma_flush_range
391ENDPROC(xscsale_dma_a0_map_area)
392
393/*
394 * dma_unmap_area(start, size, dir)
395 * - start - kernel virtual start address
396 * - size - size of region
397 * - dir - DMA direction
398 */
399ENTRY(xscale_dma_unmap_area)
400 mov pc, lr
401ENDPROC(xscale_dma_unmap_area)
402
366ENTRY(xscale_cache_fns) 403ENTRY(xscale_cache_fns)
367 .long xscale_flush_kern_cache_all 404 .long xscale_flush_kern_cache_all
368 .long xscale_flush_user_cache_all 405 .long xscale_flush_user_cache_all
@@ -370,6 +407,8 @@ ENTRY(xscale_cache_fns)
370 .long xscale_coherent_kern_range 407 .long xscale_coherent_kern_range
371 .long xscale_coherent_user_range 408 .long xscale_coherent_user_range
372 .long xscale_flush_kern_dcache_area 409 .long xscale_flush_kern_dcache_area
410 .long xscale_dma_map_area
411 .long xscale_dma_unmap_area
373 .long xscale_dma_inv_range 412 .long xscale_dma_inv_range
374 .long xscale_dma_clean_range 413 .long xscale_dma_clean_range
375 .long xscale_dma_flush_range 414 .long xscale_dma_flush_range
@@ -394,6 +433,8 @@ ENTRY(xscale_80200_A0_A1_cache_fns)
394 .long xscale_coherent_kern_range 433 .long xscale_coherent_kern_range
395 .long xscale_coherent_user_range 434 .long xscale_coherent_user_range
396 .long xscale_flush_kern_dcache_area 435 .long xscale_flush_kern_dcache_area
436 .long xscale_dma_a0_map_area
437 .long xscale_dma_unmap_area
397 .long xscale_dma_flush_range 438 .long xscale_dma_flush_range
398 .long xscale_dma_clean_range 439 .long xscale_dma_clean_range
399 .long xscale_dma_flush_range 440 .long xscale_dma_flush_range