diff options
Diffstat (limited to 'arch/arm/mm/proc-feroceon.S')
-rw-r--r-- | arch/arm/mm/proc-feroceon.S | 69 |
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 |
237 | ENTRY(feroceon_flush_kern_dcache_page) | 238 | ENTRY(feroceon_flush_kern_dcache_area) |
238 | add r1, r0, #PAGE_SZ | 239 | add r1, r0, r1 |
239 | 1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry | 240 | 1: 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 |
249 | ENTRY(feroceon_range_flush_kern_dcache_page) | 250 | ENTRY(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 |
276 | ENTRY(feroceon_dma_inv_range) | 277 | feroceon_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 |
290 | ENTRY(feroceon_range_dma_inv_range) | 291 | feroceon_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 |
316 | ENTRY(feroceon_dma_clean_range) | 317 | feroceon_dma_clean_range: |
317 | bic r0, r0, #CACHE_DLINESIZE - 1 | 318 | bic r0, r0, #CACHE_DLINESIZE - 1 |
318 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 319 | 1: 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 |
326 | ENTRY(feroceon_range_dma_clean_range) | 327 | feroceon_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 | */ | ||
376 | ENTRY(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 | ||
382 | ENDPROC(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 | */ | ||
390 | ENTRY(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 | ||
396 | ENDPROC(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 | */ | ||
404 | ENTRY(feroceon_dma_unmap_area) | ||
405 | mov pc, lr | ||
406 | ENDPROC(feroceon_dma_unmap_area) | ||
407 | |||
369 | ENTRY(feroceon_cache_fns) | 408 | ENTRY(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 | ||
380 | ENTRY(feroceon_range_cache_fns) | 419 | ENTRY(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 |