summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/common/plat/prdfPlatServices_common.C')
-rw-r--r--src/usr/diag/prdf/common/plat/prdfPlatServices_common.C276
1 files changed, 157 insertions, 119 deletions
diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
index b00291622..b7f58445c 100644
--- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
+++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C
@@ -44,6 +44,7 @@
#endif
#ifdef __HOSTBOOT_MODULE
+#include <prdfParserUtils.H>
#include <dimmBadDqBitmapFuncs.H>
#include <p9_io_xbus_read_erepair.H>
#include <p9_io_xbus_pdwn_lanes.H>
@@ -383,179 +384,216 @@ int32_t setBadDqBitmap<DIMMS_PER_RANK::MBA>(
TargetHandle_t i_trgt, const MemRank & i_rank,
const MemDqBitmap<DIMMS_PER_RANK::MBA> & i_bitmap );
+
+
//------------------------------------------------------------------------------
-/*
-int32_t mssGetMarkStore( TargetHandle_t i_mba, const MemRank & i_rank,
- MemMark & o_mark )
+template<>
+void getDimmDqAttr<TYPE_MCA>( TargetHandle_t i_target,
+ uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
{
- #define PRDF_FUNC "[PlatServices::mssGetMarkStore] "
+ #define PRDF_FUNC "[PlatServices::getDimmDqAttr<TYPE_MCA>] "
- int32_t o_rc = SUCCESS;
+ PRDF_ASSERT( TYPE_MCA == getTargetType(i_target) );
- do
- {
- errlHndl_t errl = NULL;
- uint8_t symbolMark, chipMark;
- fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba(i_mba);
- FAPI_INVOKE_HWP( errl, mss_get_mark_store, fapiMba,
- i_rank.getMaster(), symbolMark, chipMark );
+ TargetHandle_t mcs = getConnectedParent( i_target, TYPE_MCS );
- if ( NULL != errl )
- {
- 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; break;
- }
+ uint32_t mcaRelMcs = getTargetPosition( i_target ) % MAX_MCA_PER_MCS;
+ uint8_t tmpData[MAX_MCA_PER_MCS][DQS_PER_DIMM];
- MemSymbol sm = MemSymbol::fromSymbol( i_mba, i_rank, symbolMark );
- MemSymbol cm = MemSymbol::fromSymbol( i_mba, i_rank, chipMark );
+ if ( !mcs->tryGetAttr<ATTR_MSS_VPD_DQ_MAP>(tmpData) )
+ {
+ PRDF_ERR( PRDF_FUNC "Failed to get ATTR_MSS_VPD_DQ_MAP" );
+ PRDF_ASSERT( false );
+ }
- // Check if the chip or symbol mark are on any of the spares.
- MemSymbol sp0, sp1, ecc;
- o_rc = mssGetSteerMux( i_mba, i_rank, sp0, sp1, ecc );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "mssGetSteerMux() failed. HUID: 0x%08x "
- "rank: %d", getHuid(i_mba), i_rank.getMaster() );
- break;
- }
+ memcpy( &o_dqMapPtr[0], &tmpData[mcaRelMcs][0], DQS_PER_DIMM );
- if ( sp0.isValid() )
- {
- if ( sp0.getDram() == sm.getDram() ) sm.setDramSpared();
- if ( sp0.getDram() == cm.getDram() ) cm.setDramSpared();
- }
+ #undef PRDF_FUNC
+} // end function getDimmDqAttr
- if ( sp1.isValid() )
- {
- if ( sp1.getDram() == sm.getDram() ) sm.setDramSpared();
- if ( sp1.getDram() == cm.getDram() ) cm.setDramSpared();
- }
+template<>
+void getDimmDqAttr<TYPE_DIMM>( TargetHandle_t i_target,
+ uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
+{
+ #define PRDF_FUNC "[PlatServices::getDimmDqAttr<TYPE_DIMM>] "
- if ( ecc.isValid() )
- {
- if ( ecc.getDram() == sm.getDram() ) sm.setEccSpared();
- if ( ecc.getDram() == cm.getDram() ) cm.setEccSpared();
- }
+ PRDF_ASSERT( TYPE_DIMM == getTargetType(i_target) );
- o_mark = CenMark( sm, cm );
+ const uint8_t DIMM_BAD_DQ_SIZE_BYTES = 80;
- } while (0);
+ uint8_t tmpData[DIMM_BAD_DQ_SIZE_BYTES];
- return o_rc;
+ if ( !i_target->tryGetAttr<ATTR_CEN_DQ_TO_DIMM_CONN_DQ>(tmpData) )
+ {
+ PRDF_ERR( PRDF_FUNC "Failed to get ATTR_CEN_DQ_TO_DIMM_CONN_DQ" );
+ PRDF_ASSERT( false );
+ }
+
+ memcpy( &o_dqMapPtr[0], &tmpData[0], DQS_PER_DIMM );
#undef PRDF_FUNC
-}
-*/
+} // end function getDimmDqAttr
//------------------------------------------------------------------------------
-
-/* TODO RTC 157888
-int32_t mssSetMarkStore( TargetHandle_t i_mba, const CenRank & i_rank,
- CenMark & io_mark, bool & o_writeBlocked,
- bool i_allowWriteBlocked )
+template<>
+int32_t mssGetSteerMux<TYPE_MCA>( TargetHandle_t i_mca,
+ const MemRank & i_rank,
+ MemSymbol & o_port0Spare,
+ MemSymbol & o_port1Spare,
+ MemSymbol & o_eccSpare )
{
- #define PRDF_FUNC "[PlatServices::mssSetMarkStore] "
+ // NO-OP for MCA
+ o_port0Spare = MemSymbol(); // default invalid
+ o_port1Spare = MemSymbol(); // default invalid
+ o_eccSpare = MemSymbol(); // default invalid
+ return SUCCESS;
+}
+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;
+ // called by FSP code so can't just move to hostboot side
+#ifdef __HOSTBOOT_MODULE
errlHndl_t errl = NULL;
- o_writeBlocked = false;
- uint8_t sm = io_mark.getSM().isValid() ? io_mark.getSM().getSymbol()
- : MSS_INVALID_SYMBOL;
- uint8_t cm = io_mark.getCM().isValid() ? io_mark.getCM().getDramSymbol()
- : MSS_INVALID_SYMBOL;
+ uint8_t port0Spare, port1Spare, eccSpare;
- fapi::ReturnCode l_rc = mss_put_mark_store( getFapiTarget(i_mba),
- i_rank.getMaster(), sm, cm );
+ fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba(i_mba);
+ FAPI_INVOKE_HWP( errl, mss_check_steering, fapiMba,
+ i_rank.getMaster(), port0Spare, port1Spare, eccSpare );
- if ( i_allowWriteBlocked &&
- fapi::RC_MSS_MAINT_MARKSTORE_WRITE_BLOCKED == l_rc )
+ if ( NULL != errl )
{
- o_writeBlocked = true;
-
- // Read hardware and get the new chip mark.
- CenMark hwMark;
- o_rc = mssGetMarkStore( i_mba, i_rank, hwMark );
- if ( SUCCESS != o_rc )
- {
- PRDF_ERR( PRDF_FUNC "mssGetMarkStore() failed." );
- }
- else
- {
- // Update io_mark with the new chip mark.
- io_mark.setCM( hwMark.getCM() );
- }
+ 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
{
- errl = fapi::fapiRcToErrl(l_rc);
- if ( NULL != errl )
- {
- PRDF_ERR( PRDF_FUNC "mss_put_mark_store() failed. HUID: 0x%08x "
- "rank: %d sm: %d cm: %d", getHuid(i_mba),
- i_rank.getMaster(), sm, cm );
- PRDF_COMMIT_ERRL( errl, ERRL_ACTION_REPORT );
- o_rc = FAIL;
- }
+ 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 );
}
-
+#endif
return o_rc;
-
- #undef PRDF_FUNC
}
-*/
//------------------------------------------------------------------------------
+
template<>
-void getDimmDqAttr<TYPE_MCA>( TargetHandle_t i_target,
- uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
+int32_t mssSetSteerMux<TYPE_MBA>( TargetHandle_t i_mba, const MemRank & i_rank,
+ const MemSymbol & i_symbol, bool i_x4EccSpare )
{
- #define PRDF_FUNC "[PlatServices::getDimmDqAttr<TYPE_MCA>] "
-
- PRDF_ASSERT( TYPE_MCA == getTargetType(i_target) );
+ int32_t o_rc = SUCCESS;
+#ifdef __HOSTBOOT_MODULE
+ errlHndl_t errl = NULL;
+ fapi2::Target<fapi2::TARGET_TYPE_MBA> fapiMba(i_mba);
- TargetHandle_t mcs = getConnectedParent( i_target, TYPE_MCS );
+ uint8_t l_dramSymbol = PARSERUTILS::dram2Symbol<TYPE_MBA>(
+ i_symbol.getDram(),
+ isDramWidthX4(i_mba) );
- uint32_t mcaRelMcs = getTargetPosition( i_target ) % MAX_MCA_PER_MCS;
- uint8_t tmpData[MAX_MCA_PER_MCS][DQS_PER_DIMM];
+ FAPI_INVOKE_HWP( errl, mss_do_steering, fapiMba,
+ i_rank.getMaster(), l_dramSymbol,
+ i_x4EccSpare );
- if ( !mcs->tryGetAttr<ATTR_MSS_VPD_DQ_MAP>(tmpData) )
+ if ( NULL != errl )
{
- PRDF_ERR( PRDF_FUNC "Failed to get ATTR_MSS_VPD_DQ_MAP" );
- PRDF_ASSERT( false );
+ 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;
}
+#endif
+ return o_rc;
+}
- memcpy( &o_dqMapPtr[0], &tmpData[mcaRelMcs][0], DQS_PER_DIMM );
- #undef PRDF_FUNC
-} // end function getDimmDqAttr
+//------------------------------------------------------------------------------
+template<>
+int32_t getDimmSpareConfig<TYPE_MCA>( TargetHandle_t i_mba, MemRank i_rank,
+ uint8_t i_ps, uint8_t & o_spareConfig )
+{
+ // No spares for MCAs
+ o_spareConfig = CEN_VPD_DIMM_SPARE_NO_SPARE;
+ return SUCCESS;
+}
template<>
-void getDimmDqAttr<TYPE_DIMM>( TargetHandle_t i_target,
- uint8_t (&o_dqMapPtr)[DQS_PER_DIMM] )
+int32_t getDimmSpareConfig<TYPE_MBA>( TargetHandle_t i_mba, MemRank i_rank,
+ uint8_t i_ps, uint8_t & o_spareConfig )
{
- #define PRDF_FUNC "[PlatServices::getDimmDqAttr<TYPE_DIMM>] "
+ #define PRDF_FUNC "[PlatServices::getDimmSpareConfig] "
+ int32_t o_rc = SUCCESS;
- PRDF_ASSERT( TYPE_DIMM == getTargetType(i_target) );
+#ifdef __HOSTBOOT_MODULE
+ using namespace fapi2;
- const uint8_t DIMM_BAD_DQ_SIZE_BYTES = 80;
+ 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;
+ }
- uint8_t tmpData[DIMM_BAD_DQ_SIZE_BYTES];
+ if ( MAX_PORT_PER_MBA <= i_ps )
+ {
+ PRDF_ERR( PRDF_FUNC "Invalid parameters i_ps:%u", i_ps );
+ o_rc = FAIL; break;
+ }
- if ( !i_target->tryGetAttr<ATTR_CEN_DQ_TO_DIMM_CONN_DQ>(tmpData) )
- {
- PRDF_ERR( PRDF_FUNC "Failed to get ATTR_CEN_DQ_TO_DIMM_CONN_DQ" );
- PRDF_ASSERT( false );
- }
+ 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()];
- memcpy( &o_dqMapPtr[0], &tmpData[0], DQS_PER_DIMM );
+ // 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);
+#endif
+ return o_rc;
#undef PRDF_FUNC
-} // end function getDimmDqAttr
+}
+
+
+
+
+
//------------------------------------------------------------------------------
OpenPOWER on IntegriCloud