summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/plat
diff options
context:
space:
mode:
authorMatt Derksen <mderkse1@us.ibm.com>2018-05-23 13:38:38 -0500
committerZane C. Shelley <zshelle@us.ibm.com>2018-06-08 22:45:50 -0400
commit3302fd380ebaf395839932ab00e009567a829037 (patch)
treeba2c2288bb4aae41ecbe857bd4b7bbb4e5a64dde /src/usr/diag/prdf/plat
parent38666ab58f157b82c3dca2d782667cf071a75cb2 (diff)
downloadtalos-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.H13
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfMemDsd_ipl.C13
-rw-r--r--src/usr/diag/prdf/plat/mem/prdfRestoreDramRepairs.C16
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.C131
-rw-r--r--src/usr/diag/prdf/plat/prdfPlatServices.H41
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
//##############################################################################
OpenPOWER on IntegriCloud