diff options
Diffstat (limited to 'src/usr/diag/prdf/plat/pegasus')
-rwxr-xr-x | src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C | 12 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.C | 55 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.H | 7 |
3 files changed, 66 insertions, 8 deletions
diff --git a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C index 235e34db6..f6d900fd5 100755 --- a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C +++ b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C @@ -116,7 +116,11 @@ int32_t CenMbaIplCeStats::collectStats( const CenRank & i_stopRank ) // Check if analysis is banned. HalfRankKey banKey = { i_stopRank, portSlct }; - if ( iv_bannedAnalysis[banKey] ) + + // Check if the rank has already been banned. Note that [] will + // create an entry if one does not exist, so used find() instead to + // check for existence in the map. + if ( iv_bannedAnalysis.end() != iv_bannedAnalysis.find(banKey) ) continue; // Update iv_ceSymbols with the new symbol data. @@ -125,17 +129,17 @@ int32_t CenMbaIplCeStats::collectStats( const CenRank & i_stopRank ) // Increment the soft CEs per DRAM. DramKey dramKey = { i_stopRank, dram, portSlct }; - iv_dramMap[dramKey]++; + iv_dramMap[dramKey] += symData[i].count; // Increment the soft CEs per half rank. HalfRankKey rankKey = { i_stopRank, portSlct }; - iv_rankMap[rankKey]++; + iv_rankMap[rankKey] += symData[i].count; // In case of dimm select, rank select does not matter CenRank dimmRank( dimmSlct << DIMM_SLCT_PER_MBA ); // Increment the soft CEs per half dimm select. HalfRankKey dsKey = { dimmRank, portSlct }; - iv_dsMap[dsKey]++; + iv_dsMap[dsKey] += symData[i].count; } } while (0); diff --git a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.C b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.C index f13a5b23c..77a74b071 100644 --- a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.C +++ b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.C @@ -377,12 +377,10 @@ int32_t CenMbaTdCtlr::analyzeCmdComplete( STEP_CODE_DATA_STRUCT & io_sc ) // During MNFG IPL CE, we will get this condition. // During SF read, all CE are reported as Hard CE. // So we will only check for Hard CE threshold. - - // Start TPS Phase 1 - o_rc = startTpsPhase1( io_sc ); + o_rc = handleMnfgCeEte( io_sc ); if ( SUCCESS != o_rc ) { - PRDF_ERR( PRDF_FUNC"startTpsPhase1() failed" ); + PRDF_ERR( PRDF_FUNC"handleMnfgCeEte() failed" ); break; } } @@ -1259,6 +1257,55 @@ int32_t CenMbaTdCtlr::handleMPE( STEP_CODE_DATA_STRUCT & io_sc ) //------------------------------------------------------------------------------ +int32_t CenMbaTdCtlr::handleMnfgCeEte( STEP_CODE_DATA_STRUCT & io_sc ) +{ + #define PRDF_FUNC "[CenMbaTdCtlr::handleMnfgCeEte] " + + using namespace CalloutUtil; + + int32_t o_rc = SUCCESS; + + do + { + MemUtils::MaintSymbols symData; CenSymbol junk; + o_rc = MemUtils::collectCeStats( iv_mbaChip, iv_rank, symData, junk); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC"MemUtils::collectCeStats() failed. MBA:0x%08x", + iv_mbaChip->GetId() ); + break; + } + + // As HW threshold is set as 1 in mdia, we should only get one symbol + // here. If there is no symbol, that is an HW error. + if( 0 == symData.size() ) + { + PRDF_ERR( PRDF_FUNC" symData size is 0. MBA:0x%08x", + iv_mbaChip->GetId() ); + o_rc = FAIL; break; + } + + // Callout the symbol. + MemoryMru memmru ( iv_mbaTrgt, iv_rank, symData[0].symbol ); + io_sc.service_data->SetCallout( memmru ); + + // Start TPS Phase 1 + o_rc = startTpsPhase1( io_sc ); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC"startTpsPhase1() failed" ); + break; + } + + } while(0); + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + int32_t CenMbaTdCtlr::signalMdiaCmdComplete() { #define PRDF_FUNC "[CenMbaTdCtlr::signalMdiaCmdComplete] " diff --git a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.H b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.H index 67849adc6..ca3fd761c 100644 --- a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.H +++ b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.H @@ -112,6 +112,13 @@ class CenMbaTdCtlr : public CenMbaTdCtlrCommon int32_t handleMPE( STEP_CODE_DATA_STRUCT & io_sc ); /** + * @brief Handle CE ETE during MNFG CE analysis. + * @param io_sc Service data collector. + * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. + */ + int32_t handleMnfgCeEte( STEP_CODE_DATA_STRUCT & io_sc ); + + /** * @brief Sends a message to MDIA that a maintenance command has completed. * @note If for some reason PRD needed to do some targeted diagnotics and * on a rank that was not the last rank behind the MBA, this |