summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/mc/port.C4
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.C19
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.H7
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mcbist_workarounds.C15
4 files changed, 35 insertions, 10 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mc/port.C b/src/import/chips/p9/procedures/hwp/memory/lib/mc/port.C
index 5c1433bbe..939f1b029 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/mc/port.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/mc/port.C
@@ -38,6 +38,7 @@
#include <lib/shared/mss_const.H>
#include <generic/memory/lib/utils/scom.H>
#include <lib/ecc/ecc.H>
+#include <lib/workarounds/mca_workarounds.H>
namespace mss
{
@@ -358,6 +359,9 @@ fapi2::ReturnCode place_symbol_mark(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>
FAPI_TRY( mss::ecc::set_fwms(l_mca, i_rank, l_galois, mss::ecc::fwms::mark_type::SYMBOL,
mss::ecc::fwms::mark_region::MRANK, l_addr) );
+ // Apply workaround for HW474117 if we place a symbol mark
+ FAPI_TRY( mss::workarounds::disable_bypass(l_mca) );
+
fapi_try_exit:
return fapi2::current_err;
}
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.C b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.C
index 37d03bb9b..a2d219148 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.C
@@ -176,6 +176,25 @@ fapi_try_exit:
return fapi2::current_err;
}
+///
+/// @brief Disable bypass on port with symbol mark placed
+/// @param[in] i_target the fapi2 target of the port
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+/// @note The workaround for HW474117 applies to all EC versions, so no switch is necessary
+///
+fapi2::ReturnCode disable_bypass( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target )
+{
+ fapi2::buffer<uint64_t> l_mca_dbgr_buffer;
+
+ // Trigger WAT logic to 'disable bypass' for the given port: set DBGR[8]
+ FAPI_TRY( mss::getScom(i_target, MCA_DBGR, l_mca_dbgr_buffer) );
+ l_mca_dbgr_buffer.setBit<MCA_DBGR_ECC_WAT_ENABLE>();
+ FAPI_TRY( mss::putScom(i_target, MCA_DBGR, l_mca_dbgr_buffer) );
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
} // ns workarounds
} // ns mss
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.H b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.H
index 56e98e72c..3d91bae0d 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mca_workarounds.H
@@ -71,6 +71,13 @@ fapi2::ReturnCode disable_cid_parity(const fapi2::Target<fapi2::TARGET_TYPE_MCA>
///
fapi2::ReturnCode str_non_tsv_parity(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target);
+///
+/// @brief Disable bypass on port with symbol mark placed
+/// @param[in] i_target the fapi2 target of the port
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+fapi2::ReturnCode disable_bypass( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target );
+
} // ns workarounds
} // ns mss
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mcbist_workarounds.C b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mcbist_workarounds.C
index 1e3e8b7b5..e71ee2b29 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mcbist_workarounds.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/mcbist_workarounds.C
@@ -147,28 +147,23 @@ fapi2::ReturnCode end_of_rank( const fapi2::Target<TARGET_TYPE_MCBIST>& i_target
///
/// @brief WAT debug attention
/// For Nimbus DD1 the MCBIST engine uses the WAT debug bit as a workaround
+/// For Nimbus DD2 the WAT debug bit is used for a different workaround
/// @param[in] i_target the fapi2 target of the mcbist
/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
///
fapi2::ReturnCode wat_debug_attention( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_target )
{
// MCBIST attentions are already special attention
- if (mss::chip_ec_feature_mss_wat_debug_attn(i_target))
- {
- fapi2::ReturnCode l_rc;
- fir::reg<MCBIST_MCBISTFIRQ> mcbist_fir_register(i_target, l_rc);
- FAPI_TRY(l_rc, "unable to create fir::reg for %d", MCBIST_MCBISTFIRQ);
+ fapi2::ReturnCode l_rc;
+ fir::reg<MCBIST_MCBISTFIRQ> mcbist_fir_register(i_target, l_rc);
+ FAPI_TRY(l_rc, "unable to create fir::reg for %d", MCBIST_MCBISTFIRQ);
- FAPI_TRY(mcbist_fir_register.attention<MCBIST_MCBISTFIRQ_WAT_DEBUG_ATTN>().write());
- }
-
- return fapi2::FAPI2_RC_SUCCESS;
+ FAPI_TRY(mcbist_fir_register.attention<MCBIST_MCBISTFIRQ_WAT_DEBUG_ATTN>().write());
fapi_try_exit:
return fapi2::current_err;
}
-
///
/// @brief BROADCAST OUT OF SYNC workaround
/// A UE noise window is triggered by UE/AUEs causing an out of sync error
OpenPOWER on IntegriCloud