aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
-rw-r--r--arch/powerpc/kernel/traps.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index ec74e203ee04..13c9dcdcba69 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs)
437int machine_check_e500mc(struct pt_regs *regs) 437int machine_check_e500mc(struct pt_regs *regs)
438{ 438{
439 unsigned long mcsr = mfspr(SPRN_MCSR); 439 unsigned long mcsr = mfspr(SPRN_MCSR);
440 unsigned long pvr = mfspr(SPRN_PVR);
440 unsigned long reason = mcsr; 441 unsigned long reason = mcsr;
441 int recoverable = 1; 442 int recoverable = 1;
442 443
@@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs)
478 * may still get logged and cause a machine check. We should 479 * may still get logged and cause a machine check. We should
479 * only treat the non-write shadow case as non-recoverable. 480 * only treat the non-write shadow case as non-recoverable.
480 */ 481 */
481 if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS)) 482 /* On e6500 core, L1 DCWS (Data cache write shadow mode) bit
482 recoverable = 0; 483 * is not implemented but L1 data cache always runs in write
484 * shadow mode. Hence on data cache parity errors HW will
485 * automatically invalidate the L1 Data Cache.
486 */
487 if (PVR_VER(pvr) != PVR_VER_E6500) {
488 if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
489 recoverable = 0;
490 }
483 } 491 }
484 492
485 if (reason & MCSR_L2MMU_MHIT) { 493 if (reason & MCSR_L2MMU_MHIT) {