diff options
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
-rw-r--r-- | arch/powerpc/kernel/traps.c | 12 |
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) | |||
437 | int machine_check_e500mc(struct pt_regs *regs) | 437 | int 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) { |