diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2016-12-05 14:42:17 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2016-12-14 17:03:49 -0500 |
commit | a6ac835e61193f05623a7ae9934407fc784b4b31 (patch) | |
tree | 7ab01f5f3c9f656ab23099c8fce8837d262b136f /src | |
parent | 585aea7e7d95264bd61dd102782a1726f835a9b1 (diff) | |
download | talos-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.C | 32 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfMemAddress.H | 18 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/mem/prdfMemoryMru.C | 14 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdfP9Mca_common.C | 21 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/mem/prdf_plat_mem.mk | 1 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/p9/p9_mca.rule | 2 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/p9/p9_mca_actions.rule | 10 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/plat/pegasus/prdfCenMembuf.C | 107 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemTps.H | 9 |
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) {} |