summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat/mem
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2017-01-17 14:33:15 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2017-02-17 13:54:01 -0500
commitb0b1c62e528e8756282afb304e853c4411c21ac9 (patch)
treef70642119d5f348c9c0fd48aa8756bd421320ef2 /src/usr/diag/prdf/plat/mem
parenta3fd64b53ed779b957ef071430c4b80491a33ac1 (diff)
downloadtalos-hostboot-b0b1c62e528e8756282afb304e853c4411c21ac9.tar.gz
talos-hostboot-b0b1c62e528e8756282afb304e853c4411c21ac9.zip
PRD: TD controller state capture data
Change-Id: I63240fd048efdacc9054915ad18d7ac86f5c4503 RTC: 164706 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/35276 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com> Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36519 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/plat/mem')
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.C9
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr.H12
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_ipl.C71
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTdCtlr_rt.C15
-rwxr-xr-xsrc/usr/diag/prdf/plat/mem/prdfMemTdQueue.H16
5 files changed, 117 insertions, 6 deletions
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 <prdfMemAddress.H>
#include <prdfMemCaptureData.H>
#include <prdfP9McbistExtraSig.H>
+#include <prdfParserEnums.H>
// External includes
#include <util/misc.H>
@@ -61,6 +62,8 @@ uint32_t MemTdCtlr<T>::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<T>::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 <prdfMemScrubUtils.H>
#include <prdfMemVcm.H>
#include <prdfP9McaExtraSig.H>
+#include <UtilHash.H> // for Util::hashString
using namespace TARGETING;
@@ -271,6 +272,76 @@ uint32_t MemTdCtlr<TYPE_MBA>::checkEcc( bool & o_errorsFound,
//------------------------------------------------------------------------------
+template <TARGETING::TYPE T>
+void MemTdCtlr<T>::collectStateCaptureData( STEP_CODE_DATA_STRUCT & io_sc,
+ const char * i_startEnd )
+{
+ #define PRDF_FUNC "[MemTdCtlr<T>::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<TYPE_MCBIST>;
template class MemTdCtlr<TYPE_MBA>;
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<TYPE_MBA>::checkEcc( bool & o_errorsFound,
//------------------------------------------------------------------------------
+template <TARGETING::TYPE T>
+void MemTdCtlr<T>::collectStateCaptureData( STEP_CODE_DATA_STRUCT & io_sc,
+ const char * i_startEnd )
+{
+ #define PRDF_FUNC "[MemTdCtlr<T>::collectStateCaptureData] "
+
+ // TODO RTC 167827
+
+ #undef PRDF_FUNC
+}
+
+//------------------------------------------------------------------------------
+
// Avoid linker errors with the template.
template class MemTdCtlr<TYPE_MCBIST>;
template class MemTdCtlr<TYPE_MBA>;
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
/**
OpenPOWER on IntegriCloud