diff options
| author | Will Deacon <will.deacon@arm.com> | 2013-04-03 12:16:57 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-04-03 12:39:07 -0400 |
| commit | ae8a8b9553bd3906af74ff4e8d763904d20ab4e5 (patch) | |
| tree | 85406316a071f016d2cfcb79b4f9ef686cfa011b | |
| parent | b00884802043d9102ecc2abfdc37a7b35b30e52a (diff) | |
ARM: 7691/1: mm: kill unused TLB_CAN_READ_FROM_L1_CACHE and use ALT_SMP instead
Many ARMv7 cores have hardware page table walkers that can read the L1
cache. This is discoverable from the ID_MMFR3 register, although this
can be expensive to access from the low-level set_pte functions and is a
pain to cache, particularly with multi-cluster systems.
A useful observation is that the multi-processing extensions for ARMv7
require coherent table walks, meaning that we can make use of ALT_SMP
patching in proc-v7-* to patch away the cache flush safely for these
cores.
Reported-by: Albin Tonnerre <Albin.Tonnerre@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/include/asm/tlbflush.h | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-v6.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-v7-2level.S | 3 | ||||
| -rw-r--r-- | arch/arm/mm/proc-v7-3level.S | 3 | ||||
| -rw-r--r-- | arch/arm/mm/proc-v7.S | 4 |
5 files changed, 7 insertions, 7 deletions
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index 4db8c8820f0d..7a3e48dceb84 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -169,7 +169,7 @@ | |||
| 169 | # define v6wbi_always_flags (-1UL) | 169 | # define v6wbi_always_flags (-1UL) |
| 170 | #endif | 170 | #endif |
| 171 | 171 | ||
| 172 | #define v7wbi_tlb_flags_smp (TLB_WB | TLB_DCLEAN | TLB_BARRIER | \ | 172 | #define v7wbi_tlb_flags_smp (TLB_WB | TLB_BARRIER | \ |
| 173 | TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | \ | 173 | TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | \ |
| 174 | TLB_V7_UIS_ASID | TLB_V7_UIS_BP) | 174 | TLB_V7_UIS_ASID | TLB_V7_UIS_BP) |
| 175 | #define v7wbi_tlb_flags_up (TLB_WB | TLB_DCLEAN | TLB_BARRIER | \ | 175 | #define v7wbi_tlb_flags_up (TLB_WB | TLB_DCLEAN | TLB_BARRIER | \ |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index bcaaa8de9325..a286d4712b57 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
| @@ -80,12 +80,10 @@ ENTRY(cpu_v6_do_idle) | |||
| 80 | mov pc, lr | 80 | mov pc, lr |
| 81 | 81 | ||
| 82 | ENTRY(cpu_v6_dcache_clean_area) | 82 | ENTRY(cpu_v6_dcache_clean_area) |
| 83 | #ifndef TLB_CAN_READ_FROM_L1_CACHE | ||
| 84 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 83 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
| 85 | add r0, r0, #D_CACHE_LINE_SIZE | 84 | add r0, r0, #D_CACHE_LINE_SIZE |
| 86 | subs r1, r1, #D_CACHE_LINE_SIZE | 85 | subs r1, r1, #D_CACHE_LINE_SIZE |
| 87 | bhi 1b | 86 | bhi 1b |
| 88 | #endif | ||
| 89 | mov pc, lr | 87 | mov pc, lr |
| 90 | 88 | ||
| 91 | /* | 89 | /* |
diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S index 78f520bc0e99..9704097c450e 100644 --- a/arch/arm/mm/proc-v7-2level.S +++ b/arch/arm/mm/proc-v7-2level.S | |||
| @@ -110,7 +110,8 @@ ENTRY(cpu_v7_set_pte_ext) | |||
| 110 | ARM( str r3, [r0, #2048]! ) | 110 | ARM( str r3, [r0, #2048]! ) |
| 111 | THUMB( add r0, r0, #2048 ) | 111 | THUMB( add r0, r0, #2048 ) |
| 112 | THUMB( str r3, [r0] ) | 112 | THUMB( str r3, [r0] ) |
| 113 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | 113 | ALT_SMP(mov pc,lr) |
| 114 | ALT_UP (mcr p15, 0, r0, c7, c10, 1) @ flush_pte | ||
| 114 | #endif | 115 | #endif |
| 115 | mov pc, lr | 116 | mov pc, lr |
| 116 | ENDPROC(cpu_v7_set_pte_ext) | 117 | ENDPROC(cpu_v7_set_pte_ext) |
diff --git a/arch/arm/mm/proc-v7-3level.S b/arch/arm/mm/proc-v7-3level.S index 6ffd78c0f9ab..363027e811d6 100644 --- a/arch/arm/mm/proc-v7-3level.S +++ b/arch/arm/mm/proc-v7-3level.S | |||
| @@ -73,7 +73,8 @@ ENTRY(cpu_v7_set_pte_ext) | |||
| 73 | tst r3, #1 << (55 - 32) @ L_PTE_DIRTY | 73 | tst r3, #1 << (55 - 32) @ L_PTE_DIRTY |
| 74 | orreq r2, #L_PTE_RDONLY | 74 | orreq r2, #L_PTE_RDONLY |
| 75 | 1: strd r2, r3, [r0] | 75 | 1: strd r2, r3, [r0] |
| 76 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | 76 | ALT_SMP(mov pc, lr) |
| 77 | ALT_UP (mcr p15, 0, r0, c7, c10, 1) @ flush_pte | ||
| 77 | #endif | 78 | #endif |
| 78 | mov pc, lr | 79 | mov pc, lr |
| 79 | ENDPROC(cpu_v7_set_pte_ext) | 80 | ENDPROC(cpu_v7_set_pte_ext) |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 3a3c015f8d5c..37716b0508e1 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -75,14 +75,14 @@ ENTRY(cpu_v7_do_idle) | |||
| 75 | ENDPROC(cpu_v7_do_idle) | 75 | ENDPROC(cpu_v7_do_idle) |
| 76 | 76 | ||
| 77 | ENTRY(cpu_v7_dcache_clean_area) | 77 | ENTRY(cpu_v7_dcache_clean_area) |
| 78 | #ifndef TLB_CAN_READ_FROM_L1_CACHE | 78 | ALT_SMP(mov pc, lr) @ MP extensions imply L1 PTW |
| 79 | ALT_UP(W(nop)) | ||
| 79 | dcache_line_size r2, r3 | 80 | dcache_line_size r2, r3 |
| 80 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry | 81 | 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry |
| 81 | add r0, r0, r2 | 82 | add r0, r0, r2 |
| 82 | subs r1, r1, r2 | 83 | subs r1, r1, r2 |
| 83 | bhi 1b | 84 | bhi 1b |
| 84 | dsb | 85 | dsb |
| 85 | #endif | ||
| 86 | mov pc, lr | 86 | mov pc, lr |
| 87 | ENDPROC(cpu_v7_dcache_clean_area) | 87 | ENDPROC(cpu_v7_dcache_clean_area) |
| 88 | 88 | ||
