aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeonid Yegoshin <Leonid.Yegoshin@imgtec.com>2014-07-15 09:09:57 -0400
committerRalf Baechle <ralf@linux-mips.org>2014-08-01 18:06:40 -0400
commit6575b1d4173eaeff6742a2c6dcbd835bb052952b (patch)
tree786eada52d0db5a02411bb1aae5a138d4aacc782
parent5890f70f15c52d0204a578422f8da828a0ba1096 (diff)
MIPS: kernel: cpu-probe: Detect unique RI/XI exceptions
Detect if the core supports unique exception codes for the Read-Inhibit and Execute-Inhibit exceptions and set the option accordingly. The RI/XI exception support is detected by setting the 27th bit (IEC) of the PageGrain C0 register and reading back the value of that register to verify the bit is enabled. Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> Signed-off-by: Markos Chandras <markos.chandras@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/7340/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/include/asm/mipsregs.h1
-rw-r--r--arch/mips/kernel/cpu-probe.c9
2 files changed, 10 insertions, 0 deletions
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index 417125548bde..9775c1aba4d3 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -265,6 +265,7 @@
265#define PG_XIE (_ULCAST_(1) << 30) 265#define PG_XIE (_ULCAST_(1) << 30)
266#define PG_ELPA (_ULCAST_(1) << 29) 266#define PG_ELPA (_ULCAST_(1) << 29)
267#define PG_ESP (_ULCAST_(1) << 28) 267#define PG_ESP (_ULCAST_(1) << 28)
268#define PG_IEC (_ULCAST_(1) << 27)
268 269
269/* 270/*
270 * R4x00 interrupt enable / cause bits 271 * R4x00 interrupt enable / cause bits
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index 0d30433db54b..cd252fd684b7 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -438,6 +438,15 @@ static void decode_configs(struct cpuinfo_mips *c)
438 438
439 mips_probe_watch_registers(c); 439 mips_probe_watch_registers(c);
440 440
441 if (cpu_has_rixi) {
442 /* Enable the RIXI exceptions */
443 write_c0_pagegrain(read_c0_pagegrain() | PG_IEC);
444 back_to_back_c0_hazard();
445 /* Verify the IEC bit is set */
446 if (read_c0_pagegrain() & PG_IEC)
447 c->options |= MIPS_CPU_RIXIEX;
448 }
449
441#ifndef CONFIG_MIPS_CPS 450#ifndef CONFIG_MIPS_CPS
442 if (cpu_has_mips_r2) { 451 if (cpu_has_mips_r2) {
443 c->core = get_ebase_cpunum(); 452 c->core = get_ebase_cpunum();