summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/memory/lib/dimm
diff options
context:
space:
mode:
authorTsung Yeung <tyeung@us.ibm.com>2019-02-12 16:39:44 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-02-13 11:42:57 -0600
commitd4c084086a47ae01448a9870f04dd43baf4455a8 (patch)
tree3b95dcc05eff4e8b52de5b59391ae0d780e62e03 /src/import/chips/p9/procedures/hwp/memory/lib/dimm
parentb573dd73e95a1969d978bc609ac2228ea737e0e9 (diff)
downloadtalos-hostboot-d4c084086a47ae01448a9870f04dd43baf4455a8.tar.gz
talos-hostboot-d4c084086a47ae01448a9870f04dd43baf4455a8.zip
Disable maint address mode before rcd_load during NVDIMM post-restore
Maintenance address mode needs to be disabled before reloading the rcd during NVDIMM post-restore. Running with enable can interfere the DIMMs on the same MCBIST, causing UEs. Change-Id: I96e11bc9d8f2b5b29cc8c0ca7a0d7731978713f1 CQ:SW456981 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/71776 Reviewed-by: Louis Stermole <stermole@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/71791 Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/lib/dimm')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.C60
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.H18
2 files changed, 67 insertions, 11 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.C b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.C
index ecd6039d5..b33056dfd 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.C
@@ -67,21 +67,49 @@ namespace nvdimm
{
///
-/// @brief Disable maintenance address mode
-/// Specialization for TARGET_TYPE_MCBIST
+/// @brief Wrapper to read MAINT_ADDR_MODE_EN
+/// Specialization for TARGET_TYPE_MCA
/// @param[in] i_target the target associated with this subroutine
+/// @param[out] o_state MAINT_ADDR_MODE_EN state
/// @return FAPI2_RC_SUCCESS iff setup was successful
///
-template<>
-fapi2::ReturnCode maint_addr_mode_off( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_target )
+template< >
+fapi2::ReturnCode get_maint_addr_mode_en( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
+ mss::states& o_state )
+{
+ const auto& l_mcbist = mss::find_target<fapi2::TARGET_TYPE_MCBIST>(i_target);
+ typedef mcbistTraits<TARGET_TYPE_MCBIST> TT;
+ fapi2::buffer<uint64_t> l_data;
+
+ FAPI_TRY( mss::getScom(l_mcbist, TT::MCBAGRAQ_REG, l_data),
+ "%s Failed getScom", mss::c_str(l_mcbist) );
+ o_state = l_data.getBit<TT::MAINT_ADDR_MODE_EN>() ? mss::states::HIGH : mss::states::LOW;
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief change maintenance address mode
+/// Specialization for TARGET_TYPE_MCA
+/// @param[in] i_target the target associated with this subroutine
+/// @param[in] i_state the state to change to
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+template< >
+fapi2::ReturnCode change_maint_addr_mode_en( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
+ const mss::states i_state )
{
+ const auto& l_mcbist = mss::find_target<fapi2::TARGET_TYPE_MCBIST>(i_target);
typedef mcbistTraits<TARGET_TYPE_MCBIST> TT;
fapi2::buffer<uint64_t> l_data;
- FAPI_TRY( mss::getScom(i_target, TT::MCBAGRAQ_REG, l_data), "%s Failed getScom", mss::c_str(i_target) );
- l_data.clearBit<TT::MAINT_ADDR_MODE_EN>();
+ FAPI_TRY( mss::getScom(l_mcbist, TT::MCBAGRAQ_REG, l_data),
+ "%s Failed getScom", mss::c_str(l_mcbist) );
+ l_data.writeBit<TT::MAINT_ADDR_MODE_EN>(i_state);
- FAPI_TRY( mss::putScom(i_target, TT::MCBAGRAQ_REG, l_data), "%s Failed putScom", mss::c_str(i_target) );
+ FAPI_TRY( mss::putScom(l_mcbist, TT::MCBAGRAQ_REG, l_data),
+ "%s Failed putScom", mss::c_str(l_mcbist) );
fapi_try_exit:
return fapi2::current_err;
@@ -151,6 +179,7 @@ fapi_try_exit:
return fapi2::current_err;
}
+
///
/// @brief Put target into self-refresh
/// Specialization for TARGET_TYPE_MCA
@@ -197,7 +226,6 @@ template< >
fapi2::ReturnCode self_refresh_exit( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target )
{
fapi2::buffer<uint64_t> l_mbarpc0_data, l_mbastr0_data;
- const auto& l_mcbist = mss::find_target<fapi2::TARGET_TYPE_MCBIST>(i_target);
// Step 1 - In MBARPC0Q, disable power domain control.
FAPI_TRY(mss::mc::read_mbarpc0(i_target, l_mbarpc0_data));
@@ -209,7 +237,7 @@ fapi2::ReturnCode self_refresh_exit( const fapi2::Target<fapi2::TARGET_TYPE_MCA>
// maint_addr_mode could be enabled by the helper. Disable it before exiting
// otherwise it will introduce problem to other DIMMs on the same MCBIST
- FAPI_TRY(maint_addr_mode_off(l_mcbist));
+ FAPI_TRY(change_maint_addr_mode_en(i_target, mss::states::LOW));
// Restore MBASTR0Q and MBARPC0Q to the original values based on MRW
FAPI_TRY(mss::mc::set_pwr_cntrl_reg(i_target));
@@ -294,6 +322,17 @@ fapi_try_exit:
template<>
fapi2::ReturnCode post_restore_transition( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target )
{
+ mss::states l_maint_addr_enabled = mss::states::LOW;
+
+ FAPI_TRY(get_maint_addr_mode_en(i_target, l_maint_addr_enabled));
+
+ if (l_maint_addr_enabled)
+ {
+ //If maint addr, disable it before doing rcd_load(). RCD load
+ //this bit on can interfere with other ports on the same mcbist
+ FAPI_TRY(change_maint_addr_mode_en(i_target, mss::states::LOW));
+ }
+
// Subseqent restore on later nvdimms would go wonky if this goes before STR exit...
FAPI_TRY( mss::rcd_load( i_target ) );
@@ -318,6 +357,9 @@ fapi2::ReturnCode post_restore_transition( const fapi2::Target<fapi2::TARGET_TYP
FAPI_TRY( pda_vref_latch( l_dimm ) );
}
+ //Restore main_addr_mode_en to previous setting
+ FAPI_TRY(change_maint_addr_mode_en(i_target, l_maint_addr_enabled));
+
fapi_try_exit:
return fapi2::current_err;
}
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.H b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.H
index e6e97759d..2a37e9aaa 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.H
@@ -35,6 +35,7 @@
#include <fapi2.H>
#include <generic/memory/lib/utils/find.H>
+#include <lib/shared/mss_const.H>
namespace mss
{
@@ -43,13 +44,26 @@ namespace nvdimm
{
///
-/// @brief Disable maintenance address mode
+/// @brief Wrapper to read MAINT_ADDR_MODE_EN
/// @tparam T the target type associated with this subroutine
/// @param[in] i_target the target associated with this subroutine
+/// @param[out] o_state MAINT_ADDR_MODE_EN state
/// @return FAPI2_RC_SUCCESS iff setup was successful
///
template< fapi2::TargetType T >
-fapi2::ReturnCode maint_addr_mode_off( const fapi2::Target<T>& i_target );
+fapi2::ReturnCode get_maint_addr_mode_en( const fapi2::Target<T>& i_target,
+ mss::states& o_state );
+
+///
+/// @brief change maintenance address mode
+/// @tparam T the target type associated with this subroutine
+/// @param[in] i_target the target associated with this subroutine
+/// @param[in] i_state the state to change to
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+template< fapi2::TargetType T >
+fapi2::ReturnCode change_maint_addr_mode_en( const fapi2::Target<T>& i_target,
+ const mss::states i_state );
///
/// @brief Helper for self_refresh_exit().
OpenPOWER on IntegriCloud