diff options
author | Sachin Gupta <sgupta2m@in.ibm.com> | 2014-03-24 12:19:21 +0530 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-04-02 16:00:36 -0500 |
commit | e4bbb69907572d844427b3154ba104cbdd145dc5 (patch) | |
tree | 1305ada0c48bdf031c3122e5b22fc9be28284644 /src/usr/diag/prdf/plat | |
parent | 10694290ff548014921900b36bbdec69a0c42edd (diff) | |
download | talos-hostboot-e4bbb69907572d844427b3154ba104cbdd145dc5.tar.gz talos-hostboot-e4bbb69907572d844427b3154ba104cbdd145dc5.zip |
PRD: Bug fixes in IPL MNFG CE
CQ: SW253505
Change-Id: I2f424e0ccf06214ae984adf6e474977985ac4218
Backport: release-fips810
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/9828
Tested-by: Jenkins Server
Reviewed-by: Christopher T. Phan <cphan@us.ibm.com>
Reviewed-by: Bilicon Patil <bilpatil@in.ibm.com>
Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/9974
Diffstat (limited to 'src/usr/diag/prdf/plat')
-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 |