diff --git a/src/usr/diag/mdia/mdia.C b/src/usr/diag/mdia/mdia.C index d136f6cee15..c05e38a1e2b 100644 --- a/src/usr/diag/mdia/mdia.C +++ b/src/usr/diag/mdia/mdia.C @@ -117,20 +117,16 @@ errlHndl_t runStep(const TargetHandleList & i_targetList) doStepCleanup(globals); - if ( nullptr != top && - 0 != top->getAttr() ) + // If this step completes without the need for a reconfig due to an RCD + // parity error, clear all RCD parity error counters. + ATTR_RECONFIGURE_LOOP_type attr = top->getAttr(); + if ( 0 == (attr & RECONFIGURE_LOOP_RCD_PARITY_ERROR) ) { - // Reset the RCD parity error reconfig loop counter if this step - // completes without an RCD parity error. Note that PRD will only set - // the RCD parity error flag if there is an RCD parity error and the - // total count of reconfig loops is under threshold. At threshold, a - // part will be deconfigured, forcing a reconfig, but the RCD parity - // error flag will not be set to ensure this code is activated and the - // count it reset. - ATTR_RECONFIGURE_LOOP_type attr = top->getAttr(); - if ( 0 == (attr & RECONFIGURE_LOOP_RCD_PARITY_ERROR) ) + TargetHandleList trgtList; getAllChiplets( trgtList, TYPE_MCA ); + for ( auto & trgt : trgtList ) { - top->setAttr(0); + if ( 0 != trgt->getAttr() ) + trgt->setAttr(0); } } diff --git a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C index 84b3a77928b..17161c03d60 100644 --- a/src/usr/diag/prdf/plat/mem/prdfP9Mca.C +++ b/src/usr/diag/prdf/plat/mem/prdfP9Mca.C @@ -109,7 +109,7 @@ int32_t RcdParityError( ExtensibleChip * i_mcaChip, // documented below. // Nothing more to do if this is a checkstop attention. - if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) + if ( CHECK_STOP == io_sc.service_data->getPrimaryAttnType() ) return SUCCESS; #ifdef __HOSTBOOT_RUNTIME // TPS only supported at runtime. @@ -160,7 +160,7 @@ int32_t RcdParityError( ExtensibleChip * i_mcaChip, { // Recovery is disabled. Issue a reconfig loop. Make the error log // predictive if threshold is reached. - if ( rcdParityErrorReconfigLoop() ) + if ( rcdParityErrorReconfigLoop(i_mcaChip->getTrgt()) ) io_sc.service_data->setServiceCall(); } else diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C index 658a9f785f3..3b4aa0e7f32 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C @@ -39,6 +39,7 @@ //#include TODO RTC 164707 #include +#include #include #include @@ -107,15 +108,25 @@ int32_t mdiaSendEventMsg( TargetHandle_t i_trgt, //------------------------------------------------------------------------------ -bool rcdParityErrorReconfigLoop() +bool rcdParityErrorReconfigLoop( TargetHandle_t i_trgt ) { TargetHandle_t top = getSystemTarget(); - // Check the current reconfig count. - uint8_t allowed = top->getAttr(); - uint8_t count = top->getAttr(); + // Get the current reconfig count and increment. + uint8_t count = i_trgt->getAttr() + 1; - if ( count <= allowed ) + // Get the reconfig threshold and check MNFG threshold, if needed. + uint8_t th = top->getAttr() + 1; + if ( mfgMode() ) + { + uint8_t mnfgTh = MfgThresholdMgr::getInstance()-> + getThreshold(ATTR_MNFG_TH_RCD_PARITY_ERRORS); + if ( mnfgTh < th ) + th = mnfgTh; + } + + // If the count is under threshold, trigger a reconfig loop. + if ( count < th ) { // Set the RCD parity error flag in the reconfig loop attribute. This // will trigger a reconfig loop at the end of the current istep. @@ -126,8 +137,8 @@ bool rcdParityErrorReconfigLoop() top->setAttr(attr); } - // Increment the count. - top->setAttr(++count); + // Write the new count to the attribute. + i_trgt->setAttr(count); return false; } diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H index 5151f11b35d..2dcdc628c72 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H +++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.H @@ -65,10 +65,11 @@ int32_t mdiaSendEventMsg( TARGETING::TargetHandle_t i_trgt, /** * @brief Initiates a reconfig loop due to an RCD parity error. + * @param i_trgt An MCA target. * @return True if the number of allowed reconfig loops has been exceeded. * False otherwise. */ -bool rcdParityErrorReconfigLoop(); +bool rcdParityErrorReconfigLoop( TARGETING::TargetHandle_t i_trgt ); /** * @brief Invokes the restore DRAM repairs hardware procedure. diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml index fa10dd73bf4..38085de50c7 100755 --- a/src/usr/targeting/common/xmltohb/target_types.xml +++ b/src/usr/targeting/common/xmltohb/target_types.xml @@ -705,7 +705,6 @@ MNFG_TH_MEMORY_IUES MNFG_TH_MEMORY_IMPES RCD_PARITY_RECONFIG_LOOPS_ALLOWED - RCD_PARITY_RECONFIG_LOOP_COUNT OPT_MEMMAP_GROUP_POLICY BRAZOS_RX_FIFO_OVERRIDE MRW_MBA_CACHELINE_INTERLEAVE_MODE_CONTROL @@ -1939,6 +1938,7 @@ VPD_OVERRIDE_MW_ENABLE VPD_OVERRIDE_MW PRD_HWP_PLID + RCD_PARITY_RECONFIG_LOOP_COUNT