diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2016-12-19 09:37:52 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-02-10 13:22:08 -0500 |
commit | 97dcd092f4e72e2b67f2b97b6aac3cd57944d05e (patch) | |
tree | 4590ce315156b50cfa54d5515ce3ac11cd3f53fe /src | |
parent | 2df37e971282522423f114880f99501f0728116f (diff) | |
download | talos-hostboot-97dcd092f4e72e2b67f2b97b6aac3cd57944d05e.tar.gz talos-hostboot-97dcd092f4e72e2b67f2b97b6aac3cd57944d05e.zip |
PRD: Update MemUtils File
Change-Id: I90add0fc0222e1f6f9ef4cdc4a657824c52df492
RTC: 159627
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/34055
Reviewed-by: Brian J. Stegmiller <bjs@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@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/36073
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')
-rwxr-xr-x | src/usr/diag/prdf/plat/mem/prdfMemUtils.C (renamed from src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C) | 293 | ||||
-rwxr-xr-x | src/usr/diag/prdf/plat/mem/prdfMemUtils.H (renamed from src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H) | 89 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk | 3 |
3 files changed, 227 insertions, 158 deletions
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C b/src/usr/diag/prdf/plat/mem/prdfMemUtils.C index 798c741e0..dffdf7fbc 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemUtils.C @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.C $ */ +/* $Source: src/usr/diag/prdf/plat/mem/prdfMemUtils.C $ */ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2015 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -23,20 +23,17 @@ /* */ /* IBM_PROLOG_END_TAG */ -/** @file prdfCenMemUtils.C - * @brief Utility functions related to Centaur +/** @file prdfMemUtils.C + * @brief Utility functions related to memory */ -#include <prdfCenMemUtils.H> +#include <prdfMemUtils.H> #include <prdfExtensibleChip.H> -#include <prdfCenMbaDataBundle.H> -#include <prdfP8McsDataBundle.H> #include <prdfPlatServices.H> -#include <prdfCenMembufDataBundle.H> #include <prdfParserUtils.H> #if defined(__HOSTBOOT_RUNTIME) || !defined(__HOSTBOOT_MODULE) - #include <prdfCenMbaDynMemDealloc_rt.H> +// #include <prdfCenMbaDynMemDealloc_rt.H> #endif using namespace TARGETING; @@ -51,10 +48,12 @@ using namespace PlatServices; using namespace PARSERUTILS; using namespace CEN_SYMBOL; -const uint8_t CE_REGS_PER_MBA = 9; +const uint8_t CE_REGS_PER_PORT = 9; const uint8_t SYMBOLS_PER_CE_REG = 8; -static const char *mbsCeStatReg[][ CE_REGS_PER_MBA ] = { +//TODO RTC 166802 +/* +static const char *mbsCeStatReg[][ CE_REGS_PER_PORT ] = { { "MBA0_MBSSYMEC0", "MBA0_MBSSYMEC1","MBA0_MBSSYMEC2", "MBA0_MBSSYMEC3", "MBA0_MBSSYMEC4", "MBA0_MBSSYMEC5", "MBA0_MBSSYMEC6", "MBA0_MBSSYMEC7", "MBA0_MBSSYMEC8" }, @@ -62,6 +61,14 @@ static const char *mbsCeStatReg[][ CE_REGS_PER_MBA ] = { "MBA1_MBSSYMEC3", "MBA1_MBSSYMEC4", "MBA1_MBSSYMEC5", "MBA1_MBSSYMEC6", "MBA1_MBSSYMEC7", "MBA1_MBSSYMEC8" } }; +*/ + +static const char *mcbCeStatReg[CE_REGS_PER_PORT] = + { + "MCB_MBSSYMEC0", "MCB_MBSSYMEC1", "MCB_MBSSYMEC2", + "MCB_MBSSYMEC3", "MCB_MBSSYMEC4", "MCB_MBSSYMEC5", + "MCB_MBSSYMEC6", "MCB_MBSSYMEC7", "MCB_MBSSYMEC8" + }; //------------------------------------------------------------------------------ @@ -74,15 +81,145 @@ struct DramCount_t typedef std::map<uint32_t, DramCount_t> DramCountMap; //------------------------------------------------------------------------------ +template<> +int32_t collectCeStats<TYPE_MCA>( ExtensibleChip * i_chip, + const MemRank & i_rank, MaintSymbols & o_maintStats, + MemSymbol & o_chipMark, uint8_t i_thr ) +{ + #define PRDF_FUNC "[MemUtils::collectCeStats<TYPE_MCA>] " + + int32_t o_rc = SUCCESS; + o_chipMark = MemSymbol(); // Initially invalid. + + do + { + PRDF_ASSERT( 0 != i_thr ); + + TargetHandle_t mcaTrgt = i_chip->getTrgt(); + ExtensibleChip * mcbChip = getConnectedParent( i_chip, TYPE_MCBIST ); + + uint8_t mcaPos = getTargetPosition( mcaTrgt ); + + PRDF_ASSERT( MAX_MCA_PER_MCBIST > mcaPos ); + + const bool isX4 = isDramWidthX4(mcaTrgt); + + // Use this map to keep track of the total counts per DRAM. + DramCountMap dramCounts; + + const char * reg_str = NULL; + SCAN_COMM_REGISTER_CLASS * reg = NULL; + + for ( uint8_t regIdx = 0; regIdx < CE_REGS_PER_PORT; regIdx++ ) + { + reg_str = mcbCeStatReg[regIdx]; + reg = mcbChip->getRegister( reg_str ); + + o_rc = reg->Read(); + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Read() failed on %s", reg_str ); + break; + } + + uint8_t baseSymbol = SYMBOLS_PER_CE_REG * regIdx; + + for ( uint8_t i = 0; i < SYMBOLS_PER_CE_REG; i++ ) + { + uint8_t count = reg->GetBitFieldJustified( (i*8), 8 ); + + if ( 0 == count ) continue; // nothing to do + + uint8_t sym = baseSymbol + i; + uint8_t dram = isX4 ? symbol2Nibble<TYPE_MCA>( sym ) + : symbol2Byte <TYPE_MCA>( sym ); + + // Keep track of the total DRAM counts. + dramCounts[dram].totalCount += count; + + // Add any symbols that have exceeded threshold to the list. + if ( i_thr <= count ) + { + // Keep track of the total number of symbols per DRAM that + // have exceeded threshold. + dramCounts[dram].symbolCount++; + + SymbolData symData; + symData.symbol = MemSymbol::fromSymbol( mcaTrgt, i_rank, + sym, CEN_SYMBOL::BOTH_SYMBOL_DQS ); + if ( !symData.symbol.isValid() ) + { + PRDF_ERR( PRDF_FUNC "MemSymbol() failed: symbol=%d", + sym ); + o_rc = FAIL; + break; + } + else + { + // Add the symbol to the list. + symData.count = count; + o_maintStats.push_back( symData ); + } + } + } + if ( SUCCESS != o_rc ) break; + } + if ( SUCCESS != o_rc ) break; -int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank, - MaintSymbols & o_maintStats, CenSymbol & o_chipMark, - uint8_t i_thr ) + if ( o_maintStats.empty() ) break; // no need to continue + + // Sort the list of symbols. + std::sort( o_maintStats.begin(), o_maintStats.end(), sortSymDataCount ); + + // Get the DRAM with the highest count. + uint32_t highestDram = 0; + uint32_t highestCount = 0; + const uint32_t symbolTH = isX4 ? 1 : 2; + for ( DramCountMap::iterator it = dramCounts.begin(); + it != dramCounts.end(); ++it ) + { + if ( (symbolTH <= it->second.symbolCount) && + (highestCount < it->second.totalCount ) ) + { + highestDram = it->first; + highestCount = it->second.totalCount; + } + } + + if ( 0 != highestCount ) + { + uint8_t sym = isX4 ? nibble2Symbol<TYPE_MCA>( highestDram ) + : byte2Symbol <TYPE_MCA>( highestDram ); + o_chipMark = MemSymbol::fromSymbol( mcaTrgt, i_rank, sym ); + } + + } while(0); + + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC "Failed: i_chip=0x%08x i_rank=m%ds%d i_thr=%d", + i_chip->GetId(), i_rank.getMaster(), i_rank.getSlave(), + i_thr ); + } + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + +template<> +int32_t collectCeStats<TYPE_MBA>( ExtensibleChip * i_chip, + const MemRank & i_rank, MaintSymbols & o_maintStats, + MemSymbol & o_chipMark, uint8_t i_thr ) { - #define PRDF_FUNC "[MemUtils::collectCeStats] " + #define PRDF_FUNC "[MemUtils::collectCeStats<TYPE_MBA>] " int32_t o_rc = SUCCESS; + //TODO RTC 166802 + /* o_chipMark = CenSymbol(); // Initially invalid. do @@ -93,7 +230,7 @@ int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank, o_rc = FAIL; break; } - TargetHandle_t mbaTrgt = i_mbaChip->GetChipHandle(); + TargetHandle_t mbaTrgt = i_mbaChip->getTrgt(); CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip ); ExtensibleChip * membufChip = mbadb->getMembChip(); if ( NULL == membufChip ) @@ -240,7 +377,7 @@ int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank, i_mbaChip->GetId(), i_rank.getMaster(), i_rank.getSlave(), i_thr ); } - + */ return o_rc; #undef PRDF_FUNC @@ -248,97 +385,79 @@ int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank, //------------------------------------------------------------------------------ -int32_t clearPerSymbolCounters( ExtensibleChip * i_membChip, uint32_t i_mbaPos ) +template<> +uint8_t getDramSize<TYPE_MCA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) { - #define PRDF_FUNC "[MemUtils::clearPerSymbolCounters] " - - int32_t o_rc = SUCCESS; - - do - { - if ( MAX_MBA_PER_MEMBUF <= i_mbaPos ) - { - PRDF_ERR( PRDF_FUNC "i_mbaPos %d is invalid", i_mbaPos ); - o_rc = FAIL; - break; - } - - const char * reg_str = NULL; - SCAN_COMM_REGISTER_CLASS * reg = NULL; + #define PRDF_FUNC "[MemUtils::getDramSize] " - for ( uint8_t regIdx = 0; regIdx < CE_REGS_PER_MBA; regIdx++ ) - { - reg_str = mbsCeStatReg[i_mbaPos][regIdx]; - reg = i_membChip->getRegister( reg_str ); + PRDF_ASSERT( TYPE_MCA == i_chip->getType() ); + PRDF_ASSERT( i_dimmSlct < DIMM_SLCT_PER_PORT ); - reg->clearAllBits(); + TargetHandle_t mcaTrgt = i_chip->getTrgt(); + TargetHandle_t mcsTrgt = getConnectedParent( mcaTrgt, TYPE_MCS ); - o_rc = reg->Write(); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "Write() failed on %s", reg_str ); - break; - } - } + PRDF_ASSERT( nullptr != mcsTrgt ); - if ( SUCCESS != o_rc ) break; + uint8_t mcaPos = i_chip->getPos(); - } while(0); + uint8_t tmp[MAX_MCA_PER_MCS][DIMM_SLCT_PER_PORT]; - if ( SUCCESS != o_rc ) + if ( !mcsTrgt->tryGetAttr<TARGETING::ATTR_EFF_DRAM_DENSITY>(tmp) ) { - PRDF_ERR( PRDF_FUNC "Failed. i_membChip=0x%08x i_mbaPos=%d", - i_membChip->GetId(), i_mbaPos ); + PRDF_ERR( PRDF_FUNC "Failed to get ATTR_EFF_DRAM_DENSITY" ); + PRDF_ASSERT( false ); } - return o_rc; + return tmp[mcaPos][i_dimmSlct]; #undef PRDF_FUNC } -//------------------------------------------------------------------------------ - -int32_t getDramSize( ExtensibleChip *i_mbaChip, uint8_t & o_size ) +template<> +uint8_t getDramSize<TYPE_MBA>(ExtensibleChip *i_chip, uint8_t i_dimmSlct) { #define PRDF_FUNC "[MemUtils::getDramSize] " - int32_t o_rc = SUCCESS; - o_size = SIZE_2GB; - - do - { - TargetHandle_t mbaTrgt = i_mbaChip->GetChipHandle(); - CenMbaDataBundle * mbadb = getMbaDataBundle( i_mbaChip ); - ExtensibleChip * membufChip = mbadb->getMembChip(); - if ( NULL == membufChip ) - { - PRDF_ERR( PRDF_FUNC "getMembChip() failed: MBA=0x%08x", - getHuid(mbaTrgt) ); - o_rc = FAIL; break; - } - - uint32_t pos = getTargetPosition(mbaTrgt); - const char * reg_str = (0 == pos) ? "MBA0_MBAXCR" : "MBA1_MBAXCR"; - - SCAN_COMM_REGISTER_CLASS * reg = membufChip->getRegister( reg_str ); - o_rc = reg->Read(); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "Read() failed on %s. Target=0x%08x", - reg_str, getHuid(mbaTrgt) ); - break; - } - o_size = reg->GetBitFieldJustified( 6, 2 ); - - } while(0); + uint8_t o_rc = 0; + + //TODO RTC 166802 + //do + //{ + // CenMbaDataBundle * mbadb = getMbaDataBundle( i_chip ); + // ExtensibleChip * membufChip = mbadb->getMembChip(); + // if ( NULL == membufChip ) + // { + // PRDF_ERR( PRDF_FUNC "getMembChip() failed: MBA=0x%08x", + // getHuid(mbaTrgt) ); + // o_rc = FAIL; break; + // } + + // uint32_t pos = getTargetPosition(mbaTrgt); + // // If we will still be using the register values for centaur, we will + // // need to convert them to the appropriate enum + // const char * reg_str = (0 == pos) ? "MBA0_MBAXCR" : "MBA1_MBAXCR"; + + // SCAN_COMM_REGISTER_CLASS * reg = membufChip->getRegister( reg_str ); + // o_rc = reg->Read(); + // if ( SUCCESS != o_rc ) + // { + // PRDF_ERR( PRDF_FUNC "Read() failed on %s. Target=0x%08x", + // reg_str, getHuid(mbaTrgt) ); + // break; + // } + // o_size = reg->GetBitFieldJustified( 6, 2 ); + + //} while(0); return o_rc; #undef PRDF_FUNC + } +//TODO RTC 166802 //------------------------------------------------------------------------------ - +/* int32_t checkMcsChannelFail( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & io_sc ) { @@ -514,8 +633,8 @@ int32_t chnlCsCleanup( ExtensibleChip *i_mbChip, int32_t l_rc = mdiaSendEventMsg( mba, MDIA::SKIP_MBA ); if ( SUCCESS != l_rc ) { - PRDF_ERR( PRDF_FUNC "mdiaSendEventMsg(0x%08x, SKIP_MBA) " - "failed", getHuid( mba ) ); + PRDF_ERR( PRDF_FUNC "mdiaSendEventMsg(0x%08x, SKIP_MBA)" + " failed", getHuid( mba ) ); o_rc |= l_rc; } #else @@ -542,7 +661,7 @@ int32_t chnlCsCleanup( ExtensibleChip *i_mbChip, } //------------------------------------------------------------------------------ - +*/ } // end namespace MemUtils } // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H b/src/usr/diag/prdf/plat/mem/prdfMemUtils.H index b31d2035f..aaadc1827 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemUtils.H @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMemUtils.H $ */ +/* $Source: src/usr/diag/prdf/plat/mem/prdfMemUtils.H $ */ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2015 */ +/* Contributors Listed Below - COPYRIGHT 2013,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -23,11 +23,11 @@ /* */ /* IBM_PROLOG_END_TAG */ -#ifndef prdfCenMemUtils_H -#define prdfCenMemUtils_H +#ifndef prdfMemUtils_H +#define prdfMemUtils_H -/** @file prdfCenMemUtils.H - * @brief General utility functions for Centaur +/** @file prdfMemUtils.H + * @brief General utility functions for memory */ //------------------------------------------------------------------------------ @@ -35,7 +35,7 @@ //------------------------------------------------------------------------------ #include <vector> -#include <prdfCenSymbol.H> +#include <prdfMemSymbol.H> #include <prdfParserEnums.H> namespace PRDF @@ -48,23 +48,6 @@ namespace MemUtils { //============================================================================== -// Constants and Enums -//============================================================================== - -/** - * @brief Lists all possible sizes for a DRAM. - * @note These values must match the definition of MBAXCR[6:7]. They are - * important for calculations. - */ -enum DramSize -{ - SIZE_2GB = 0, - SIZE_4GB = 1, - SIZE_8GB = 2, - SIZE_16GB = 3, -}; - -//============================================================================== // Maintenance statistics //============================================================================== @@ -73,7 +56,7 @@ enum DramSize */ struct SymbolData { - CenSymbol symbol; + MemSymbol symbol; uint8_t count; SymbolData() : count(0) {} }; @@ -86,37 +69,11 @@ inline bool sortSymDataCount( const SymbolData & i, const SymbolData & j ) return i.count < j.count; } -/** Functor for MaintSymbols to match a DRAM. */ -class MatchSymDataDram -{ - public: - explicit MatchSymDataDram( const CenSymbol & i_d ) : iv_d(i_d.getDram()) {} - - bool operator() ( const SymbolData & i_data ) const - { return ( iv_d == i_data.symbol.getDram() ); } - - private: - uint8_t iv_d; -}; - -/** Functor for MaintSymbols to match a symbol. */ -class MatchSymDataSymbol -{ - public: - explicit MatchSymDataSymbol( const CenSymbol & i_s ) : iv_s(i_s) {} - - bool operator() ( const SymbolData & i_data ) const - { return ( iv_s == i_data.symbol ); } - - private: - CenSymbol iv_s; -}; - /** * @brief Queries the per symbol counters and returns a sorted list of symbols * with a count greater than or equal to the given threshold. * @note The returned list will be sorted from lowest count to highest count. - * @param i_mbaChip Target MBA chip. + * @param i_chip Target mba or mca chip. * @param i_rank Target rank. * @param o_maintStats Returns the list of symbols and counts. * @param o_chipMark This represents the DRAM in which a chip mark should be @@ -138,27 +95,19 @@ class MatchSymDataSymbol * return code. * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. */ -int32_t collectCeStats( ExtensibleChip * i_mbaChip, const CenRank & i_rank, - MaintSymbols & o_maintStats, CenSymbol & o_chipMark, +template<TARGETING::TYPE T> +int32_t collectCeStats( ExtensibleChip * i_chip, const MemRank & i_rank, + MaintSymbols & o_maintStats, MemSymbol & o_chipMark, uint8_t i_thr = 1 ); /** - * @brief Clears the per symbol CE counters on a target MBA (via MEMBUF and MBA - * position number). - * @param i_membChip MEMBUF chip. - * @param i_mbaPos MBA positions number (0-1). - * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. - */ -int32_t clearPerSymbolCounters( ExtensibleChip * i_membChip, - uint32_t i_mbaPos ); - -/** - * @brief Gets DRAM size for an MBA. - * @param i_mbaChip MBA chip. - * @param o_size size for a DRAM. - * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. + * @brief Gets DRAM size for an MBA or MCA. + * @param i_chip MBA or MCA chip. + * @param i_dimmSlct DIMM select. + * @return size for a DRAM */ -int32_t getDramSize( ExtensibleChip * i_mbaChip, uint8_t & o_size ); +template<TARGETING::TYPE T> +uint8_t getDramSize( ExtensibleChip * i_chip, uint8_t i_dimmSlct ); /** * @brief Check for channel fail attentions on the MCS side of the DMI bus. @@ -170,7 +119,7 @@ int32_t checkMcsChannelFail( ExtensibleChip * i_mcsChip, STEP_CODE_DATA_STRUCT & io_sc ); /** - * @brief Cleanup for channel CS on Centaur. + * @brief Cleanup for channel CS. * @param i_mbChip Membuf chip. * @param i_sc Service Data Collector. * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. diff --git a/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk b/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk index 9a28bdb3d..b753dc50a 100644 --- a/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk +++ b/src/usr/diag/prdf/plat/mem/prdf_plat_mem_hb_only.mk @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2016 +# Contributors Listed Below - COPYRIGHT 2016,2017 # [+] International Business Machines Corp. # # @@ -40,6 +40,7 @@ prd_incpath += ${PRD_SRC_PATH}/plat/mem # plat/mem/ (non-rule plugin related) prd_obj += prdfMemScrubUtils.o prd_obj += prdfMemTdCtlr.o +prd_obj += prdfMemUtils.o # plat/mem/ (rule plugin related) prd_rule_plugin += prdfP9Mca.o |