aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/kernel/mca_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64/kernel/mca_drv.c')
-rw-r--r--arch/ia64/kernel/mca_drv.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
index afc1403799c9..5e2d18fbce40 100644
--- a/arch/ia64/kernel/mca_drv.c
+++ b/arch/ia64/kernel/mca_drv.c
@@ -607,6 +607,33 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx,
607 return status; 607 return status;
608} 608}
609 609
610/*
611 * recover_from_tlb_check
612 * @peidx: pointer of index of processor error section
613 *
614 * Return value:
615 * 1 on Success / 0 on Failure
616 */
617static int
618recover_from_tlb_check(peidx_table_t *peidx)
619{
620 sal_log_mod_error_info_t *smei;
621 pal_tlb_check_info_t *ptci;
622
623 smei = (sal_log_mod_error_info_t *)peidx_tlb_check(peidx, 0);
624 ptci = (pal_tlb_check_info_t *)&(smei->check_info);
625
626 /*
627 * Look for signature of a duplicate TLB DTC entry, which is
628 * a SW bug and always fatal.
629 */
630 if (ptci->op == PAL_TLB_CHECK_OP_PURGE
631 && !(ptci->itr || ptci->dtc || ptci->itc))
632 return fatal_mca("Duplicate TLB entry");
633
634 return mca_recovered("TLB check recovered");
635}
636
610/** 637/**
611 * recover_from_processor_error 638 * recover_from_processor_error
612 * @platform: whether there are some platform error section or not 639 * @platform: whether there are some platform error section or not
@@ -652,6 +679,12 @@ recover_from_processor_error(int platform, slidx_table_t *slidx,
652 return fatal_mca("error not contained"); 679 return fatal_mca("error not contained");
653 680
654 /* 681 /*
682 * Look for recoverable TLB check
683 */
684 if (psp->tc && !(psp->cc || psp->bc || psp->rc || psp->uc))
685 return recover_from_tlb_check(peidx);
686
687 /*
655 * The cache check and bus check bits have four possible states 688 * The cache check and bus check bits have four possible states
656 * cc bc 689 * cc bc
657 * 0 0 Weird record, not recovered 690 * 0 0 Weird record, not recovered