summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2018-04-23 08:55:42 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-05-18 10:39:40 -0400
commit41a25f11016a7847565e323f42615e460354afa4 (patch)
treec83727db6669e6f9a52bec739db452a90bcf6165 /src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C
parent1b04e458595a9e9c5c04dd322f90d4c44129e111 (diff)
downloadtalos-hostboot-41a25f11016a7847565e323f42615e460354afa4.tar.gz
talos-hostboot-41a25f11016a7847565e323f42615e460354afa4.zip
PRD: Resume maint cmd support for MBA
Change-Id: I77b56983eba633104f8b15d6b608cb490c5be48d RTC: 191647 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57918 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Matt Derksen <mderkse1@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59013 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C')
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C
index 5b7e72c03..43fd84545 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemScrubUtils.C
@@ -386,6 +386,146 @@ uint32_t checkEccFirs<TYPE_MBA>( ExtensibleChip * i_chip,
//------------------------------------------------------------------------------
template<>
+uint32_t conditionallyClearEccCounters<TYPE_MBA>( ExtensibleChip * i_chip )
+{
+ #define PRDF_FUNC "[conditionallyClearEccCounters] "
+
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
+
+ uint32_t o_rc = SUCCESS;
+
+ do
+ {
+ // Check for maintenance ECC errors.
+ uint32_t eccAttns = 0;
+ o_rc = checkEccFirs<TYPE_MBA>( i_chip, eccAttns );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "checkEccFirs<TYPE_MBA>(0x%08x) failed",
+ i_chip->getHuid() );
+ break;
+ }
+
+ ExtensibleChip * membChip = getConnectedParent( i_chip, TYPE_MEMBUF );
+ uint8_t mbaPos = i_chip->getPos();
+
+ const char * ec0Reg_str = (0 == mbaPos) ? "MBA0_MBSEC0" : "MBA1_MBSEC0";
+ SCAN_COMM_REGISTER_CLASS * ec0Reg = membChip->getRegister( ec0Reg_str );
+ o_rc = ec0Reg->Read();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Read() failed on %s", ec0Reg_str );
+ break;
+ }
+
+ const char * mbstr_str = (0 == mbaPos) ? "MBSTR_0" : "MBSTR_1";
+ SCAN_COMM_REGISTER_CLASS * mbstr = membChip->getRegister( mbstr_str );
+ o_rc = mbstr->Read();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Read() failed on %s", mbstr_str );
+ break;
+ }
+
+ bool updateEc0 = false;
+ bool clearSymCntrs = false;
+
+ if ( eccAttns & MAINT_SOFT_NCE_ETE )
+ {
+ // Clear Soft CE total count.
+ ec0Reg->SetBitFieldJustified( 0, 12, 0 );
+ updateEc0 = true;
+
+ if ( mbstr->IsBitSet(55) ) clearSymCntrs = true;
+ }
+
+ if ( eccAttns & MAINT_INT_NCE_ETE )
+ {
+ // Clear Intermittent CE total count.
+ ec0Reg->SetBitFieldJustified( 12, 12, 0 );
+ updateEc0 = true;
+
+ if ( mbstr->IsBitSet(56) ) clearSymCntrs = true;
+ }
+
+ if ( eccAttns & MAINT_HARD_NCE_ETE )
+ {
+ // Clear the hard CE total count.
+ ec0Reg->SetBitFieldJustified( 24, 12, 0 );
+ updateEc0 = true;
+
+ if ( mbstr->IsBitSet(57) ) clearSymCntrs = true;
+ }
+
+ if ( updateEc0 )
+ {
+ o_rc = ec0Reg->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Write() failed on %s", ec0Reg_str );
+ break;
+ }
+ }
+
+ if ( clearSymCntrs )
+ {
+ // Clear all of the per symbol counters. Note that there are a total
+ // of 9 MBSSYMECx registers (MBSSYMEC0-MBSSYMEC8) per MBA.
+ for ( uint8_t i = 0; i < 9; i++ )
+ {
+ char reg_str[20];
+ snprintf( reg_str, 20, "MBA%d_MBSSYMEC%d", mbaPos, i );
+
+ SCAN_COMM_REGISTER_CLASS * reg = membChip->getRegister(reg_str);
+
+ reg->clearAllBits();
+
+ o_rc = reg->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Write() failed on %s", reg_str );
+ break;
+ }
+ }
+ if ( SUCCESS != o_rc ) break;
+ }
+
+ if ( eccAttns & MAINT_RCE_ETE )
+ {
+ // Clear only the RCE total count.
+ const char * ec1Reg_str =
+ (0 == mbaPos) ? "MBA0_MBSEC1" : "MBA1_MBSEC1";
+ SCAN_COMM_REGISTER_CLASS * ec1Reg =
+ membChip->getRegister( ec1Reg_str );
+
+ o_rc = ec1Reg->Read();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Read() failed on %s", ec1Reg_str );
+ break;
+ }
+
+ ec1Reg->SetBitFieldJustified( 0, 12, 0 );
+
+ o_rc = ec1Reg->Write();
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "Write() failed on %s", ec1Reg_str );
+ break;
+ }
+ }
+
+ } while(0);
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+template<>
uint32_t setBgScrubThresholds<TYPE_MBA>( ExtensibleChip * i_chip,
const MemRank & i_rank )
{
OpenPOWER on IntegriCloud