diff options
author | Steven J. Hill <sjhill@mips.com> | 2012-08-29 00:20:08 -0400 |
---|---|---|
committer | Steven J. Hill <sjhill@mips.com> | 2012-09-13 16:43:52 -0400 |
commit | 625c0a21700bdb90844d926a1508a17a77e369c9 (patch) | |
tree | cda27e3f4b541e91d92788fa18985bfa20a6b119 /arch/mips/mm/tlbex.c | |
parent | 3234f4466934f08136736790e3de3c6debc71271 (diff) |
MIPS: Avoid pipeline stalls on some MIPS32R2 cores.
The architecture specification says that an EHB instruction is
needed to avoid a hazard when writing TLB entries. However, some
cores do not have this hazard, and thus the EHB instruction causes
a costly pipeline stall. Detect these cores and do not use the EHB
instruction.
Signed-off-by: Steven J. Hill <sjhill@mips.com>
Diffstat (limited to 'arch/mips/mm/tlbex.c')
-rw-r--r-- | arch/mips/mm/tlbex.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 03eb0ef91580..22ba108d708d 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -449,8 +449,20 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l, | |||
449 | } | 449 | } |
450 | 450 | ||
451 | if (cpu_has_mips_r2) { | 451 | if (cpu_has_mips_r2) { |
452 | if (cpu_has_mips_r2_exec_hazard) | 452 | /* |
453 | * The architecture spec says an ehb is required here, | ||
454 | * but a number of cores do not have the hazard and | ||
455 | * using an ehb causes an expensive pipeline stall. | ||
456 | */ | ||
457 | switch (current_cpu_type()) { | ||
458 | case CPU_M14KC: | ||
459 | case CPU_74K: | ||
460 | break; | ||
461 | |||
462 | default: | ||
453 | uasm_i_ehb(p); | 463 | uasm_i_ehb(p); |
464 | break; | ||
465 | } | ||
454 | tlbw(p); | 466 | tlbw(p); |
455 | return; | 467 | return; |
456 | } | 468 | } |