From b0b1c62e528e8756282afb304e853c4411c21ac9 Mon Sep 17 00:00:00 2001 From: Caleb Palmer Date: Tue, 17 Jan 2017 14:33:15 -0600 Subject: PRD: TD controller state capture data Change-Id: I63240fd048efdacc9054915ad18d7ac86f5c4503 RTC: 164706 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/35276 Tested-by: Jenkins Server Reviewed-by: Brian J. Stegmiller Reviewed-by: Benjamin J. Weisenbeck Reviewed-by: Zane C. Shelley Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36519 Tested-by: FSP CI Jenkins --- src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C | 9 +++- src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.H | 12 ++++- src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C | 71 ++++++++++++++++++++++++++ src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C | 15 +++++- src/usr/diag/prdf/plat/mem/prdfMemTdQueue.H | 16 ++++-- 5 files changed, 117 insertions(+), 6 deletions(-) (limited to 'src/usr/diag/prdf/plat/mem') diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C index a11b050fd..77f69de28 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -29,6 +29,7 @@ #include #include #include +#include // External includes #include @@ -61,6 +62,8 @@ uint32_t MemTdCtlr::handleCmdComplete( STEP_CODE_DATA_STRUCT & io_sc ) break; } + collectStateCaptureData( io_sc, TD_CTLR_DATA::START ); + #else // IPL only PRDF_ASSERT( isInMdiaMode() ); // MDIA must be running. @@ -148,6 +151,10 @@ uint32_t MemTdCtlr::handleCmdComplete( STEP_CODE_DATA_STRUCT & io_sc ) #endif } + else + { + collectStateCaptureData( io_sc, TD_CTLR_DATA::END ); + } return o_rc; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.H b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.H index 3448d76a9..59cf8c5d8 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -186,6 +186,16 @@ class MemTdCtlr */ uint32_t checkEcc( bool & o_errorsFound, STEP_CODE_DATA_STRUCT & io_sc ); + /** + * @brief Adds the TD controller state to the capture data. + * @param io_sc The step code data struct. + * @param i_startEnd Description tag for the capture data. Used to + * distinguish between data captured at the beginning or end of + * analysis. + */ + void collectStateCaptureData( STEP_CODE_DATA_STRUCT & io_sc, + const char * i_startEnd ); + #ifdef __HOSTBOOT_RUNTIME /** diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C index d17021c7a..e10a0595e 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C @@ -36,6 +36,7 @@ #include #include #include +#include // for Util::hashString using namespace TARGETING; @@ -271,6 +272,76 @@ uint32_t MemTdCtlr::checkEcc( bool & o_errorsFound, //------------------------------------------------------------------------------ +template +void MemTdCtlr::collectStateCaptureData( STEP_CODE_DATA_STRUCT & io_sc, + const char * i_startEnd ) +{ + #define PRDF_FUNC "[MemTdCtlr::collectStateCaptureData] " + + // Get the number of entries in the TD queue (limit 15) + TdQueue::Queue queue = iv_queue.getQueue(); + uint8_t queueCount = queue.size(); + if ( 15 < queueCount ) queueCount = 15; + + // Get the buffer + uint32_t bitLen = 22 + queueCount*10; // Header + TD queue + BitStringBuffer bsb( bitLen ); + uint32_t curPos = 0; + + //###################################################################### + // Header data (18 bits) + //###################################################################### + + // Specifies running at IPL. Also ensures our data is non-zero. 4-bit + bsb.setFieldJustify( curPos, 4, TD_CTLR_DATA::Version::IPL ); curPos+=4; + + uint8_t mrnk = 0; + uint8_t srnk = 0; + uint8_t phase = TdEntry::Phase::TD_PHASE_0; + uint8_t type = TdEntry::TdType::INVALID_EVENT; + + if ( nullptr != iv_curProcedure ) + { + mrnk = iv_curProcedure->getRank().getMaster(); // 3-bit + srnk = iv_curProcedure->getRank().getSlave(); // 3-bit + phase = iv_curProcedure->getPhase(); // 4-bit + type = iv_curProcedure->getType(); // 4-bit + } + + bsb.setFieldJustify( curPos, 3, mrnk ); curPos+=3; + bsb.setFieldJustify( curPos, 3, srnk ); curPos+=3; + bsb.setFieldJustify( curPos, 4, phase ); curPos+=4; + bsb.setFieldJustify( curPos, 4, type ); curPos+=4; + + //###################################################################### + // TD Request Queue (min 4 bits, max 164 bits) + //###################################################################### + + bsb.setFieldJustify( curPos, 4, queueCount ); curPos+=4; // 4-bit + + for ( uint32_t n = 0; n < queueCount; n++ ) + { + uint8_t itMrnk = queue[n]->getRank().getMaster(); // 3-bit + uint8_t itSrnk = queue[n]->getRank().getSlave(); // 3-bit + uint8_t itType = queue[n]->getType(); // 4-bit + + bsb.setFieldJustify( curPos, 3, itMrnk ); curPos+=3; + bsb.setFieldJustify( curPos, 3, itSrnk ); curPos+=3; + bsb.setFieldJustify( curPos, 4, itType ); curPos+=4; + } + + //###################################################################### + // Add the capture data + //###################################################################### + CaptureData & cd = io_sc.service_data->GetCaptureData(); + cd.Add( iv_chip->getTrgt(), Util::hashString(i_startEnd), bsb ); + + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + // Avoid linker errors with the template. template class MemTdCtlr; template class MemTdCtlr; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C index f525acebd..865078014 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -232,6 +232,19 @@ uint32_t MemTdCtlr::checkEcc( bool & o_errorsFound, //------------------------------------------------------------------------------ +template +void MemTdCtlr::collectStateCaptureData( STEP_CODE_DATA_STRUCT & io_sc, + const char * i_startEnd ) +{ + #define PRDF_FUNC "[MemTdCtlr::collectStateCaptureData] " + + // TODO RTC 167827 + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + // Avoid linker errors with the template. template class MemTdCtlr; template class MemTdCtlr; diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTdQueue.H b/src/usr/diag/prdf/plat/mem/prdfMemTdQueue.H index 9442c0093..7603328dc 100755 --- a/src/usr/diag/prdf/plat/mem/prdfMemTdQueue.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemTdQueue.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -60,8 +60,9 @@ class TdEntry */ enum TdType { - VCM_EVENT = 0, ///< A Verify Chip Mark event. - TPS_EVENT, ///< A Two-Phase Scrub event. + VCM_EVENT = 0, ///< A Verify Chip Mark event. + TPS_EVENT, ///< A Two-Phase Scrub event. + INVALID_EVENT = 0xf, ///< Used to denote that no event is in progress }; /** @@ -107,6 +108,15 @@ class TdEntry return this->iv_tdType < i_e.iv_tdType; } + /** @return The event type */ + TdType getType() const { return iv_tdType; } + + /** @return The rank in which this event occurred */ + MemRank getRank() const { return iv_rank; } + + /** @return The event phase */ + Phase getPhase() const { return iv_phase; } + protected: // functions /** -- cgit v1.2.1