summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2016-12-05 14:42:17 -0600
committerZane C. Shelley <zshelle@us.ibm.com>2016-12-14 17:03:49 -0500
commita6ac835e61193f05623a7ae9934407fc784b4b31 (patch)
tree7ab01f5f3c9f656ab23099c8fce8837d262b136f /src
parent585aea7e7d95264bd61dd102782a1726f835a9b1 (diff)
downloadtalos-hostboot-a6ac835e61193f05623a7ae9934407fc784b4b31.tar.gz
talos-hostboot-a6ac835e61193f05623a7ae9934407fc784b4b31.zip
PRD: Mainline memory UE analysis
Change-Id: I7f094853d2b313986c9c49116c962f70abe956de RTC: 165377 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33690 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com> Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33842 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C32
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H18
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C14
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C21
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk1
-rw-r--r--src/usr/diag/prdf/common/plat/p9/p9_mca.rule2
-rw-r--r--src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule10
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C107
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemTps.H9
9 files changed, 107 insertions, 107 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C
index 00d8e60da..bff7d612e 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.C
@@ -201,6 +201,38 @@ uint32_t getMemReadAddr<TYPE_MEMBUF>( ExtensibleChip * i_chip, uint32_t i_pos,
//------------------------------------------------------------------------------
+template<>
+uint32_t getMemReadAddr<TYPE_MCA>( ExtensibleChip * i_chip,
+ MemAddr::ReadReg i_reg, MemAddr & o_addr )
+{
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_MCA == i_chip->getType() );
+
+ ExtensibleChip * mcbChip = getConnectedParent( i_chip, TYPE_MCBIST );
+
+ uint8_t port = i_chip->getPos() % MAX_MCA_PER_MCBIST;
+
+ return getMemReadAddr<TYPE_MCBIST>( mcbChip, port, i_reg, o_addr );
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+uint32_t getMemReadAddr<TYPE_MBA>( ExtensibleChip * i_chip,
+ MemAddr::ReadReg i_reg, MemAddr & o_addr )
+{
+ PRDF_ASSERT( nullptr != i_chip );
+ PRDF_ASSERT( TYPE_MBA == i_chip->getType() );
+
+ ExtensibleChip * membChip = getConnectedParent( i_chip, TYPE_MEMBUF );
+
+ uint8_t mbaPos = i_chip->getPos();
+
+ return getMemReadAddr<TYPE_MEMBUF>( membChip, mbaPos, i_reg, o_addr );
+}
+
+//------------------------------------------------------------------------------
+
#ifdef __HOSTBOOT_MODULE
template<>
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H
index 70725a20a..ff7d68a13 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H
@@ -138,13 +138,6 @@ class MemAddr
/**
* @brief Reads the specified mainline memory read address from hardware.
- *
- * While the address returned will be relative to an MBA or MCA, this function
- * requires the MEMBUF or MCBIST targets and the position of the MBA or MCA
- * relative to the parent. The reason for this is because of where the addresses
- * and FIRs are located on the Nimbus or Centaur. We didn't want to add a lot of
- * hopping around between targets just to make the interface look pretty.
- *
* @param i_chip An MEMBUF or MCBIST chip.
* @param i_pos Position of MBA/MCA relative to MEMBUF/MCBIST.
* @param i_reg The target address register.
@@ -155,6 +148,17 @@ template<TARGETING::TYPE T>
uint32_t getMemReadAddr( ExtensibleChip * i_chip, uint32_t i_pos,
MemAddr::ReadReg i_reg, MemAddr & o_addr );
+/**
+ * @brief Reads the specified mainline memory read address from hardware.
+ * @param i_chip MCA or MBA.
+ * @param i_reg The target address register.
+ * @param o_addr The returned address from hardware.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+template<TARGETING::TYPE T>
+uint32_t getMemReadAddr( ExtensibleChip * i_chip, MemAddr::ReadReg i_reg,
+ MemAddr & o_addr );
+
#ifdef __HOSTBOOT_MODULE
/**
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C b/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
index a4e139da6..3acf6e233 100755
--- a/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C
@@ -292,19 +292,19 @@ void MemoryMru::getCommonVars()
TARGETING::TYPE trgtType = getTargetType( iv_target );
PRDF_ASSERT( TYPE_MCA == trgtType || TYPE_MBA == trgtType );
- TargetHandle_t node = getConnectedParent( iv_target, TYPE_NODE );
- if ( NULL == node )
+ TargetHandle_t proc = getConnectedParent( iv_target, TYPE_PROC );
+ if ( NULL == proc )
{
- PRDF_ERR( PRDF_FUNC "Could not find node attached to target 0x%08x",
+ PRDF_ERR( PRDF_FUNC "Could not find proc attached to target 0x%08x",
getHuid(iv_target) );
PRDF_ASSERT( false );
}
- TargetHandle_t proc = getConnectedParent( iv_target, TYPE_PROC );
- if ( NULL == proc )
+ TargetHandle_t node = getConnectedParent( proc, TYPE_NODE );
+ if ( NULL == node )
{
- PRDF_ERR( PRDF_FUNC "Could not find proc attached to target 0x%08x",
- getHuid(iv_target) );
+ PRDF_ERR( PRDF_FUNC "Could not find node attached to target 0x%08x",
+ getHuid(proc) );
PRDF_ASSERT( false );
}
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C b/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C
index c82fc41df..35442aa2d 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C
+++ b/src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C
@@ -29,6 +29,7 @@
#include <prdfPluginMap.H>
// Platform includes
+#include <prdfMemEccAnalysis.H>
#include <prdfPlatServices.H>
#include <prdfP9McaDataBundle.H>
@@ -79,6 +80,26 @@ int32_t PostAnalysis( ExtensibleChip * i_chip, STEP_CODE_DATA_STRUCT & io_sc )
}
PRDF_PLUGIN_DEFINE( p9_mca, PostAnalysis );
+//##############################################################################
+//
+// MCAECCFIR
+//
+//##############################################################################
+
+/**
+ * @brief MCAECCFIR[14] - Mainline UE.
+ * @param i_chip MCA chip.
+ * @param io_sc The step code data struct.
+ * @return SUCCESS
+ */
+int32_t AnalyzeFetchUe( ExtensibleChip * i_chip,
+ STEP_CODE_DATA_STRUCT & io_sc )
+{
+ MemEcc::analyzeFetchUe<TYPE_MCA, McaDataBundle *>( i_chip, io_sc );
+ return SUCCESS; // nothing to return to rule code
+}
+PRDF_PLUGIN_DEFINE( p9_mca, AnalyzeFetchUe );
+
} // end namespace p9_mca
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk b/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk
index d9d332878..a82f30008 100644
--- a/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk
+++ b/src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk
@@ -40,6 +40,7 @@ prd_incpath += ${PRD_SRC_PATH}/common/plat/mem
# non-rule plugin related
prd_obj += prdfMemAddress.o
prd_obj += prdfMemCaptureData.o
+prd_obj += prdfMemEccAnalysis.o
prd_obj += prdfMemSymbol.o
prd_obj += prdfMemoryMru.o
prd_obj += prdfMemUeTable.o
diff --git a/src/usr/diag/prdf/common/plat/p9/p9_mca.rule b/src/usr/diag/prdf/common/plat/p9/p9_mca.rule
index 8c29acced..7966d4a5f 100644
--- a/src/usr/diag/prdf/common/plat/p9/p9_mca.rule
+++ b/src/usr/diag/prdf/common/plat/p9/p9_mca.rule
@@ -362,7 +362,7 @@ group gMCAECCFIR filter singlebit
/** MCAECCFIR[14]
* Mainline read UE
*/
- (rMCAECCFIR, bit(14)) ? mainline_ce_ue_handling;
+ (rMCAECCFIR, bit(14)) ? mainline_ue_handling;
/** MCAECCFIR[15]
* Mainline read RCD
diff --git a/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule b/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule
index 9a332d62b..e33f37d69 100644
--- a/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule
+++ b/src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule
@@ -52,6 +52,16 @@ actionclass mainline_ce_ue_handling
TBDDefaultCallout;
};
+/** Mainline UE handling */
+actionclass mainline_ue_handling
+{
+ SUEGenerationPoint;
+ threshold( field(33 / 30 min ) ); # To prevent flooding. Will be unmasked
+ # when background scrubbing resumes after
+ # targeted diagnostics is complete.
+ funccall("AnalyzeFetchUe");
+};
+
/** Handle RCD parity error. */
actionclass rcd_parity_error
{
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
index 0013e3d2d..7170fb740 100755
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C
@@ -51,6 +51,7 @@
#if !defined(__HOSTBOOT_MODULE) || defined(__HOSTBOOT_RUNTIME)
#include <prdfCenMbaDynMemDealloc_rt.H>
#endif
+#include <prdfMemEccAnalysis.H>
using namespace TARGETING;
@@ -771,98 +772,26 @@ int32_t AnalyzeFetchRcePue( ExtensibleChip * i_membChip,
//------------------------------------------------------------------------------
/**
- * @brief MBSECCFIR[19] - Fetch UE.
- * @param i_membChip A Centaur chip.
- * @param i_sc The step code data struct.
- * @param i_mbaPos The MBA position.
+ * @brief MBSECCFIR[19] - Mainline UE.
+ * @param i_chip MEMBUF chip.
+ * @param io_sc The step code data struct.
* @return SUCCESS
*/
-int32_t AnalyzeFetchUe( ExtensibleChip * i_membChip,
- STEP_CODE_DATA_STRUCT & i_sc, uint32_t i_mbaPos )
-{
- #define PRDF_FUNC "[AnalyzeFetchUe] "
-
- int32_t l_rc = SUCCESS;
-
- ExtensibleChip * mbaChip = NULL;
-
- do
- {
- // All memory UEs should be customer viewable. Normally, this would be
- // done by setting the threshold to 1, but we do not want to mask UEs
- // on the first occurrence.
- i_sc.service_data->setServiceCall();
-
- CenMembufDataBundle * membdb = getMembufDataBundle( i_membChip );
- mbaChip = membdb->getMbaChip( i_mbaPos );
- if ( NULL == mbaChip )
- {
- PRDF_ERR( PRDF_FUNC "getMbaChip() returned NULL" );
- l_rc = FAIL; break;
- }
-
- CenAddr addr;
- l_rc = getCenReadAddr( i_membChip, i_mbaPos, READ_UE_ADDR, addr );
- if ( SUCCESS != l_rc )
- {
- PRDF_ERR( PRDF_FUNC "getCenReadAddr() failed" );
- break;
- }
- CenRank rank = addr.getRank();
-
- // Add address to UE table.
- CenMbaDataBundle * mbadb = getMbaDataBundle( mbaChip );
- mbadb->iv_ueTable.addEntry( UE_TABLE::FETCH_UE, addr );
-
- // Callout the rank.
- MemoryMru memmru ( mbaChip->GetChipHandle(), rank,
- MemoryMruData::CALLOUT_RANK );
- i_sc.service_data->SetCallout( memmru );
-
- if ( CHECK_STOP != i_sc.service_data->getPrimaryAttnType() )
- {
- // Add a TPS request to the TD queue and ban any further TPS
- // requests for this rank.
- l_rc = mbadb->iv_tdCtlr.handleTdEvent( i_sc, rank,
- CenMbaTdCtlrCommon::TPS_EVENT,
- true );
- if ( SUCCESS != l_rc )
- {
- PRDF_ERR( PRDF_FUNC "handleTdEvent() failed: rank=m%ds%d",
- rank.getMaster(), rank.getSlave() );
- // We are not adding break here as we still want to do lmbGard
- // If you want to add any code after this which depends on
- // result of handleTdEvent result, add the code judicially.
- }
-
- #if !defined(__HOSTBOOT_MODULE) || defined(__HOSTBOOT_RUNTIME)
- // Send lmb gard message to hypervisor.
- int32_t lmbRc = DEALLOC::lmbGard( mbaChip, addr );
- if ( SUCCESS != lmbRc )
- {
- PRDF_ERR( PRDF_FUNC "lmbGard() failed" );
- l_rc = lmbRc; break;
- }
- #endif
- }
-
- } while (0);
-
- // Add ECC capture data for FFDC.
- if ( NULL != mbaChip )
- MemCaptureData::addEccData<TYPE_MBA>( mbaChip, i_sc );
-
- if ( SUCCESS != l_rc )
- {
- PRDF_ERR( PRDF_FUNC "Failed: i_membChip=0x%08x i_mbaPos=%d",
- i_membChip->GetId(), i_mbaPos );
- CalloutUtil::defaultError( i_sc );
- }
+#define PLUGIN_FETCH_UE_ERROR( POS ) \
+int32_t AnalyzeFetchUe##POS( ExtensibleChip * i_chip, \
+ STEP_CODE_DATA_STRUCT & io_sc ) \
+{ \
+ ExtensibleChip * mbaChip = getConnectedChild( i_chip, TYPE_MBA, POS ); \
+ PRDF_ASSERT( nullptr != mbaChip ); \
+ MemEcc::analyzeFetchUe<TYPE_MBA, MbaDataBundle *>( mbaChip, io_sc ); \
+ return SUCCESS; \
+} \
+PRDF_PLUGIN_DEFINE( Membuf, AnalyzeFetchUe##POS );
- return SUCCESS; // Intentionally return SUCCESS for this plugin
+PLUGIN_FETCH_UE_ERROR( 0 )
+PLUGIN_FETCH_UE_ERROR( 1 )
- #undef PRDF_FUNC
-}
+#undef PLUGIN_FETCH_UE_ERROR
//------------------------------------------------------------------------------
@@ -1426,8 +1355,6 @@ PRDF_PLUGIN_DEFINE( Membuf, AnalyzeFetch##TYPE##MBA );
PLUGIN_FETCH_ECC_ERROR( Nce, 0 )
PLUGIN_FETCH_ECC_ERROR( Nce, 1 )
-PLUGIN_FETCH_ECC_ERROR( Ue, 0 )
-PLUGIN_FETCH_ECC_ERROR( Ue, 1 )
#undef PLUGIN_FETCH_ECC_ERROR
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemTps.H b/src/usr/diag/prdf/plat/mem/prdfMemTps.H
index ba3f5535e..924f55c94 100644
--- a/src/usr/diag/prdf/plat/mem/prdfMemTps.H
+++ b/src/usr/diag/prdf/plat/mem/prdfMemTps.H
@@ -41,8 +41,13 @@ class TpsEvent : public TdEntry
{
public: // functions
- /** @brief Constructor */
- TpsEvent<T>( ExtensibleChip * i_chip, MemRank i_rank ) :
+ /**
+ * @brief Constructor
+ * @param i_chip MCA or MBA.
+ * @param i_rank Target rank.
+ * @param i_ban True to ban all subsequent requests for TPS on this rank.
+ */
+ TpsEvent<T>( ExtensibleChip * i_chip, MemRank i_rank, bool i_ban = false ) :
TdEntry(TPS_EVENT, i_chip, i_rank)
{}
OpenPOWER on IntegriCloud