diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2018-04-09 21:37:56 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-04-19 16:45:24 -0400 |
commit | 87201e7f578f9ef54513009acb539af2b1eab43b (patch) | |
tree | d500f1ee1f9e66c6a7ebe6341634e1904f466003 /src/usr/diag/prdf/plat | |
parent | 360d83a83ec25acbdb6b40e3c773e017c75b6cb4 (diff) | |
download | talos-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>
Diffstat (limited to 'src/usr/diag/prdf/plat')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemVcm.H | 56 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemVcm_ipl.C | 76 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemVcm_rt.C | 67 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/pegasus/prdfCenMbaTdCtlr_ipl.C | 265 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.C | 22 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.H | 18 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_ipl.C | 140 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices_rt.C | 55 |
8 files changed, 190 insertions, 509 deletions
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 //############################################################################## |