diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2006-03-07 09:42:27 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-03-07 09:42:27 -0500 |
commit | 6a0e243069b09a323255f6e847c87d531961cd96 (patch) | |
tree | 575a7194c86b2b3e1b9db30e283a2f5705e89e99 | |
parent | d11d9b2dd2c43dd99a491df8a83ae28401db0044 (diff) |
[ARM] 3352/1: DSB required for the completion of a TLB maintenance operation
Patch from Catalin Marinas
Chapter B2.7.3 in the latest ARM ARM (with v6 information) states that
the completion of a TLB maintenance operation is only guaranteed by
the execution of a DSB (Data Syncronization Barrier, formerly Data
Write Barrier or Drain Write Buffer).
Note that a DSB is only needed in the flush_tlb_kernel_* functions
since the completion is guaranteed by a mode change (i.e. switching
back to user mode) for the flush_tlb_user_* functions.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/Kconfig | 2 | ||||
-rw-r--r-- | arch/arm/mm/tlb-v6.S | 1 | ||||
-rw-r--r-- | include/asm-arm/tlbflush.h | 6 |
3 files changed, 8 insertions, 1 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 15dc1a0dffbb..9f80fa502f8f 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -78,7 +78,7 @@ menu "System Type" | |||
78 | 78 | ||
79 | choice | 79 | choice |
80 | prompt "ARM system type" | 80 | prompt "ARM system type" |
81 | default ARCH_RPC | 81 | default ARCH_VERSATILE |
82 | 82 | ||
83 | config ARCH_CLPS7500 | 83 | config ARCH_CLPS7500 |
84 | bool "Cirrus-CL-PS7500FE" | 84 | bool "Cirrus-CL-PS7500FE" |
diff --git a/arch/arm/mm/tlb-v6.S b/arch/arm/mm/tlb-v6.S index 6f76b89ef46e..fd6adde39091 100644 --- a/arch/arm/mm/tlb-v6.S +++ b/arch/arm/mm/tlb-v6.S | |||
@@ -80,6 +80,7 @@ ENTRY(v6wbi_flush_kern_tlb_range) | |||
80 | add r0, r0, #PAGE_SZ | 80 | add r0, r0, #PAGE_SZ |
81 | cmp r0, r1 | 81 | cmp r0, r1 |
82 | blo 1b | 82 | blo 1b |
83 | mcr p15, 0, r2, c7, c10, 4 @ data synchronization barrier | ||
83 | mov pc, lr | 84 | mov pc, lr |
84 | 85 | ||
85 | .section ".text.init", #alloc, #execinstr | 86 | .section ".text.init", #alloc, #execinstr |
diff --git a/include/asm-arm/tlbflush.h b/include/asm-arm/tlbflush.h index 9387a5e1ffe0..0c2acc944a0a 100644 --- a/include/asm-arm/tlbflush.h +++ b/include/asm-arm/tlbflush.h | |||
@@ -340,6 +340,12 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | |||
340 | asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (kaddr)); | 340 | asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (kaddr)); |
341 | if (tlb_flag(TLB_V6_I_PAGE)) | 341 | if (tlb_flag(TLB_V6_I_PAGE)) |
342 | asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (kaddr)); | 342 | asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (kaddr)); |
343 | |||
344 | /* The ARM ARM states that the completion of a TLB maintenance | ||
345 | * operation is only guaranteed by a DSB instruction | ||
346 | */ | ||
347 | if (tlb_flag(TLB_V6_U_PAGE | TLB_V6_D_PAGE | TLB_V6_I_PAGE)) | ||
348 | asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero)); | ||
343 | } | 349 | } |
344 | 350 | ||
345 | /* | 351 | /* |