diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2017-08-02 13:59:07 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-08-07 12:28:39 -0400 |
commit | 0e2147d8f946014ee4cdc3e4b4d457ad5e91f057 (patch) | |
tree | a7ee213523a729faa7878cd8d891b7741bb1c512 | |
parent | 3da96b958d3b248737febeb85951a0e446787d07 (diff) | |
download | talos-hostboot-0e2147d8f946014ee4cdc3e4b4d457ad5e91f057.tar.gz talos-hostboot-0e2147d8f946014ee4cdc3e4b4d457ad5e91f057.zip |
PRD: Stop commands during MDIA when handling RCD parity error
Change-Id: Ic896637293a398d241b0c9e43c1559ac9869d196
CQ: SW397959
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44194
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44122
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
-rw-r--r-- | src/usr/diag/prdf/common/plat/p9/p9_mcbist_regs.rule | 9 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfP9Mca.C | 42 |
2 files changed, 49 insertions, 2 deletions
diff --git a/src/usr/diag/prdf/common/plat/p9/p9_mcbist_regs.rule b/src/usr/diag/prdf/common/plat/p9/p9_mcbist_regs.rule index 0b6c0465f..4200737bb 100644 --- a/src/usr/diag/prdf/common/plat/p9/p9_mcbist_regs.rule +++ b/src/usr/diag/prdf/common/plat/p9/p9_mcbist_regs.rule @@ -29,6 +29,7 @@ ########################################################################### # P9 MCBIST target MCBISTFIR ########################################################################### + register MCBISTFIR_AND { name "P9 MCBIST target MCBISTFIR AND"; @@ -37,6 +38,14 @@ access write_only; }; + register MCBISTFIR_MASK_OR + { + name "P9 MCBIST target MCBISTFIR MASK OR"; + scomaddr 0x07012305; + capture group never; + access write_only; + }; + ############################################################################ # P9 Memory ECC Address Registers ############################################################################ diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C index 17161c03d..70e91a0f5 100644 --- a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C +++ b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C @@ -112,6 +112,8 @@ int32_t RcdParityError( ExtensibleChip * i_mcaChip, if ( CHECK_STOP == io_sc.service_data->getPrimaryAttnType() ) return SUCCESS; + ExtensibleChip * mcbChip = getConnectedParent( i_mcaChip, TYPE_MCBIST ); + #ifdef __HOSTBOOT_RUNTIME // TPS only supported at runtime. // Recovery is always enabled during runtime. If the threshold is reached, @@ -121,8 +123,6 @@ int32_t RcdParityError( ExtensibleChip * i_mcaChip, { io_sc.service_data->setServiceCall(); - ExtensibleChip * mcbChip = getConnectedParent( i_mcaChip, TYPE_MCBIST ); - McbistDataBundle * mcbdb = getMcbistDataBundle( mcbChip ); std::vector<MemRank> list; @@ -162,6 +162,44 @@ int32_t RcdParityError( ExtensibleChip * i_mcaChip, // predictive if threshold is reached. if ( rcdParityErrorReconfigLoop(i_mcaChip->getTrgt()) ) io_sc.service_data->setServiceCall(); + + if ( isInMdiaMode() ) + { + uint32_t l_rc = SUCCESS; + SCAN_COMM_REGISTER_CLASS * mask = nullptr; + + // Stop any further commands on this MCBIST to avoid subsequent RCD + // errors or potential AUEs. + l_rc = mdiaSendEventMsg( mcbChip->getTrgt(), MDIA::STOP_TESTING ); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC "mdiaSendEventMsg(STOP_TESTING) failed" ); + } + + // Mask the maintenance AUE/IAUE attentions on this MCA because they + // are potential side-effects of the RCD parity errors. + mask = i_mcaChip->getRegister( "MCAECCFIR_MASK_OR" ); + mask->SetBit(33); // maintenance AUE + mask->SetBit(36); // maintenance IAUE + l_rc = mask->Write(); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC "Write() failed on MCAECCFIR_MASK_OR: " + "i_mcaChip=0x%08x", i_mcaChip->getHuid() ); + } + + // Mask the maintenance command complete bits to avoid false + // attentions. + mask = mcbChip->getRegister( "MCBISTFIR_MASK_OR" ); + mask->SetBit(10); // Command complete + mask->SetBit(12); // WAT workaround + l_rc = mask->Write(); + if ( SUCCESS != l_rc ) + { + PRDF_ERR( PRDF_FUNC "Write() failed on MCBISTFIR_MASK_OR: " + "mcbChip=0x%08x", mcbChip->getHuid() ); + } + } } else { |