MIPS: kernel: cpu-probe: Add support for the HardWare Table Walker
authorMarkos Chandras <markos.chandras@imgtec.com>
Mon, 14 Jul 2014 11:46:13 +0000 (12:46 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 1 Aug 2014 22:06:39 +0000 (00:06 +0200)
Detect if the core implements the HTW and set the option accordingly.
Also, add a new kernel parameter called 'nohtw' allowing
the user to disable the htw support and fallback to the software
refill handler.

Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7335/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/kernel/cpu-probe.c

index 2d2e2877b1ea8a98765cd5ad4eef07f8eb249e1d..0d30433db54bab2376a61e517f5ad3d8bb173381 100644 (file)
@@ -54,6 +54,20 @@ static int __init dsp_disable(char *s)
 
 __setup("nodsp", dsp_disable);
 
+static int mips_htw_disabled;
+
+static int __init htw_disable(char *s)
+{
+       mips_htw_disabled = 1;
+       cpu_data[0].options &= ~MIPS_CPU_HTW;
+       write_c0_pwctl(read_c0_pwctl() &
+                      ~(1 << MIPS_PWCTL_PWEN_SHIFT));
+
+       return 1;
+}
+
+__setup("nohtw", htw_disable);
+
 static inline void check_errata(void)
 {
        struct cpuinfo_mips *c = &current_cpu_data;
@@ -321,6 +335,9 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c)
                c->options |= MIPS_CPU_SEGMENTS;
        if (config3 & MIPS_CONF3_MSA)
                c->ases |= MIPS_ASE_MSA;
+       /* Only tested on 32-bit cores */
+       if ((config3 & MIPS_CONF3_PW) && config_enabled(CONFIG_32BIT))
+               c->options |= MIPS_CPU_HTW;
 
        return config3 & MIPS_CONF_M;
 }
@@ -1193,6 +1210,12 @@ void cpu_probe(void)
        if (mips_dsp_disabled)
                c->ases &= ~(MIPS_ASE_DSP | MIPS_ASE_DSP2P);
 
+       if (mips_htw_disabled) {
+               c->options &= ~MIPS_CPU_HTW;
+               write_c0_pwctl(read_c0_pwctl() &
+                              ~(1 << MIPS_PWCTL_PWEN_SHIFT));
+       }
+
        if (c->options & MIPS_CPU_FPU) {
                c->fpu_id = cpu_get_fpu_id();