summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZane Shelley <zshelle@us.ibm.com>2018-04-26 16:36:40 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-05-04 22:26:22 -0400
commit453283ebfde2d76bd999af0edc1c5b16cf836773 (patch)
tree6256e491a63434dd9dfc06db70897ad8e68148c9 /src
parent7f4b95b28d2119d431c2c5a9d0ec1b93f7d5d59f (diff)
downloadtalos-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')
-rw-r--r--src/usr/diag/prdf/common/plat/mem/prdfMemCaptureData.C11
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfCenMbaCaptureData.C9
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMbaDynMemDealloc_rt.C11
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/pegasus/prdfCenMbaTdCtlr_rt.C10
-rw-r--r--src/usr/diag/prdf/common/plat/prdfPlatServices_common.C21
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.C61
-rwxr-xr-xsrc/usr/diag/prdf/common/plat/prdfTargetServices.H21
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C137
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++ )
OpenPOWER on IntegriCloud