diff options
author | Jacob Harvey <jlharvey@us.ibm.com> | 2017-02-09 14:02:43 -0600 |
---|---|---|
committer | Daniel M Crowell <dcrowell@us.ibm.com> | 2019-08-20 08:37:41 -0500 |
commit | 85b7c42f14fc9f4d7ee9b5a873268f47705878be (patch) | |
tree | 42865b91eea088857a27e156168788533faaceaa /src/import/chips/p9/procedures/hwp/memory/lib | |
parent | f26b88c041afb309a3933d6a978e1f41ecde83e6 (diff) | |
download | talos-hostboot-85b7c42f14fc9f4d7ee9b5a873268f47705878be.tar.gz talos-hostboot-85b7c42f14fc9f4d7ee9b5a873268f47705878be.zip |
Disable memory throttle change_after_sync
Disabled change_after_sync that sets MCAs' throttles
after a sync command has been sent. The change was needed due to a
hardware defect that won't be fixed
Change-Id: I946599383c3d11749fdb20141c99da991dff5672
Original-Change-Id: I81e061f07a35e14c641e92a28f0a3a43ccc18289
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/36231
Reviewed-by: Michael D. Pardeik <pardeik@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: Brian R. Silver <bsilver@us.ibm.com>
Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com>
Reviewed-by: Matt K. Light <mklight@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/82429
Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
Tested-by: Daniel M Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/lib')
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C | 93 |
1 files changed, 71 insertions, 22 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C b/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C index ab3954f93..0f1f8006c 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C @@ -63,11 +63,14 @@ enum throttle_enums NM_RAS_WEIGHT = 0b000, NM_CAS_WEIGHT = 0b001, - CHANGE_AFTER_SYNC = 0b1, + CHANGE_AFTER_SYNC_ON = 0b1, + CHANGE_AFTER_SYNC_OFF = 0b0, MAXALL_MINALL = 0b000, + //wait 16 refresh intervals of idle before powering down all ranks MIN_DOMAIN_REDUCTION_TIME = 0x10, + //wait 64 refresh intervals of idle before going into STR on all ranks ENTER_STR_TIME = 0x40 }; @@ -80,21 +83,37 @@ enum throttle_enums /// fapi2::ReturnCode set_pwr_cntrl_reg(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target) { + typedef mss::mcTraits<fapi2::TARGET_TYPE_MCA> TT; uint8_t l_pwr_cntrl = 0; fapi2::buffer<uint64_t> l_data; FAPI_TRY(mrw_power_control_requested(l_pwr_cntrl)); FAPI_TRY(mss::getScom(i_target, MCA_MBARPC0Q, l_data)); - l_data.insertFromRight<MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS, MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_LEN>(MAXALL_MINALL); + l_data.insertFromRight<TT::CFG_MIN_MAX_DOMAINS, TT::CFG_MIN_MAX_DOMAINS_LEN>(MAXALL_MINALL); //Write data if PWR_CNTRL_REQUESTED includes power down - l_data.writeBit<MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_ENABLE> - ((l_pwr_cntrl == fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_PD_AND_STR) || - (l_pwr_cntrl == fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_POWER_DOWN)); + switch (l_pwr_cntrl) + { + case PD_AND_STR: + case POWER_DOWN: + case PD_AND_STR_CLK_STOP: + l_data.setBit<TT::MIN_DOMAIN_REDUCTION_ENABLE>(); + break; + + case PD_AND_STR_OFF: + l_data.clearBit<TT::MIN_DOMAIN_REDUCTION_ENABLE>(); + break; + + default: + // Chief system engineer would reaally have to mess up here since _OFF is 0 + FAPI_ERR("ATTR_MSS_MRW_POWER_CONTROL_REQUESTED not set correctly in MRW"); + fapi2::Assert(false); + break; + } //Set the MIN_DOMAIN_REDUCTION time - l_data.insertFromRight<MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_TIME, MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_TIME_LEN> + l_data.insertFromRight<TT::MIN_DOMAIN_REDUCTION_TIME, TT::MIN_DOMAIN_REDUCTION_TIME_LEN> (MIN_DOMAIN_REDUCTION_TIME); FAPI_TRY(mss::putScom(i_target, MCA_MBARPC0Q, l_data) ); @@ -113,6 +132,7 @@ fapi_try_exit: /// fapi2::ReturnCode set_str_reg(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target) { + typedef mss::mcTraits<fapi2::TARGET_TYPE_MCA> TT; uint8_t l_str_enable = 0; fapi2::buffer<uint64_t> l_data; @@ -120,11 +140,29 @@ fapi2::ReturnCode set_str_reg(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_tar FAPI_TRY(mss::getScom(i_target, MCA_MBASTR0Q, l_data)); //Write bit if STR should be enabled - l_data.writeBit<MCA_MBASTR0Q_CFG_STR_ENABLE> - ((l_str_enable == fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_STR) || - (l_str_enable == fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_PD_AND_STR)); - - l_data.insertFromRight<MCA_MBASTR0Q_CFG_ENTER_STR_TIME, MCA_MBASTR0Q_CFG_ENTER_STR_TIME_LEN>(ENTER_STR_TIME); + switch (l_str_enable) + { + case PD_AND_STR: + case PD_AND_STR_CLK_STOP: + l_data.setBit<TT::CFG_STR_ENABLE>(); + break; + + case POWER_DOWN: + case PD_AND_STR_OFF: + l_data.clearBit<TT::CFG_STR_ENABLE>(); + break; + + default: + // System engineer would reaally have to mess up here since _OFF is 0 + FAPI_ERR("ATTR_MSS_MRW_POWER_CONTROL_REQUESTED not set correctly in MRW"); + fapi2::Assert(false); + break; + } + + // MCA_MBASTR0Q_CFG_DIS_CLK_IN_STR: Set to 1 for PD_AND_STR_CLK_STOP, otherwise clear the bit + l_data.writeBit<MCA_MBASTR0Q_CFG_DIS_CLK_IN_STR>(l_str_enable == PD_AND_STR_CLK_STOP); + + l_data.insertFromRight<TT::ENTER_STR_TIME_POS, TT::ENTER_STR_TIME_LEN>(ENTER_STR_TIME); FAPI_TRY(mss::putScom(i_target, MCA_MBASTR0Q, l_data) ); @@ -140,8 +178,11 @@ fapi_try_exit: /// @return fapi2::fapi2_rc_success if ok /// @note sets MCA_MBA_FARB3Q /// + fapi2::ReturnCode set_nm_support (const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target) { + typedef mss::mcTraits<fapi2::TARGET_TYPE_MCA> TT; + uint16_t l_run_slot = 0; uint16_t l_run_port = 0; uint32_t l_throttle_denominator = 0; @@ -159,12 +200,15 @@ fapi2::ReturnCode set_nm_support (const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i l_throttle_denominator); FAPI_TRY(mss::getScom(i_target, MCA_MBA_FARB3Q, l_data)); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_N_PER_SLOT, MCA_MBA_FARB3Q_CFG_NM_N_PER_SLOT_LEN>(l_run_slot); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT, MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT_LEN>(l_run_port); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_M, MCA_MBA_FARB3Q_CFG_NM_M_LEN>(l_throttle_denominator); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_RAS_WEIGHT, MCA_MBA_FARB3Q_CFG_NM_RAS_WEIGHT_LEN>(NM_RAS_WEIGHT); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_CAS_WEIGHT, MCA_MBA_FARB3Q_CFG_NM_CAS_WEIGHT_LEN>(NM_CAS_WEIGHT); - l_data.writeBit<MCA_MBA_FARB3Q_CFG_NM_CHANGE_AFTER_SYNC>(CHANGE_AFTER_SYNC); + l_data.insertFromRight<TT::RUNTIME_N_SLOT, TT::RUNTIME_N_SLOT_LEN>(l_run_slot); + l_data.insertFromRight<TT::RUNTIME_N_PORT, TT::RUNTIME_N_PORT_LEN>(l_run_port); + l_data.insertFromRight<TT::RUNTIME_M, TT::RUNTIME_M_LEN>(l_throttle_denominator); + l_data.insertFromRight<TT::RAS_WEIGHT_POS, TT::RAS_WEIGHT_LEN>(NM_RAS_WEIGHT); + l_data.insertFromRight<TT::CAS_WEIGHT_POS, TT::CAS_WEIGHT_LEN>(NM_CAS_WEIGHT); + + // If set, changes to cfg_nm_n_per_slot, cfg_nm_n_per_port, cfg_nm_m, min_max_domains will only be applied after a pc_sync command is seen + // Set to disable permanently due to hardware design bug (HW403028) that won't be changed + l_data.writeBit<TT::NM_CHANGE_AFTER_SYNC>(CHANGE_AFTER_SYNC_OFF); FAPI_TRY(mss::putScom(i_target, MCA_MBA_FARB3Q, l_data) ); @@ -179,9 +223,12 @@ fapi_try_exit: /// @param[in] i_target the mca target /// @return fapi2::fapi2_rc_success if ok /// @note sets MCA_MBA_FARB4Q +/// @note used to set throttle window (N throttles / M clocks) /// fapi2::ReturnCode set_safemode_throttles(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target) { + typedef mss::mcTraits<fapi2::TARGET_TYPE_MCA> TT; + fapi2::buffer<uint64_t> l_data; uint16_t l_throttle_per_slot = 0; uint32_t l_throttle_denominator = 0; @@ -190,8 +237,8 @@ fapi2::ReturnCode set_safemode_throttles(const fapi2::Target<fapi2::TARGET_TYPE_ FAPI_TRY(mss::mrw_safemode_mem_throttled_n_commands_per_port(l_throttle_per_slot) ); FAPI_TRY(mss::getScom(i_target, MCA_MBA_FARB4Q, l_data) ); - l_data.insertFromRight<MCA_MBA_FARB4Q_EMERGENCY_M, MCA_MBA_FARB4Q_EMERGENCY_M_LEN>(l_throttle_denominator); - l_data.insertFromRight<MCA_MBA_FARB4Q_EMERGENCY_N, MCA_MBA_FARB4Q_EMERGENCY_N_LEN>(l_throttle_per_slot); + l_data.insertFromRight<TT::EMERGENCY_M, TT::EMERGENCY_M_LEN>(l_throttle_denominator); + l_data.insertFromRight<TT::EMERGENCY_N, TT::EMERGENCY_N_LEN>(l_throttle_per_slot); FAPI_TRY(mss::putScom(i_target, MCA_MBA_FARB4Q, l_data) ); return fapi2::FAPI2_RC_SUCCESS; @@ -210,6 +257,8 @@ fapi_try_exit: /// fapi2::ReturnCode set_runtime_throttles_to_safe(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target) { + typedef mss::mcTraits<fapi2::TARGET_TYPE_MCA> TT; + fapi2::buffer<uint64_t> l_data; uint16_t l_throttle_per_port = 0; uint32_t l_throttle_denominator = 0; @@ -219,9 +268,9 @@ fapi2::ReturnCode set_runtime_throttles_to_safe(const fapi2::Target<fapi2::TARGE FAPI_TRY(mss::getScom(i_target, MCA_MBA_FARB3Q, l_data) ); //Same value for both throttles - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_N_PER_SLOT, MCA_MBA_FARB3Q_CFG_NM_N_PER_SLOT_LEN>(l_throttle_per_port); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT, MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT_LEN>(l_throttle_per_port); - l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_M, MCA_MBA_FARB3Q_CFG_NM_M_LEN>(l_throttle_denominator); + l_data.insertFromRight<TT::RUNTIME_N_SLOT, TT::RUNTIME_N_SLOT_LEN>(l_throttle_per_port); + l_data.insertFromRight<TT::RUNTIME_N_PORT, TT::RUNTIME_N_PORT_LEN>(l_throttle_per_port); + l_data.insertFromRight<TT::RUNTIME_M, TT::RUNTIME_M_LEN>(l_throttle_denominator); FAPI_TRY(mss::putScom(i_target, MCA_MBA_FARB3Q, l_data) ); return fapi2::FAPI2_RC_SUCCESS; |