diff options
author | Zane Shelley <zshelle@us.ibm.com> | 2018-04-26 16:36:40 -0500 |
---|---|---|
committer | Zane C. Shelley <zshelle@us.ibm.com> | 2018-05-04 22:26:22 -0400 |
commit | 453283ebfde2d76bd999af0edc1c5b16cf836773 (patch) | |
tree | 6256e491a63434dd9dfc06db70897ad8e68148c9 /src | |
parent | 7f4b95b28d2119d431c2c5a9d0ec1b93f7d5d59f (diff) | |
download | talos-hostboot-453283ebfde2d76bd999af0edc1c5b16cf836773.tar.gz talos-hostboot-453283ebfde2d76bd999af0edc1c5b16cf836773.zip |
PRD: Fixed logic errors in isMembufOnDimm() that broke Nimbus
Change-Id: Ie7d8893ef3a552206bddfd4f49dcea161d0912d1
RTC: 192287
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57916
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/58325
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src')
8 files changed, 92 insertions, 189 deletions
diff --git a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C index 60a1bcdc9..1d347514f 100644 --- a/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C +++ b/src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C @@ -62,8 +62,6 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl ) do { - int32_t l_rc = SUCCESS; - TargetHandle_t trgt = i_memMru.getTrgt(); // Get the DRAM width. @@ -71,12 +69,9 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl ) // Get the DIMM type. bool isBufDimm = false; - l_rc = isMembufOnDimm( trgt, isBufDimm ); - if ( SUCCESS != l_rc ) + if ( TYPE_MBA == getTargetType(trgt) ) { - PRDF_ERR( PRDF_FUNC "isMembufOnDimm() failed. Trgt:0x%08x", - getHuid(trgt) ); - break; + isBufDimm = isMembufOnDimm<TYPE_MBA>( trgt ); } extMemMru.isBufDimm = isBufDimm ? 1 : 0; @@ -85,7 +80,7 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl ) // TODO RTC 169956 //// Get the raw card type (Centaur DIMMs only). //CEN_SYMBOL::WiringType cardType = CEN_SYMBOL::WIRING_INVALID; - //l_rc = getMemBufRawCardType( trgt, cardType ); + //int32_t l_rc = getMemBufRawCardType( trgt, cardType ); //if ( SUCCESS != l_rc ) //{ // PRDF_ERR( PRDF_FUNC "getMemBufRawCardType() failed. MBA:0x%08x", diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C index 57bdbac0e..de15a9436 100644 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C @@ -285,14 +285,7 @@ void addExtMemMruData( const MemoryMru & i_memMru, errlHndl_t io_errl ) extMemMru.isX4Dram = isDramWidthX4( mbaTrgt ) ? 1 : 0; // Get the DIMM type. - bool isBufDimm = false; - l_rc = isMembufOnDimm( mbaTrgt, isBufDimm ); - if ( SUCCESS != l_rc ) - { - PRDF_ERR( PRDF_FUNC "isMembufOnDimm() failed. MBA:0x%08x", - getHuid(mbaTrgt) ); - break; - } + bool isBufDimm = isMembufOnDimm<TYPE_MBA>( mbaTrgt ); extMemMru.isBufDimm = isBufDimm ? 1 : 0; if ( isBufDimm ) diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaDynMemDealloc_rt.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaDynMemDealloc_rt.C index e8ab075fb..3031c9d2b 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaDynMemDealloc_rt.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaDynMemDealloc_rt.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -356,14 +356,7 @@ int32_t getCenPhyAddr( ExtensibleChip * i_mbaChip, ExtensibleChip * i_mbChip, } // Get the DDR verion of the DIMM (DDR3, DDR4, etc...) - uint8_t ddrVer; - o_rc = getDramGen( mba, ddrVer ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "getDramGen() failed. HUID:0x%08X", - i_mbaChip->GetId() ); - break; - } + uint8_t ddrVer = getDramGen<TYPE_MBA>( mba ); // Get the Centaur interleave mode (MBSXCR[0:4]). SCAN_COMM_REGISTER_CLASS * mbsxcr = i_mbChip->getRegister("MBSXCR"); diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C index 501fc4fe5..893bb6dd8 100755 --- a/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C +++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C @@ -2331,18 +2331,10 @@ int32_t CenMbaTdCtlr::handleTpsFalseAlarm( STEP_CODE_DATA_STRUCT & io_sc ) o_rc = FAIL; break; } - bool isMbDimm = false; - o_rc = isMembufOnDimm( iv_mbaTrgt, isMbDimm ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "isMembufOnDimm() failed." ); - break; - } - // Callout all DIMMs that have reached threshold. // Centaur DIMMS: Any non-zero count, threshold on 1. // IS DIMMS: Allow 1, threshold on 2 (because of limited spares). - uint8_t thr = isMbDimm ? 1 : 2; + uint8_t thr = isMembufOnDimm<TYPE_MBA>(iv_mbaTrgt) ? 1 : 2; MaintSymbols symData; CenSymbol junk; o_rc = collectCeStats( iv_mbaChip, iv_rank, symData, junk, thr ); if ( SUCCESS != o_rc ) diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C index d66303abe..e4df155cc 100644 --- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C +++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C @@ -677,16 +677,7 @@ int32_t getMemBufRawCardType( TargetHandle_t i_mba, o_rc = FAIL; break; } - bool isCenDimm = false; - o_rc = isMembufOnDimm( i_mba, isCenDimm ); - if ( SUCCESS != o_rc ) - { - PRDF_ERR( PRDF_FUNC "isMembufOnDimm() failed on MBA 0x%08x", - getHuid(i_mba) ); - break; - } - - if ( !isCenDimm ) + if ( !isMembufOnDimm<TYPE_MBA>(i_mba) ) { PRDF_ERR( PRDF_FUNC "MBA 0x%08x is not on a buffered DIMM", getHuid(i_mba) ); @@ -721,14 +712,8 @@ int32_t getMemBufRawCardType( TargetHandle_t i_mba, o_rc = FAIL; break; } - uint8_t l_version = 0; - o_rc = getDramGen(i_mba, l_version); - if ( SUCCESS != o_rc ) - { - PRDF_ERR(PRDF_FUNC "Fail DramVers x%08X"" HUID:x%08X", - l_version, getHuid(i_mba) ); - break; - } + uint8_t l_version = getDramGen<TYPE_MBA>( i_mba ); + // Centaur raw card types are only used for DRAM site locations. If an // invalid wiring type is passed to the error log parser, the parser // will simply print out the symbol and other data instead of diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.C b/src/usr/diag/prdf/common/plat/prdfTargetServices.C index 5b447a382..0da0a2047 100755 --- a/src/usr/diag/prdf/common/plat/prdfTargetServices.C +++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.C @@ -1318,65 +1318,24 @@ uint32_t getMemChnl( TargetHandle_t i_trgt ) //------------------------------------------------------------------------------ -int32_t isMembufOnDimm( TARGETING::TargetHandle_t i_memTarget, - bool & o_isBuffered ) +template<> +bool isMembufOnDimm<TYPE_MBA>( TargetHandle_t i_trgt ) { - int32_t o_rc = FAIL; - - o_isBuffered = false; - - do - { - // The DIMMs in a node should either all be buffered or all not. So - // we can check the attribute from ANY MBA. - TargetHandleList list = getConnected( i_memTarget, TYPE_MBA ); - if ( 0 == list.size() ) - { - PRDF_ERR( "[isMembufOnDimm] Couldn't find an MBA target" ); - break; - } - - const TargetHandle_t mbaTarget = list[0]; - o_isBuffered = mbaTarget->getAttr<ATTR_CEN_EFF_CUSTOM_DIMM>(); - - o_rc = SUCCESS; - - } while (0); - - if ( SUCCESS != o_rc ) - { - PRDF_ERR( "[isMembufOnDimm] Failed: i_memTarget=0x%08x", - getHuid(i_memTarget) ); - } + PRDF_ASSERT( nullptr != i_trgt ); + PRDF_ASSERT( TYPE_MBA == getTargetType(i_trgt) ); - return o_rc; + return i_trgt->getAttr<ATTR_CEN_EFF_CUSTOM_DIMM>(); } //------------------------------------------------------------------------------ -int32_t getDramGen( TARGETING::TargetHandle_t i_mba, uint8_t & o_dramGen ) +template<> +uint8_t getDramGen<TYPE_MBA>( TargetHandle_t i_trgt ) { - #define PRDF_FUNC "[PlatServices::getDramGen] " - - int32_t o_rc = FAIL; - do - { - if ( TYPE_MBA != getTargetType( i_mba ) ) - { - PRDF_ERR( PRDF_FUNC "Invalid Target. HUID:0X%08X", - getHuid( i_mba ) ); - break; - } - - o_dramGen = i_mba->getAttr<ATTR_CEN_EFF_DRAM_GEN>( ); - - o_rc = SUCCESS; - - }while(0); - - return o_rc; + PRDF_ASSERT( nullptr != i_trgt ); + PRDF_ASSERT( TYPE_MBA == getTargetType(i_trgt) ); - #undef PRDF_FUNC + return i_trgt->getAttr<ATTR_CEN_EFF_DRAM_GEN>(); } //------------------------------------------------------------------------------ diff --git a/src/usr/diag/prdf/common/plat/prdfTargetServices.H b/src/usr/diag/prdf/common/plat/prdfTargetServices.H index b00e5cadd..c876658c5 100755 --- a/src/usr/diag/prdf/common/plat/prdfTargetServices.H +++ b/src/usr/diag/prdf/common/plat/prdfTargetServices.H @@ -373,12 +373,14 @@ uint32_t getMemChnl( TARGETING::TargetHandle_t i_memTarget ); /** * @brief Determines if a given target is associated with a memory buffer that - * is located on the DIMM card. - * @param i_target Any memory target or parent or a mba - * @param o_memBuf true if associated MBA is non IS MBA - * @return FAIL if internal function fails. Success otherwise + * is located on the DIMM card (as opposed to IS DIMMs connected to the + * memory buffer). + * @param i_trgt MBA + * @return True if the DIMMs connected to this target have a memory buffer on + * the DIMM card. False otherwise. */ -int32_t isMembufOnDimm( TARGETING::TargetHandle_t i_memTarget, bool &o_memBuf); +template<TARGETING::TYPE T> +bool isMembufOnDimm( TARGETING::TargetHandle_t i_trgt ); /** * @brief Obtain the port select for the given Dimm. @@ -404,12 +406,11 @@ uint8_t getDimmSlct( TARGETING::TargetHandle_t i_trgt ); bool isDramWidthX4(TARGETING::TargetHandle_t i_trgt); /** - * @brief Get DRAM generation - * @param i_mba MBA target - * @param o_dramGen DRAM generation ( 1 - DDR3, 2 - DDR4 ) - * @return Non-SUCCESS if internal functions fail, SUCCESS otherwise. + * @param i_trgt MBA + * @return The DRAM generation ( 1 - DDR3, 2 - DDR4 ) */ -int32_t getDramGen( TARGETING::TargetHandle_t i_mba, uint8_t & o_dramGen ); +template<TARGETING::TYPE T> +uint8_t getDramGen( TARGETING::TargetHandle_t i_trgt ); /** * @brief Get DIMM number of rows and columns diff --git a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C index 65a95b5fb..3ad9878bc 100644 --- a/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C +++ b/src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C @@ -287,99 +287,90 @@ bool processRepairedRanks<TYPE_MBA>( TargetHandle_t i_trgt, errlHndl_t errl = NULL; // Initially NULL, will create if needed. - bool isCen = false; - int32_t l_rc = isMembufOnDimm( i_mba, isCen ); - if ( SUCCESS != l_rc ) - { - PRDF_ERR( PRDF_FUNC "isMembufOnDimm() failed" ); - analysisErrors = true; - } - else + bool isCen = isMembufOnDimm<TYPE_MBA>( i_trgt ); + bool isX4 = isDramWidthX4( i_trgt ); + + for ( uint8_t r = 0; r < MASTER_RANKS_PER_PORT; ++r ) { - bool isX4 = isDramWidthX4( i_mba ); + if ( 0 == (i_repairedRankMask & (0x80 >> r)) ) + { + continue; // this rank didn't have any repairs + } - for ( uint8_t r = 0; r < MASTER_RANKS_PER_PORT; ++r ) + CenRank rank ( r ); + CenMark mark; + + if ( SUCCESS != mssGetMarkStore(i_trgt, rank, mark) ) { - if ( 0 == (i_repairedRankMask & (0x80 >> r)) ) - { - continue; // this rank didn't have any repairs - } + PRDF_ERR( PRDF_FUNC "mssGetMarkStore() failed: MBA=0x%08x " + "rank=%d", getHuid(i_trgt), rank.getMaster() ); + analysisErrors = true; + continue; // skip this rank + } - CenRank rank ( r ); - CenMark mark; + CenSymbol sp0, sp1, ecc; - if ( SUCCESS != mssGetMarkStore(i_mba, rank, mark) ) - { - PRDF_ERR( PRDF_FUNC "mssGetMarkStore() failed: MBA=0x%08x " - "rank=%d", getHuid(i_mba), rank.getMaster() ); - analysisErrors = true; - continue; // skip this rank - } + if ( SUCCESS != mssGetSteerMux(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 = mark.getCM().isValid(); // chip mark + bool isSm = mark.getSM().isValid(); // symbol mark + bool isSp = (sp0.isValid() || sp1.isValid()); // either DRAM spare + bool isEcc = ecc.isValid(); // ECC spare - CenSymbol sp0, sp1, ecc; + if ( isCm && // CM used + ( ( isCen && isSp && (!isX4 || isEcc)) || // all spares used + (!isCen && ( isSm || isEcc)) ) ) // SM or ECC used + { + // All repairs on the rank have been used. Callout all repairs. - if ( SUCCESS != mssGetSteerMux(i_mba, rank, sp0, sp1, ecc) ) + if ( NULL == errl ) { - PRDF_ERR( PRDF_FUNC "mssGetSteerMux() failed: MBA=0x%08x " - "rank=%d", getHuid(i_mba), rank.getMaster() ); - analysisErrors = true; - continue; // skip this rank + errl = createErrl<TYPE_MBA>( PRDF_DETECTED_FAIL_HARDWARE, + i_trgt, + PRDFSIG_RdrRepairsUsed ); } - bool isCm = mark.getCM().isValid(); // chip mark - bool isSm = mark.getSM().isValid(); // symbol mark - bool isSp = (sp0.isValid() || sp1.isValid()); // either DRAM spare - bool isEcc = ecc.isValid(); // ECC spare + std::vector<CenSymbol> list; + list.push_back( mark.getCM() ); + list.push_back( mark.getSM() ); + list.push_back( sp0 ); + list.push_back( sp1 ); + list.push_back( ecc ); - if ( isCm && // CM used - ( ( isCen && isSp && (!isX4 || isEcc)) || // all spares used - (!isCen && ( isSm || isEcc)) ) ) // SM or ECC used + for ( std::vector<CenSymbol>::iterator it = list.begin(); + it != list.end(); it++ ) { - // All repairs on the rank have been used. Callout all repairs. + if ( !it->isValid() ) continue; - if ( NULL == errl ) + // Add all parts to the error log. + TargetHandleList partList = i_memmru.getCalloutList(); + for ( auto &part : partList ) { - errl = createErrl<TYPE_MBA>( PRDF_DETECTED_FAIL_HARDWARE, - i_mba, - PRDFSIG_RdrRepairsUsed ); + errl->addHwCallout( part, MRU_HIGH, + HWAS::DELAYED_DECONFIG, + HWAS::GARD_Predictive ); } - std::vector<CenSymbol> list; - list.push_back( mark.getCM() ); - list.push_back( mark.getSM() ); - list.push_back( sp0 ); - list.push_back( sp1 ); - list.push_back( ecc ); - - for ( std::vector<CenSymbol>::iterator it = list.begin(); - it != list.end(); it++ ) - { - if ( !it->isValid() ) continue; - - // Add all parts to the error log. - TargetHandleList partList = i_memmru.getCalloutList(); - for ( auto &part : partList ) - { - errl->addHwCallout( part, MRU_HIGH, - HWAS::DELAYED_DECONFIG, - HWAS::GARD_Predictive ); - } - - // Add the MemoryMru to the capture data. - MemCaptureData::addExtMemMruData( i_memmru, errl ); - } - - o_calloutMade = true; + // Add the MemoryMru to the capture data. + MemCaptureData::addExtMemMruData( i_memmru, errl ); } + + o_calloutMade = true; } } // Commit the error log, if needed. - commitErrl( errl, i_mba ); + commitErrl( errl, i_trgt ); // Commit an additional error log indicating something failed in the // analysis, if needed. - commitSoftError( PRDF_DETECTED_FAIL_SOFTWARE, i_mba, + commitSoftError( PRDF_DETECTED_FAIL_SOFTWARE, i_trgt, PRDFSIG_RdrInternalFail, analysisErrors ); */ @@ -566,13 +557,7 @@ void deployDramSpares( TargetHandle_t i_mba, { /* TODO RTC 178743 bool x4 = isDramWidthX4(i_mba); - - bool cenDimm = false; - if ( SUCCESS != isMembufOnDimm(i_mba, cenDimm) ) - { - // Traces will be printed. Assume no spare DRAMs for now. - cenDimm = false; - } + bool cenDimm = isMembufOnDimm<TYPE_MBA>( i_mba ); for ( std::vector<CenRank>::const_iterator rank = i_ranks.begin(); rank != i_ranks.end(); rank++ ) |