diff options
Diffstat (limited to 'src/usr/isteps/istep09/call_fabric_erepair.C')
-rw-r--r-- | src/usr/isteps/istep09/call_fabric_erepair.C | 285 |
1 files changed, 189 insertions, 96 deletions
diff --git a/src/usr/isteps/istep09/call_fabric_erepair.C b/src/usr/isteps/istep09/call_fabric_erepair.C index 005491860..44422b485 100644 --- a/src/usr/isteps/istep09/call_fabric_erepair.C +++ b/src/usr/isteps/istep09/call_fabric_erepair.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015 */ +/* Contributors Listed Below - COPYRIGHT 2015,2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -57,6 +57,14 @@ #include <targeting/common/utilFilter.H> #include <targeting/common/trace.H> +#include <pbusLinkSvc.H> + +#include <fapi2/target.H> +#include <fapi2/plat_hwp_invoker.H> +#include <errl/errlmanager.H> + +// HWP procedure +#include <p9_io_xbus_restore_erepair.H> namespace ISTEP_09 { @@ -68,14 +76,37 @@ using namespace TARGETING; using namespace HWAS; +// prototype +/** + * @brief Try to restore target's endpoints + * + * Runs restore_erepair HWP on each group combination for this target + * This hardware procedure should update the bad lane vector and + * power down the bad lanes. + * + * @param[in] i_target XBUS target endpoint + * @param[in] i_rx_bad_lanes Vector of Rx Bad Lanes + * @param[in] i_tx_bad_lanes Vector of Tx Bad Lanes + * @param[out] o_step_error Failing error logs added to this + * + * @pre Target service must be initialized + * @post See "return" + * @return uint8_t Number of failures + * @retval 0 means successfully restored target endpoint + * @retval 4 Means all attempts to restore/erepair failed + */ +uint8_t restore_endpoint(const fapi2::Target<fapi2::TARGET_TYPE_XBUS> &i_target, + const std::vector< uint8_t >& i_rx_bad_lanes, + const std::vector< uint8_t >& i_tx_bad_lanes, + ISTEP_ERROR::IStepError& o_step_error); + // // Wrapper function to call fabric_erepair // void* call_fabric_erepair( void *io_pArgs ) { errlHndl_t l_errl = NULL; - //@TODO RTC:134079 - /*ISTEP_ERROR::IStepError l_StepError; + ISTEP_ERROR::IStepError l_StepError; TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_erepair entry" ); do { @@ -93,8 +124,9 @@ void* call_fabric_erepair( void *io_pArgs ) { // Call to check Processor SBE SEEPROM Images against NEST_FREQ_MHZ // attributes and make any necessary updates - l_errl = SBE::updateProcessorSbeSeeproms( - SBE::SBE_UPDATE_ONLY_CHECK_NEST_FREQ); + // TODO-RTC:138226 - add it after SBE is ported to fapi2 + //l_errl = SBE::updateProcessorSbeSeeproms( + // SBE::SBE_UPDATE_ONLY_CHECK_NEST_FREQ); if (l_errl) { @@ -104,24 +136,28 @@ void* call_fabric_erepair( void *io_pArgs ) errlCommit( l_errl, HWPF_COMP_ID ); break; } - } std::vector<uint8_t> l_endp1_txFaillanes; std::vector<uint8_t> l_endp1_rxFaillanes; std::vector<uint8_t> l_endp2_txFaillanes; std::vector<uint8_t> l_endp2_rxFaillanes; + uint8_t l_restore_failures = 0; + + EDI_EI_INITIALIZATION::TargetPairs_t l_PbusConnections; + const uint32_t MaxBusSet = 1; + TYPE busSet[MaxBusSet] = { TYPE_XBUS }; // TODO RTC:152304 - add TYPE_OBUS - TargetPairs_t l_PbusConnections; - const uint32_t MaxBusSet = 2; - TYPE busSet[MaxBusSet] = { TYPE_ABUS, TYPE_XBUS }; uint32_t l_count = 0; - fapi::TargetType l_tgtType = fapi::TARGET_TYPE_NONE; + fapi2::TargetType l_tgtType = fapi2::TARGET_TYPE_NONE; + + TARGETING::ATTR_FAPI_NAME_type l_target_name = {0}; for (uint32_t i = 0; l_StepError.isNull() && (i < MaxBusSet); i++) { - l_errl = PbusLinkSvc::getTheInstance().getPbusConnections( - l_PbusConnections, busSet[i] ); + // grab the unique pairs for this particular type + l_errl = EDI_EI_INITIALIZATION::PbusLinkSvc::getTheInstance(). + getPbusConnections( l_PbusConnections, busSet[i] ); if ( l_errl ) { // Create IStep error log and cross reference error that occurred @@ -129,27 +165,32 @@ void* call_fabric_erepair( void *io_pArgs ) // Commit Error errlCommit( l_errl, HWPF_COMP_ID ); + + break; } - for (TargetPairs_t::const_iterator l_itr = l_PbusConnections.begin(); - (l_StepError.isNull()) && (l_itr != l_PbusConnections.end()); - ++l_itr) + for (const auto & l_PbusConnection: l_PbusConnections) { - const fapi::Target l_fapi_endp1_target( - (i ? TARGET_TYPE_XBUS_ENDPOINT : TARGET_TYPE_ABUS_ENDPOINT), - (const_cast<TARGETING::Target*>(l_itr->first))); - const fapi::Target l_fapi_endp2_target( - (i ? TARGET_TYPE_XBUS_ENDPOINT : TARGET_TYPE_ABUS_ENDPOINT), - (const_cast<TARGETING::Target*>(l_itr->second))); + const TARGETING::Target* l_thisPbusTarget = l_PbusConnection.first; + const TARGETING::Target* l_connectedPbusTarget = + l_PbusConnection.second; + + // TODO-RTC:152304 - need to adjust target types if adding OBUS/ABUS + const fapi2::Target<fapi2::TARGET_TYPE_XBUS> l_fapi_endp1_target + (const_cast<TARGETING::Target*>(l_thisPbusTarget)); + + const fapi2::Target<fapi2::TARGET_TYPE_XBUS> l_fapi_endp2_target + (const_cast<TARGETING::Target*>(l_connectedPbusTarget)); TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "===== " ); // Get the repair lanes from the VPD - fapi::ReturnCode l_rc; + fapi2::ReturnCode l_rc; l_endp1_txFaillanes.clear(); l_endp1_rxFaillanes.clear(); l_endp2_txFaillanes.clear(); l_endp2_rxFaillanes.clear(); +/* TODO-RTC:134079 - L2 HWP enablement l_rc = erepairGetRestoreLanes(l_fapi_endp1_target, l_endp1_txFaillanes, l_endp1_rxFaillanes, @@ -166,8 +207,8 @@ void* call_fabric_erepair( void *io_pArgs ) l_errl = fapiRcToErrl(l_rc); // capture the target data in the elog - ErrlUserDetailsTarget(l_itr->first).addToLog( l_errl ); - ErrlUserDetailsTarget(l_itr->second).addToLog( l_errl ); + ErrlUserDetailsTarget(l_thisPbusTarget).addToLog( l_errl ); + ErrlUserDetailsTarget(l_connectedPbusTarget).addToLog( l_errl ); // Create IStep error log and cross ref error that occurred l_StepError.addErrorDetails( l_errl); @@ -176,109 +217,97 @@ void* call_fabric_erepair( void *io_pArgs ) errlCommit(l_errl, HWPF_COMP_ID); break; } - +*/ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "===== Call io_restore_erepair HWP" - "%cbus connection ", (i ? 'X' : 'A') ); + "%cbus connection ", (i ? 'X' : 'O') ); if(l_endp1_txFaillanes.size() || l_endp1_rxFaillanes.size()) { - // call the io_restore_erepair HWP to restore eRepair + // call the io_xbus_restore_erepair HWP to restore eRepair // lanes of endp1 - //@TODO RTC:133830 - //FAPI_INVOKE_HWP(l_errl, - // p9_io_restore_erepair, - // l_fapi_endp1_target, - // l_endp1_txFaillanes, - // l_endp1_rxFaillanes); + l_restore_failures = restore_endpoint(l_fapi_endp1_target, + l_endp1_rxFaillanes, + l_endp1_txFaillanes, + l_StepError); } - if(l_errl) - { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X : io_restore_erepair HWP" - "%cbus connection ", - l_errl->reasonCode(), (i ? 'X' : 'A') ); - - // capture the target data in the elog - ErrlUserDetailsTarget(l_itr->first).addToLog( l_errl ); - ErrlUserDetailsTarget(l_itr->second).addToLog( l_errl ); - - // Create IStep error log and cross ref error that occurred - l_StepError.addErrorDetails( l_errl); + fapi2::toString(l_fapi_endp1_target, + l_target_name, + sizeof(l_target_name)); - // Commit Error - errlCommit(l_errl, HWPF_COMP_ID); - break; - } - - l_tgtType = l_fapi_endp1_target.getType(); - for(l_count = 0; l_count < l_endp1_txFaillanes.size(); l_count++) + if (l_restore_failures) { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Successfully" - " restored Tx lane %d, of %s, of endpoint %s", - l_endp1_txFaillanes[l_count], - l_tgtType == TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus" : - "A-Bus", l_fapi_endp1_target.toEcmdString()); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + "%d restore endpoint attempts to endpoint1 %s failed.", + l_restore_failures, l_target_name); } - - for(l_count = 0; l_count < l_endp1_rxFaillanes.size(); l_count++) + else { - TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Successfully" - " restored Rx lane %d, of %s, of endpoint %s", - l_endp1_rxFaillanes[l_count], - l_tgtType == TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus" : - "A-Bus", l_fapi_endp1_target.toEcmdString()); + l_tgtType = l_fapi_endp1_target.getType(); + + for(l_count = 0; l_count < l_endp1_txFaillanes.size();l_count++) + { + fapi2::toString(l_fapi_endp1_target, + l_target_name, + sizeof(l_target_name)); + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Successfully" + " restored Tx lane %d, of %s, of endpoint %s", + l_endp1_txFaillanes[l_count], + l_tgtType == fapi2::TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus": + "O-Bus", l_target_name); + } + + for(l_count = 0; l_count < l_endp1_rxFaillanes.size();l_count++) + { + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, "Successfully" + " restored Rx lane %d, of %s, of endpoint %s", + l_endp1_rxFaillanes[l_count], + l_tgtType == fapi2::TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus": + "O-Bus", l_target_name); + } } if(l_endp2_txFaillanes.size() || l_endp2_rxFaillanes.size()) { - // call the io_restore_erepair HWP to restore eRepair + // call the io_xbus_restore_erepair HWP to restore eRepair // lanes of endp2 - //@TODO RTC:133830 - FAPI_INVOKE_HWP(l_errl, - io_restore_erepair, - l_fapi_endp2_target, - l_endp2_txFaillanes, - l_endp2_rxFaillanes); + l_restore_failures = restore_endpoint(l_fapi_endp2_target, + l_endp2_rxFaillanes, + l_endp2_txFaillanes, + l_StepError); } - if (l_errl) + fapi2::toString(l_fapi_endp2_target, + l_target_name, + sizeof(l_target_name)); + + if ( l_restore_failures ) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, - "ERROR 0x%.8X : io_restore_erepair HWP" - "%cbus connection ", - l_errl->reasonCode(), (i ? 'X' : 'A') ); - - // capture the target data in the elog - ErrlUserDetailsTarget(l_itr->first).addToLog( l_errl ); - ErrlUserDetailsTarget(l_itr->second).addToLog( l_errl ); - - // Create IStep error log and cross ref error that occurred - l_StepError.addErrorDetails( l_errl); + "%d restore endpoint attempts to endpoint2 %s failed.", + l_restore_failures, l_target_name); - // Commit Error - errlCommit(l_errl, HWPF_COMP_ID); - break; + continue; } l_tgtType = l_fapi_endp2_target.getType(); for(l_count = 0; l_count < l_endp2_txFaillanes.size(); l_count++) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Successfully" - " restored Tx lane %d, of %s, of endpoint %s", - l_endp2_txFaillanes[l_count], - l_tgtType == TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus" : - "A-Bus", l_fapi_endp2_target.toEcmdString()); + " restored Tx lane %d, of %s, of endpoint %s", + l_endp2_txFaillanes[l_count], + l_tgtType == fapi2::TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus" : + "O-Bus", l_target_name); } for(l_count = 0; l_count < l_endp2_rxFaillanes.size(); l_count++) { TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,"Successfully" - " restored Rx lane %d, of %s, of endpoint %s", - l_endp2_rxFaillanes[l_count], - l_tgtType == TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus" : - "A-Bus", l_fapi_endp2_target.toEcmdString()); + " restored Rx lane %d, of %s, of endpoint %s", + l_endp2_rxFaillanes[l_count], + l_tgtType == fapi2::TARGET_TYPE_XBUS_ENDPOINT ? "X-Bus" : + "O-Bus", l_target_name); } } // end for l_PbusConnections } // end for MaxBusSet @@ -288,7 +317,71 @@ void* call_fabric_erepair( void *io_pArgs ) TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_erepair exit" ); return l_StepError.getErrorHandle(); - */ - return l_errl; } + + +uint8_t restore_endpoint(const fapi2::Target<fapi2::TARGET_TYPE_XBUS> &i_target, + const std::vector< uint8_t >& i_rx_bad_lanes, + const std::vector< uint8_t >& i_tx_bad_lanes, + ISTEP_ERROR::IStepError & o_step_error) +{ + uint8_t o_failures = 0; + errlHndl_t l_errl = NULL; + + fapi2::TargetType l_tgtType = fapi2::TARGET_TYPE_NONE; + l_tgtType = i_target.getType(); + + // clock group is either 0 or 1 + // need to train both groups and allow for them to differ + uint8_t l_this_group = 0; + uint8_t l_connected_group = 0; + uint8_t l_group_loop = 0; + for (l_group_loop = 0; l_group_loop < 4; l_group_loop++) + { + l_this_group = l_group_loop / 2; // 0, 0, 1, 1 + l_connected_group = l_group_loop % 2; // 0, 1, 1, 0 + + + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Running p9_io_xbus_restore_erepair HWP on " + "this %C-BUS target %.8X (groups %d and %d)", + (l_tgtType == fapi2::TARGET_TYPE_XBUS_ENDPOINT) ? 'X':'O', + TARGETING::get_huid(i_target), + l_this_group, l_connected_group ); + + /* + * A HWP that runs Restore eRepair. + * This procedure should update the + * bad lane vector and power down the bad lanes. + */ + FAPI_INVOKE_HWP(l_errl, + p9_io_xbus_restore_erepair, + i_target, + l_this_group, + i_rx_bad_lanes, + i_target, + l_connected_group, + i_tx_bad_lanes); + + if (l_errl) + { + o_failures++; + TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR 0x%.8X : io_xbus_restore_erepair HWP " + "xbus connection.", l_errl->reasonCode() ); + + // capture the target data in the elog + ErrlUserDetailsTarget(i_target).addToLog( l_errl ); + + // Create IStep error log and cross ref error that occurred + o_step_error.addErrorDetails( l_errl); + + // Commit Error + errlCommit(l_errl, HWPF_COMP_ID); + l_errl = NULL; + } + } + return o_failures; +} + }; |