diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2013-08-22 15:20:14 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-09-18 13:55:30 -0500 |
commit | 61bd30cddc44108ea1f1cc72527f2ea52fd3f7e5 (patch) | |
tree | 5313bcd91b5209948808ea08bc008c5a98c69023 /src/usr/diag/prdf/common/framework/service | |
parent | d62e12b822f62d13127aa83f7f319eafa70c89d7 (diff) | |
download | talos-hostboot-61bd30cddc44108ea1f1cc72527f2ea52fd3f7e5.tar.gz talos-hostboot-61bd30cddc44108ea1f1cc72527f2ea52fd3f7e5.zip |
PRD: support for slave ranks in memory
Change-Id: Ica91679b5ce688f2ccfab07137174696871aea60
RTC: 77146
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/5975
Tested-by: Jenkins Server
Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Reviewed-by: Christopher T. Phan <cphan@us.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/6229
Diffstat (limited to 'src/usr/diag/prdf/common/framework/service')
-rwxr-xr-x | src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C | 199 | ||||
-rwxr-xr-x | src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H | 10 |
2 files changed, 122 insertions, 87 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 fed697795..f2dc9753a 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C +++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C @@ -60,14 +60,6 @@ namespace PlatServices { //############################################################################## -//## Forward references -//############################################################################## - -int32_t getMemAddrRange( TargetHandle_t i_mba, uint8_t i_rank, - ecmdDataBufferBase & o_startAddr, - ecmdDataBufferBase & o_endAddr ); - -//############################################################################## //## Utility Functions (for this file only) //############################################################################## @@ -128,7 +120,7 @@ int32_t readErepair(TargetHandle_t i_rxBusTgt, getFapiTarget(i_rxBusTgt), o_rxFailLanes); - if(NULL != err) + if(NULL != err) { PRDF_ERR( "[PlatServices::readErepair] HUID: 0x%08x io_read_erepair " "failed", getHuid(i_rxBusTgt) ); @@ -234,25 +226,104 @@ int32_t setVpdFailedLanes(TargetHandle_t i_rxBusTgt, int32_t erepairFirIsolation(TargetHandle_t i_rxBusTgt) { + #define PRDF_FUNC "[PlatServices::erepairFirIsolation] " + errlHndl_t err = NULL; PRD_FAPI_TO_ERRL(err, io_fir_isolation, getFapiTarget(i_rxBusTgt)); if(NULL != err) { - PRDF_TRAC( "[PlatServices::setVpdFailedLanes] rxHUID: 0x%08x " - "committing io_fir_isolation log", + PRDF_ERR( PRDF_FUNC"rxHUID: 0x%08x committing io_fir_isolation log", getHuid(i_rxBusTgt)); PRDF_COMMIT_ERRL( err, ERRL_ACTION_REPORT ); } // Return SUCCESS since we expect this procedure to generate an error return SUCCESS; + + #undef PRDF_FUNC } + //############################################################################## //## Memory specific functions //############################################################################## +// Helper function for the for several other memory functions. +int32_t getMemAddrRange( TargetHandle_t i_mba, uint8_t i_mrank, + ecmdDataBufferBase & o_startAddr, + ecmdDataBufferBase & o_endAddr, + uint8_t i_srank = 0, bool i_slaveOnly = false ) +{ + #define PRDF_FUNC "[PlatServices::getMemAddrRange] " + + int32_t o_rc = SUCCESS; + + do + { + // Check parameters. + if ( TYPE_MBA != getTargetType(i_mba) ) + { + PRDF_ERR( PRDF_FUNC"The given target is not TYPE_MBA" ); + o_rc = FAIL; break; + } + + if ( (MSS_ALL_RANKS != i_mrank && MASTER_RANKS_PER_MBA <= i_mrank) || + (SLAVE_RANKS_PER_MASTER_RANK <= i_srank) ) + { + PRDF_ERR( PRDF_FUNC"The given rank is not valid" ); + o_rc = FAIL; break; + } + + errlHndl_t errl = NULL; + + if ( i_slaveOnly ) + { + // TODO: RTC 82157 Use new interface when available, for now use + // current interface. +// PRD_FAPI_TO_ERRL( errl, mss_get_address_range, getFapiTarget(i_mba), +// i_mrank, i_srank, o_startAddr, o_endAddr ); + PRD_FAPI_TO_ERRL( errl, mss_get_address_range, getFapiTarget(i_mba), + i_mrank, o_startAddr, o_endAddr ); + } + else + { + PRD_FAPI_TO_ERRL( errl, mss_get_address_range, getFapiTarget(i_mba), + i_mrank, o_startAddr, o_endAddr ); + } + + if ( NULL != errl ) + { + PRDF_ERR( PRDF_FUNC"mss_get_address_range() failed" ); + PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); + o_rc = FAIL; break; + } + + // Verify addresses are of the valid register size. + if ( 64 != o_startAddr.getBitLength() || + 64 != o_endAddr.getBitLength() ) + { + PRDF_ERR( PRDF_FUNC"Addresses returned from " + "mss_get_address_range() are not 64-bit" ); + o_rc = FAIL; break; + } + + } while (0); + + if ( SUCCESS != o_rc ) + { + PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x i_mrank=%d i_srank=%d " + "i_slaveOnly=%s", getHuid(i_mba), i_mrank, i_srank, + i_slaveOnly ? "true" : "false" ); + } + + return o_rc; + + #undef PRDF_FUNC +} + +//------------------------------------------------------------------------------ + int32_t getBadDqBitmap( TargetHandle_t i_mba, const CenRank & i_rank, CenDqBitmap & o_bitmap, bool i_allowNoDimm ) { @@ -338,19 +409,20 @@ int32_t setBadDqBitmap( TargetHandle_t i_mba, const CenRank & i_rank, int32_t mssGetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank, CenMark & o_mark ) { + #define PRDF_FUNC "[PlatServices::mssGetMarkStore] " + int32_t o_rc = SUCCESS; errlHndl_t errl = NULL; uint8_t symbolMark, chipMark; PRD_FAPI_TO_ERRL( errl, mss_get_mark_store, getFapiTarget(i_mba), - i_rank.flatten(), symbolMark, chipMark ); + i_rank.getMaster(), symbolMark, chipMark ); if ( NULL != errl ) { - PRDF_ERR( "[PlatServices::mssGetMarkStore] mss_get_mark_store() " - "failed. HUID: 0x%08x rank: %d", - getHuid(i_mba), i_rank.flatten() ); + PRDF_ERR( PRDF_FUNC"mss_get_mark_store() failed. HUID: 0x%08x rank: %d", + getHuid(i_mba), i_rank.getMaster() ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; } @@ -360,6 +432,8 @@ int32_t mssGetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank, } return o_rc; + + #undef PRDF_FUNC } //------------------------------------------------------------------------------ @@ -380,7 +454,7 @@ int32_t mssSetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank, : MSS_INVALID_SYMBOL; fapi::ReturnCode l_rc = mss_put_mark_store( getFapiTarget(i_mba), - i_rank.flatten(), symbolMark, + i_rank.getMaster(), symbolMark, chipMark ); if ( i_allowWriteBlocked && @@ -395,7 +469,7 @@ int32_t mssSetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank, { 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 ); + i_rank.getMaster(), symbolMark, chipMark ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; } @@ -418,13 +492,13 @@ int32_t mssGetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank, uint8_t port0Spare, port1Spare, eccSpare; PRD_FAPI_TO_ERRL( errl, mss_check_steering, getFapiTarget(i_mba), - i_rank.flatten(), port0Spare, port1Spare, eccSpare ); + i_rank.getMaster(), port0Spare, port1Spare, eccSpare ); if ( NULL != errl ) { PRDF_ERR( "[PlatServices::mssGetSteerMux] mss_check_steering() " "failed. HUID: 0x%08x rank: %d", - getHuid(i_mba), i_rank.flatten() ); + getHuid(i_mba), i_rank.getMaster() ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; } @@ -448,13 +522,13 @@ int32_t mssSetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank, errlHndl_t errl = NULL; PRD_FAPI_TO_ERRL( errl, mss_do_steering, getFapiTarget(i_mba), - i_rank.flatten(), i_symbol.getSymbol(), i_x4EccSpare ); + i_rank.getMaster(), 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_mba), i_rank.flatten(), i_symbol.getSymbol(), + getHuid(i_mba), i_rank.getMaster(), i_symbol.getSymbol(), i_x4EccSpare ? 'T' : 'F' ); PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); o_rc = FAIL; @@ -468,12 +542,13 @@ int32_t mssSetSteerMux( TargetHandle_t i_mba, const CenRank & i_rank, int32_t getMemAddrRange( TargetHandle_t i_mba, CenAddr & o_startAddr, CenAddr & o_endAddr ) { + #define PRDF_FUNC "[PlatServices::getMemAddrRange] " + ecmdDataBufferBase startAddr(64), endAddr(64); int32_t o_rc = getMemAddrRange( i_mba, MSS_ALL_RANKS, startAddr, endAddr ); if ( SUCCESS != o_rc ) { - PRDF_ERR( "[PlatServices::getMemAddrRange] failed: i_mba=0x%08x", - getHuid(i_mba) ); + PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x", getHuid(i_mba) ); } else { @@ -482,19 +557,27 @@ int32_t getMemAddrRange( TargetHandle_t i_mba, CenAddr & o_startAddr, } return o_rc; + + #undef PRDF_FUNC } //------------------------------------------------------------------------------ int32_t getMemAddrRange( TargetHandle_t i_mba, const CenRank & i_rank, - CenAddr & o_startAddr, CenAddr & o_endAddr ) + CenAddr & o_startAddr, CenAddr & o_endAddr, + bool i_slaveOnly ) { + #define PRDF_FUNC "[PlatServices::getMemAddrRange] " + ecmdDataBufferBase startAddr(64), endAddr(64); - int32_t o_rc = getMemAddrRange(i_mba, i_rank.flatten(), startAddr, endAddr); + int32_t o_rc = getMemAddrRange( i_mba, i_rank.getMaster(), + startAddr, endAddr, + i_rank.getSlave(), i_slaveOnly ); if ( SUCCESS != o_rc ) { - PRDF_ERR( "[PlatServices::getMemAddrRange] failed: i_mba=0x%08x " - "i_rank=%d", getHuid(i_mba), i_rank.flatten() ); + PRDF_ERR( PRDF_FUNC"Failed: i_mba=0x%08x i_rank=M%dS%d i_slaveOnly=%s", + getHuid(i_mba), i_rank.getMaster(), i_rank.getSlave(), + i_slaveOnly ? "true" : "false" ); } else { @@ -503,6 +586,8 @@ int32_t getMemAddrRange( TargetHandle_t i_mba, const CenRank & i_rank, } return o_rc; + + #undef PRDF_FUNC } //------------------------------------------------------------------------------ @@ -611,61 +696,6 @@ int32_t mss_MaintCmdWrapper::cleanupCmd() //------------------------------------------------------------------------------ -// Helper function for the createMssCmd() functions. -int32_t getMemAddrRange( TargetHandle_t i_mba, uint8_t i_rank, - ecmdDataBufferBase & o_startAddr, - ecmdDataBufferBase & o_endAddr ) -{ - #define PRDF_FUNC "[PlatServices::getMemAddrRange] " - - int32_t o_rc = SUCCESS; - - do - { - // Check parameters. - if ( TYPE_MBA != getTargetType(i_mba) ) - { - PRDF_ERR( PRDF_FUNC"The given target is not TYPE_MBA" ); - o_rc = FAIL; break; - } - - if ( MSS_ALL_RANKS != i_rank && MAX_RANKS_PER_MBA <= i_rank ) - { - PRDF_ERR( PRDF_FUNC"The given rank is not valid" ); - o_rc = FAIL; break; - } - - errlHndl_t errl = NULL; - PRD_FAPI_TO_ERRL( errl, mss_get_address_range, getFapiTarget(i_mba), - i_rank, o_startAddr, o_endAddr ); - if ( NULL != errl ) - { - PRDF_ERR( PRDF_FUNC"mss_get_address_range() failed" ); - PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); - o_rc = FAIL; break; - } - - // Verify addresses are of the valid register size. - if ( 64 != o_startAddr.getBitLength() || - 64 != o_endAddr.getBitLength() ) - { - PRDF_ERR( PRDF_FUNC"Addresses returned from " - "mss_get_address_range() are not 64-bit" ); - o_rc = FAIL; break; - } - - } while (0); - - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC"Failed: 0x%08x 0x%02x", getHuid(i_mba), i_rank ); - } - - return o_rc; - - #undef PRDF_FUNC -} - //------------------------------------------------------------------------------ // Helper function for the other createMssCmd() functions. @@ -737,12 +767,13 @@ mss_MaintCmdWrapper * createMssCmd( mss_MaintCmdWrapper::CmdType i_cmdType, mss_MaintCmdWrapper * createMssCmd( mss_MaintCmdWrapper::CmdType i_cmdType, TargetHandle_t i_mba, const CenRank & i_rank, uint32_t i_stopCond, - bool i_isFastSpeed ) + bool i_isFastSpeed, bool i_slaveOnly ) { mss_MaintCmdWrapper * o_cmd = NULL; ecmdDataBufferBase sAddr(64), eAddr(64); - int32_t l_rc = getMemAddrRange( i_mba, i_rank.flatten(), sAddr, eAddr ); + int32_t l_rc = getMemAddrRange( i_mba, i_rank.getMaster(), sAddr, eAddr, + i_rank.getSlave(), i_slaveOnly ); if ( SUCCESS == l_rc ) { o_cmd = createMssCmd( i_cmdType, i_mba, i_stopCond, i_isFastSpeed, 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 be23be1f4..fee317cca 100755 --- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H +++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H @@ -288,16 +288,18 @@ int32_t getMemAddrRange( TARGETING::TargetHandle_t i_mba, CenAddr & o_startAddr, CenAddr & o_endAddr ); /** - * @brief Returns the start and end maintenance address of the given rank. + * @brief Returns the start and end maintenance address of the given rank. By + * default, will return the address range of the master rank. * @param i_mba Target MBA. * @param i_rank Target rank. * @param o_startAddr The return start address. * @param o_endAddr The return end address. + * @param i_slaveOnly true = slave rank only, false = master rank (default). * @return Non-SUCCESS in internal function fails, SUCCESS otherwise. */ int32_t getMemAddrRange( TARGETING::TargetHandle_t i_mba, const CenRank & i_rank, CenAddr & o_startAddr, - CenAddr & o_endAddr ); + CenAddr & o_endAddr, bool i_slaveOnly = false ); /** * @brief Returns the memory buffer raw card type (i.e. R/C A). @@ -410,6 +412,7 @@ mss_MaintCmdWrapper * createMssCmd( mss_MaintCmdWrapper::CmdType i_cmdType, * @param i_mba An MBA target. * @param i_stopCond Bit mask for conditions in which to stop command. * @param i_isFastSpeed false = slow (12 H), true = fast (default). + * @param i_slaveOnly true = slave rank only, false = master rank (default). * @return A mss_MaintCmdWrapper object, NULL if an internal function failed. * @note This function allocates memory on heap for mss_MaintCmdWrapper * object. It is the caller's responsibilty to delete this object. @@ -418,7 +421,8 @@ mss_MaintCmdWrapper * createMssCmd( mss_MaintCmdWrapper::CmdType i_cmdType, mss_MaintCmdWrapper * createMssCmd( mss_MaintCmdWrapper::CmdType i_cmdType, TARGETING::TargetHandle_t i_mba, const CenRank & i_rank, uint32_t i_stopCond, - bool i_isFastSpeed = true ); + bool i_isFastSpeed = true, + bool i_slaveOnly = false ); } // end namespace PlatServices |