diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2013-05-20 12:10:50 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-06-11 09:11:04 -0500 |
commit | bb2e9e1adac63e8b12c881b546b757f8d8de5697 (patch) | |
tree | 0fc5e25035276bcb175a608c954e35da0b969dcc /src/usr/diag/prdf | |
parent | aad40c5ff3cfea7c2901a2f96f6fe4c2c8568f9b (diff) | |
download | talos-hostboot-bb2e9e1adac63e8b12c881b546b757f8d8de5697.tar.gz talos-hostboot-bb2e9e1adac63e8b12c881b546b757f8d8de5697.zip |
PRD: simplified mss[G|S]etMarkStore interfaces
Change-Id: I8b85d462fb618b10e721ed61a6f2bbbf02ca9d93
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/4609
Tested-by: Jenkins Server
Reviewed-by: Christopher T. Phan <cphan@us.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Reviewed-by: Zane Shelley <zshelle@us.ibm.com>
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/4934
Diffstat (limited to 'src/usr/diag/prdf')
8 files changed, 267 insertions, 158 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C index 654c4b4a8..20a4cdea8 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C @@ -39,6 +39,7 @@ #include <prdfCenAddress.H> #include <prdfCenDqBitmap.H> +#include <prdfCenMarkstore.H> #include <dimmBadDqBitmapFuncs.H> // for dimm[S|G]etBadDqBitmap() @@ -314,98 +315,126 @@ int32_t setBadDqBitmap( TargetHandle_t i_mba, const CenRank & i_rank, //------------------------------------------------------------------------------ -int32_t mssGetMarkStore( TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t & o_chipMark, uint8_t & o_symbolMark ) +int32_t mssGetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank, + CenMark & o_mark ) { int32_t o_rc = SUCCESS; errlHndl_t errl = NULL; - PRD_FAPI_TO_ERRL( errl, mss_get_mark_store, getFapiTarget(i_mbaTarget), - i_rank, o_chipMark, o_symbolMark ); + uint8_t symbolMark, chipMark; + PRD_FAPI_TO_ERRL( errl, mss_get_mark_store, getFapiTarget(i_mba), + i_rank.flatten(), symbolMark, chipMark ); if ( NULL != errl ) { PRDF_ERR( "[PlatServices::mssGetMarkStore] mss_get_mark_store() " "failed. HUID: 0x%08x rank: %d", - getHuid(i_mbaTarget), i_rank ); + getHuid(i_mba), i_rank.flatten() ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; } + else + { + o_mark = CenMark( i_mba, i_rank, symbolMark, chipMark ); + } return o_rc; } //------------------------------------------------------------------------------ -int32_t mssSetMarkStore( TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t i_chipMark, uint8_t i_symbolMark ) +int32_t mssSetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank, + const CenMark & i_mark, bool & o_writeBlocked, + bool i_allowWriteBlocked ) { + #define PRDF_FUNC "[PlatServices::mssSetMarkStore] " + int32_t o_rc = SUCCESS; errlHndl_t errl = NULL; - // TODO: mss_put_mark_store() will give a certain return code if the write - // to mark store was circumvented by hardware. Will need to check this - // return code. + uint8_t symbolMark = i_mark.getSM().isValid() ? i_mark.getSM().getSymbol() + : MSS_INVALID_SYMBOL; + uint8_t chipMark = i_mark.getCM().isValid() ? i_mark.getCM().getSymbol() + : MSS_INVALID_SYMBOL; - PRD_FAPI_TO_ERRL( errl, mss_put_mark_store, getFapiTarget(i_mbaTarget), - i_rank, i_chipMark, i_symbolMark ); + fapi::ReturnCode l_rc = mss_put_mark_store( getFapiTarget(i_mba), + i_rank.flatten(), symbolMark, + chipMark ); - if ( NULL != errl ) + if ( i_allowWriteBlocked && + fapi::RC_MSS_MAINT_MARKSTORE_WRITE_BLOCKED == l_rc ) { - PRDF_ERR( "[PlatServices::mssSetMarkStore] mss_put_mark_store() " - "failed. HUID: 0x%08x rank: %d cm: %d sm: %d", - getHuid(i_mbaTarget), i_rank, i_chipMark, i_symbolMark ); - PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); - o_rc = FAIL; + o_writeBlocked = true; + } + else + { + errl = fapi::fapiRcToErrl(l_rc); + if ( NULL != errl ) + { + PRDF_ERR( PRDF_FUNC"mss_put_mark_store() failed. HUID: 0x%08x " + "rank: %d sm: %d cm: %d", getHuid(i_mba), + i_rank.flatten(), symbolMark, chipMark ); + PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); + o_rc = FAIL; + } } return o_rc; + + #undef PRDF_FUNC } //------------------------------------------------------------------------------ -int32_t mssGetSteerMux( TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t & o_port0Spare, uint8_t & o_port1Spare, - uint8_t & o_eccSpare ) +int32_t mssGetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank, + CenSymbol & o_port0Spare, CenSymbol & o_port1Spare, + CenSymbol & o_eccSpare ) { int32_t o_rc = SUCCESS; errlHndl_t errl = NULL; - PRD_FAPI_TO_ERRL( errl, mss_check_steering, getFapiTarget(i_mbaTarget), - i_rank, o_port0Spare, o_port1Spare, o_eccSpare ); + uint8_t port0Spare, port1Spare, eccSpare; + PRD_FAPI_TO_ERRL( errl, mss_check_steering, getFapiTarget(i_mba), + i_rank.flatten(), port0Spare, port1Spare, eccSpare ); if ( NULL != errl ) { PRDF_ERR( "[PlatServices::mssGetSteerMux] mss_check_steering() " "failed. HUID: 0x%08x rank: %d", - getHuid(i_mbaTarget), i_rank ); + getHuid(i_mba), i_rank.flatten() ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; } + else + { + o_port0Spare = CenSymbol::fromSymbol( i_mba, i_rank, port0Spare ); + o_port1Spare = CenSymbol::fromSymbol( i_mba, i_rank, port1Spare ); + o_eccSpare = CenSymbol::fromSymbol( i_mba, i_rank, eccSpare ); + } return o_rc; } //------------------------------------------------------------------------------ -int32_t mssSetSteerMux( TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t i_symbol, bool i_x4EccSpare ) +int32_t mssSetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank, + const CenSymbol & i_symbol, bool i_x4EccSpare ) { int32_t o_rc = SUCCESS; errlHndl_t errl = NULL; - PRD_FAPI_TO_ERRL( errl, mss_do_steering, getFapiTarget(i_mbaTarget), - i_rank, i_symbol, i_x4EccSpare ); + PRD_FAPI_TO_ERRL( errl, mss_do_steering, getFapiTarget(i_mba), + i_rank.flatten(), i_symbol.getSymbol(), i_x4EccSpare ); if ( NULL != errl ) { PRDF_ERR( "[PlatServices::mssSetSteerMux] mss_do_steering " "failed. HUID: 0x%08x rank: %d symbol: %d eccSpare: %c", - getHuid(i_mbaTarget), i_rank, i_symbol, + getHuid(i_mba), i_rank.flatten(), i_symbol.getSymbol(), i_x4EccSpare ? 'T' : 'F' ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H index 1cccfa675..24d975b38 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H +++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H @@ -56,7 +56,9 @@ namespace PRDF { class CenDqBitmap; +class CenMark; class CenRank; +class CenSymbol; namespace PlatServices { @@ -213,52 +215,60 @@ int32_t setBadDqBitmap( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank, /** * @brief Invokes the get mark store hardware procedure. - * @param i_mbaTarget A MBA target. - * @param i_rank Target rank (0-7). - * @param o_chipMark A symbol associated with the returned chip mark. - * @param o_symbolMark A symbol associated with the returned symbol mark. + * @param i_mba Target MBA. + * @param i_rank Target rank. + * @param o_mark The returned mark. * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ -int32_t mssGetMarkStore( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t & o_chipMark, uint8_t & o_symbolMark ); +int32_t mssGetMarkStore( TARGETING::TargetHandle_t i_mba, + const CenRank & i_rank, CenMark & o_mark ); /** * @brief Invokes the set mark store hardware procedure. - * @param i_mbaTarget A MBA target. - * @param i_rank Target rank (0-7). - * @param i_chipMark A symbol associated with the new chip mark. - * @param i_symbolMark A symbol associated with the new symbol mark. + * @param i_mba Target MBA. + * @param i_rank Target rank. + * @param i_mark The mark to write. + * @param o_writeBlocked TRUE if a blocke write is allowed and hardware + * blocked the write to markstore. + * @param i_allowWriteBlocked TRUE if a blocked write is allowed. This means + * the user will need to read what hardware just + * placed in the markstore and retry. If FALSE and + * the write was blocked, this function will commit + * the FAPI error log and return a non-SUCCESS. The + * default value is FALSE. * @note Both the chip mark and the symbol mark will be written at the same - * time, so do a RMW operation to avoid overwriting a previous mark. + * time, so do a RMW operation to avoid overwritting a previous mark. * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ -int32_t mssSetMarkStore( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t i_chipMark, uint8_t i_symbolMark ); +int32_t mssSetMarkStore( TARGETING::TargetHandle_t i_mba, + const CenRank & i_rank, const CenMark & i_mark, + bool & o_writeBlocked, + bool i_allowWriteBlocked = false ); /** * @brief Invokes the get steer mux hardware procedure. - * @param i_mbaTarget A MBA target. - * @param i_rank Target rank (0-7). + * @param i_mba Target MBA. + * @param i_rank Target rank. * @param o_port0Spare A symbol associated with the spare on port 0. * @param o_port1Spare A symbol associated with the spare on port 1. * @param o_eccSpare A symbol associated with the ECC spare (x4 mode only). * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ -int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t & o_port0Spare, uint8_t & o_port1Spare, - uint8_t & o_eccSpare ); +int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank, + CenSymbol & o_port0Spare, CenSymbol & o_port1Spare, + CenSymbol & o_eccSpare ); /** * @brief Invokes the set steer mux hardware procedure. - * @param i_mbaTarget A MBA target. - * @param i_rank Target rank (0-7). + * @param i_mba Target MBA. + * @param i_rank Target rank. * @param i_symbol A symbol associated with the DRAM to be spared. * @param i_x4EccSpare If true, will set ECC spare instead (x4 mode only). * @note The procedure will be able to derive the port from the given symbol. * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ -int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mbaTarget, uint8_t i_rank, - uint8_t i_symbol, bool i_x4EccSpare ); +int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank, + const CenSymbol & i_symbol, bool i_x4EccSpare ); /** * @brief Returns the memory buffer raw card type (i.e. R/C A). diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H new file mode 100644 index 000000000..38bf32245 --- /dev/null +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H @@ -0,0 +1,99 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/common/plat/pegasus/prdfCenMarkstore.H $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2013 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ + +#ifndef prdfCenMarkstore_H +#define prdfCenMarkstore_H + +/** @file prdfCenMarkstore.H */ + +#include <prdfCenAddress.H> +#include <prdfCenConst.H> +#include <prdfCenSymbol.H> +#include <prdfTargetFwdRef.H> + +//############################################################################## +// class CenMark +//############################################################################## + +namespace PRDF +{ + +/** + * @brief Container for a memory symbol and chip mark. + * @note When reading and writing markstore the symbol and chip marks are set + * or returned as a pair. This is a simple container to keep the two + * marks bundled. + */ +class CenMark +{ + public: // constructors + + /** @brief Default constructor */ + CenMark() : + iv_symbolMark(), iv_chipMark() + {} + + /** @brief Constructor from components */ + CenMark( CenSymbol i_symbolMark, CenSymbol i_chipMark ) : + iv_symbolMark(i_symbolMark), iv_chipMark(i_chipMark) + {} + + /** @brief Constructor from components */ + CenMark( TARGETING::TargetHandle_t i_mba, CenRank i_rank, + uint8_t i_symbolMark, uint8_t i_chipMark ) + { + iv_symbolMark = CenSymbol::fromSymbol( i_mba, i_rank, i_symbolMark ); + iv_chipMark = CenSymbol::fromSymbol( i_mba, i_rank, i_chipMark ); + } + + public: // functions + + /** @return A symbol representing the symbol mark. */ + CenSymbol getSM() const { return iv_symbolMark; } + + /** @return A symbol representing the chip mark. */ + CenSymbol getCM() const { return iv_chipMark; } + + /** @brief Sets the symbol mark to the given symbol. */ + void setSM( CenSymbol i_symbolMark ) { iv_symbolMark = i_symbolMark; } + + /** @brief Sets the chip mark to the given symbol. */ + void setCM( CenSymbol i_chipMark ) { iv_chipMark = i_chipMark; } + + /** @brief Sets the symbol mark to an invalid symbol. */ + void clearSM() { iv_symbolMark = CenSymbol(); } + + /** @brief Sets the chip mark to an invalid symbol. */ + void clearCM() { iv_chipMark = CenSymbol(); } + + private: // instance variables + + CenSymbol iv_symbolMark; ///< A symbol representing the symbol mark. + CenSymbol iv_chipMark; ///< A symbol representing the chip mark. + +}; + +} // end namespace PRDF + +#endif // prdfCenMarkstore_H + diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C index 0e55bd69f..8fdcfd3d3 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C @@ -33,6 +33,8 @@ #include <iipServiceDataCollector.h> #include <prdf_ras_services.H> +#include <prdfCenMarkstore.H> + namespace PRDF { @@ -67,35 +69,36 @@ void captureDramRepairsData( TARGETING::TargetHandle_t i_mbaTarget, DramRepairMbaData mbaData; // Iterate all ranks to get DRAM repair data - for(int rank = 0; rank < MAX_RANKS_PER_MBA ; rank++) + for ( uint32_t r = 0; r < MAX_RANKS_PER_MBA; r++ ) { - DramRepairRankData rankData; - rankData.rank = rank; - - // Get DRAM Repair data + CenRank rank ( r ); - rc = PlatServices::mssGetMarkStore( i_mbaTarget, rankData.rank, - rankData.chipMark, rankData.symbolMark ); - - if (SUCCESS != rc) + // Get chip/symbol marks + CenMark mark; + rc = PlatServices::mssGetMarkStore( i_mbaTarget, rank, mark ); + if ( SUCCESS != rc ) { PRDF_ERR("Failed to get markstore data"); continue; } - rc = PlatServices::mssGetSteerMux( i_mbaTarget, rankData.rank, - rankData.port0Spare, - rankData.port1Spare, - rankData.eccSpare ); - - if (SUCCESS != rc) + // Get DRAM spares + CenSymbol sp0, sp1, ecc; + rc = PlatServices::mssGetSteerMux( i_mbaTarget, rank, sp0, sp1, ecc ); + if ( SUCCESS != rc ) { PRDF_ERR("Failed to get DRAM steer data"); continue; } - // Check id rank had some DRAM repair data - if( rankData.valid() ) + // Add data + DramRepairRankData rankData = { rank.flatten(), + mark.getCM().getSymbol(), + mark.getSM().getSymbol(), + sp0.getSymbol(), + sp1.getSymbol(), + ecc.getSymbol() }; + if ( rankData.valid() ) { mbaData.rankDataList.push_back(rankData); } diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C index fe28589ba..38edaea21 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.C @@ -37,25 +37,24 @@ using namespace PlatServices; // class CenSymbol //############################################################################## -int32_t CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank, - uint8_t i_symbol, uint8_t i_pins, - CenSymbol & o_symbol ) +CenSymbol CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank, + uint8_t i_symbol, uint8_t i_pins ) { #define PRDF_FUNC "[CenSymbol::fromSymbol] " - int32_t o_rc = SUCCESS; + CenSymbol o_symbol; // default contructor is invalid. do { if ( TYPE_MBA != getTargetType(i_mba) ) { PRDF_ERR( PRDF_FUNC"i_mba is invalid" ); - o_rc = FAIL; break; + break; } WiringType wiringType = WIRING_INVALID; - o_rc = getWiringType( i_mba, i_rank, wiringType ); - if ( SUCCESS != o_rc ) + int32_t l_rc = getWiringType( i_mba, i_rank, wiringType ); + if ( SUCCESS != l_rc ) { PRDF_ERR( PRDF_FUNC"getWiringType() failed" ); break; @@ -64,14 +63,12 @@ int32_t CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank, if ( SYMBOLS_PER_RANK <= i_symbol ) { PRDF_ERR( PRDF_FUNC"i_symbol is invalid" ); - o_rc = FAIL; break; } if ( BOTH_SYMBOL_DQS < i_pins ) { PRDF_ERR( PRDF_FUNC"i_pins is invalid" ); - o_rc = FAIL; break; } @@ -79,47 +76,46 @@ int32_t CenSymbol::fromSymbol( TargetHandle_t i_mba, const CenRank & i_rank, } while (0); - if ( SUCCESS != o_rc ) + if ( !o_symbol.isValid() ) { PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x i_rank=%d i_symbol=%d " "i_pins=%d", getHuid(i_mba), i_rank.flatten(), i_symbol, i_pins ); } - return o_rc; + return o_symbol; #undef PRDF_FUNC } //------------------------------------------------------------------------------ -int32_t CenSymbol::fromDimmDq( TargetHandle_t i_mba, const CenRank & i_rank, - uint8_t i_dimmDq, uint8_t i_portSlct, - CenSymbol & o_symbol ) +CenSymbol CenSymbol::fromDimmDq( TargetHandle_t i_mba, const CenRank & i_rank, + uint8_t i_dimmDq, uint8_t i_portSlct ) { #define PRDF_FUNC "[CenSymbol::fromDimmDq] " - int32_t o_rc = SUCCESS; + CenSymbol o_symbol; // default contructor is invalid. do { if ( TYPE_MBA != getTargetType(i_mba) ) { PRDF_ERR( PRDF_FUNC"i_mba is invalid" ); - o_rc = FAIL; break; + break; } WiringType wiringType = WIRING_INVALID; - o_rc = getWiringType( i_mba, i_rank, wiringType ); - if ( SUCCESS != o_rc ) + int32_t l_rc = getWiringType( i_mba, i_rank, wiringType ); + if ( SUCCESS != l_rc ) { PRDF_ERR( PRDF_FUNC"getWiringType() failed" ); break; } uint8_t symbol; - o_rc = getSymbol( i_rank, wiringType, i_dimmDq, i_portSlct, symbol ); - if ( SUCCESS != o_rc ) + l_rc = getSymbol( i_rank, wiringType, i_dimmDq, i_portSlct, symbol ); + if ( SUCCESS != l_rc ) { PRDF_ERR( PRDF_FUNC"getSymbol() failed" ); break; @@ -132,14 +128,14 @@ int32_t CenSymbol::fromDimmDq( TargetHandle_t i_mba, const CenRank & i_rank, } while (0); - if ( SUCCESS != o_rc ) + if ( !o_symbol.isValid() ) { PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x i_rank=%d i_dimmDq=%d " "i_portSlct=%d", getHuid(i_mba), i_rank.flatten(), i_dimmDq, i_portSlct ); } - return o_rc; + return o_symbol; #undef PRDF_FUNC } diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H index ccd1f8ec4..0bfc86dfd 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenSymbol.H @@ -72,7 +72,7 @@ class CenSymbol */ CenSymbol() : iv_mbaTarget(NULL), iv_rank(), iv_wiringType(WIRING_INVALID), - iv_symbol(0), iv_pins(NO_SYMBOL_DQS) + iv_symbol(SYMBOLS_PER_RANK), iv_pins(NO_SYMBOL_DQS) {} private: // constructor @@ -94,12 +94,12 @@ class CenSymbol * @param i_rank The rank this symbol is on. * @param i_symbol The input symbol. * @param i_pins See enum DqMask. - * @param o_symbol The returned symbol object. - * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. + * @return A CenSymbol. Must call isValid() to determine if the function was + * successful in creating a valid object. */ - static int32_t fromSymbol( TARGETING::TargetHandle_t i_mba, - const CenRank & i_rank, uint8_t i_symbol, - uint8_t i_pins, CenSymbol & o_symbol ); + static CenSymbol fromSymbol( TARGETING::TargetHandle_t i_mba, + const CenRank & i_rank, uint8_t i_symbol, + uint8_t i_pins = NO_SYMBOL_DQS ); /** * @brief Creates a CenSymbol from a DIMM DQ. @@ -112,11 +112,12 @@ class CenSymbol * For IS DIMMs, the mapping between DIMM DQ and Centaur DQ is * determined by card that the DIMM is plugged into. See enum * WiringType for more details. - * @return Non-SUCCESS if an internal function failed, SUCCESS otherwise. + * @return A CenSymbol. Must call isValid() to determine if the function was + * successful in creating a valid object. */ - static int32_t fromDimmDq( TARGETING::TargetHandle_t i_mba, - const CenRank & i_rank, uint8_t i_dimmDq, - uint8_t i_portSlct, CenSymbol & o_symbol ); + static CenSymbol fromDimmDq( TARGETING::TargetHandle_t i_mba, + const CenRank & i_rank, uint8_t i_dimmDq, + uint8_t i_portSlct ); /** * @brief Returns the dimm's wiring type. @@ -129,6 +130,9 @@ class CenSymbol const CenRank & i_rank, WiringType & o_wiringType ); + /** @return true if symbol is within the valid range, false otherwise. */ + bool isValid() const { return iv_symbol < SYMBOLS_PER_RANK; } + /** @return This symbol's wiring type. */ WiringType getWiringType() const { return iv_wiringType; } diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C index bba6248f5..177a64d91 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfMemoryMru.C @@ -122,12 +122,11 @@ MemoryMru::MemoryMru( uint32_t i_memMru ) : break; } - int32_t rc = CenSymbol::fromSymbol( iv_mbaTarget, iv_rank, - iv_memMruMeld.s.symbol, - iv_memMruMeld.s.pins, - iv_symbol ); + iv_symbol = CenSymbol::fromSymbol( iv_mbaTarget, iv_rank, + iv_memMruMeld.s.symbol, + iv_memMruMeld.s.pins ); - if ( SUCCESS != rc) + if ( !iv_symbol.isValid() ) { PRDF_ERR( PRDF_FUNC"Can not create symbol from symbol value" " :%u, pins:%u, rank:%u", diff --git a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C index 8e4e95de9..4e58f4f2f 100644 --- a/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C +++ b/src/usr/diag/prdf/plat/pegasus/prdfDramRepairs.C @@ -33,6 +33,7 @@ #include "common/plat/pegasus/prdfCenMbaCaptureData.H" #include "common/plat/pegasus/prdfCalloutUtil.H" #include "common/plat/pegasus/prdfCenDqBitmap.H" +#include "common/plat/pegasus/prdfCenMarkstore.H" #include "common/plat/pegasus/prdfCenSymbol.H" #include "common/plat/pegasus/prdfMemoryMru.H" #include "framework/service/prdfPlatServices.H" @@ -166,63 +167,35 @@ bool processRepairedRanks( TargetHandle_t i_mba, uint8_t i_repairedRankMask ) // check each rank for repairs // that violate RAS policy - for ( uint8_t rankNumber = 0; - rankNumber < DIMM_DQ_MAX_MBAPORT_DIMMS * DIMM_DQ_MAX_DIMM_RANKS; - ++rankNumber ) + for ( uint8_t r = 0; r < MAX_RANKS_PER_MBA; ++r ) { - if(0 == ((0x80 >> rankNumber) & i_repairedRankMask)) + if ( 0 == (i_repairedRankMask & (1 << r)) ) { - // this rank didn't have any repairs - - continue; + continue; // this rank didn't have any repairs } - uint8_t sm = INVALID_SYMBOL, - cm = INVALID_SYMBOL; + CenRank rank ( r ); + CenMark mark; - if(SUCCESS != PlatServices::mssGetMarkStore( - i_mba, rankNumber, cm, sm)) + if ( SUCCESS != PlatServices::mssGetMarkStore(i_mba, rank, mark) ) { - // skip this rank - - continue; + continue; // skip this rank } - uint8_t sp0 = INVALID_SYMBOL, - sp1 = INVALID_SYMBOL, - sp = INVALID_SYMBOL; + CenSymbol sp0, sp1, sp; - if(SUCCESS != PlatServices::mssGetSteerMux( - i_mba, - rankNumber, - sp0, sp1, sp)) + if ( SUCCESS != PlatServices::mssGetSteerMux(i_mba, rank, sp0, sp1, sp)) { - // skip this rank - - continue; + continue; // skip this rank } - if ( (validSymbol(sp0) || validSymbol(sp1) || validSymbol(sp)) && - validSymbol(cm) ) + if ( (sp0.isValid() || sp1.isValid() || sp.isValid()) && + mark.getCM().isValid() ) { // This rank has both a steer and a chip mark. Call out the DIMM // with the chip mark. - CenRank rank ( rankNumber ); - - CenSymbol symbol; - int32_t rc = CenSymbol::fromSymbol( i_mba, rank, cm, - CenSymbol::BOTH_SYMBOL_DQS, - symbol ); - if ( SUCCESS != rc ) - { - PRDF_ERR( "[processRepairedRanks] CenSymbol::fromSymbol() " - "failed: HUID=0x%08x rank=%d symbol=%d", - PlatServices::getHuid(i_mba), rank.flatten(), cm ); - continue; - } - - MemoryMru memoryMru( i_mba, rank, symbol ); + MemoryMru memoryMru( i_mba, rank, mark.getCM() ); commitRestoreCallout( &addMemMruCallout, &memoryMru, i_mba ); @@ -382,24 +355,20 @@ void deployDramSpares(TargetHandle_t i_mba) bool x4 = PlatServices::isDramWidthX4(i_mba); - for ( uint8_t rankNumber = 0; - rankNumber < DIMM_DQ_MAX_MBAPORT_DIMMS * DIMM_DQ_MAX_DIMM_RANKS; - ++rankNumber ) + for ( uint32_t r = 0; r < MAX_RANKS_PER_MBA; r++ ) { + CenRank rank ( r ); + CenSymbol symbol = CenSymbol::fromSymbol( i_mba, rank, 0 ); + // ignore errors from putSteerMux static_cast<void>( - PlatServices::mssSetSteerMux( - i_mba, - rankNumber, - 0, false)); + PlatServices::mssSetSteerMux(i_mba, rank, symbol, false) ); - if( x4 ) { + if( x4 ) + { static_cast<void>( - PlatServices::mssSetSteerMux( - i_mba, - rankNumber, - 0, true)); + PlatServices::mssSetSteerMux(i_mba, rank, symbol, true) ); } } } |