aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/proc-feroceon.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/proc-feroceon.S')
-rw-r--r--arch/arm/mm/proc-feroceon.S69
1 files changed, 54 insertions, 15 deletions
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S
index d0d7795200fc..53e632343849 100644
--- a/arch/arm/mm/proc-feroceon.S
+++ b/arch/arm/mm/proc-feroceon.S
@@ -226,16 +226,17 @@ ENTRY(feroceon_coherent_user_range)
226 mov pc, lr 226 mov pc, lr
227 227
228/* 228/*
229 * flush_kern_dcache_page(void *page) 229 * flush_kern_dcache_area(void *addr, size_t size)
230 * 230 *
231 * Ensure no D cache aliasing occurs, either with itself or 231 * Ensure no D cache aliasing occurs, either with itself or
232 * the I cache 232 * the I cache
233 * 233 *
234 * - addr - page aligned address 234 * - addr - kernel address
235 * - size - region size
235 */ 236 */
236 .align 5 237 .align 5
237ENTRY(feroceon_flush_kern_dcache_page) 238ENTRY(feroceon_flush_kern_dcache_area)
238 add r1, r0, #PAGE_SZ 239 add r1, r0, r1
2391: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry 2401: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
240 add r0, r0, #CACHE_DLINESIZE 241 add r0, r0, #CACHE_DLINESIZE
241 cmp r0, r1 242 cmp r0, r1
@@ -246,7 +247,7 @@ ENTRY(feroceon_flush_kern_dcache_page)
246 mov pc, lr 247 mov pc, lr
247 248
248 .align 5 249 .align 5
249ENTRY(feroceon_range_flush_kern_dcache_page) 250ENTRY(feroceon_range_flush_kern_dcache_area)
250 mrs r2, cpsr 251 mrs r2, cpsr
251 add r1, r0, #PAGE_SZ - CACHE_DLINESIZE @ top addr is inclusive 252 add r1, r0, #PAGE_SZ - CACHE_DLINESIZE @ top addr is inclusive
252 orr r3, r2, #PSR_I_BIT 253 orr r3, r2, #PSR_I_BIT
@@ -273,7 +274,7 @@ ENTRY(feroceon_range_flush_kern_dcache_page)
273 * (same as v4wb) 274 * (same as v4wb)
274 */ 275 */
275 .align 5 276 .align 5
276ENTRY(feroceon_dma_inv_range) 277feroceon_dma_inv_range:
277 tst r0, #CACHE_DLINESIZE - 1 278 tst r0, #CACHE_DLINESIZE - 1
278 bic r0, r0, #CACHE_DLINESIZE - 1 279 bic r0, r0, #CACHE_DLINESIZE - 1
279 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry 280 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
@@ -287,7 +288,7 @@ ENTRY(feroceon_dma_inv_range)
287 mov pc, lr 288 mov pc, lr
288 289
289 .align 5 290 .align 5
290ENTRY(feroceon_range_dma_inv_range) 291feroceon_range_dma_inv_range:
291 mrs r2, cpsr 292 mrs r2, cpsr
292 tst r0, #CACHE_DLINESIZE - 1 293 tst r0, #CACHE_DLINESIZE - 1
293 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry 294 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
@@ -313,7 +314,7 @@ ENTRY(feroceon_range_dma_inv_range)
313 * (same as v4wb) 314 * (same as v4wb)
314 */ 315 */
315 .align 5 316 .align 5
316ENTRY(feroceon_dma_clean_range) 317feroceon_dma_clean_range:
317 bic r0, r0, #CACHE_DLINESIZE - 1 318 bic r0, r0, #CACHE_DLINESIZE - 1
3181: mcr p15, 0, r0, c7, c10, 1 @ clean D entry 3191: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
319 add r0, r0, #CACHE_DLINESIZE 320 add r0, r0, #CACHE_DLINESIZE
@@ -323,7 +324,7 @@ ENTRY(feroceon_dma_clean_range)
323 mov pc, lr 324 mov pc, lr
324 325
325 .align 5 326 .align 5
326ENTRY(feroceon_range_dma_clean_range) 327feroceon_range_dma_clean_range:
327 mrs r2, cpsr 328 mrs r2, cpsr
328 cmp r1, r0 329 cmp r1, r0
329 subne r1, r1, #1 @ top address is inclusive 330 subne r1, r1, #1 @ top address is inclusive
@@ -366,15 +367,53 @@ ENTRY(feroceon_range_dma_flush_range)
366 mcr p15, 0, r0, c7, c10, 4 @ drain WB 367 mcr p15, 0, r0, c7, c10, 4 @ drain WB
367 mov pc, lr 368 mov pc, lr
368 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
369ENTRY(feroceon_cache_fns) 408ENTRY(feroceon_cache_fns)
370 .long feroceon_flush_kern_cache_all 409 .long feroceon_flush_kern_cache_all
371 .long feroceon_flush_user_cache_all 410 .long feroceon_flush_user_cache_all
372 .long feroceon_flush_user_cache_range 411 .long feroceon_flush_user_cache_range
373 .long feroceon_coherent_kern_range 412 .long feroceon_coherent_kern_range
374 .long feroceon_coherent_user_range 413 .long feroceon_coherent_user_range
375 .long feroceon_flush_kern_dcache_page 414 .long feroceon_flush_kern_dcache_area
376 .long feroceon_dma_inv_range 415 .long feroceon_dma_map_area
377 .long feroceon_dma_clean_range 416 .long feroceon_dma_unmap_area
378 .long feroceon_dma_flush_range 417 .long feroceon_dma_flush_range
379 418
380ENTRY(feroceon_range_cache_fns) 419ENTRY(feroceon_range_cache_fns)
@@ -383,9 +422,9 @@ ENTRY(feroceon_range_cache_fns)
383 .long feroceon_flush_user_cache_range 422 .long feroceon_flush_user_cache_range
384 .long feroceon_coherent_kern_range 423 .long feroceon_coherent_kern_range
385 .long feroceon_coherent_user_range 424 .long feroceon_coherent_user_range
386 .long feroceon_range_flush_kern_dcache_page 425 .long feroceon_range_flush_kern_dcache_area
387 .long feroceon_range_dma_inv_range 426 .long feroceon_range_dma_map_area
388 .long feroceon_range_dma_clean_range 427 .long feroceon_dma_unmap_area
389 .long feroceon_range_dma_flush_range 428 .long feroceon_range_dma_flush_range
390 429
391 .align 5 430 .align 5