diff options
author | Caleb Palmer <cnpalmer@us.ibm.com> | 2016-12-19 10:48:27 -0600 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2017-02-10 13:22:23 -0500 |
commit | ca06545bc2b11266ffd7db859e78b693adb7f959 (patch) | |
tree | b54b1d8d704b5498fdbd36812bc9f3128e421cc9 /src/usr/diag/prdf/plat/pegasus | |
parent | eb825905b34c4978bb75e81b654bb2390778563f (diff) | |
download | talos-hostboot-ca06545bc2b11266ffd7db859e78b693adb7f959.tar.gz talos-hostboot-ca06545bc2b11266ffd7db859e78b693adb7f959.zip |
PRD: Create CeStats Class
Change-Id: I30ebbb49a2851c19822a68a3fcefb4eb406aae51
RTC: 159627
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/34057
Reviewed-by: Benjamin J. Weisenbeck <bweisenb@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36075
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/usr/diag/prdf/plat/pegasus')
-rwxr-xr-x | src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C | 513 | ||||
-rwxr-xr-x | src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.H | 227 |
2 files changed, 0 insertions, 740 deletions
diff --git a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C deleted file mode 100755 index 0d14581cb..000000000 --- a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C +++ /dev/null @@ -1,513 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.C $ */ -/* */ -/* OpenPOWER HostBoot Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2013,2016 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -/** @file prdfCenMbaIplCeStats.C - * @brief Contains IPL CE related code. - */ - -// Framework includes -#include <iipServiceDataCollector.h> -#include <prdfEnums.H> -#include <prdfErrlUtil.H> -#include <prdfExtensibleChip.H> -#include <prdfGlobal.H> -#include <prdfPfa5Data.h> -#include <prdf_service_codes.H> - -// Pegasus includes -#include <prdfCenMbaExtraSig.H> -#include <prdfCenMbaIplCeStats.H> -#include <prdfCenMbaThresholds.H> -#include <prdfCenMemUtils.H> -#include <prdfMemoryMru.H> -#include <prdfPlatCalloutUtil.H> - -using namespace TARGETING; - -namespace PRDF -{ - -using namespace PlatServices; -using namespace HWAS; - -//------------------------------------------------------------------------------ - -void CenMbaIplCeStats::banAnalysis( const CenRank & i_rank ) -{ - - for ( uint8_t i = 0; i < MAX_PORT_PER_MBA; i++ ) - { - HalfRankKey banKey = { i_rank, i }; - iv_bannedAnalysis[banKey] = true; - } -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::banAnalysis( const CenRank & i_rank, - uint8_t i_portSlct ) -{ - int32_t o_rc = SUCCESS; - - do - { - if ( i_portSlct >= MAX_PORT_PER_MBA ) - { - PRDF_ERR("[banAnalysis] i_portSlct (0x%02x) is invalid", - i_portSlct ); - o_rc = FAIL; - break; - } - - HalfRankKey banKey = { i_rank, i_portSlct }; - iv_bannedAnalysis[banKey] = true; - - } while (0); - - return o_rc; -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::collectStats( const CenRank & i_stopRank ) -{ - #define PRDF_FUNC "[CenMbaIplCeStats::collectStats] " - int32_t o_rc = SUCCESS; - do - { - MemUtils::MaintSymbols symData; CenSymbol junk; - o_rc = MemUtils::collectCeStats( iv_mbaChip, i_stopRank, symData, junk); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "MemUtils::collectCeStats() failed. MBA:0X%08X", - getHuid( iv_mbaChip->GetChipHandle() ) ); - break; - } - - // if size of stats collected is zero, it may mean some symbol - // has gone beyond maximum value. But this is only valid for DD1 - // and has a very low probability. So ignoring this case. - - for ( uint32_t i = 0; i < symData.size(); i++ ) - { - uint8_t dimmSlct = i_stopRank.getDimmSlct(); - uint8_t dram = symData[i].symbol.getDram(); - uint8_t portSlct = symData[i].symbol.getPortSlct(); - - // Check if analysis is banned. - HalfRankKey banKey = { i_stopRank, portSlct }; - - // Check if the rank has already been banned. Note that [] will - // create an entry if one does not exist, so used find() instead to - // check for existence in the map. - if ( iv_bannedAnalysis.end() != iv_bannedAnalysis.find(banKey) ) - continue; - - // Update iv_ceSymbols with the new symbol data. - SymbolKey symkey = { symData[i].symbol }; - iv_ceSymbols.push_back (symkey ); - - // Increment the soft CEs per DRAM. - DramKey dramKey = { i_stopRank, dram, portSlct }; - iv_dramMap[dramKey] += symData[i].count; - - // Increment the soft CEs per half rank. - HalfRankKey rankKey = { i_stopRank, portSlct }; - iv_rankMap[rankKey] += symData[i].count; - - // In case of dimm select, rank select does not matter - CenRank dimmRank( dimmSlct << DIMM_SLCT_PER_PORT ); - // Increment the soft CEs per half dimm select. - HalfRankKey dsKey = { dimmRank, portSlct }; - iv_dsMap[dsKey] += symData[i].count; - } - - } while (0); - - // We have to clear all stats before giving control back to MDIA.. - // This is done by setting up MBSTRQ[53] bit - // We are doing cleanup in TdController code, - // So not clearing up stats here. - return o_rc; - - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::analyzeStats( bool & o_callOutsMade ) -{ - #define PRDF_FUNC "CenMbaIplCeStats::analyzeStats " - int32_t o_rc = SUCCESS; - - o_callOutsMade = false; - - do - { - TargetHandle_t mbaTrgt = iv_mbaChip->GetChipHandle(); - - o_rc = calloutCePerDram( o_callOutsMade ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC " calloutCePerDram() failed. MBA:0X%08X", - getHuid( mbaTrgt ) ); - break; - } - - o_rc = calloutCePerRank( o_callOutsMade ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "calloutCePerRank() failed. MBA:0X%08X", - getHuid( mbaTrgt ) ); - break; - } - - o_rc = calloutCePerDs( o_callOutsMade ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC " calloutCePerDs() failed. MBA:0X%08X", - getHuid( mbaTrgt ) ); - break; - } - - } while (0); - - return o_rc; - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::calloutHardCes( const CenRank & i_stopRank ) -{ - #define PRDF_FUNC "[CenMbaIplCeStats::calloutHardCes] " - TargetHandle_t mbaTrgt = iv_mbaChip->GetChipHandle(); - int32_t o_rc = SUCCESS; - do - { - MemUtils::MaintSymbols symData; CenSymbol junk; - o_rc = MemUtils::collectCeStats( iv_mbaChip, i_stopRank, symData, junk); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "MemUtils::collectCeStats() failed. MBA:0X%08X", - getHuid( iv_mbaChip->GetChipHandle() ) ); - break; - } - - for ( uint32_t i = 0; i < symData.size(); i++ ) - { - uint8_t portSlct = symData[i].symbol.getPortSlct(); - - // Check if analysis is banned. - HalfRankKey banKey = { i_stopRank, portSlct }; - - bool& isBanned = iv_bannedAnalysis[banKey]; - - if ( isBanned ) - continue; - - // At this point a hard CE was found, callout the symbol. - MemoryMru memMru ( mbaTrgt, symData[i].symbol.getRank(), - symData[i].symbol ); - - // We are creating and committing error log here. It is different - // from rest of attention flow. We could have set the callout - // values in sdc but it would have created confusion in ffdc if - // we also get vcm/ue at same time. - errlHndl_t l_errl = NULL; - - PRDF_CREATE_ERRL( l_errl, - ERRL_SEV_PREDICTIVE, - ERRL_ETYPE_NOT_APPLICABLE, - SRCI_ERR_INFO, - SRCI_NO_ATTR, - PRDF_MNFG_IPL_CE_ANALYSIS, - LIC_REFCODE, - PRDF_DETECTED_FAIL_HARDWARE, - getHuid( mbaTrgt ), - 0, PRDFSIG_MnfgIplHardCE, 0); - addMruAndCommitErrl( memMru, l_errl); - - // Ban the half rank. - isBanned = true; - } - }while(0); - return o_rc; - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::calloutCePerDram( bool & o_callOutsMade ) -{ - #define PRDF_FUNC "[CenMbaIplCeStats::calloutCePerDram] " - int32_t o_rc = SUCCESS; - - TargetHandle_t mbaTrgt = iv_mbaChip->GetChipHandle(); - - for ( CePerDramMap::iterator dramIter = iv_dramMap.begin(); - dramIter != iv_dramMap.end(); dramIter++ ) - { - // First, check if this half rank is banned from analysis. - HalfRankKey banKey = { dramIter->first.rank, - dramIter->first.portSlct }; - - // Check if the rank has already been banned. Note that [] will create - // the an entry if one does not exist, so used find() instead to check - // for existence in the map. - if ( iv_bannedAnalysis.end() != iv_bannedAnalysis.find(banKey) ) - continue; - - // Get the CEs per DRAM threshold. - uint16_t dramTh, junk0, junk1; - o_rc = getMnfgMemCeTh( iv_mbaChip, dramIter->first.rank, dramTh, - junk0, junk1 ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "getMnfgMemCeTh() failed. MBA:0x%08X", - getHuid( mbaTrgt ) ); - break; - } - - // Now, check if a threshold has been reached. If not, continue to the - // next entry in iv_dsMap. - if ( dramIter->second <= dramTh ) - continue; - - // At this point a threshold has been reached. Callout a single symbol - // found in this dram. - for ( CESymbols::iterator symIter = iv_ceSymbols.begin(); - symIter != iv_ceSymbols.end(); symIter++ ) - { - if ( (dramIter->first.rank == symIter->symbol.getRank() ) && - (dramIter->first.dram == symIter->symbol.getDram() ) ) - { - MemoryMru memMru ( mbaTrgt, symIter->symbol.getRank() , - symIter->symbol ); - - errlHndl_t l_errl = NULL; - - PRDF_CREATE_ERRL( l_errl, - ERRL_SEV_PREDICTIVE, - ERRL_ETYPE_NOT_APPLICABLE, - SRCI_ERR_INFO, - SRCI_NO_ATTR, - PRDF_MNFG_IPL_CE_ANALYSIS, - LIC_REFCODE, - PRDF_DETECTED_FAIL_HARDWARE, - getHuid( mbaTrgt ), - 0, PRDFSIG_MnfgIplDramCTE, 0); - - addMruAndCommitErrl( memMru, l_errl); - - // Ban the half rank. - iv_bannedAnalysis[banKey] = true; - o_callOutsMade = true; - - // Only one symbol needs to be called out, so exit on first - // occurrence. - break; - } - } - } - return o_rc; - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::calloutCePerRank( bool & o_callOutsMade ) -{ - #define PRDF_FUNC "[CenMbaIplCeStats::calloutCePerRank] " - int32_t o_rc = SUCCESS; - - TargetHandle_t mbaTrgt = iv_mbaChip->GetChipHandle(); - - for ( CePerHalfRankMap::iterator rankIter = iv_rankMap.begin(); - rankIter != iv_rankMap.end(); rankIter++ ) - { - // First, check if this half rank is banned from analysis. - HalfRankKey banKey = { rankIter->first.rank, - rankIter->first.portSlct }; - - // Check if the rank has already been banned. Note that [] will create - // the an entry if one does not exist, so used find() instead to check - // for existence in the map. - if ( iv_bannedAnalysis.end() != iv_bannedAnalysis.find(banKey) ) - continue; - - // Get the CEs per rank threshold. - uint16_t junk0, rankTh, junk1; - o_rc = getMnfgMemCeTh( iv_mbaChip, rankIter->first.rank, junk0, - rankTh, junk1 ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "getMnfgMemCeTh() failed. MBA:0x%08X", - getHuid( mbaTrgt ) ); - break; - } - - // Now, check if a threshold has been reached. If not, continue to the - // next entry in iv_rankMap. - if ( rankIter->second <= rankTh ) - continue; - - // At this point a threshold has been reached. Callout a single symbol - // found in this rank. - for ( CESymbols::iterator symIter = iv_ceSymbols.begin(); - symIter != iv_ceSymbols.end(); symIter++ ) - { - if ( (rankIter->first.rank == symIter->symbol.getRank() ) && - (rankIter->first.portSlct == - symIter->symbol.getPortSlct()) ) - { - MemoryMru memMru ( mbaTrgt, symIter->symbol.getRank() , - symIter->symbol ); - - errlHndl_t l_errl = NULL; - - PRDF_CREATE_ERRL( l_errl, - ERRL_SEV_PREDICTIVE, - ERRL_ETYPE_NOT_APPLICABLE, - SRCI_ERR_INFO, - SRCI_NO_ATTR, - PRDF_MNFG_IPL_CE_ANALYSIS, - LIC_REFCODE, - PRDF_DETECTED_FAIL_HARDWARE, - getHuid( mbaTrgt ), - 0, PRDFSIG_MnfgIplRankCTE, 0); - - addMruAndCommitErrl( memMru, l_errl); - // Ban the half rank. - iv_bannedAnalysis[banKey] = true; - o_callOutsMade = true; - - // Only one symbol needs to be called out, so exit on first - // occurrence. - break; - } - } - } - return o_rc; - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -int32_t CenMbaIplCeStats::calloutCePerDs( bool & o_callOutsMade ) -{ - #define PRDF_FUNC "[CenMbaIplCeStats::calloutCePerDs] " - int32_t o_rc = SUCCESS; - - TargetHandle_t mbaTrgt = iv_mbaChip->GetChipHandle(); - - for ( CePerHalfDsMap::iterator dsIter = iv_dsMap.begin(); - dsIter != iv_dsMap.end(); dsIter++ ) - { - // First, check if this half dimm select is banned from analysis. - HalfRankKey banKey = { dsIter->first.rank, - dsIter->first.portSlct }; - - // Check if the rank has already been banned. Note that [] will create - // the an entry if one does not exist, so used find() instead to check - // for existence in the map. - if ( iv_bannedAnalysis.end() != iv_bannedAnalysis.find(banKey) ) - continue; - - // Get the CEs per dimm select threshold. - uint16_t junk0, junk1, dsTh; - o_rc = getMnfgMemCeTh( iv_mbaChip, dsIter->first.rank, junk0, - junk1, dsTh ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "getMnfgMemCeTh() failed. MBA:0x%08X", - getHuid( mbaTrgt ) ); - break; - } - - // Now, check if a threshold has been reached. If not, continue to the - // next entry in iv_dsMap. - if ( dsIter->second <= dsTh ) - continue; - - // At this point a threshold has been reached. Callout a single symbol - // found in this dimm select. - for ( CESymbols::iterator symIter = iv_ceSymbols.begin(); - symIter != iv_ceSymbols.end(); symIter++ ) - { - if ( (dsIter->first.rank.getDimmSlct() == - symIter->symbol.getRank().getDimmSlct() ) - && (dsIter->first.portSlct == - symIter->symbol.getPortSlct()) ) - { - MemoryMru memMru ( mbaTrgt, symIter->symbol.getRank() , - symIter->symbol ); - - errlHndl_t l_errl = NULL; - PRDF_CREATE_ERRL( l_errl, - ERRL_SEV_PREDICTIVE, - ERRL_ETYPE_NOT_APPLICABLE, - SRCI_ERR_INFO, - SRCI_NO_ATTR, - PRDF_MNFG_IPL_CE_ANALYSIS, - LIC_REFCODE, - PRDF_DETECTED_FAIL_HARDWARE, - getHuid(mbaTrgt), - 0, PRDFSIG_MnfgIplDsCTE, 0); - - addMruAndCommitErrl( memMru, l_errl); - // Ban the half dimm select. - iv_bannedAnalysis[banKey] = true; - o_callOutsMade = true; - - // Only one symbol needs to be called out, so exit on first - // occurrence. - break; - } - } - } - return o_rc; - #undef PRDF_FUNC -} - -//------------------------------------------------------------------------------ - -void CenMbaIplCeStats::addMruAndCommitErrl( const MemoryMru & i_memmru, - errlHndl_t i_errl ) -{ - // Add MemoryMru callouts and FFDC - CalloutUtil::calloutMemoryMru( i_errl, i_memmru, - SRCI_PRIORITY_HIGH, - HWAS::DELAYED_DECONFIG, - HWAS::GARD_Predictive ); - - // Add traces - i_errl->collectTrace( PRDF_COMP_NAME, 512 ); - - // Commit the error log - ERRORLOG::errlCommit( i_errl, PRDF_COMP_ID ); -} - -} // end namespace PRDF diff --git a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.H b/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.H deleted file mode 100755 index b873eec9e..000000000 --- a/src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.H +++ /dev/null @@ -1,227 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/diag/prdf/plat/pegasus/prdfCenMbaIplCeStats.H $ */ -/* */ -/* OpenPOWER HostBoot Project */ -/* */ -/* COPYRIGHT International Business Machines Corp. 2013,2014 */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -#ifndef PRDF_CEN_MBA_IPL_CE_STATS_H -#define PRDF_CEN_MBA_IPL_CE_STATS_H - -/** @file prdfCenMbaIplCeStats.H */ - -//------------------------------------------------------------------------------ -#include <prdfExtensibleChip.H> -#include <prdfCenAddress.H> -#include <prdfCenSymbol.H> -#include <prdfCenAddress.H> -#include <map> - -namespace PRDF -{ -class ExtensibleChip; -class MemoryMru; -//------------------------------------------------------------------------------ - -/** - * This class is used for storing the CE statistics that are gathered during a - * manufacturing mode IPL for MDIA analysis. Only one instance of this object is - * meant to be used for each MBA and is stored in its data bundle. - * It is expected that when the IPL memory diagnostics is complete, MDIA will - * call the appropriate function to tell this object to analyze all statistics - * that were collected during the IPL. - */ -class CenMbaIplCeStats -{ - public: - - /** - * @brief Constructor - * @param i_mbaChip The MBA chip. - */ - explicit CenMbaIplCeStats( ExtensibleChip * i_mbaChip ) - :iv_mbaChip(i_mbaChip) {} - - /** - * @brief Destructor - */ - ~CenMbaIplCeStats() {} - - /** - * @brief Bans analysis of the given rank. - * @param i_rank The rank to ban. - */ - void banAnalysis( const CenRank & i_rank ); - - /** - * @brief Bans analysis of the given half rank. - * @param i_rank The rank. - * @param i_portSlct The port select. - * @return Non-SUCCESS if the parameters are invalid, SUCCESS otherwise. - */ - int32_t banAnalysis( const CenRank & i_rank, uint8_t i_portSlct ); - - /** - * @brief Will collect all the maintenance statistics and store them for - * analysis. Will also clear the scrub statistics counters when - * collection is complete. - * @param i_rank The rank the maintenance command stopped on. - * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. - */ - int32_t collectStats( const CenRank & i_rank ); - - /** - * @brief Analyzes the maintenance statistics that were gathered, making - * the appropriate callouts. - * @param o_callOutsDone TRUE if PRD made a hardware callout, FALSE - * otherwise. - * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. - */ - int32_t analyzeStats ( bool & o_callOutsDone ); - - /** @brief Calls out all symbols with hard CEs. - * @param i_stopRank The rank the maintenance command stopped on. - */ - int32_t calloutHardCes( const CenRank & i_stopRank ); - - private: // enums, structs, typedefs - - /** @brief The key type for each entry in iv_symMap. */ - struct SymbolKey - { - CenSymbol symbol; ///< The failing symbol - - /** @brief Overrides the '==' operator. */ - bool operator==( const SymbolKey & i ) const - { return ( symbol == i.symbol ); } - - /** @brief Overrides the '<' operator. */ - bool operator<( const SymbolKey & i ) const - { return (symbol < i.symbol ); } - }; - - - /** @brief The key to identify half rank. - * This key will be used to ban analysis, rank and dimm - * threshold analysis - */ - struct HalfRankKey - { - CenRank rank; ///< The rank - uint8_t portSlct; ///< The port select - - /** @brief Overrides the '==' operator. */ - bool operator==( const HalfRankKey & i ) const - { return ( (rank == i.rank) && (portSlct == i.portSlct) ); } - - /** @brief Overrides the '<' operator. */ - bool operator<( const HalfRankKey & i ) const - { - return ( (rank < i.rank) || - ((rank == i.rank) && (portSlct < i.portSlct)) ); - } - }; - - /** @brief The key type for each entry in iv_dramMap. */ - struct DramKey - { - CenRank rank; ///< The rank - uint8_t dram; ///< The DRAM (x8:0-17 x4:0-35) - uint8_t portSlct; ///< The port select (0-1) - - // Techinally, the port select can be derived from the DRAM value, - // however, it simplifies things to just store the port select here. - // Therefore, the port select does not need to be used in operator==() - // or operators<(). - - /** @brief Overrides the '==' operator. */ - bool operator==( const DramKey & i ) const - { return ( (rank == i.rank) && (dram == i.dram) ); } - - /** @brief Overrides the '<' operator. */ - bool operator<( const DramKey & i ) const - { return ( (rank < i.rank) || ((rank == i.rank) && (dram < i.dram)) ); } - }; - - // data type to collect all symbol statistics - typedef std::vector<SymbolKey> CESymbols; - - // data type to collect dimm specific statitics. While - // filling up data for this data type, we should ignore rank select - // and only consider dimm slct. - typedef std::map<HalfRankKey, uint32_t> CePerHalfDsMap; - // data type to collect all symbol statistics for a rank. - typedef std::map<HalfRankKey, uint32_t> CePerHalfRankMap; - // data type to store banned half ranks on which analysis is not required. - typedef std::map<HalfRankKey, bool> BannedAnalysisMap; - // data type to collect all symbol statistics for a dram. - typedef std::map<DramKey, uint32_t> CePerDramMap; - - private: // functions - - /** @brief Calls out all symbols on a dram that has exceeded threshold. - * @param o_callOutsMade TRUE if a callout was made, FALSE othewise. - * @return Non-SUCCESS if an internal function fails, SUCCESS othewise. - */ - int32_t calloutCePerDram( bool & o_callOutsMade ); - - /** @brief Calls out all symbols on a rank that has exceeded threshold. - * @param o_callOutsMade TRUE if a callout was made, FALSE othewise. - * @return Non-SUCCESS if an internal function fails, SUCCESS othewise. - */ - int32_t calloutCePerRank( bool & o_callOutsMade ); - - /** @brief Calls out all symbols on a dimm select that has exceeded - * threshold. - * @param o_callOutsMade TRUE if a callout was made, FALSE othewise. - * @return Non-SUCCESS if an internal function fails, SUCCESS othewise. - */ - int32_t calloutCePerDs( bool & o_callOutsMade ); - - /** - * @brief Add MemoryMru callout to error log and commit it. - * @param i_memmru Memory MRU. - * @param i_errl Error log. - */ - void addMruAndCommitErrl( const MemoryMru & i_memmru, errlHndl_t i_errl ); - - private: // instance variables - - /** The MBA chip. */ - ExtensibleChip * iv_mbaChip; - - /** A map to keep track of which half ranks have all ready been called out. - * This helps reduce excessive callouts for the same hardware. */ - BannedAnalysisMap iv_bannedAnalysis; - - /** A vector containing all data for every failing symbol. */ - CESymbols iv_ceSymbols; - - /** A map containing count for every failing dimm select. */ - CePerHalfDsMap iv_dsMap; - - /** A map containing count for every failing rank. */ - CePerHalfRankMap iv_rankMap; - - /** A map containing count for every failing DRAM. */ - CePerDramMap iv_dramMap; -}; - -} //end namespace PRDF -#endif /* PRDF_CEN_MBA_IPL_CE_STATS_H */ |