summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9a/procedures/hwp/memory
diff options
context:
space:
mode:
authorLouis Stermole <stermole@us.ibm.com>2019-12-04 11:33:19 -0500
committerDaniel M Crowell <dcrowell@us.ibm.com>2020-01-29 15:04:49 -0600
commita69715d78e44ca4d69009bdd829a8ed778bcd845 (patch)
treec64073452836a61f5c17e5a7eaed0cae431e824e /src/import/chips/p9a/procedures/hwp/memory
parent5318cf7e4a01aaca4663fbb04c2ef3dd10277bfc (diff)
downloadtalos-hostboot-a69715d78e44ca4d69009bdd829a8ed778bcd845.tar.gz
talos-hostboot-a69715d78e44ca4d69009bdd829a8ed778bcd845.zip
Add p9a_mss_utils_to_throttle
Also move some shared code into gen_throttle.H Change-Id: I74ada8a0ee99db511813e04a58f434d779a90930 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/88093 Reviewed-by: Mark Pizzutillo <mark.pizzutillo@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> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Reviewed-by: Michael D Pardeik <pardeik@us.ibm.com> Reviewed-by: Jennifer A Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/88121 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9a/procedures/hwp/memory')
-rw-r--r--src/import/chips/p9a/procedures/hwp/memory/p9a_mss_utils_to_throttle.C117
1 files changed, 109 insertions, 8 deletions
diff --git a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_utils_to_throttle.C b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_utils_to_throttle.C
index 0666a8772..7d8afb81f 100644
--- a/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_utils_to_throttle.C
+++ b/src/import/chips/p9a/procedures/hwp/memory/p9a_mss_utils_to_throttle.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2019 */
+/* Contributors Listed Below - COPYRIGHT 2019,2020 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -38,10 +38,16 @@
// *HWP Consumed by: FSP:HB
#include <p9a_mss_utils_to_throttle.H>
+#include <lib/shared/exp_defaults.H>
+#include <lib/shared/exp_consts.H>
+#include <mss_explorer_attribute_getters.H>
+#include <lib/power_thermal/exp_throttle.H>
// fapi2
#include <fapi2.H>
+extern "C"
+{
///
/// @brief Determines throttle and power values for a given port databus utilization.
/// @param[in] i_targets vector of OCMB_CHIPs to set throttle and power attributes on
@@ -49,11 +55,106 @@
/// @note ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_SLOT will be set to worst case of all slots passed in
/// @note input ATTR_MSS_DATABUS_UTIL and ATTR_MSS_MEM_WATT_TARGET
/// @note output ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_SLOT, ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_PORT, and ATTR_MSS_PORT_MAXPOWER
-/// @note Does not set runtime throttles or set registers to throttle values`
+/// @note Does not set runtime throttles or set registers to throttle values
///
-fapi2::ReturnCode p9a_mss_utils_to_throttle( const std::vector< fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> >&
- i_targets )
-{
- FAPI_INF("Entering p9a_mss_utils_to_throttle");
- return fapi2::FAPI2_RC_SUCCESS;
-}
+ fapi2::ReturnCode p9a_mss_utils_to_throttle(const std::vector<fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>>& i_targets)
+ {
+ constexpr uint64_t l_min_util = mss::power_thermal::throttle_traits<mss::mc_type::EXPLORER>::MIN_UTIL;
+
+ FAPI_INF("Entering p9a_mss_utils_to_throttle");
+
+ std::vector<fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT>> l_exceeded_power;
+ bool l_util_error = false;
+
+ for (const auto& l_ocmb : i_targets)
+ {
+ if (mss::count_dimm(l_ocmb) == 0)
+ {
+ FAPI_INF("Skipping %s because it has no DIMM targets", mss::c_str(l_ocmb));
+ continue;
+ }
+
+ uint32_t l_max_databus_util = 0;
+ uint32_t l_dram_clocks = 0;
+ uint32_t l_safemode_util = 0;
+ uint32_t l_safemode_throttle_per_port = 0;
+ uint32_t l_calc_util = 0;
+
+ FAPI_TRY(mss::attr::get_mrw_mem_m_dram_clocks(l_dram_clocks));
+ FAPI_TRY(mss::attr::get_mrw_max_dram_databus_util(l_max_databus_util));
+ FAPI_TRY(mss::attr::get_mrw_safemode_dram_databus_util(l_safemode_util));
+
+ l_safemode_throttle_per_port = mss::power_thermal::calc_n_from_dram_util(
+ (l_safemode_util / mss::power_thermal::throttle_const::PERCENT_CONVERSION),
+ l_dram_clocks);
+
+ for(const auto& l_port : mss::find_targets<fapi2::TARGET_TYPE_MEM_PORT>(l_ocmb))
+ {
+ fapi2::ReturnCode l_rc;
+ uint32_t l_input_databus_util = 0;
+ bool l_safemode = false;
+
+ // Util attribute set by OCC
+ FAPI_TRY( mss::attr::get_databus_util(l_port, l_input_databus_util) );
+
+ FAPI_INF("Input databus utilization for %s is %d",
+ mss::c_str(l_port),
+ l_input_databus_util);
+
+ // If input utilization is zero, use mrw safemode throttle values for utilization
+ // else make sure we're within our maximum utilization limit
+ FAPI_TRY(mss::power_thermal::calc_utilization<mss::mc_type::EXPLORER>(l_port,
+ l_input_databus_util,
+ l_dram_clocks,
+ l_safemode_throttle_per_port,
+ l_max_databus_util,
+ l_calc_util,
+ l_util_error,
+ l_safemode));
+
+ // Error if utilization is less than MIN_UTIL
+ // Don't exit, let HWP finish and return error at end
+ FAPI_ASSERT_NOEXIT( !l_util_error,
+ fapi2::MSS_MIN_UTILIZATION_ERROR()
+ .set_INPUT_UTIL_VALUE(l_input_databus_util)
+ .set_MIN_UTIL_VALUE(l_min_util),
+ "%s Input utilization (%d) less than minimum utilization allowed (%d)",
+ mss::c_str(l_port), l_input_databus_util, l_min_util);
+
+ // Make a throttle object in order to calculate the port power
+ mss::power_thermal::throttle<mss::mc_type::EXPLORER> l_throttle(l_port, l_rc);
+ FAPI_TRY(l_rc, "%s Error calculating mss::power_thermal::throttle constructor in p9a_mss_utils_to_throttles",
+ mss::c_str(l_port));
+
+ FAPI_TRY(l_throttle.calc_slots_and_power(l_calc_util));
+
+ FAPI_INF( "%s Calculated N commands per port %d, per slot %d, commands per dram clock window %d, maxpower is %d",
+ mss::c_str(l_port),
+ l_throttle.iv_n_port,
+ l_throttle.iv_n_slot,
+ l_dram_clocks,
+ l_throttle.iv_calc_port_maxpower);
+
+ FAPI_TRY(mss::attr::set_port_maxpower(l_port, l_throttle.iv_calc_port_maxpower));
+ FAPI_TRY(mss::attr::set_mem_throttled_n_commands_per_slot(l_port,
+ (l_safemode) ? l_safemode_throttle_per_port : l_throttle.iv_n_slot));
+ FAPI_TRY(mss::attr::set_mem_throttled_n_commands_per_port(l_port,
+ (l_safemode) ? l_safemode_throttle_per_port : l_throttle.iv_n_port));
+ } // ports
+ } // ocmbs
+
+ // Equalize throttles to prevent variable performance
+ // Note that we don't do anything with any port that exceed the power limit here, as we don't have an input power limit to go from
+ FAPI_TRY(mss::power_thermal::equalize_throttles<mss::mc_type::EXPLORER>(i_targets, mss::throttle_type::POWER,
+ l_exceeded_power));
+
+ // Return a failing RC code if we had any input utilization values less than MIN_UTIL
+ if (l_util_error)
+ {
+ fapi2::current_err = fapi2::RC_MSS_MIN_UTILIZATION_ERROR;
+ }
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+}// extern C
OpenPOWER on IntegriCloud