diff options
author | Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> | 2014-07-15 09:09:57 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-08-01 18:06:40 -0400 |
commit | 6575b1d4173eaeff6742a2c6dcbd835bb052952b (patch) | |
tree | 786eada52d0db5a02411bb1aae5a138d4aacc782 | |
parent | 5890f70f15c52d0204a578422f8da828a0ba1096 (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.h | 1 | ||||
-rw-r--r-- | arch/mips/kernel/cpu-probe.c | 9 |
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(); |