From: WANG Xuerui <g...@xen0n.name>

[ Upstream commit efd1b4ad3d5178a74387bc5ff69a2d4585f586c6 ]

Previously ExcCode 16 is unconditionally treated as the FTLB parity
exception (FTLBPar), but in fact its semantic is implementation-
dependent. Looking at various manuals it seems the FTLBPar exception is
only present on some recent MIPS Technologies cores, so only register
the handler on these.

Fixes: 75b5b5e0a262790f ("MIPS: Add support for FTLBs")
Reviewed-by: Huacai Chen <che...@lemote.com>
Signed-off-by: WANG Xuerui <g...@xen0n.name>
Cc: Paul Burton <paulbur...@kernel.org>
Signed-off-by: Thomas Bogendoerfer <tsbog...@alpha.franken.de>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 arch/mips/include/asm/cpu-features.h |  4 ++++
 arch/mips/include/asm/cpu.h          |  1 +
 arch/mips/kernel/cpu-probe.c         | 13 +++++++++++++
 arch/mips/kernel/traps.c             |  3 ++-
 4 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/arch/mips/include/asm/cpu-features.h 
b/arch/mips/include/asm/cpu-features.h
index 724dfddcab92d..0b1bc7ed913b2 100644
--- a/arch/mips/include/asm/cpu-features.h
+++ b/arch/mips/include/asm/cpu-features.h
@@ -568,6 +568,10 @@
 # define cpu_has_mac2008_only  __opt(MIPS_CPU_MAC_2008_ONLY)
 #endif
 
+#ifndef cpu_has_ftlbparex
+# define cpu_has_ftlbparex     __opt(MIPS_CPU_FTLBPAREX)
+#endif
+
 #ifdef CONFIG_SMP
 /*
  * Some systems share FTLB RAMs between threads within a core (siblings in
diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h
index 104a509312b30..3a4773714b296 100644
--- a/arch/mips/include/asm/cpu.h
+++ b/arch/mips/include/asm/cpu.h
@@ -425,6 +425,7 @@ enum cpu_type_enum {
 #define MIPS_CPU_MM_SYSAD      BIT_ULL(58)     /* CPU supports write-through 
SysAD Valid merge */
 #define MIPS_CPU_MM_FULL       BIT_ULL(59)     /* CPU supports write-through 
full merge */
 #define MIPS_CPU_MAC_2008_ONLY BIT_ULL(60)     /* CPU Only support MAC2008 
Fused multiply-add instruction */
+#define MIPS_CPU_FTLBPAREX     BIT_ULL(61)     /* CPU has FTLB parity 
exception */
 
 /*
  * CPU ASE encodings
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index def1659fe2621..3404011eb7cff 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -1827,6 +1827,19 @@ static inline void cpu_probe_mips(struct cpuinfo_mips 
*c, unsigned int cpu)
        default:
                break;
        }
+
+       /* Recent MIPS cores use the implementation-dependent ExcCode 16 for
+        * cache/FTLB parity exceptions.
+        */
+       switch (__get_cpu_type(c->cputype)) {
+       case CPU_PROAPTIV:
+       case CPU_P5600:
+       case CPU_P6600:
+       case CPU_I6400:
+       case CPU_I6500:
+               c->options |= MIPS_CPU_FTLBPAREX;
+               break;
+       }
 }
 
 static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu)
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index f655af68176c8..e664d8b43e72b 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -2457,7 +2457,8 @@ void __init trap_init(void)
        if (cpu_has_fpu && !cpu_has_nofpuex)
                set_except_vector(EXCCODE_FPE, handle_fpe);
 
-       set_except_vector(MIPS_EXCCODE_TLBPAR, handle_ftlb);
+       if (cpu_has_ftlbparex)
+               set_except_vector(MIPS_EXCCODE_TLBPAR, handle_ftlb);
 
        if (cpu_has_rixiex) {
                set_except_vector(EXCCODE_TLBRI, tlb_do_page_fault_0);
-- 
2.25.1



Reply via email to