diff options
Diffstat (limited to 'arch/arm/mm/proc-xscale.S')
-rw-r--r-- | arch/arm/mm/proc-xscale.S | 76 |
1 files changed, 30 insertions, 46 deletions
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 2dd85273976f..0cce37b93937 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/linkage.h> | 23 | #include <linux/linkage.h> |
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <asm/assembler.h> | 25 | #include <asm/assembler.h> |
26 | #include <asm/elf.h> | 26 | #include <asm/hwcap.h> |
27 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
28 | #include <asm/pgtable-hwdef.h> | 28 | #include <asm/pgtable-hwdef.h> |
29 | #include <asm/page.h> | 29 | #include <asm/page.h> |
@@ -406,8 +406,6 @@ ENTRY(cpu_xscale_dcache_clean_area) | |||
406 | 406 | ||
407 | /* =============================== PageTable ============================== */ | 407 | /* =============================== PageTable ============================== */ |
408 | 408 | ||
409 | #define PTE_CACHE_WRITE_ALLOCATE 0 | ||
410 | |||
411 | /* | 409 | /* |
412 | * cpu_xscale_switch_mm(pgd) | 410 | * cpu_xscale_switch_mm(pgd) |
413 | * | 411 | * |
@@ -431,56 +429,42 @@ ENTRY(cpu_xscale_switch_mm) | |||
431 | * | 429 | * |
432 | * Errata 40: must set memory to write-through for user read-only pages. | 430 | * Errata 40: must set memory to write-through for user read-only pages. |
433 | */ | 431 | */ |
432 | cpu_xscale_mt_table: | ||
433 | .long 0x00 @ L_PTE_MT_UNCACHED | ||
434 | .long PTE_BUFFERABLE @ L_PTE_MT_BUFFERABLE | ||
435 | .long PTE_CACHEABLE @ L_PTE_MT_WRITETHROUGH | ||
436 | .long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEBACK | ||
437 | .long PTE_EXT_TEX(1) | PTE_BUFFERABLE @ L_PTE_MT_DEV_SHARED | ||
438 | .long 0x00 @ unused | ||
439 | .long PTE_EXT_TEX(1) | PTE_CACHEABLE @ L_PTE_MT_MINICACHE | ||
440 | .long PTE_EXT_TEX(1) | PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEALLOC | ||
441 | .long 0x00 @ unused | ||
442 | .long PTE_BUFFERABLE @ L_PTE_MT_DEV_WC | ||
443 | .long 0x00 @ unused | ||
444 | .long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_DEV_CACHED | ||
445 | .long 0x00 @ L_PTE_MT_DEV_NONSHARED | ||
446 | .long 0x00 @ unused | ||
447 | .long 0x00 @ unused | ||
448 | .long 0x00 @ unused | ||
449 | |||
434 | .align 5 | 450 | .align 5 |
435 | ENTRY(cpu_xscale_set_pte_ext) | 451 | ENTRY(cpu_xscale_set_pte_ext) |
436 | str r1, [r0], #-2048 @ linux version | 452 | xscale_set_pte_ext_prologue |
437 | |||
438 | bic r2, r1, #0xff0 | ||
439 | orr r2, r2, #PTE_TYPE_EXT @ extended page | ||
440 | |||
441 | eor r3, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY | ||
442 | |||
443 | tst r3, #L_PTE_USER @ User? | ||
444 | orrne r2, r2, #PTE_EXT_AP_URO_SRW @ yes -> user r/o, system r/w | ||
445 | |||
446 | tst r3, #L_PTE_WRITE | L_PTE_DIRTY @ Write and Dirty? | ||
447 | orreq r2, r2, #PTE_EXT_AP_UNO_SRW @ yes -> user n/a, system r/w | ||
448 | @ combined with user -> user r/w | ||
449 | |||
450 | @ | ||
451 | @ Handle the X bit. We want to set this bit for the minicache | ||
452 | @ (U = E = B = W = 0, C = 1) or when write allocate is enabled, | ||
453 | @ and we have a writeable, cacheable region. If we ignore the | ||
454 | @ U and E bits, we can allow user space to use the minicache as | ||
455 | @ well. | ||
456 | @ | ||
457 | @ X = (C & ~W & ~B) | (C & W & B & write_allocate) | ||
458 | @ | ||
459 | eor ip, r1, #L_PTE_CACHEABLE | ||
460 | tst ip, #L_PTE_CACHEABLE | L_PTE_WRITE | L_PTE_BUFFERABLE | ||
461 | #if PTE_CACHE_WRITE_ALLOCATE | ||
462 | eorne ip, r1, #L_PTE_CACHEABLE | L_PTE_WRITE | L_PTE_BUFFERABLE | ||
463 | tstne ip, #L_PTE_CACHEABLE | L_PTE_WRITE | L_PTE_BUFFERABLE | ||
464 | #endif | ||
465 | orreq r2, r2, #PTE_EXT_TEX(1) | ||
466 | 453 | ||
467 | @ | 454 | @ |
468 | @ Erratum 40: The B bit must be cleared for a user read-only | 455 | @ Erratum 40: must set memory to write-through for user read-only pages |
469 | @ cacheable page. | ||
470 | @ | ||
471 | @ B = B & ~(U & C & ~W) | ||
472 | @ | 456 | @ |
473 | and ip, r1, #L_PTE_USER | L_PTE_WRITE | L_PTE_CACHEABLE | 457 | and ip, r1, #(L_PTE_MT_MASK | L_PTE_USER | L_PTE_WRITE) & ~(4 << 2) |
474 | teq ip, #L_PTE_USER | L_PTE_CACHEABLE | 458 | teq ip, #L_PTE_MT_WRITEBACK | L_PTE_USER |
475 | biceq r2, r2, #PTE_BUFFERABLE | ||
476 | 459 | ||
477 | tst r3, #L_PTE_PRESENT | L_PTE_YOUNG @ Present and Young? | 460 | moveq r1, #L_PTE_MT_WRITETHROUGH |
478 | movne r2, #0 @ no -> fault | 461 | and r1, r1, #L_PTE_MT_MASK |
462 | adr ip, cpu_xscale_mt_table | ||
463 | ldr ip, [ip, r1] | ||
464 | bic r2, r2, #0x0c | ||
465 | orr r2, r2, ip | ||
479 | 466 | ||
480 | str r2, [r0] @ hardware version | 467 | xscale_set_pte_ext_epilogue |
481 | mov ip, #0 | ||
482 | mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line | ||
483 | mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer | ||
484 | mov pc, lr | 468 | mov pc, lr |
485 | 469 | ||
486 | 470 | ||