summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2018-04-09 21:37:56 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-04-19 16:45:24 -0400
commit87201e7f578f9ef54513009acb539af2b1eab43b (patch)
treed500f1ee1f9e66c6a7ebe6341634e1904f466003
parent360d83a83ec25acbdb6b40e3c773e017c75b6cb4 (diff)
downloadtalos-hostboot-87201e7f578f9ef54513009acb539af2b1eab43b.tar.gz
talos-hostboot-87201e7f578f9ef54513009acb539af2b1eab43b.zip
PRD: add full maint cmd support for all VCM procedures
Change-Id: Id7467120889831e07fa59cd64977b866a8c79ee7 RTC: 190428 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57151 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Caleb N. Palmer <cnpalmer@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/57132 CI-Ready: Zane C. Shelley <zshelle@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemMark.H10
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C82
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemVcm.H56
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C76
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C67
-rw-r--r--src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr_ipl.C265
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.C22
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.H18
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_ipl.C140
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices_rt.C55
10 files changed, 212 insertions, 579 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H
index 4958ec985..8ea692ea9 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemMark.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -216,6 +216,14 @@ uint32_t balance( ExtensibleChip * i_chip, const MemRank & i_rank,
io_sc.service_data->setServiceCall();
io_sc.service_data->setSignature( i_chip->getHuid(),
PRDFSIG_AllDramRepairs );
+
+ // The chip and symbol mark may be on different DIMMs (Centaur ranks
+ // span two DIMMs). Therefore, we must add both to the callout list
+ // to ensure all DIMMs are in the callout list.
+ MemoryMru cm_mm { i_chip->getTrgt(), i_rank, chipMark.getSymbol() };
+ MemoryMru sm_mm { i_chip->getTrgt(), i_rank, symMark.getSymbol() };
+ io_sc.service_data->SetCallout( cm_mm );
+ io_sc.service_data->SetCallout( sm_mm );
}
} while (0);
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C
index 758e88454..b4a67b690 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -1201,84 +1201,28 @@ int32_t CenMbaTdCtlr::analyzeTpsPhase1( STEP_CODE_DATA_STRUCT & io_sc,
int32_t CenMbaTdCtlr::startVcmPhase1( STEP_CODE_DATA_STRUCT & io_sc )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::startVcmPhase1] "
+ // Starting a new phase of VCM procedure. Reset the scrub resume counter
+ iv_scrubResumeCounter.reset();
- int32_t o_rc = SUCCESS;
-
- io_sc.service_data->AddSignatureList( iv_mbaTrgt, PRDFSIG_StartVcmPhase1 );
- iv_tdState = VCM_PHASE_1;
-
- do
- {
- // Starting a new phase of VCM procedure. Reset the scrub resume counter
- iv_scrubResumeCounter.reset();
-
- // Get the current marks in hardware (initialize iv_mark).
- o_rc = mssGetMarkStore( iv_mbaTrgt, iv_rank, iv_mark );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "mssGetMarkStore() failed");
- break;
- }
-
- o_rc = prepareNextCmd( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "prepareNextCmd() failed" );
- break;
- }
-
- // Start phase 1.
- o_rc = doTdScrubCmd( COND_RT_VCM_DSD );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "doTdScrubCmd() failed" );
- break;
- }
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // moved to VcmEvent class
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- } while(0);
-
- return o_rc;
-
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
int32_t CenMbaTdCtlr::startVcmPhase2( STEP_CODE_DATA_STRUCT & io_sc )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::startVcmPhase2] "
-
- int32_t o_rc = SUCCESS;
+ // Starting a new phase of VCM procedure. Reset the scrub resume counter
+ iv_scrubResumeCounter.reset();
- io_sc.service_data->AddSignatureList( iv_mbaTrgt, PRDFSIG_StartVcmPhase2 );
- iv_tdState = VCM_PHASE_2;
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // moved to VcmEvent class
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- do
- {
- // Starting a new phase of VCM procedure. Reset the scrub resume counter
- iv_scrubResumeCounter.reset();
-
- o_rc = prepareNextCmd( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "prepareNextCmd() failed" );
- break;
- }
-
- // Start phase 2.
- o_rc = doTdScrubCmd( COND_RT_VCM_DSD | mss_MaintCmd::STOP_ON_MCE );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "doTdScrubCmd() failed" );
- break;
- }
-
- } while(0);
-
- return o_rc;
-
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm.H b/src/usr/diag/prdf/plat/mem/prdfMemVcm.H
index c42598935..28f347030 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemVcm.H
+++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -73,12 +73,13 @@ class VcmEvent : public TdEntry
switch ( iv_phase )
{
case TD_PHASE_0:
- o_rc = startPhase1( io_sc );
+ o_rc = startNextPhase( io_sc );
break;
case TD_PHASE_1:
o_rc = analyzePhase1( io_sc, o_done );
- if ( SUCCESS == o_rc && !o_done ) o_rc = startPhase2( io_sc );
+ if ( SUCCESS == o_rc && !o_done )
+ o_rc = startNextPhase( io_sc );
break;
case TD_PHASE_2:
@@ -110,37 +111,44 @@ class VcmEvent : public TdEntry
private: // functions
/**
- * @brief Starts phase 1 of the procedure.
- * @param io_sc The step code data struct.
+ * @brief Starts the appropriate maintenance command for each phase of the
+ * VCM procedure.
+ * @pre iv_phase must be set appropriately before calling this function.
* @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
*/
- uint32_t startPhase1( STEP_CODE_DATA_STRUCT & io_sc )
- {
- PRDF_TRAC( "[VcmEvent] Starting VCM Phase 1: 0x%08x,0x%02x",
- iv_chip->getHuid(), getKey() );
-
- iv_phase = TD_PHASE_1;
- io_sc.service_data->AddSignatureList( iv_chip->getTrgt(),
- PRDFSIG_StartVcmPhase1 );
-
- return PlatServices::startVcmPhase1<T>( iv_chip, iv_rank );
- }
+ uint32_t startCmd();
/**
- * @brief Starts phase 2 of the procedure.
+ * @brief Starts the next phase of the procedure.
* @param io_sc The step code data struct.
+ * @post iv_phase will be updated appropriately per design.
* @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
*/
- uint32_t startPhase2( STEP_CODE_DATA_STRUCT & io_sc )
+ uint32_t startNextPhase( STEP_CODE_DATA_STRUCT & io_sc )
{
- PRDF_TRAC( "[VcmEvent] Starting VCM Phase 2: 0x%08x,0x%02x",
- iv_chip->getHuid(), getKey() );
+ uint32_t signature = 0;
+
+ switch ( iv_phase )
+ {
+ case TD_PHASE_0:
+ iv_phase = TD_PHASE_1;
+ signature = PRDFSIG_StartVcmPhase1;
+ break;
+
+ case TD_PHASE_1:
+ iv_phase = TD_PHASE_2;
+ signature = PRDFSIG_StartVcmPhase2;
+ break;
+
+ default: PRDF_ASSERT( false ); // invalid phase
+ }
+
+ PRDF_TRAC( "[VcmEvent] Starting VCM Phase %d: 0x%08x,0x%02x",
+ iv_phase, iv_chip->getHuid(), getKey() );
- iv_phase = TD_PHASE_2;
- io_sc.service_data->AddSignatureList( iv_chip->getTrgt(),
- PRDFSIG_StartVcmPhase2 );
+ io_sc.service_data->AddSignatureList( iv_chip->getTrgt(), signature );
- return PlatServices::startVcmPhase2<T>( iv_chip, iv_rank );
+ return startCmd();
}
/**
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C
index bd8a3fde2..2d9458815 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C
@@ -195,6 +195,82 @@ uint32_t VcmEvent<T>::checkEcc( const uint32_t & i_eccAttns,
#undef PRDF_FUNC
}
+//##############################################################################
+//
+// Specializations for MCA
+//
+//##############################################################################
+
+template<>
+uint32_t VcmEvent<TYPE_MCA>::startCmd()
+{
+ #define PRDF_FUNC "[VcmEvent::startCmd] "
+
+ uint32_t o_rc = SUCCESS;
+
+ // No stop conditions.
+ mss::mcbist::stop_conditions stopCond;
+
+ // Start the time based scrub procedure on this master rank.
+ o_rc = startTdScrub<TYPE_MCA>( iv_chip, iv_rank, MASTER_RANK, stopCond );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "startTdScrub(0x%08x,0x%2x) failed",
+ iv_chip->getHuid(), getKey() );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//##############################################################################
+//
+// Specializations for MBA
+//
+//##############################################################################
+
+template<>
+uint32_t VcmEvent<TYPE_MBA>::startCmd()
+{
+ #define PRDF_FUNC "[VcmEvent::startCmd] "
+
+ uint32_t o_rc = SUCCESS;
+
+ uint32_t stopCond = mss_MaintCmd::NO_STOP_CONDITIONS;
+
+ switch ( iv_phase )
+ {
+ case TD_PHASE_1:
+ // Start the steer cleanup procedure on this master rank.
+ o_rc = startTdSteerCleanup<TYPE_MBA>( iv_chip, iv_rank, MASTER_RANK,
+ stopCond );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "startTdSteerCleanup(0x%08x,0x%2x) failed",
+ iv_chip->getHuid(), getKey() );
+ }
+ break;
+
+ case TD_PHASE_2:
+ // Start the superfast read procedure on this master rank.
+ o_rc = startTdSfRead<TYPE_MBA>( iv_chip, iv_rank, MASTER_RANK,
+ stopCond );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "startTdSfRead(0x%08x,0x%2x) failed",
+ iv_chip->getHuid(), getKey() );
+ }
+ break;
+
+ default: PRDF_ASSERT( false ); // invalid phase
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
//------------------------------------------------------------------------------
// Avoid linker errors with the template.
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C
index caf57d763..a6db8d9b3 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C
+++ b/src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -190,6 +190,31 @@ template class VcmEvent<TYPE_MBA>;
//##############################################################################
template<>
+uint32_t VcmEvent<TYPE_MCA>::startCmd()
+{
+ #define PRDF_FUNC "[VcmEvent::startCmd] "
+
+ uint32_t o_rc = SUCCESS;
+
+ // No stop conditions.
+ mss::mcbist::stop_conditions stopCond;
+
+ // Start the time based scrub procedure on this master rank.
+ o_rc = startTdScrub<TYPE_MCA>( iv_chip, iv_rank, MASTER_RANK, stopCond );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "startTdScrub(0x%08x,0x%2x) failed",
+ iv_chip->getHuid(), getKey() );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+template<>
uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns,
STEP_CODE_DATA_STRUCT & io_sc,
bool & o_done )
@@ -272,6 +297,46 @@ uint32_t VcmEvent<TYPE_MCA>::checkEcc( const uint32_t & i_eccAttns,
//##############################################################################
template<>
+uint32_t VcmEvent<TYPE_MBA>::startCmd()
+{
+ #define PRDF_FUNC "[VcmEvent::startCmd] "
+
+ uint32_t o_rc = SUCCESS;
+
+ uint32_t stopCond = mss_MaintCmd::NO_STOP_CONDITIONS;
+
+ // Due to a hardware bug in the Centaur, we must execute runtime maintenance
+ // commands at a very slow rate. Because of this, we decided that we should
+ // stop the command immediately on error if there is a UE so that we can
+ // respond quicker and send a DMD message to the hypervisor as soon as
+ // possible.
+
+ stopCond |= mss_MaintCmd::STOP_ON_UE;
+ stopCond |= mss_MaintCmd::STOP_IMMEDIATE;
+
+ // Again, due to the hardware bug in the Centaur, we want to stop
+ // immediately if there is an MCE found during phase 2 because that
+ // indicates an error was detected on the bad DRAM and fixed by the chip
+ // mark.
+
+ if ( TD_PHASE_2 == iv_phase ) stopCond |= mss_MaintCmd::STOP_ON_MCE;
+
+ // Start the time based scrub procedure on this master rank.
+ o_rc = startTdScrub<TYPE_MBA>( iv_chip, iv_rank, MASTER_RANK, stopCond );
+ if ( SUCCESS != o_rc )
+ {
+ PRDF_ERR( PRDF_FUNC "startTdScrub(0x%08x,0x%2x) failed",
+ iv_chip->getHuid(), getKey() );
+ }
+
+ return o_rc;
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
+template<>
uint32_t VcmEvent<TYPE_MBA>::checkEcc( const uint32_t & i_eccAttns,
STEP_CODE_DATA_STRUCT & io_sc,
bool & o_done )
diff --git a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr_ipl.C b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr_ipl.C
index bbaadfd1a..51975b934 100644
--- a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr_ipl.C
+++ b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr_ipl.C
@@ -376,56 +376,11 @@ int32_t CenMbaTdCtlr::analyzeVcmPhase1( STEP_CODE_DATA_STRUCT & io_sc,
const CenAddr & i_stopAddr,
const CenAddr & i_endAddr )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::analyzeVcmPhase1] "
-
- int32_t o_rc = SUCCESS;
-
- do
- {
- if ( VCM_PHASE_1 != iv_tdState )
- {
- PRDF_ERR( PRDF_FUNC "Invalid state machine configuration" );
- o_rc = FAIL; break;
- }
-
- // Add the mark to the callout list.
- CalloutUtil::calloutMark( iv_mbaTrgt, iv_rank, iv_mark, io_sc );
-
- // Get error condition which caused command to stop
- uint16_t eccErrorMask = NO_ERROR;
- o_rc = checkEccErrors( eccErrorMask, io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "checkEccErrors() failed" );
- break;
- }
-
- if ( (eccErrorMask & UE) || (eccErrorMask & RETRY_CTE) )
- {
- // Handle UE. Highest priority
- o_rc = handleUE( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "handleUE() failed" );
- break;
- }
- }
- else
- {
- // Start VCM Phase 2
- o_rc = startVcmPhase2( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "startVcmPhase2() failed" );
- break;
- }
- }
-
- } while(0);
-
- return o_rc;
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // moved to VcmEvent class
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
@@ -434,83 +389,11 @@ int32_t CenMbaTdCtlr::analyzeVcmPhase2( STEP_CODE_DATA_STRUCT & io_sc,
const CenAddr & i_stopAddr,
const CenAddr & i_endAddr )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::analyzeVcmPhase2] "
-
- int32_t o_rc = SUCCESS;
-
- do
- {
- if ( VCM_PHASE_2 != iv_tdState )
- {
- PRDF_ERR( PRDF_FUNC "Invalid state machine configuration" );
- o_rc = FAIL; break;
- }
-
- // Add the mark to the callout list.
- CalloutUtil::calloutMark( iv_mbaTrgt, iv_rank, iv_mark, io_sc );
-
- // Get error condition which caused command to stop
- uint16_t eccErrorMask = NO_ERROR;
- o_rc = checkEccErrors( eccErrorMask, io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "checkEccErrors() failed" );
- break;
- }
-
- if ( eccErrorMask & UE )
- {
- // Handle UE. Highest priority
- o_rc = handleUE( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "handleUE() failed" );
- break;
- }
- }
- else if ( eccErrorMask & MCE )
- {
- // Chip mark is verified.
-
- // Do callouts, VPD updates, and start DRAM sparing, if possible.
- o_rc = handleMCE_VCM2( io_sc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "handleMCE_VCM2() failed" );
- break;
- }
- }
- else
- {
- // Chip mark verification failed.
-
- iv_tdState = NO_OP; // Abort the TD procedure.
-
- setTdSignature( io_sc, PRDFSIG_VcmFalseAlarm );
-
- // In the field, this error log will be recoverable for now, but we
- // may have to add thresholding later if they become a problem. In
- // manufacturing, this error log will be predictive.
-
- if ( areDramRepairsDisabled() )
- io_sc.service_data->setServiceCall();
-
- // Remove chip mark from hardware.
- iv_mark.clearCM();
- bool blocked; // not possible during MDIA
- o_rc = mssSetMarkStore( iv_mbaTrgt, iv_rank, iv_mark, blocked );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "mssSetMarkStore() failed" );
- break;
- }
- }
-
- } while(0);
-
- return o_rc;
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // moved to VcmEvent class
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
@@ -803,40 +686,22 @@ int32_t CenMbaTdCtlr::analyzeTpsPhase2( STEP_CODE_DATA_STRUCT & io_sc,
int32_t CenMbaTdCtlr::startVcmPhase1( STEP_CODE_DATA_STRUCT & io_sc )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::startVcmPhase1] "
-
- int32_t o_rc = SUCCESS;
-
- io_sc.service_data->AddSignatureList( iv_mbaTrgt, PRDFSIG_StartVcmPhase1 );
- iv_tdState = VCM_PHASE_1;
-
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- // Moved to startVcmPhase1() in prdfPlatServices_ipl.C
+ // moved to VcmEvent class
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- return o_rc;
-
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
int32_t CenMbaTdCtlr::startVcmPhase2( STEP_CODE_DATA_STRUCT & io_sc )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::startVcmPhase2] "
-
- int32_t o_rc = SUCCESS;
-
- io_sc.service_data->AddSignatureList( iv_mbaTrgt, PRDFSIG_StartVcmPhase2 );
- iv_tdState = VCM_PHASE_2;
-
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- // Moved to startVcmPhase2() in prdfPlatServices_ipl.C
+ // moved to VcmEvent class
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- return o_rc;
-
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
@@ -978,109 +843,11 @@ int32_t CenMbaTdCtlr::startTpsPhase2( STEP_CODE_DATA_STRUCT & io_sc )
int32_t CenMbaTdCtlr::handleUE( STEP_CODE_DATA_STRUCT & io_sc )
{
- #define PRDF_FUNC "[CenMbaTdCtlr::handleUE] "
-
- using namespace CalloutUtil;
-
- int32_t o_rc = SUCCESS;
-
- iv_tdState = NO_OP; // Abort the TD procedure.
-
- setTdSignature( io_sc, PRDFSIG_MaintUE );
- io_sc.service_data->setServiceCall();
-
- CenMbaDataBundle * mbadb = getMbaDataBundle( iv_mbaChip );
-
- do
- {
- // Clean up the maintenance command. This is needed just in case the UE
- // isolation procedure is modified to use maintenance commands.
- o_rc = cleanupPrevCmd();
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "cleanupPrevCmd() failed" );
- break;
- }
-
- // Look for all failing bits on this rank.
- CenDqBitmap bitmap;
- o_rc = mssIplUeIsolation( iv_mbaTrgt, iv_rank, bitmap );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "mssIplUeIsolation() failed" );
- break;
- }
-
- // Add UE data to capture data.
- bitmap.getCaptureData( io_sc.service_data->GetCaptureData() );
-
- // Callout the failing DIMMs.
- TargetHandleList callouts;
- for ( int32_t ps = 0; ps < MBA_DIMMS_PER_RANK; ps++ )
- {
- bool badDqs = false;
- o_rc = bitmap.badDqs( ps, badDqs );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "badDqs(%d) failed", ps );
- break;
- }
-
- if ( !badDqs ) continue; // nothing to do.
-
- TargetHandleList dimms = getConnectedDimms(iv_mbaTrgt, iv_rank, ps);
- if ( 0 == dimms.size() )
- {
- PRDF_ERR( PRDF_FUNC "getConnectedDimms(%d) failed", ps );
- o_rc = FAIL; break;
- }
-
- callouts.insert( callouts.end(), dimms.begin(), dimms.end() );
-
- if ( isMfgCeCheckingEnabled() )
- {
- // As we are doing callout for UE, we dont need to do callout
- // during CE for this rank on given port
- mbadb->getIplCeStats()->banAnalysis( iv_rank, ps );
- }
- }
- if ( SUCCESS != o_rc ) break;
-
- if ( 0 == callouts.size() )
- {
- // It is possible the scrub counters have rolled over to zero due to
- // a known DD1.0 hardware bug. In this case, the best we can do is
- // callout both DIMMs, because at minimum we know there was a UE, we
- // just don't know where.
- // NOTE: If this condition happens because of a DD2.0+ bug, the
- // mssIplUeIsolation procedure will callout the Centaur.
- callouts = getConnectedDimms( iv_mbaTrgt, iv_rank );
- if ( 0 == callouts.size() )
- {
- PRDF_ERR( PRDF_FUNC "getConnectedDimms() failed" );
- o_rc = FAIL; break;
- }
-
- if ( isMfgCeCheckingEnabled() )
- {
- // As we are doing callout for UE, we dont need to do callout
- // during CE for this rank on both port
- mbadb->getIplCeStats()->banAnalysis( iv_rank);
- }
- }
-
- // Callout all DIMMs in the list.
- for ( TargetHandleList::iterator i = callouts.begin();
- i != callouts.end(); i++ )
- {
- io_sc.service_data->SetCallout( *i, MRU_HIGH );
- }
-
- } while(0);
-
- return o_rc;
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // moved to MemEcc::handleMemUe()
+ //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #undef PRDF_FUNC
+ return SUCCESS;
}
//------------------------------------------------------------------------------
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.C b/src/usr/diag/prdf/plat/prdfPlatServices.C
index 29acee7e2..b714427bb 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices.C
@@ -749,28 +749,6 @@ uint32_t __startTdScrub_mca( ExtensibleChip * i_mcaChip, const MemRank & i_rank,
//------------------------------------------------------------------------------
template<>
-uint32_t startVcmPhase1<TYPE_MCA>( ExtensibleChip * i_mcaChip,
- const MemRank & i_rank )
-{
- mss::mcbist::stop_conditions stopCond;
-
- return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, MASTER_RANK );
-}
-
-//------------------------------------------------------------------------------
-
-template<>
-uint32_t startVcmPhase2<TYPE_MCA>( ExtensibleChip * i_mcaChip,
- const MemRank & i_rank )
-{
- mss::mcbist::stop_conditions stopCond;
-
- return __startTdScrub_mca( i_mcaChip, i_rank, stopCond, MASTER_RANK );
-}
-
-//------------------------------------------------------------------------------
-
-template<>
uint32_t startTpsPhase1<TYPE_MCA>( ExtensibleChip * i_mcaChip,
const MemRank & i_rank )
{
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.H b/src/usr/diag/prdf/plat/prdfPlatServices.H
index 0a3aa9b1c..2c4510506 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices.H
+++ b/src/usr/diag/prdf/plat/prdfPlatServices.H
@@ -173,24 +173,6 @@ uint32_t startTdScrub( ExtensibleChip * i_chip, const MemRank & i_rank,
AddrRangeType i_rangeType, SCT i_stopCond );
/**
- * @brief Starts a targeted scrub command on the target rank for VCM phase 1.
- * @param i_chip MCA or MBA chip.
- * @param i_rank The rank to target.
- * @return Non-SUCCESS if an internal function fails, otherwise SUCCESS.
- */
-template<TARGETING::TYPE T>
-uint32_t startVcmPhase1( ExtensibleChip * i_chip, const MemRank & i_rank );
-
-/**
- * @brief Starts a targeted scrub command on the target rank for VCM phase 2.
- * @param i_chip MCA or MBA chip.
- * @param i_rank The rank to target.
- * @return Non-SUCCESS if an internal function fails, otherwise SUCCESS.
- */
-template<TARGETING::TYPE T>
-uint32_t startVcmPhase2( ExtensibleChip * i_chip, const MemRank & i_rank );
-
-/**
* @brief Starts a targeted scrub command on the target rank for TPS phase 1.
* @param i_chip MCA or MBA chip.
* @param i_rank The rank to target.
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
index 374b71bf1..3944671a0 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices_ipl.C
@@ -641,146 +641,6 @@ uint32_t startTdSteerCleanup<TYPE_MBA>( ExtensibleChip * i_chip,
//------------------------------------------------------------------------------
template<>
-uint32_t startVcmPhase1<TYPE_MBA>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
-{
- #define PRDF_FUNC "[PlatServices::startVcmPhase1<TYPE_MBA>] "
-
- PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running.
-
- PRDF_ASSERT( nullptr != i_chip );
- PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
-
- uint32_t o_rc = SUCCESS;
-
- // Get the MBA fapi target
- fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiTrgt ( i_chip->getTrgt() );
-
- // Get the stop conditions.
- uint32_t stopCond = mss_MaintCmd::STOP_ON_RETRY_CE_ETE |
- mss_MaintCmd::STOP_ON_END_ADDRESS |
- mss_MaintCmd::ENABLE_CMD_COMPLETE_ATTENTION;
-
- // Note that we set the stop on RCE ETE flag. This requires us to set a
- // threshold in the MBSTR. Fortunately, MDIA sets the threshold for us when
- // it starts the first command on this MBA.
-
- do
- {
- // Get the address range of the master rank.
- fapi2::buffer<uint64_t> saddr, eaddr;
- o_rc = getMemAddrRange<TYPE_MBA>( i_chip, i_rank, saddr, eaddr,
- MASTER_RANK );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
- i_chip->getHuid(), i_rank.getKey() );
- break;
- }
-
- // Clear all of the counters and maintenance ECC attentions.
- o_rc = prepareNextCmd<TYPE_MBA>( i_chip );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed",
- i_chip->getHuid() );
- break;
- }
-
- // Start a steer cleanup command.
- mss_TimeBaseSteerCleanup cmd { fapiTrgt, saddr, eaddr,
- mss_MaintCmd::FAST_MAX_BW_IMPACT,
- stopCond, false };
- errlHndl_t errl;
- FAPI_INVOKE_HWP( errl, cmd.setupAndExecuteCmd );
- if ( nullptr != errl )
- {
- PRDF_ERR( PRDF_FUNC "setupAndExecuteCmd() on 0x%08x,0x%02x failed",
- i_chip->getHuid(), i_rank.getKey() );
- PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
- o_rc = FAIL; break;
- }
-
- } while (0);
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-
-//------------------------------------------------------------------------------
-
-template<>
-uint32_t startVcmPhase2<TYPE_MBA>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
-{
- #define PRDF_FUNC "[PlatServices::startVcmPhase2<TYPE_MBA>] "
-
- PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running.
-
- PRDF_ASSERT( nullptr != i_chip );
- PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
-
- uint32_t o_rc = SUCCESS;
-
- // Get the MBA fapi target
- fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiTrgt ( i_chip->getTrgt() );
-
- // Get the stop conditions.
- uint32_t stopCond = mss_MaintCmd::STOP_ON_END_ADDRESS |
- mss_MaintCmd::ENABLE_CMD_COMPLETE_ATTENTION;
-
- do
- {
- // Get the address range of the master rank.
- fapi2::buffer<uint64_t> saddr, eaddr;
- o_rc = getMemAddrRange<TYPE_MBA>( i_chip, i_rank, saddr, eaddr,
- MASTER_RANK );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "getMemAddrRange(0x%08x,0x%2x) failed",
- i_chip->getHuid(), i_rank.getKey() );
- break;
- }
-
- // Clear all of the counters and maintenance ECC attentions.
- o_rc = prepareNextCmd<TYPE_MBA>( i_chip );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "prepareNextCmd(0x%08x) failed",
- i_chip->getHuid() );
- break;
- }
-
- // Create the new command. Store a pointer to the command in the MBA
- // data bundle so that we can call the cleanup function after the
- // command has completed.
- MbaDataBundle * db = getMbaDataBundle( i_chip );
- PRDF_ASSERT( nullptr == db->iv_sfCmd ); // Code bug.
- db->iv_sfCmd = new mss_SuperFastRead { fapiTrgt, saddr, eaddr,
- stopCond, false };
-
- // Start the super fast read command.
- errlHndl_t errl;
- FAPI_INVOKE_HWP( errl, db->iv_sfCmd->setupAndExecuteCmd );
- if ( nullptr != errl )
- {
- PRDF_ERR( PRDF_FUNC "setupAndExecuteCmd() on 0x%08x,0x%02x failed",
- i_chip->getHuid(), i_rank.getKey() );
- PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
- o_rc = FAIL; break;
- }
-
- } while (0);
-
- return o_rc;
-
- #undef PRDF_FUNC
-}
-
-//------------------------------------------------------------------------------
-
-template<>
uint32_t startTpsPhase1<TYPE_MBA>( ExtensibleChip * i_chip,
const MemRank & i_rank )
{
diff --git a/src/usr/diag/prdf/plat/prdfPlatServices_rt.C b/src/usr/diag/prdf/plat/prdfPlatServices_rt.C
index 6d1528a23..05dcfd265 100644
--- a/src/usr/diag/prdf/plat/prdfPlatServices_rt.C
+++ b/src/usr/diag/prdf/plat/prdfPlatServices_rt.C
@@ -263,61 +263,6 @@ uint32_t resumeBgScrub<TYPE_MBA>( ExtensibleChip * i_chip )
#undef PRDF_FUNC
}
-//------------------------------------------------------------------------------
-
-template<>
-uint32_t startVcmPhase1<TYPE_MBA>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
-{
- #define PRDF_FUNC "[PlatServices::startVcmPhase1<TYPE_MBA>] "
-
- PRDF_ASSERT( nullptr != i_chip );
- PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
-
- // TODO RTC 157888
- // - Start a time based scrub.
- // - If fast scrub is enabled use FAST_MAX_BW_IMPACT speed, otherwise use
- // FAST_MIN_BW_IMPACT speed.
- // - Stop on UE.
- // - Stop on RCE ETE (threshold 2047 field, 1 mnfg).
- // - The command should stop immediately on error, or at the end of the
- // master rank if no errors are found.
-
- PRDF_ERR( "function not implemented yet" );
-
- return SUCCESS;
-
- #undef PRDF_FUNC
-}
-
-//------------------------------------------------------------------------------
-
-template<>
-uint32_t startVcmPhase2<TYPE_MBA>( ExtensibleChip * i_chip,
- const MemRank & i_rank )
-{
- #define PRDF_FUNC "[PlatServices::startVcmPhase2<TYPE_MBA>] "
-
- PRDF_ASSERT( nullptr != i_chip );
- PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
-
- // TODO RTC 157888
- // - Start a time based scrub.
- // - If fast scrub is enabled use FAST_MAX_BW_IMPACT speed, otherwise use
- // FAST_MIN_BW_IMPACT speed.
- // - Stop on UE.
- // - Stop on MCE.
- // - Stop on RCE ETE (threshold 2047 field, 1 mnfg).
- // - The command should stop immediately on error, or at the end of the
- // master rank if no errors are found.
-
- PRDF_ERR( "function not implemented yet" );
-
- return SUCCESS;
-
- #undef PRDF_FUNC
-}
-
//##############################################################################
//## Line Delete Functions
//##############################################################################
OpenPOWER on IntegriCloud