diff options
author | Tsung Yeung <tyeung@us.ibm.com> | 2019-02-12 16:39:44 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2019-02-13 11:42:57 -0600 |
commit | d4c084086a47ae01448a9870f04dd43baf4455a8 (patch) | |
tree | 3b95dcc05eff4e8b52de5b59391ae0d780e62e03 /src/import/chips/p9/procedures/hwp | |
parent | b573dd73e95a1969d978bc609ac2228ea737e0e9 (diff) | |
download | talos-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')
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.C | 60 | ||||
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/lib/dimm/ddr4/nvdimm_utils.H | 18 |
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(). |