summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2017-08-02 13:59:07 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2017-08-07 12:28:39 -0400
commit0e2147d8f946014ee4cdc3e4b4d457ad5e91f057 (patch)
treea7ee213523a729faa7878cd8d891b7741bb1c512
parent3da96b958d3b248737febeb85951a0e446787d07 (diff)
downloadtalos-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.rule9
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfP9Mca.C42
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
{
OpenPOWER on IntegriCloud