summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C')
-rw-r--r--src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C122
1 files changed, 65 insertions, 57 deletions
diff --git a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
index 6cb4e6535..6ad889fd5 100644
--- a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
+++ b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C
@@ -75,6 +75,16 @@ TargetHandle_t getTxBusEndPt( TargetHandle_t i_rxTrgt)
// grab connected DMI parent
o_txTrgt = getConnectedParent( i_rxTrgt, TYPE_DMI );
}
+ else if ( TYPE_OMI == busType )
+ {
+ // Get connected child OCMB (one OCMB per OMI)
+ o_txTrgt = getConnectedChild( i_rxTrgt, TYPE_OCMB_CHIP, 0 );
+ }
+ else if ( TYPE_OCMB_CHIP == busType )
+ {
+ // Get connected parent OMI
+ o_txTrgt = getConnectedParent( i_rxTrgt, TYPE_OMI );
+ }
PRDF_ASSERT(nullptr != o_txTrgt);
return o_txTrgt;
@@ -310,38 +320,6 @@ int32_t __handleLaneRepairEvent( ExtensibleChip * i_chip,
#undef PRDF_FUNC
}
-template<>
-int32_t __handleLaneRepairEvent<TYPE_OBUS, TYPE_OBUS>( ExtensibleChip * i_chip,
- STEP_CODE_DATA_STRUCT & i_sc,
- bool i_spareDeployed )
-{
- TargetHandle_t rxBusTgt = i_chip->getTrgt();
-
- // Make predictive on first occurrence in MFG
- if ( isLaneRepairDisabled<TYPE_OBUS>() )
- {
- i_sc.service_data->setServiceCall();
- }
-
- // RTC 174485
- // Need HWPs for this. Just callout bus interface for now.
- if ( obusInSmpMode(rxBusTgt) )
- {
- calloutBusInterface( i_chip, i_sc, MRU_LOW );
- i_sc.service_data->setServiceCall();
- }
- else
- {
- PRDF_ERR( "__handleLaneRepairEvent: Lane repair only supported "
- "in SMP mode obus: 0x%08x", getHuid(rxBusTgt) );
- i_sc.service_data->SetCallout( LEVEL2_SUPPORT, MRU_MED, NO_GARD );
- i_sc.service_data->SetCallout( SP_CODE, MRU_MED, NO_GARD );
- i_sc.service_data->setServiceCall();
- }
- return SUCCESS;
-}
-
-
int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
STEP_CODE_DATA_STRUCT & i_sc,
bool i_spareDeployed )
@@ -350,10 +328,6 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
TYPE trgtType = getTargetType(i_chip->getTrgt());
switch (trgtType)
{
- case TYPE_OBUS:
- rc = __handleLaneRepairEvent<TYPE_OBUS,TYPE_OBUS>( i_chip, i_sc,
- i_spareDeployed );
- break;
case TYPE_XBUS:
rc = __handleLaneRepairEvent<TYPE_XBUS,TYPE_XBUS>( i_chip, i_sc,
i_spareDeployed );
@@ -729,6 +703,8 @@ void obus_clearMaskFail( errlHndl_t &io_errl, TargetHandle_t &i_rxTrgt,
PRDF_ASSERT( NULL != i_txTrgt );
PRDF_ASSERT( NULL != io_errl );
+#ifdef __HOSTBOOT_MODULE // register writes not allowed on FSP
+
uint32_t l_rc = SUCCESS;
ExtensibleChip *l_rxChip =
(ExtensibleChip *)systemPtr->GetChip( i_rxTrgt );
@@ -790,6 +766,8 @@ void obus_clearMaskFail( errlHndl_t &io_errl, TargetHandle_t &i_rxTrgt,
} while (0);
+#endif // __HOSTBOOT_MODULE
+
} // end obus_clearMaskFail
@@ -924,7 +902,7 @@ PRDF_PLUGIN_DEFINE_NS( cumulus_proc, LaneRepair, captureSmpObus3 );
PRDF_PLUGIN_DEFINE_NS( nimbus_proc, LaneRepair, captureSmpObus3 );
PRDF_PLUGIN_DEFINE_NS( axone_proc, LaneRepair, captureSmpObus3 );
-int32_t calloutBusInterface( ExtensibleChip * i_chip,
+int32_t calloutBusInterface( TargetHandle_t i_rxTrgt,
STEP_CODE_DATA_STRUCT & i_sc,
PRDpriority i_priority )
{
@@ -934,10 +912,9 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip,
do {
// Get both endpoints
- TargetHandle_t rxTrgt = i_chip->getTrgt();
- TYPE rxType = getTargetType(rxTrgt);
+ TYPE rxType = getTargetType(i_rxTrgt);
- if ( rxType == TYPE_OBUS && !obusInSmpMode( rxTrgt ) )
+ if ( rxType == TYPE_OBUS && !obusInSmpMode( i_rxTrgt ) )
{
// There is no support in hostboot for calling out the other end of
// an NV or openCAPI bus. By design, any FIR bits associated with
@@ -945,7 +922,7 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip,
// action. So if we hit this case, just make a default callout.
PRDF_ERR( PRDF_FUNC "Lane repair only supported in SMP mode "
- "obus: 0x%08x", getHuid(rxTrgt) );
+ "obus: 0x%08x", getHuid(i_rxTrgt) );
i_sc.service_data->SetCallout( LEVEL2_SUPPORT, MRU_MED, NO_GARD );
i_sc.service_data->SetCallout( SP_CODE, MRU_MED, NO_GARD );
@@ -953,11 +930,11 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip,
break;
}
- TargetHandle_t txTrgt = getTxBusEndPt(rxTrgt);
+ TargetHandle_t txTrgt = getTxBusEndPt(i_rxTrgt);
TYPE txType = getTargetType(txTrgt);
// Add the endpoint target callouts
- i_sc.service_data->SetCallout( rxTrgt, MRU_MEDA );
+ i_sc.service_data->SetCallout( i_rxTrgt, MRU_MEDA );
i_sc.service_data->SetCallout( txTrgt, MRU_MEDA);
// Get the HWAS bus type.
@@ -975,6 +952,11 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip,
{
hwasType = HWAS::DMI_BUS_TYPE;
}
+ else if ( (TYPE_OMI == rxType && TYPE_OCMB_CHIP == txType) ||
+ (TYPE_OCMB_CHIP == rxType && TYPE_OMI == txType) )
+ {
+ hwasType = HWAS::OMI_BUS_TYPE;
+ }
else
{
PRDF_ASSERT( false );
@@ -990,7 +972,7 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip,
}
// Callout this bus interface.
- PRDF_ADD_BUS_CALLOUT( errl, rxTrgt, txTrgt, hwasType, i_priority );
+ PRDF_ADD_BUS_CALLOUT( errl, i_rxTrgt, txTrgt, hwasType, i_priority );
} while(0);
@@ -1020,9 +1002,6 @@ int32_t spareDeployed( ExtensibleChip * i_chip,
PRDF_PLUGIN_DEFINE_NS( nimbus_xbus, LaneRepair, spareDeployed );
PRDF_PLUGIN_DEFINE_NS( cumulus_xbus, LaneRepair, spareDeployed );
PRDF_PLUGIN_DEFINE_NS( axone_xbus, LaneRepair, spareDeployed );
-PRDF_PLUGIN_DEFINE_NS( nimbus_obus, LaneRepair, spareDeployed );
-PRDF_PLUGIN_DEFINE_NS( cumulus_obus, LaneRepair, spareDeployed );
-PRDF_PLUGIN_DEFINE_NS( axone_obus, LaneRepair, spareDeployed );
PRDF_PLUGIN_DEFINE_NS( centaur_membuf, LaneRepair, spareDeployed );
/**
@@ -1042,9 +1021,6 @@ int32_t maxSparesExceeded( ExtensibleChip * i_chip,
PRDF_PLUGIN_DEFINE_NS( nimbus_xbus, LaneRepair, maxSparesExceeded );
PRDF_PLUGIN_DEFINE_NS( cumulus_xbus, LaneRepair, maxSparesExceeded );
PRDF_PLUGIN_DEFINE_NS( axone_xbus, LaneRepair, maxSparesExceeded );
-PRDF_PLUGIN_DEFINE_NS( nimbus_obus, LaneRepair, maxSparesExceeded );
-PRDF_PLUGIN_DEFINE_NS( cumulus_obus, LaneRepair, maxSparesExceeded );
-PRDF_PLUGIN_DEFINE_NS( axone_obus, LaneRepair, maxSparesExceeded );
PRDF_PLUGIN_DEFINE_NS( centaur_membuf, LaneRepair, maxSparesExceeded );
/**
@@ -1064,9 +1040,6 @@ int32_t tooManyBusErrors( ExtensibleChip * i_chip,
PRDF_PLUGIN_DEFINE_NS( nimbus_xbus, LaneRepair, tooManyBusErrors );
PRDF_PLUGIN_DEFINE_NS( cumulus_xbus, LaneRepair, tooManyBusErrors );
PRDF_PLUGIN_DEFINE_NS( axone_xbus, LaneRepair, tooManyBusErrors );
-PRDF_PLUGIN_DEFINE_NS( nimbus_obus, LaneRepair, tooManyBusErrors );
-PRDF_PLUGIN_DEFINE_NS( cumulus_obus, LaneRepair, tooManyBusErrors );
-PRDF_PLUGIN_DEFINE_NS( axone_obus, LaneRepair, tooManyBusErrors );
PRDF_PLUGIN_DEFINE_NS( centaur_membuf, LaneRepair, tooManyBusErrors );
/**
@@ -1078,18 +1051,53 @@ PRDF_PLUGIN_DEFINE_NS( centaur_membuf, LaneRepair, tooManyBusErrors );
int32_t calloutBusInterfacePlugin( ExtensibleChip * i_chip,
STEP_CODE_DATA_STRUCT & io_sc )
{
- calloutBusInterface(i_chip, io_sc, MRU_LOW);
+ calloutBusInterface(i_chip->getTrgt(), io_sc, MRU_LOW);
return SUCCESS;
}
PRDF_PLUGIN_DEFINE_NS( nimbus_xbus, LaneRepair, calloutBusInterfacePlugin );
PRDF_PLUGIN_DEFINE_NS( cumulus_xbus, LaneRepair, calloutBusInterfacePlugin );
PRDF_PLUGIN_DEFINE_NS( axone_xbus, LaneRepair, calloutBusInterfacePlugin );
-PRDF_PLUGIN_DEFINE_NS( nimbus_obus, LaneRepair, calloutBusInterfacePlugin );
-PRDF_PLUGIN_DEFINE_NS( cumulus_obus, LaneRepair, calloutBusInterfacePlugin );
-PRDF_PLUGIN_DEFINE_NS( axone_obus, LaneRepair, calloutBusInterfacePlugin );
+PRDF_PLUGIN_DEFINE_NS( explorer_ocmb, LaneRepair, calloutBusInterfacePlugin );
PRDF_PLUGIN_DEFINE_NS( cumulus_dmi, LaneRepair, calloutBusInterfacePlugin );
PRDF_PLUGIN_DEFINE_NS( centaur_membuf, LaneRepair, calloutBusInterfacePlugin );
+/**
+ * @brief Add callouts for a BUS interface inputting an OMIC or MCC target
+ * @param i_chip OMIC/MCC chip
+ * @param io_sc Step code data struct.
+ * @param i_pos The position of the OMI relative to the OMIC/MCC.
+ * @return SUCCESS always
+ */
+
+int32_t omiParentCalloutBusInterfacePlugin( ExtensibleChip * i_chip,
+ STEP_CODE_DATA_STRUCT & io_sc,
+ uint8_t i_pos )
+{
+ TargetHandle_t omi = getConnectedChild(i_chip->getTrgt(), TYPE_OMI, i_pos);
+ TargetHandle_t ocmb = getConnectedChild( omi, TYPE_OCMB_CHIP, 0 );
+
+ // Callout both ends of the bus as well (OMI and OCMB)
+ io_sc.service_data->SetCallout( omi, MRU_MEDA );
+ io_sc.service_data->SetCallout( ocmb, MRU_MEDA );
+
+ calloutBusInterface(omi, io_sc, MRU_LOW);
+ return SUCCESS;
+}
+
+#define OMI_PARENT_CALL_BUS_PLUGIN( POS ) \
+int32_t omiParentCalloutBusInterfacePlugin_##POS( ExtensibleChip * i_chip, \
+ STEP_CODE_DATA_STRUCT & io_sc ) \
+{ \
+ return omiParentCalloutBusInterfacePlugin( i_chip, io_sc, POS ); \
+} \
+PRDF_PLUGIN_DEFINE_NS( axone_omic, LaneRepair, \
+ omiParentCalloutBusInterfacePlugin_##POS );\
+PRDF_PLUGIN_DEFINE_NS( axone_mcc, LaneRepair, \
+ omiParentCalloutBusInterfacePlugin_##POS );
+
+OMI_PARENT_CALL_BUS_PLUGIN( 0 );
+OMI_PARENT_CALL_BUS_PLUGIN( 1 );
+OMI_PARENT_CALL_BUS_PLUGIN( 2 );
//------------------------------------------------------------------------------
OpenPOWER on IntegriCloud