diff options
author | Matt Derksen <mderkse1@us.ibm.com> | 2018-05-23 13:38:38 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-06-08 22:45:50 -0400 |
commit | 3302fd380ebaf395839932ab00e009567a829037 (patch) | |
tree | ba2c2288bb4aae41ecbe857bd4b7bbb4e5a64dde /src/usr/diag/prdf/plat | |
parent | 38666ab58f157b82c3dca2d782667cf071a75cb2 (diff) | |
download | talos-hostboot-3302fd380ebaf395839932ab00e009567a829037.tar.gz talos-hostboot-3302fd380ebaf395839932ab00e009567a829037.zip |
Additional DRAM sparing support functions
Ported isSpareAvailable(), setDramSpare(), and setEccSpare()
Created common updateSpared method for MemSymbol
Change-Id: I02d4616137f65cf5216b83495594e45f52a93470
RTC: 189221
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59388
Reviewed-by: Caleb N. Palmer <cnpalmer@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/60137
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/diag/prdf/plat')
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemDsd.H | 13 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C | 13 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C | 16 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.C | 131 | ||||
-rw-r--r-- | src/usr/diag/prdf/plat/prdfPlatServices.H | 41 |
5 files changed, 21 insertions, 193 deletions
diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDsd.H b/src/usr/diag/prdf/plat/mem/prdfMemDsd.H index ac1b1e044..5990a902e 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemDsd.H +++ b/src/usr/diag/prdf/plat/mem/prdfMemDsd.H @@ -66,10 +66,11 @@ class DsdEvent : public TdEntry { #define PRDF_FUNC "[DsdEvent::nextStep] " - // TODO: RTC 189221 should assert if DRAM Sparing is NOT supported. - uint32_t o_rc = SUCCESS; + // NOTE: DRAM Sparing should already be supported if we get this far, + // so just continue without checking for the support here + o_done = false; do @@ -154,16 +155,16 @@ class DsdEvent : public TdEntry { // Before starting the first command, set iv_mark in the // hardware steer mux. - /* TODO: RTC 189221 - o_rc = mssSetSteerMux<T>( iv_chip, iv_rank, iv_mark, - iv_eccSpare ); + o_rc = PlatServices::mssSetSteerMux<T>(iv_chip->getTrgt(), + iv_rank, + iv_mark.getSymbol(), + iv_eccSpare ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "mssSetSteerMux(0x%08x,0x%2x) failed", iv_chip->getHuid(), getKey() ); break; } - */ break; // Nothing to analyze yet. } diff --git a/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C b/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C index a7de2d38c..559e384fa 100644 --- a/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C +++ b/src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C @@ -128,10 +128,10 @@ uint32_t DsdEvent<TYPE_MBA>::verifySpare( const uint32_t & i_eccAttns, // Set the bad spare in the VPD. At this point, the chip mark // should have already been set in the VPD because it was recently // verified. + MemDqBitmap<DIMMS_PER_RANK::MBA> bitmap; + o_rc = getBadDqBitmap<DIMMS_PER_RANK::MBA>( iv_chip->getTrgt(), + iv_rank, bitmap ); - /* TODO: RTC 189221 - CenDqBitmap bitmap; - o_rc = getBadDqBitmap( iv_mbaTrgt, iv_rank, bitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "getBadDqBitmap() failed" ); @@ -143,7 +143,7 @@ uint32_t DsdEvent<TYPE_MBA>::verifySpare( const uint32_t & i_eccAttns, } else { - o_rc = bitmap.setDramSpare( iv_mark.getCM().getPortSlct() ); + o_rc = bitmap.setDramSpare( iv_mark.getSymbol().getPortSlct() ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setDramSpare() failed" ); @@ -151,13 +151,14 @@ uint32_t DsdEvent<TYPE_MBA>::verifySpare( const uint32_t & i_eccAttns, } } - o_rc = setBadDqBitmap( iv_mbaTrgt, iv_rank, bitmap ); + o_rc = setBadDqBitmap<DIMMS_PER_RANK::MBA>( iv_chip->getTrgt(), + iv_rank, bitmap ); if ( SUCCESS != o_rc ) { PRDF_ERR( PRDF_FUNC "setBadDqBitmap() failed" ); break; } - */ + } else { diff --git a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C index c32dd52a7..7dbdd9beb 100644 --- a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C +++ b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C @@ -319,15 +319,13 @@ bool processRepairedRanks<TYPE_MBA>( TargetHandle_t i_trgt, MemSymbol sp0, sp1, ecc; - /* TODO RTC 189221 DRAM sparing - if ( SUCCESS != mssGetSteerMux(i_trgt, rank, sp0, sp1, ecc) ) + if ( SUCCESS != mssGetSteerMux<TYPE_MBA>(i_trgt, rank, sp0, sp1, ecc) ) { PRDF_ERR( PRDF_FUNC "mssGetSteerMux() failed: MBA=0x%08x " "rank=%d", getHuid(i_trgt), rank.getMaster() ); analysisErrors = true; continue; // skip this rank } - */ bool isCm = chipMark.isValid(); // chip mark bool isSm = symMark.isValid(); // symbol mark @@ -576,9 +574,9 @@ void deployDramSpares<TYPE_MBA>( TargetHandle_t i_trgt, const std::vector<MemRank> & i_ranks ) { PRDF_TRAC( "deployDramSpares: Function not implemented yet" ); - /* TODO RTC 189221 + bool x4 = isDramWidthX4( i_trgt ); - bool cenDimm = isMembufOnDimm<TYPE_MBA>( i_mba ); + bool cenDimm = isMembufOnDimm<TYPE_MBA>( i_trgt ); for ( auto & rank : i_ranks ) { @@ -593,12 +591,12 @@ void deployDramSpares<TYPE_MBA>( TargetHandle_t i_trgt, if ( cenDimm ) { - l_rc |= mssSetSteerMux( i_trgt, rank, symPort0, false ); - l_rc |= mssSetSteerMux( i_trgt, rank, symPort1, false ); + l_rc |= mssSetSteerMux<TYPE_MBA>( i_trgt, rank, symPort0, false ); + l_rc |= mssSetSteerMux<TYPE_MBA>( i_trgt, rank, symPort1, false ); } if ( x4 ) - l_rc |= mssSetSteerMux( i_trgt, rank, symEccSp, true ); + l_rc |= mssSetSteerMux<TYPE_MBA>( i_trgt, rank, symEccSp, true ); if ( SUCCESS != l_rc ) { @@ -607,7 +605,7 @@ void deployDramSpares<TYPE_MBA>( TargetHandle_t i_trgt, // warning in Hostboot. continue; } - }*/ + } } } // end namespace RDR diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.C b/src/usr/diag/prdf/plat/prdfPlatServices.C index 0c7210d7c..afd3ac492 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices.C +++ b/src/usr/diag/prdf/plat/prdfPlatServices.C @@ -420,137 +420,6 @@ uint32_t getMemAddrRange<TYPE_MBA>( ExtensibleChip * i_chip, //------------------------------------------------------------------------------ -template<> -int32_t mssGetSteerMux<TYPE_MBA>( TargetHandle_t i_mba, const MemRank & i_rank, - MemSymbol & o_port0Spare, MemSymbol & o_port1Spare, - MemSymbol & o_eccSpare ) -{ - int32_t o_rc = SUCCESS; - - errlHndl_t errl = NULL; - - uint8_t port0Spare, port1Spare, eccSpare; - - fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba(i_mba); - FAPI_INVOKE_HWP( errl, mss_check_steering, fapiMba, - 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.getMaster() ); - PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); - o_rc = FAIL; - } - else - { - o_port0Spare = MemSymbol::fromSymbol( i_mba, i_rank, port0Spare ); - o_port1Spare = MemSymbol::fromSymbol( i_mba, i_rank, port1Spare ); - o_eccSpare = MemSymbol::fromSymbol( i_mba, i_rank, eccSpare ); - } - - return o_rc; -} - - -//------------------------------------------------------------------------------ - -template<> -int32_t mssSetSteerMux<TYPE_MBA>( TargetHandle_t i_mba, const MemRank & i_rank, - const MemSymbol & i_symbol, bool i_x4EccSpare ) -{ - int32_t o_rc = SUCCESS; - - errlHndl_t errl = NULL; - fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba(i_mba); - - uint8_t l_dramSymbol = PARSERUTILS::dram2Symbol<TYPE_MBA>( - i_symbol.getDram(), - isDramWidthX4(i_mba) ); - - FAPI_INVOKE_HWP( errl, mss_do_steering, fapiMba, - i_rank.getMaster(), l_dramSymbol, - 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.getMaster(), l_dramSymbol, - i_x4EccSpare ? 'T' : 'F' ); - PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); - o_rc = FAIL; - } - - return o_rc; -} - - -//------------------------------------------------------------------------------ - -template<> -int32_t getDimmSpareConfig<TYPE_MBA>( TargetHandle_t i_mba, MemRank i_rank, - uint8_t i_ps, uint8_t & o_spareConfig ) -{ - #define PRDF_FUNC "[PlatServices::getDimmSpareConfig] " - int32_t o_rc = SUCCESS; - - using namespace fapi2; - - ATTR_CEN_VPD_DIMM_SPARE_Type attr; - o_spareConfig = ENUM_ATTR_CEN_VPD_DIMM_SPARE_NO_SPARE; - do - { - if( TYPE_MBA != getTargetType( i_mba ) ) - { - PRDF_ERR( PRDF_FUNC "Invalid Target:0x%08X", getHuid( i_mba ) ); - o_rc = FAIL; break; - } - - if ( MAX_PORT_PER_MBA <= i_ps ) - { - PRDF_ERR( PRDF_FUNC "Invalid parameters i_ps:%u", i_ps ); - o_rc = FAIL; break; - } - - fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba(i_mba); - ReturnCode l_rc = FAPI_ATTR_GET(ATTR_CEN_VPD_DIMM_SPARE, fapiMba, attr); - errlHndl_t errl = fapi2::rcToErrl(l_rc); - if ( NULL != errl ) - { - PRDF_ERR( PRDF_FUNC "Failed to get ATTR_VPD_DIMM_SPARE for Target:" - "0x%08X", getHuid( i_mba ) ); - PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT ); - o_rc = FAIL; break; - } - o_spareConfig = attr[i_ps][i_rank.getDimmSlct()][i_rank.getRankSlct()]; - - // Check for valid values - // For X4 DRAM, we can not have full byte as spare config. Also for X8 - // DRAM we can not have nibble as spare. - - if( ENUM_ATTR_CEN_VPD_DIMM_SPARE_NO_SPARE == o_spareConfig) break; - - bool isFullByte = ( ENUM_ATTR_CEN_VPD_DIMM_SPARE_FULL_BYTE == - o_spareConfig ); - bool isX4Dram = isDramWidthX4(i_mba); - - if ( ( isX4Dram && isFullByte ) || ( !isX4Dram && !isFullByte ) ) - { - PRDF_ERR( PRDF_FUNC "Invalid Configuration: o_spareConfig:%u", - o_spareConfig ); - o_rc = FAIL; break; - } - - }while(0); - - return o_rc; - #undef PRDF_FUNC -} - - -//------------------------------------------------------------------------------ MemAddr __convertMssMcbistAddr( const mss::mcbist::address & i_addr ) { diff --git a/src/usr/diag/prdf/plat/prdfPlatServices.H b/src/usr/diag/prdf/plat/prdfPlatServices.H index 5641738fe..bd20bd239 100644 --- a/src/usr/diag/prdf/plat/prdfPlatServices.H +++ b/src/usr/diag/prdf/plat/prdfPlatServices.H @@ -158,48 +158,7 @@ uint32_t getMemAddrRange( ExtensibleChip * i_chip, VT & o_startAddr, VT & o_endAddr, uint8_t i_dimmSlct = MAX_DIMM_PER_PORT ); -/** - * @brief Invokes the get steer mux hardware procedure. - * @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. - */ -template<TARGETING::TYPE T> -int32_t mssGetSteerMux( TARGETING::TargetHandle_t i_mba, const MemRank & i_rank, - MemSymbol & o_port0Spare, MemSymbol & o_port1Spare, - MemSymbol & o_eccSpare ); -/** - * @brief Invokes the set steer mux hardware procedure. - * @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. - */ -template<TARGETING::TYPE T> -int32_t mssSetSteerMux( TARGETING::TargetHandle_t i_mba, const MemRank & i_rank, - const MemSymbol & i_symbol, bool i_x4EccSpare ); - - -/** - * @brief Get spare DRAM information on a DIMM. - * @param i_mba MBA target. - * @param i_rank Rank. - * @param i_ps MBA port select. - * @param o_spareConfig Spare DRAM config information. - * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise. - * @note On a DIMM its possible that spare is not present. Also on X4 DRAM - * spare can be on High nibble or low nibble. This function will - * populate spare config information in o_spareConfig. - */ -template<TARGETING::TYPE T> -int32_t getDimmSpareConfig( TARGETING::TargetHandle_t i_mba, MemRank i_rank, - uint8_t i_ps, uint8_t & o_spareConfig ); //############################################################################## //## Nimbus/Centaur Maintenance Command wrappers //############################################################################## |