summaryrefslogtreecommitdiffstats
path: root/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C')
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C101
1 files changed, 61 insertions, 40 deletions
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C
index 1bfe94371..eae18dd1f 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/workarounds/exp_omi_workarounds.C
@@ -51,46 +51,33 @@ namespace workarounds
{
namespace omi
{
+
///
-/// @brief Determine if OCMB PRBS workaround needs to be performed
+/// @brief Determine if the OCMB is an explorer
///
-/// @param[in] i_ocmb_chip OCMB target
-/// @param[out] o_required workaround needs to be performed
-/// @return FAPI2_RC_SUCCESS iff success
+/// @param[in] i_ocmb_chip OCMB chip
+/// @param[out] o_explorer true/false is explorer
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success
+/// @note Used for exp_omi_train procedure to differentiate fw_status behavior with gemini
///
-fapi2::ReturnCode is_prbs_ocmb_required(
- const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> i_ocmb_chip,
- bool& o_required)
+fapi2::ReturnCode ocmb_is_explorer(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_ocmb_chip, bool& o_explorer)
{
- // Check chip type
- uint8_t l_proc_type = 0;
- const auto& l_proc_chip = mss::find_target<fapi2::TARGET_TYPE_PROC_CHIP>(i_ocmb_chip);
- FAPI_TRY(FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_NAME, l_proc_chip, l_proc_type),
- "Error getting ATTR_NAME of %s", mss::c_str(l_proc_chip));
-
- // OCMB Workaround Logic:
- // Axone: OCMB workaround off
- // Non-axone (Apollo): OCMB workaround on
- // P10 - No workaround required (no enum for this yet, so we must revisit this when the time comes)
- o_required = l_proc_type != fapi2::ENUM_ATTR_NAME_AXONE;
+ uint8_t l_name = 0;
+ FAPI_TRY(FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_NAME, i_ocmb_chip, l_name));
+
+ o_explorer = (l_name == fapi2::ENUM_ATTR_NAME_EXPLORER);
fapi_try_exit:
return fapi2::current_err;
}
-
///
-/// @brief Performs OCMB PRBS workaround
+/// @brief Set configurable delay based on the PRBS ATTR and SIM mode
///
-/// @param[in] i_ocmb_chip OCMB chip
-/// @param[in] i_dl_x4_backoff_en backoff enable
+/// @param[in] i_ocmb_chip OCMB target
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success
///
-fapi2::ReturnCode prbs_ocmb(
- const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> i_ocmb_chip,
- const uint8_t i_dl_x4_backoff_en)
+fapi2::ReturnCode prbs_delay(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_ocmb_chip)
{
- FAPI_DBG("Performing PRBS OCMB workaround on %s", mss::c_str(i_ocmb_chip));
-
uint8_t l_sim = 0;
uint32_t l_prbs_time = 0;
uint64_t l_prbs_time_scaled = 0;
@@ -101,23 +88,10 @@ fapi2::ReturnCode prbs_ocmb(
"Error from FAPI_ATTR_GET (ATTR_OMI_DL_PREIPL_PRBS_TIME)");
l_prbs_time_scaled = l_prbs_time * mss::common_timings::DELAY_1MS;
- // State 6
- FAPI_TRY(mss::exp::omi::setup_omi_dl0_config0(i_ocmb_chip,
- mss::omi::train_mode::TX_TRAINING_STATE3,
- i_dl_x4_backoff_en));
-
- // Set configurable delay based on the PRBS ATTR and SIM mode
FAPI_TRY(fapi2::delay(l_prbs_time_scaled, mss::common_timings::DELAY_1US));
FAPI_DBG("OMI Training Pre-ipl PRBS Time = %dns",
(l_sim ? mss::common_timings::DELAY_1US : l_prbs_time_scaled));
- // Enable training state 1 to send Pattern A
- FAPI_TRY(mss::exp::omi::setup_omi_dl0_config0(i_ocmb_chip,
- mss::omi::train_mode::TX_PATTERN_A,
- i_dl_x4_backoff_en));
-
- // Not calling with ENABLE_AUTO_TRAINING for explorer
-
fapi_try_exit:
return fapi2::current_err;
}
@@ -174,6 +148,53 @@ fapi_try_exit:
return fapi2::current_err;
}
+///
+/// @brief Workaround for exp_omi_train to perform dlx_config0 setup
+///
+/// @param[in] i_target OCMB chip
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success
+///
+fapi2::ReturnCode training_prbs(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target)
+{
+ uint8_t l_dl_x4_backoff_en = 0;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_OMI_DL_X4_BACKOFF_ENABLE, i_target, l_dl_x4_backoff_en),
+ "Error getting ATTR_CHIP_EC_FEATURE_OMI_DL_X4_BACKOFF_ENABLE");
+
+ // Train mode 1 (PATTERN_A)
+ FAPI_TRY(mss::exp::omi::setup_omi_dl0_config0(i_target,
+ mss::omi::train_mode::TX_PATTERN_A,
+ l_dl_x4_backoff_en));
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Workaround for exp_omi_setup to perform dlx_config0 setup
+///
+/// @param[in] i_target OCMB chip
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success
+///
+fapi2::ReturnCode pre_training_prbs(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target)
+{
+ uint8_t l_dl_x4_backoff_en = 0;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_OMI_DL_X4_BACKOFF_ENABLE, i_target, l_dl_x4_backoff_en),
+ "Error getting ATTR_CHIP_EC_FEATURE_OMI_DL_X4_BACKOFF_ENABLE");
+
+ // State 6
+ FAPI_TRY(mss::exp::omi::setup_omi_dl0_config0(i_target,
+ mss::omi::train_mode::TX_TRAINING_STATE3,
+ l_dl_x4_backoff_en));
+
+ // Set configurable delay based on the PRBS ATTR and SIM mode
+ FAPI_TRY(prbs_delay(i_target));
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
} // omi
} // workarounds
} // exp
OpenPOWER on IntegriCloud