diff options
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/lib/power_thermal/throttle.H')
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/lib/power_thermal/throttle.H | 179 |
1 files changed, 152 insertions, 27 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/power_thermal/throttle.H b/src/import/chips/p9/procedures/hwp/memory/lib/power_thermal/throttle.H index e22950a39..3259608ce 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/power_thermal/throttle.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/power_thermal/throttle.H @@ -27,7 +27,7 @@ /// @brief throttle API /// -// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com> +// *HWP HWP Owner: Jacob Harvey <jlharvey@us.ibm.com> // *HWP HWP Backup: Brian Silver <bsilver@us.ibm.com> // *HWP Team: Memory // *HWP Level: 2 @@ -36,15 +36,141 @@ #ifndef _MSS_POWER_THROTTLE_ #define _MSS_POWER_THROTTLE_ - +#include <fapi2.H> +#include <mss.H> namespace mss { - +namespace power_thermal +{ enum throttle_const : size_t { - // Dram data bus utilization is 4X the address bus utilization + // Dram data bus utilization is bus utilization / 4 DRAM_BUS_UTILS = 4, + UTIL_CONVERSION = 10000, PERCENT_CONVERSION = 100, + MIN_UTIL = 1, + IDLE_UTIL = 0, +}; +/// +/// @class throttle +/// @brief Determine power_thermal throttles for memory +/// +class throttle +{ + private: + + public: + const fapi2::Target<fapi2::TARGET_TYPE_MCA>& iv_target; + //dimm level + uint32_t iv_databus_port_max; + + uint8_t iv_power_uplift_idle; + uint8_t iv_power_uplift; + + uint32_t iv_runtime_n_slot; + uint32_t iv_runtime_n_port; + uint32_t iv_m_clocks; + uint32_t iv_dimm_thermal_limit[MAX_DIMM_PER_PORT] = {}; + uint16_t iv_pwr_slope[MAX_DIMM_PER_PORT] = {}; + uint16_t iv_pwr_int[MAX_DIMM_PER_PORT] = {}; + uint32_t iv_n_slot; + uint32_t iv_n_port; + uint32_t iv_port_power_limit; + uint32_t iv_port_maxpower; + uint32_t iv_calc_port_maxpower; + + //default ctor deleted + throttle() = delete; + + /// + /// @brief Constructor + /// @param[in] i_target MCA target to call power thermal stuff on + /// @param[out] o_rc fapi2::ReturnCode fapi2::FAPI2_RC_SUCCESS iff ctor was successful + /// + throttle( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_mca, fapi2::ReturnCode o_rc); + + // + // @brief Destructor + // + ~throttle() = default; + + /// + /// @brief Calculates the min and max power usage for a port based off of power curves and utilizati + /// @param[in] i_idle_util the utilization of the databus in idle mode + /// @param[in] i_max_util the utilization of the port at maximum possible (mrw or calculated) + /// @param[out] o_port_power_idle max value of port power in cW + /// @param[out] o_port_power_max max value of port power in cW + /// @note Called twice in p9_mss_bulk_pwr_throttles + /// @note uses dimm power curves from class variables + /// + void calc_port_power(const double i_idle_util [MAX_DIMM_PER_PORT], + const double i_max_util [MAX_DIMM_PER_PORT], + double& o_port_power_idle, + double& o_port_power_max); + /// + /// @brief Calculate the port power curve in order to calculate the port utilization + /// @paramp[in] i_port_power_calc_idle double of the port's power consumption at idle + /// @paramp[in] i_port_power_calc_max double of the port's power consumption at max utilization + /// @paramp[out] o_port_power_slope + /// @paramp[out] o_port_power_int + /// @return FAPI2_RC_SUCCESS iff success + /// @note Called in p9_mss_bulk_pwr_throttles + /// @note Port power curve needed to calculate the port utilization + /// + fapi2::ReturnCode calc_port_power_curve(const double& i_port_power_calc_idle, + const double& i_port_power_calc_max, + uint32_t& o_port_power_slope, + uint32_t& o_port_power_int); + /// + /// @brief Calculate the port's databus utilization given the port's power curve + /// @paramp[in] i_port_power_slope + /// @paramp[in] i_port_power_int + /// @paramp[out] o_port_util the port's databus utilization + /// @note Called in p9_mss_bulk_pwr_throttles + /// @note Chooses worst case between the maximum allowed databus utilization and the calculated value + /// @notes makes sure that the utilization isn't 0 + /// + void calc_port_util_usage(const uint32_t& i_port_power_slope, + const uint32_t& i_port_power_int, + double& o_port_util); + + /// + /// @brief Calculates the power max and idle for each dimm using power curves and databus utilization + /// @param[out] o_dimm_power_idle double type for precision, the DIMM power limit in idle state (0 utilization) + /// @param[out] o_dimm_power_max double type for precision, the DIMM power limit at max utilization + /// @note Called in p9_mss_bulk_pwr_throttle for thermal_throttles, eff_config_thermal + /// @note power values are as if dimm is alone on port, using port_databus_util_max + /// + void calc_dimm_power(double o_dimm_power_idle [MAX_DIMM_PER_PORT], + double o_dimm_power_max [MAX_DIMM_PER_PORT]); + /// + /// @brief Converts the port maximum databus to a dimm level based on powerslopes and dimms installed + /// @param[in] i_databus_port_max max databus utilization for the port (either calculated or mrw) + /// @param[out] o_databus_dimm_max array of dimm utilization values + /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff the split is OK + /// @note Called in p9_mss_bulk_pwr_throttles + /// @used to calculate the port power based off of DIMM power curves + /// + fapi2::ReturnCode calc_databus(const double& i_databus_port_max, + double o_databus_dimm_max [MAX_DIMM_PER_PORT]); + + /// + /// @brief Set ATTR_MSS_CHANNEL_PAIR_MAXPOWER and ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_SLOT, + /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK + /// @note Called in p9_mss_bulk_pwr_throttles + /// @note determines the throttle levels based off of the port's power curve, + /// sets the slot throttles to the same + /// + fapi2::ReturnCode power_regulator_throttles (); + + /// + /// @brief Set ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_SLOT, + /// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK + /// @note Called in p9_mss_bulk_pwr_throttles + /// @note Sets the throttle levels based off of the dimm's thermal limits + /// @note both DIMM's on a port are set to the same throttle level + /// + fapi2::ReturnCode thermal_throttles (); }; /// @@ -53,42 +179,41 @@ enum throttle_const : size_t /// @param[in] i_num_dram_clocks window of M DRAM clocks /// @return number of throttled commands allowed /// @note Uses N/M Throttling. -/// Equation: (DRAM data bus utilization Percent / 100 ) = ((N * 4) / M ) -/// Dram data bus utilization is 4X the address bus utilization -/// +/// Equation: (DRAM data bus utilization Percent / 10000 ) = ((N * M) / 4 ) +/// Equation: N = (DRAM data bus utilization Percent * M) / (4 * 10000) inline uint32_t throttled_cmds(const uint32_t i_databus_util, const uint32_t i_num_dram_clocks) { - constexpr uint64_t l_divisor = DRAM_BUS_UTILS * PERCENT_CONVERSION; + constexpr uint64_t l_divisor = DRAM_BUS_UTILS * UTIL_CONVERSION; const uint64_t l_dividend = i_databus_util * i_num_dram_clocks; - const uint64_t l_quotient = l_dividend / l_divisor; - const uint64_t l_remainder = l_dividend % l_divisor; + const uint64_t l_result = l_dividend / l_divisor; - return l_quotient + (l_remainder == 0 ? 0 : 1); + return l_result; } /// -/// @brief Set ATTR_MSS_CHANNEL_PAIR_MAXPOWER and ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_SLOT, -/// @param[in] Vector of MCS 's on the same VDDR domain -/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK -/// @note Called in p9_mss_bulk_pwr_throttles -/// @note determines the throttle levels based off of the port's power curve, -/// sets the slot throttles to the same +/// @brief Calculate the port databus utilization based off of N throttles and M dram clocks +/// @param[in] i_n_throttles N (address operations) allowed within a window of M DRAM clocks +/// @param[in] i_num_dram_clocks window of M DRAM clocks +/// @return number of throttled commands allowed +/// @note Uses N/M Throttling. +/// Equation: databus utilization = (N * 4 * 100000) / M /// -fapi2::ReturnCode bulk_power_regulator_throttles (const std::vector<fapi2::Target<fapi2::TARGET_TYPE_MCS>>& - i_targets); +inline double calc_util_from_throttles(const uint16_t i_n_throttles, const uint32_t i_num_dram_clocks) +{ + constexpr uint32_t l_multiplier = DRAM_BUS_UTILS * UTIL_CONVERSION; + return ( (double(i_n_throttles) * l_multiplier) / i_num_dram_clocks); + +} /// -/// @brief Set ATTR_MSS_MEM_THROTTLED_N_COMMANDS_PER_SLOT, -/// @param[in] Vector of MCS 's on the same VDDR domain -/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK -/// @note Called in p9_mss_bulk_pwr_throttles -/// @note Sets the throttle levels based off of the dimm's thermal limits -/// @note both DIMM's on a port are set to the same throttle level +/// @brief Perform thermal calculations as part of the effective configuration +/// @param[in] i_target the MCS target in which the runtime throttles will be reset +/// @return FAPI2_RC_SUCCESS iff ok /// -fapi2::ReturnCode bulk_thermal_throttles (const std::vector<fapi2::Target<fapi2::TARGET_TYPE_MCS>>& i_targets); - +fapi2::ReturnCode restore_runtime_throttles( const fapi2::Target<fapi2::TARGET_TYPE_MCS>& i_target ); +}//power_thermal }// mss #endif |