aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm/proc-xsc3.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/proc-xsc3.S')
-rw-r--r--arch/arm/mm/proc-xsc3.S52
1 files changed, 42 insertions, 10 deletions
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S
index 2028f3702881..e5797f1c1db7 100644
--- a/arch/arm/mm/proc-xsc3.S
+++ b/arch/arm/mm/proc-xsc3.S
@@ -226,15 +226,16 @@ ENTRY(xsc3_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 */
236ENTRY(xsc3_flush_kern_dcache_page) 237ENTRY(xsc3_flush_kern_dcache_area)
237 add r1, r0, #PAGE_SZ 238 add r1, r0, r1
2381: mcr p15, 0, r0, c7, c14, 1 @ clean/invalidate L1 D line 2391: mcr p15, 0, r0, c7, c14, 1 @ clean/invalidate L1 D line
239 add r0, r0, #CACHELINESIZE 240 add r0, r0, #CACHELINESIZE
240 cmp r0, r1 241 cmp r0, r1
@@ -256,7 +257,7 @@ ENTRY(xsc3_flush_kern_dcache_page)
256 * - start - virtual start address 257 * - start - virtual start address
257 * - end - virtual end address 258 * - end - virtual end address
258 */ 259 */
259ENTRY(xsc3_dma_inv_range) 260xsc3_dma_inv_range:
260 tst r0, #CACHELINESIZE - 1 261 tst r0, #CACHELINESIZE - 1
261 bic r0, r0, #CACHELINESIZE - 1 262 bic r0, r0, #CACHELINESIZE - 1
262 mcrne p15, 0, r0, c7, c10, 1 @ clean L1 D line 263 mcrne p15, 0, r0, c7, c10, 1 @ clean L1 D line
@@ -277,7 +278,7 @@ ENTRY(xsc3_dma_inv_range)
277 * - start - virtual start address 278 * - start - virtual start address
278 * - end - virtual end address 279 * - end - virtual end address
279 */ 280 */
280ENTRY(xsc3_dma_clean_range) 281xsc3_dma_clean_range:
281 bic r0, r0, #CACHELINESIZE - 1 282 bic r0, r0, #CACHELINESIZE - 1
2821: mcr p15, 0, r0, c7, c10, 1 @ clean L1 D line 2831: mcr p15, 0, r0, c7, c10, 1 @ clean L1 D line
283 add r0, r0, #CACHELINESIZE 284 add r0, r0, #CACHELINESIZE
@@ -303,15 +304,39 @@ ENTRY(xsc3_dma_flush_range)
303 mcr p15, 0, r0, c7, c10, 4 @ data write barrier 304 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
304 mov pc, lr 305 mov pc, lr
305 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
306ENTRY(xsc3_cache_fns) 331ENTRY(xsc3_cache_fns)
307 .long xsc3_flush_kern_cache_all 332 .long xsc3_flush_kern_cache_all
308 .long xsc3_flush_user_cache_all 333 .long xsc3_flush_user_cache_all
309 .long xsc3_flush_user_cache_range 334 .long xsc3_flush_user_cache_range
310 .long xsc3_coherent_kern_range 335 .long xsc3_coherent_kern_range
311 .long xsc3_coherent_user_range 336 .long xsc3_coherent_user_range
312 .long xsc3_flush_kern_dcache_page 337 .long xsc3_flush_kern_dcache_area
313 .long xsc3_dma_inv_range 338 .long xsc3_dma_map_area
314 .long xsc3_dma_clean_range 339 .long xsc3_dma_unmap_area
315 .long xsc3_dma_flush_range 340 .long xsc3_dma_flush_range
316 341
317ENTRY(cpu_xsc3_dcache_clean_area) 342ENTRY(cpu_xsc3_dcache_clean_area)
@@ -396,7 +421,7 @@ __xsc3_setup:
396 orr r4, r4, #0x18 @ cache the page table in L2 421 orr r4, r4, #0x18 @ cache the page table in L2
397 mcr p15, 0, r4, c2, c0, 0 @ load page table pointer 422 mcr p15, 0, r4, c2, c0, 0 @ load page table pointer
398 423
399 mov r0, #0 @ don't allow CP access 424 mov r0, #1 << 6 @ cp6 access for early sched_clock
400 mcr p15, 0, r0, c15, c1, 0 @ write CP access register 425 mcr p15, 0, r0, c15, c1, 0 @ write CP access register
401 426
402 mrc p15, 0, r0, c1, c0, 1 @ get auxiliary control reg 427 mrc p15, 0, r0, c1, c0, 1 @ get auxiliary control reg
@@ -406,6 +431,13 @@ __xsc3_setup:
406 431
407 adr r5, xsc3_crval 432 adr r5, xsc3_crval
408 ldmia r5, {r5, r6} 433 ldmia r5, {r5, r6}
434
435#ifdef CONFIG_CACHE_XSC3L2
436 mrc p15, 1, r0, c0, c0, 1 @ get L2 present information
437 ands r0, r0, #0xf8
438 orrne r6, r6, #(1 << 26) @ enable L2 if present
439#endif
440
409 mrc p15, 0, r0, c1, c0, 0 @ get control register 441 mrc p15, 0, r0, c1, c0, 0 @ get control register
410 bic r0, r0, r5 @ ..V. ..R. .... ..A. 442 bic r0, r0, r5 @ ..V. ..R. .... ..A.
411 orr r0, r0, r6 @ ..VI Z..S .... .C.M (mmu) 443 orr r0, r0, r6 @ ..VI Z..S .... .C.M (mmu)