diff options
Diffstat (limited to 'src/usr/diag')
7 files changed, 145 insertions, 124 deletions
diff --git a/src/usr/diag/prdf/common/plat/p9/p9_obus_actions.rule b/src/usr/diag/prdf/common/plat/p9/p9_obus_actions.rule index 90bd90020..0d5b9390f 100644 --- a/src/usr/diag/prdf/common/plat/p9/p9_obus_actions.rule +++ b/src/usr/diag/prdf/common/plat/p9/p9_obus_actions.rule @@ -26,7 +26,7 @@ /** Callout the OBUS interface */ actionclass calloutObusInterface { -# funccall("calloutInterface_obus"); RTC 174485 + funccall("calloutBusInterfacePlugin"); }; /** Callout the OBUS interface, threshold 32 per day */ @@ -40,7 +40,7 @@ actionclass calloutBusInterface_th_32perDay actionclass spareDeployed { calloutObusInterface; -# funccall("spareDeployed"); RTC 174485 + funccall("spareDeployed"); }; /** Lane Repair: max spares exceeded */ @@ -48,7 +48,7 @@ actionclass maxSparesExceeded { calloutObusInterface; threshold1; -# funccall("maxSparesExceeded"); RTC 174485 + funccall("maxSparesExceeded"); }; /** Lane Repair: too many bus errors */ @@ -56,7 +56,7 @@ actionclass tooManyBusErrors { calloutObusInterface; threshold1; -# funccall("tooManyBusErrors"); RTC 174485 + funccall("tooManyBusErrors"); }; # Currently handling each OBUS clock group with the same plugins. May optimize diff --git a/src/usr/diag/prdf/common/plat/p9/p9_xbus_actions.rule b/src/usr/diag/prdf/common/plat/p9/p9_xbus_actions.rule index 2afb6c9ed..c37f380fc 100644 --- a/src/usr/diag/prdf/common/plat/p9/p9_xbus_actions.rule +++ b/src/usr/diag/prdf/common/plat/p9/p9_xbus_actions.rule @@ -26,7 +26,7 @@ /** Callout the XBUS interface */ actionclass calloutXbusInterface { - funccall("calloutInterface_xbus"); + funccall("calloutBusInterfacePlugin"); }; /** Callout the XBUS interface, threshold 32 per day */ diff --git a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C index 5653b5911..23442a2d7 100644 --- a/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C +++ b/src/usr/diag/prdf/common/plat/p9/prdfLaneRepair.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2017 */ +/* Contributors Listed Below - COPYRIGHT 2017,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -27,6 +27,8 @@ #include <prdfLaneRepair.H> // Framework includes +#include <prdfPluginDef.H> +#include <prdfLaneRepair.H> #include <prdfPlatServices.H> #include <iipconst.h> #include <prdfGlobal.H> @@ -53,7 +55,8 @@ TargetHandle_t getTxBusEndPt( TargetHandle_t i_rxTrgt) PRDF_ASSERT(nullptr != i_rxTrgt); - if ( TYPE_XBUS == getTargetType(i_rxTrgt) ) + TYPE busType = getTargetType(i_rxTrgt); + if ( TYPE_XBUS == busType || TYPE_OBUS == busType ) { o_txTrgt = getConnectedPeerTarget( i_rxTrgt ); } @@ -72,6 +75,27 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip, TargetHandle_t rxBusTgt = i_chip->getTrgt(); TargetHandle_t txBusTgt = nullptr; TYPE busType = getTargetType(rxBusTgt); + + // RTC 174485 + // Need HWPs for this. Just callout bus interface for now. + if (busType == TYPE_OBUS) + { + if ( obusInSmpMode(rxBusTgt) ) + { + calloutBusInterface( i_chip, i_sc, MRU_LOW ); + i_sc.service_data->setServiceCall(); + } + else + { + PRDF_ERR( PRDF_FUNC "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; + } + bool thrExceeded; // Number of clock groups on this interface. (2 for xbus, 1 for all others) uint8_t clkGrps = (busType == TYPE_XBUS) ? 2 : 1; @@ -261,23 +285,43 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip, do { // Get both endpoints - TargetHandle_t i_rxTrgt = i_chip->getTrgt(); - TargetHandle_t i_txTrgt = getTxBusEndPt(i_rxTrgt); + TargetHandle_t rxTrgt = i_chip->getTrgt(); + TYPE rxType = getTargetType(rxTrgt); + + if ( rxType == TYPE_OBUS && !obusInSmpMode( 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 + // those bus types should not be taking a CalloutBusInterface + // 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) ); + + 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(); + break; + } + + TargetHandle_t txTrgt = getTxBusEndPt(rxTrgt); + TYPE txType = getTargetType(txTrgt); // Add the endpoint target callouts - i_sc.service_data->SetCallout( i_rxTrgt, MRU_MEDA ); - i_sc.service_data->SetCallout( i_txTrgt, MRU_MEDA); + i_sc.service_data->SetCallout( rxTrgt, MRU_MEDA ); + i_sc.service_data->SetCallout( txTrgt, MRU_MEDA); // Get the HWAS bus type. - HWAS::busTypeEnum hwasType; - - TYPE rxType = getTargetType(i_rxTrgt); - TYPE txType = getTargetType(i_txTrgt); + HWAS::busTypeEnum hwasType = HWAS::X_BUS_TYPE; if ( TYPE_XBUS == rxType && TYPE_XBUS == txType ) { hwasType = HWAS::X_BUS_TYPE; } + else if ( TYPE_OBUS == rxType && TYPE_OBUS == txType ) + { + hwasType = HWAS::O_BUS_TYPE; + } else { PRDF_ASSERT( false ); @@ -293,7 +337,7 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip, } // Callout this bus interface. - PRDF_ADD_BUS_CALLOUT( errl, i_rxTrgt, i_txTrgt, hwasType, i_priority ); + PRDF_ADD_BUS_CALLOUT( errl, rxTrgt, txTrgt, hwasType, i_priority ); } while(0); @@ -302,5 +346,75 @@ int32_t calloutBusInterface( ExtensibleChip * i_chip, #undef PRDF_FUNC } +// Lane Repair Rule Plugins + +/** + * @brief Handles Spare Lane Deployed Event + * @param i_chip XBUS chip. + * @param io_sc Step code data struct. + * @return SUCCESS always + */ +int32_t spareDeployed( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) + return handleLaneRepairEvent(i_chip, io_sc, true); + else + return SUCCESS; +} +PRDF_PLUGIN_DEFINE_NS( p9_xbus, LaneRepair, spareDeployed ); +PRDF_PLUGIN_DEFINE_NS( p9_obus, LaneRepair, spareDeployed ); + +/** + * @brief Handles Max Spares Exceeded Event + * @param i_chip XBUS chip. + * @param io_sc Step code data struct. + * @return SUCCESS always + */ +int32_t maxSparesExceeded( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) + return handleLaneRepairEvent(i_chip, io_sc, false); + else + return SUCCESS; +} +PRDF_PLUGIN_DEFINE_NS( p9_xbus, LaneRepair, maxSparesExceeded ); +PRDF_PLUGIN_DEFINE_NS( p9_obus, LaneRepair, maxSparesExceeded ); + +/** + * @brief Handles Too Many Bus Errors Event + * @param i_chip XBUS chip. + * @param io_sc Step code data struct. + * @return SUCCESS always + */ +int32_t tooManyBusErrors( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) + return handleLaneRepairEvent(i_chip, io_sc, false); + else + return SUCCESS; +} +PRDF_PLUGIN_DEFINE_NS( p9_xbus, LaneRepair, tooManyBusErrors ); +PRDF_PLUGIN_DEFINE_NS( p9_obus, LaneRepair, tooManyBusErrors ); + +/** + * @brief Add callouts for a BUS interface + * @param i_chip Bus endpt chip + * @param io_sc Step code data struct. + * @return SUCCESS always + */ +int32_t calloutBusInterfacePlugin( ExtensibleChip * i_chip, + STEP_CODE_DATA_STRUCT & io_sc ) +{ + calloutBusInterface(i_chip, io_sc, MRU_LOW); + return SUCCESS; +} +PRDF_PLUGIN_DEFINE_NS( p9_xbus, LaneRepair, calloutBusInterfacePlugin ); +PRDF_PLUGIN_DEFINE_NS( p9_obus, LaneRepair, calloutBusInterfacePlugin ); + } // end namespace LaneRepair + } // end namespace PRDF + diff --git a/src/usr/diag/prdf/common/plat/p9/prdfP9Xbus.C b/src/usr/diag/prdf/common/plat/p9/prdfP9Xbus.C deleted file mode 100644 index dff94ad74..000000000 --- a/src/usr/diag/prdf/common/plat/p9/prdfP9Xbus.C +++ /dev/null @@ -1,103 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: src/usr/diag/prdf/common/plat/p9/prdfP9Xbus.C $ */ -/* */ -/* OpenPOWER HostBoot Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2017 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ -// Framework includes -#include <prdfPluginDef.H> -#include <iipServiceDataCollector.h> -#include <prdfExtensibleChip.H> -#include <prdfPluginMap.H> - -#include <prdfLaneRepair.H> - -using namespace TARGETING; - -namespace PRDF -{ - -using namespace PlatServices; -using namespace LaneRepair; - -namespace p9_xbus -{ - -/** - * @brief Handles Spare Lane Deployed Event - * @param i_chip XBUS chip. - * @param io_sc Step code data struct. - * @return SUCCESS always - */ -int32_t spareDeployed( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) -{ - if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) - return handleLaneRepairEvent(i_chip, io_sc, true); - else - return SUCCESS; -} PRDF_PLUGIN_DEFINE( p9_xbus, spareDeployed ); - -/** - * @brief Handles Max Spares Exceeded Event - * @param i_chip XBUS chip. - * @param io_sc Step code data struct. - * @return SUCCESS always - */ -int32_t maxSparesExceeded( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) -{ - if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) - return handleLaneRepairEvent(i_chip, io_sc, false); - else - return SUCCESS; -} PRDF_PLUGIN_DEFINE( p9_xbus, maxSparesExceeded ); - -/** - * @brief Handles Too Many Bus Errors Event - * @param i_chip XBUS chip. - * @param io_sc Step code data struct. - * @return SUCCESS always - */ -int32_t tooManyBusErrors( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) -{ - if ( CHECK_STOP != io_sc.service_data->getPrimaryAttnType() ) - return handleLaneRepairEvent(i_chip, io_sc, false); - else - return SUCCESS; -} PRDF_PLUGIN_DEFINE( p9_xbus, tooManyBusErrors ); - -/** - * @brief Add callouts for an XBUS interface - * @param i_chip XBUS chip. - * @param io_sc Step code data struct. - * @return SUCCESS always - */ -int32_t calloutInterface_xbus( ExtensibleChip * i_chip, - STEP_CODE_DATA_STRUCT & io_sc ) -{ - calloutBusInterface(i_chip, io_sc, MRU_LOW); - return SUCCESS; -} PRDF_PLUGIN_DEFINE( p9_xbus, calloutInterface_xbus ); - -} // end namespace Proc -} // end namespace PRDF diff --git a/src/usr/diag/prdf/common/plat/p9/prdf_plat_p9.mk b/src/usr/diag/prdf/common/plat/p9/prdf_plat_p9.mk index 2207017b8..ed808bf82 100644 --- a/src/usr/diag/prdf/common/plat/p9/prdf_plat_p9.mk +++ b/src/usr/diag/prdf/common/plat/p9/prdf_plat_p9.mk @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2016,2017 +# Contributors Listed Below - COPYRIGHT 2016,2018 # [+] International Business Machines Corp. # # @@ -43,13 +43,12 @@ prd_obj += prdfP9PllDomain.o prd_obj += prdfFsiCapUtil.o prd_obj += prdfP9ProcDomain.o prd_obj += prdfLineDelete.o -prd_obj += prdfLaneRepair.o # rule plugin related prd_rule_plugin += prdfP9Proc.o prd_rule_plugin += prdfP9Pll.o prd_rule_plugin += prdfCommonPlugins.o +prd_rule_plugin += prdfLaneRepair.o prd_rule_plugin += prdfP9Ex.o -prd_rule_plugin += prdfP9Xbus.o prd_rule_plugin += prdfP9Ec.o prd_rule_plugin += prdfP9Eq.o diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C index 471e98b58..30cc2568b 100644 --- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C +++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2017 */ +/* Contributors Listed Below - COPYRIGHT 2016,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -253,6 +253,11 @@ int32_t setVpdFailedLanesXbus(TargetHandle_t i_rxBusTgt, return o_rc; } +bool obusInSmpMode( TargetHandle_t obus ) +{ + return obus->getAttr<ATTR_OPTICS_CONFIG_MODE>() == OPTICS_CONFIG_MODE_SMP; +} + //############################################################################## //## Memory specific functions //############################################################################## diff --git a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H index 67f0dc685..a62325226 100755 --- a/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H +++ b/src/usr/diag/prdf/common/plat/prdfPlatServices_common.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016,2017 */ +/* Contributors Listed Below - COPYRIGHT 2016,2018 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -190,6 +190,12 @@ int32_t setVpdFailedLanesXbus(TARGETING::TargetHandle_t i_rxBusTgt, bool & o_thrExceeded, uint8_t i_clkGrp); +/** + * @brief Checks if OBUS target is configured in SMP (ABUS) mode + * @param obusTgt OBUS target to check + * @return true if SMP mode + */ +bool obusInSmpMode(TARGETING::TargetHandle_t obusTgt); //############################################################################## //## Memory specific functions |