summaryrefslogtreecommitdiffstats
path: root/src/usr/isteps/istep09/call_fabric_io_run_training.C
diff options
context:
space:
mode:
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.C214
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;
+}
+
+
+
};
OpenPOWER on IntegriCloud