summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat
diff options
context:
space:
mode:
authorSachin Gupta <sgupta2m@in.ibm.com>2014-03-24 12:19:21 +0530
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-04-02 16:00:36 -0500
commite4bbb69907572d844427b3154ba104cbdd145dc5 (patch)
tree1305ada0c48bdf031c3122e5b22fc9be28284644 /src/usr/diag/prdf/plat
parent10694290ff548014921900b36bbdec69a0c42edd (diff)
downloadtalos-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-xsrc/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C12
-rw-r--r--src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.C55
-rw-r--r--src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr.H7
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
OpenPOWER on IntegriCloud