diff options
Diffstat (limited to 'src/usr/isteps/istep09/call_fabric_io_run_training.C')
-rw-r--r-- | src/usr/isteps/istep09/call_fabric_io_run_training.C | 214 |
1 files changed, 170 insertions, 44 deletions
diff --git a/src/usr/isteps/istep09/call_fabric_io_run_training.C b/src/usr/isteps/istep09/call_fabric_io_run_training.C index a9a4a78cf..65b424106 100644 --- a/src/usr/isteps/istep09/call_fabric_io_run_training.C +++ b/src/usr/isteps/istep09/call_fabric_io_run_training.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015 */ +/* Contributors Listed Below - COPYRIGHT 2015,2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -53,19 +53,34 @@ #include <sbe/sbeif.H> // targeting support +#include <targeting/common/attributes.H> +#include <targeting/common/targetservice.H> + #include <targeting/common/commontargeting.H> #include <targeting/common/utilFilter.H> #include <targeting/common/trace.H> +#include <pbusLinkSvc.H> +#include <fapi2/target.H> +#include <fapi2/plat_hwp_invoker.H> + +// HWP +#include <p9_io_xbus_linktrain.H> + namespace ISTEP_09 { - using namespace ISTEP; using namespace ISTEP_ERROR; using namespace ERRORLOG; using namespace TARGETING; using namespace HWAS; + +// helper function prototypes +uint8_t run_linktraining( + const fapi2::Target<fapi2::TARGET_TYPE_XBUS> &i_master_target, + const fapi2::Target<fapi2::TARGET_TYPE_XBUS> &i_slave_target, + ISTEP_ERROR::IStepError & o_step_error ); // // Wrapper function to call fabric_io_run_training // @@ -73,71 +88,182 @@ void* call_fabric_io_run_training( void *io_pArgs ) { IStepError l_StepError; - //@TODO RTC:134079 -/* errlHndl_t l_errl = NULL; + errlHndl_t l_errl = NULL; TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_io_run_training entry" ); - TargetPairs_t l_PbusConnections; - const uint32_t MaxBusSet = 2; - - // Note: Run XBUS first to match with Cronus - TYPE busSet[MaxBusSet] = { TYPE_XBUS, TYPE_ABUS }; + uint8_t l_linktrain_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 - for (uint32_t i = 0; l_StepError.isNull() && (i < MaxBusSet); i++) + for (uint32_t ii = 0; (!l_errl) && (ii < MaxBusSet); ii++) { - l_errl = PbusLinkSvc::getTheInstance().getPbusConnections( - l_PbusConnections, busSet[i] ); - - if ( l_errl ) + l_errl = EDI_EI_INITIALIZATION::PbusLinkSvc::getTheInstance(). + getPbusConnections(l_PbusConnections, busSet[ii]); + if (l_errl) { - // Create IStep error log and cross reference error that occurred + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "ERROR 0x%.8X : getPbusConnections TYPE_%cBUS returns error", + l_errl->reasonCode(), (ii ? 'X':'O') ); + + // Create IStep error log and cross reference to error that occurred l_StepError.addErrorDetails( l_errl ); - // Commit Error - errlCommit( l_errl, HWPF_COMP_ID ); + // Commit the error log + // Log should be deleted and set to NULL in errlCommit. + errlCommit(l_errl, HWPF_COMP_ID); + + // Don't continue with a potential bad connection set + 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_ABUS_ENDPOINT : TARGET_TYPE_XBUS_ENDPOINT), - (const_cast<TARGETING::Target*>(l_itr->first))); - const fapi::Target l_fapi_endp2_target( - (i ? TARGET_TYPE_ABUS_ENDPOINT : TARGET_TYPE_XBUS_ENDPOINT), - (const_cast<TARGETING::Target*>(l_itr->second))); + const fapi2::Target <fapi2::TARGET_TYPE_XBUS> + l_thisPbusFapi2Target( + (const_cast<TARGETING::Target*>(l_PbusConnection.first))); - //@TODO RTC:133830 call the HWP with each bus connection - //FAPI_INVOKE_HWP( l_errl, p9_io_run_training, - // l_fapi_endp1_target, l_fapi_endp2_target ); + const fapi2::Target <fapi2::TARGET_TYPE_XBUS> + l_connectedPbusFapi2Target( + (const_cast<TARGETING::Target*>(l_PbusConnection.second))); - TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, - "%s : %cbus connection io_run_training", - (l_errl ? "ERROR" : "SUCCESS"), - (i ? 'A' : 'X') ); - if ( l_errl ) - { - // capture the target data in the elog - ErrlUserDetailsTarget(l_itr->first).addToLog( l_errl ); - ErrlUserDetailsTarget(l_itr->second).addToLog( l_errl ); + const TARGETING::ATTR_IO_XBUS_MASTER_MODE_type l_master_mode = + l_PbusConnection.first->getAttr + <TARGETING::ATTR_IO_XBUS_MASTER_MODE>(); - // Create IStep error log and cross ref error that occurred - l_StepError.addErrorDetails( l_errl ); + TARGETING::ATTR_FAPI_NAME_type l_master_target_name = {0}; + TARGETING::ATTR_FAPI_NAME_type l_slave_target_name = {0}; + if (l_master_mode == fapi2::ENUM_ATTR_IO_XBUS_MASTER_MODE_TRUE) + { + l_linktrain_failures = run_linktraining( + l_thisPbusFapi2Target, + l_connectedPbusFapi2Target, + l_StepError); + fapi2::toString(l_thisPbusFapi2Target, + l_master_target_name, + sizeof(l_master_target_name)); + fapi2::toString(l_connectedPbusFapi2Target, + l_slave_target_name, + sizeof(l_slave_target_name)); + } + else + { + l_linktrain_failures = run_linktraining( + l_connectedPbusFapi2Target, + l_thisPbusFapi2Target, + l_StepError); + fapi2::toString(l_connectedPbusFapi2Target, + l_master_target_name, + sizeof(l_master_target_name)); + fapi2::toString(l_thisPbusFapi2Target, + l_slave_target_name, + sizeof(l_slave_target_name)); + } - // Commit Error - errlCommit( l_errl, HWPF_COMP_ID ); + if (l_linktrain_failures) + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "%d attempts to linktrain XBUS targets failed. " + "Master: %s, Slave: %s", l_linktrain_failures, + l_master_target_name, l_slave_target_name); + } + else + { + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Successfully linktrained XBUS targets. " + "Master: %s, Slave: %s", + l_master_target_name, l_slave_target_name); } } - } + } // end for MaxBusSet TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, "call_fabric_io_run_training exit" ); -*/ + // end task, returning any errorlogs to IStepDisp return l_StepError.getErrorHandle(); } + + + + +/** + * @brief Try to train link between target's endpoints + * + * @param[in] i_master_target Master XBUS target endpoint + * @param[in] i_slave_target Slave XBUS target endpoint + * @param[out] o_step_error Failing error logs added to this + * + * @pre Target services must be initialized + * @post See "return" + * @return uint8_t Number of failures (maximum failures = 4) + * @retval 4 Means all attempts to train links failed + */ +uint8_t run_linktraining( + const fapi2::Target<fapi2::TARGET_TYPE_XBUS> &i_master_target, + const fapi2::Target<fapi2::TARGET_TYPE_XBUS> &i_slave_target, + ISTEP_ERROR::IStepError & o_step_error) +{ + uint8_t o_failures = 0; + errlHndl_t l_errl = NULL; + + // 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_linktrain HWP on " + "master target %.8X group %d and " + "slave target %.8X group %d.", + TARGETING::get_huid(i_master_target), + l_this_group, + TARGETING::get_huid(i_slave_target), + l_connected_group ); + + FAPI_INVOKE_HWP(l_errl, + p9_io_xbus_linktrain, + i_master_target, + l_this_group, + i_slave_target, + l_connected_group); + + if (l_errl) + { + o_failures++; + TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace, + "Failure #%d) ERROR 0x%.8X : p9_io_xbus_linktrain " + "HWP on master target %.8X group %d and " + "slave target %.8X group %d.", + o_failures, l_errl->reasonCode(), + TARGETING::get_huid(i_master_target), + l_this_group, + TARGETING::get_huid(i_slave_target), + l_connected_group ); + + // capture the target data in the elog + ErrlUserDetailsTarget(i_master_target).addToLog( l_errl ); + ErrlUserDetailsTarget(i_slave_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; +} + + + }; |