Skip to content

Commit

Permalink
Disable memory throttle change_after_sync
Browse files Browse the repository at this point in the history
    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: 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://ralgit01.raleigh.ibm.com/gerrit1/36822
Reviewed-by: Hostboot Team <hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
  • Loading branch information
JacobHarvey authored and dcrowell77 committed Feb 27, 2017
1 parent b3f26ce commit 2e7f87d
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 36 deletions.
95 changes: 72 additions & 23 deletions src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2016 */
/* Contributors Listed Below - COPYRIGHT 2016,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -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
};
Expand All @@ -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) );
Expand All @@ -113,18 +132,37 @@ 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;

FAPI_TRY(mrw_power_control_requested(l_str_enable));
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) );

Expand All @@ -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;
Expand All @@ -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) );

Expand All @@ -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;
Expand All @@ -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;

Expand All @@ -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;
Expand All @@ -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;
Expand Down
32 changes: 31 additions & 1 deletion src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.H
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2016 */
/* Contributors Listed Below - COPYRIGHT 2016,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -106,6 +106,32 @@ class mcTraits<fapi2::TARGET_TYPE_MCA>
BANK_GROUP0_BIT_MAP_LEN = MCS_PORT02_MCP0XLT2_BANK_GROUP0_BIT_MAP_LEN,
BANK_GROUP1_BIT_MAP = MCS_PORT02_MCP0XLT2_BANK_GROUP1_BIT_MAP,
BANK_GROUP1_BIT_MAP_LEN = MCS_PORT02_MCP0XLT2_BANK_GROUP1_BIT_MAP_LEN,
RUNTIME_N_SLOT = MCA_MBA_FARB3Q_CFG_NM_N_PER_SLOT,
RUNTIME_N_SLOT_LEN = MCA_MBA_FARB3Q_CFG_NM_N_PER_SLOT_LEN,
RUNTIME_N_PORT = MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT,
RUNTIME_N_PORT_LEN = MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT_LEN,
RUNTIME_M = MCA_MBA_FARB3Q_CFG_NM_M,
RUNTIME_M_LEN = MCA_MBA_FARB3Q_CFG_NM_M_LEN,
EMERGENCY_N = MCA_MBA_FARB4Q_EMERGENCY_N,
EMERGENCY_N_LEN = MCA_MBA_FARB4Q_EMERGENCY_N_LEN,
EMERGENCY_M = MCA_MBA_FARB4Q_EMERGENCY_M,
EMERGENCY_M_LEN = MCA_MBA_FARB4Q_EMERGENCY_M_LEN,
CFG_STR_ENABLE = MCA_MBASTR0Q_CFG_STR_ENABLE,

MIN_DOMAIN_REDUCTION_ENABLE = MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_ENABLE,
MIN_MAX_DOMAINS_ENABLE = MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_ENABLE,
MIN_DOMAIN_REDUCTION_TIME = MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_TIME,
MIN_DOMAIN_REDUCTION_TIME_LEN = MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_TIME_LEN,
ENTER_STR_TIME_POS = MCA_MBASTR0Q_CFG_ENTER_STR_TIME,
ENTER_STR_TIME_LEN = MCA_MBASTR0Q_CFG_ENTER_STR_TIME_LEN,
RAS_WEIGHT_LEN = MCA_MBA_FARB3Q_CFG_NM_RAS_WEIGHT_LEN,
RAS_WEIGHT_POS = MCA_MBA_FARB3Q_CFG_NM_RAS_WEIGHT,
CAS_WEIGHT_LEN = MCA_MBA_FARB3Q_CFG_NM_CAS_WEIGHT_LEN,
CAS_WEIGHT_POS = MCA_MBA_FARB3Q_CFG_NM_CAS_WEIGHT,
NM_CHANGE_AFTER_SYNC = MCA_MBA_FARB3Q_CFG_NM_CHANGE_AFTER_SYNC,
CFG_MIN_MAX_DOMAINS = MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS,
CFG_MIN_MAX_DOMAINS_LEN = MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_LEN,

};

};
Expand Down Expand Up @@ -148,6 +174,10 @@ enum
BANK_GROUP_0_BIT_INDEX = 29,
BANK_GROUP_1_BIT_INDEX = 30,
MAX_TRANSLATIONS = 31,
PD_AND_STR = fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_PD_AND_STR,
PD_AND_STR_CLK_STOP = fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_PD_AND_STR_CLK_STOP,
POWER_DOWN = fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_POWER_DOWN,
PD_AND_STR_OFF = fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_OFF,
};

namespace mc
Expand Down
Expand Up @@ -97,7 +97,7 @@ extern "C"

const bool is_pwr_cntrl = ((l_pwr_cntrl == fapi2::ENUM_ATTR_MSS_MRW_POWER_CONTROL_REQUESTED_POWER_DOWN)
|| (l_pwr_cntrl == fapi2::ENUM_ATTR_MSS_MRW_IDLE_POWER_CONTROL_REQUESTED_PD_AND_STR)
|| (l_pwr_cntrl == fapi2::ENUM_ATTR_MSS_MRW_IDLE_POWER_CONTROL_REQUESTED_STR));
|| (l_pwr_cntrl == fapi2::ENUM_ATTR_MSS_MRW_IDLE_POWER_CONTROL_REQUESTED_PD_AND_STR_CLK_STOP));

l_data.writeBit<MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_ENABLE>(is_pwr_cntrl);

Expand Down
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2015,2016 */
/* Contributors Listed Below - COPYRIGHT 2015,2017 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -36,6 +36,7 @@
#include <fapi2.H>
#include <p9_mss_throttle_mem.H>
#include <mss.H>
#include <lib/mc/mc.H>
using fapi2::TARGET_TYPE_MCS;

extern "C"
Expand All @@ -49,6 +50,7 @@ extern "C"
///
fapi2::ReturnCode p9_mss_throttle_mem( const fapi2::Target<TARGET_TYPE_MCS>& i_target )
{
typedef mss::mcTraits<fapi2::TARGET_TYPE_MCA> TT;
FAPI_INF("Start throttle mem");

for (const auto& l_mca : mss::find_targets<fapi2::TARGET_TYPE_MCA> (i_target))
Expand All @@ -64,11 +66,10 @@ extern "C"
fapi2::buffer<uint64_t> l_data;
FAPI_TRY(mss::getScom(l_mca, 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_runtime_slot);
l_data.insertFromRight<MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT, MCA_MBA_FARB3Q_CFG_NM_N_PER_PORT_LEN>(l_runtime_port);
l_data.insertFromRight<TT::RUNTIME_N_SLOT, TT::RUNTIME_N_SLOT_LEN>(l_runtime_slot);
l_data.insertFromRight<TT::RUNTIME_N_PORT, TT::RUNTIME_N_PORT_LEN>(l_runtime_port);

FAPI_TRY( mss::putScom(l_mca, MCA_MBA_FARB3Q, l_data) );

}

FAPI_INF("End throttle mem");
Expand Down
Expand Up @@ -250,7 +250,7 @@
Used by OCC when exiting idle power-save mode
</description>
<valueType>uint8</valueType>
<enum>OFF = 0x00, POWER_DOWN = 0x01, STR = 0x02, PD_AND_STR = 0x03</enum>
<enum>OFF = 0x00, POWER_DOWN = 0x01, PD_AND_STR = 0x02, PD_AND_STR_CLK_STOP = 0x03</enum>
<platInit/>
<default>OFF</default>
<initToZero/>
Expand All @@ -265,11 +265,10 @@
Used by OCC when entering idle power-save mode
</description>
<valueType>uint8</valueType>
<enum>OFF = 0x00, POWER_DOWN = 0x01, STR = 0x02, PD_AND_STR = 0x03</enum>
<enum>OFF = 0x00, POWER_DOWN = 0x01, PD_AND_STR = 0x02, PD_AND_STR_CLK_STOP = 0x03</enum>
<platInit/>
<default>OFF</default>
<initToZero/>
<!-- little comment to tell us this might change during power/thermal implemetation -->
<mssAccessorName>mrw_idle_power_control_requested</mssAccessorName>
</attribute>

Expand All @@ -285,7 +284,6 @@
<platInit/>
<initToZero/>
<!-- Ineffective for Nimbus -->
<!-- little comment to tell us this might change during power/thermal implemetation -->
<mssAccessorName>mrw_vmem_regulator_power_limit_per_dimm_adj_enable</mssAccessorName>
</attribute>

Expand All @@ -302,7 +300,6 @@
<mssUnits>cW</mssUnits>
<initToZero/>
<!-- Ineffective for Nimbus -->
<!-- little comment to tell us this might change during power/thermal implemetation -->
<mssAccessorName>mrw_vmem_regulator_power_limit_per_dimm_ddr3</mssAccessorName>
</attribute>

Expand Down
Expand Up @@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
<!-- Contributors Listed Below - COPYRIGHT 2015,2016 -->
<!-- Contributors Listed Below - COPYRIGHT 2015,2017 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
Expand Down Expand Up @@ -76,5 +76,4 @@
</gard>
</hwpError>


</hwpErrors>

0 comments on commit 2e7f87d

Please sign in to comment.