summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
diff options
context:
space:
mode:
authorPrasad Bg Ranganath <prasadbgr@in.ibm.com>2017-08-03 08:00:48 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-09-23 10:50:36 -0400
commitb25663e5596554125614695f180f6b340589521d (patch)
tree1bb18a4da51c2ae7e20a3c21feebffff81b74ea3 /src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
parent5d1b04e960ff0d2d234ff2f39dea250663ae3dcb (diff)
downloadtalos-hostboot-b25663e5596554125614695f180f6b340589521d.tar.gz
talos-hostboot-b25663e5596554125614695f180f6b340589521d.zip
PSTATE: Safe mode implmentation in PPB
- Updated dpll fmult setting code - Updated review comments - compute using biased freq values - rebased - updated safe mode values to gppb and oppb - updated review comments Change-Id: Ia08ac464d67be4608f3c293e083135a9cf65aaec RTC:175533 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44148 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Thi N. Tran <thi@us.ibm.com> Reviewed-by: Juan R. Medina <jrmedina@us.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44153 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C')
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C167
1 files changed, 153 insertions, 14 deletions
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
index 474c50749..7233ee40b 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
@@ -333,7 +333,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
&present_chiplets,
l_poundv_bucketId,
&l_poundv_data, &l_state),
- "proc_get_mvpd_data function failed to retrieve porund V data");
+ "proc_get_mvpd_data function failed to retrieve pound V data");
if (!present_chiplets)
{
@@ -1057,9 +1057,8 @@ FAPI_INF("%-60s = 0x%08x %d", #attr_name, io_attr->attr_assign, io_attr->attr_as
DATABLOCK_GET_ATTR(ATTR_FREQ_PROC_REFCLOCK_KHZ, FAPI_SYSTEM, attr_freq_proc_refclock_khz);
DATABLOCK_GET_ATTR(ATTR_FREQ_PB_MHZ, FAPI_SYSTEM, attr_nest_frequency_mhz);
DATABLOCK_GET_ATTR(ATTR_FREQ_CORE_CEILING_MHZ, FAPI_SYSTEM, attr_freq_core_ceiling_mhz);
- // @todo RTC 169768 Safe mode and use of boot mode
-// DATABLOCK_GET_ATTR(ATTR_PM_SAFE_FREQUENCY_MHZ, FAPI_SYSTEM, attr_pm_safe_frequency_mhz);
-// DATABLOCK_GET_ATTR(ATTR_PM_SAFE_VOLTAGE_MV, FAPI_SYSTEM, attr_pm_safe_voltage_mv);
+ DATABLOCK_GET_ATTR(ATTR_SAFE_MODE_FREQUENCY_MHZ, i_target, attr_pm_safe_frequency_mhz);
+ DATABLOCK_GET_ATTR(ATTR_SAFE_MODE_VOLTAGE_MV, i_target, attr_pm_safe_voltage_mv);
DATABLOCK_GET_ATTR(ATTR_FREQ_CORE_FLOOR_MHZ, FAPI_SYSTEM, attr_freq_core_floor_mhz);
// Loadline, Distribution loss and Distribution offset attributes
@@ -1085,12 +1084,6 @@ FAPI_INF("%-60s = 0x%08x %d", #attr_name, io_attr->attr_assign, io_attr->attr_as
DATABLOCK_GET_ATTR(ATTR_TDP_RDP_CURRENT_FACTOR, i_target, attr_tdp_rdp_current_factor);
- // @todo RTC 169768 Safe mode and use of boot mode
-
- // Setting Safe Mode to the core floor frequency as this is the minimum
- // allowed for this system.
- io_attr->attr_pm_safe_frequency_mhz = io_attr->attr_freq_core_floor_mhz;
-
DATABLOCK_GET_ATTR(ATTR_EXTERNAL_VRM_TRANSITION_START_NS, FAPI_SYSTEM,
attr_ext_vrm_transition_start_ns);
@@ -1275,7 +1268,6 @@ proc_get_mvpd_data(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
}
while(0);
- free (l_buffer);
fapi_try_exit:
@@ -1283,6 +1275,7 @@ fapi_try_exit:
{
o_state->iv_pstates_enabled = false;
}
+ free (l_buffer);
return fapi2::current_err;
@@ -2517,6 +2510,7 @@ gppb_print(GlobalPstateParmBlock* i_gppb)
revle32(i_gppb->nest_frequency_mhz),
revle32(i_gppb->nest_frequency_mhz));
+
// 2 Slope sets
sprintf(l_buffer, "PsVSlopes:");
@@ -3153,7 +3147,8 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
LP_VDMParmBlock* o_vdmpb,
PoundW_data* o_data,
fapi2::voltageBucketData_t i_poundv_data,
- PSTATE_attribute_state* o_state)
+ PSTATE_attribute_state* o_state,
+ bool i_skip_check)
{
std::vector<fapi2::Target<fapi2::TARGET_TYPE_EQ>> l_eqChiplets;
fapi2::vdmData_t l_vdmBuf;
@@ -3171,8 +3166,9 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
FAPI_DBG("proc_get_mvpd_poundw: VDM enable = %d, WOF enable %d",
is_vdm_enabled(o_state), is_wof_enabled(o_state));
- // Exit if both VDM and WOF are disabled
- if (!is_vdm_enabled(o_state) && !is_wof_enabled(o_state))
+ // Exit if both VDM and WOF is disabled
+ if ((!is_vdm_enabled(o_state) && !is_wof_enabled(o_state)) &&
+ !i_skip_check)
{
FAPI_INF(" proc_get_mvpd_poundw: BOTH VDM and WOF are disabled. Skipping remaining checks");
o_state->iv_vdm_enabled = false;
@@ -4171,4 +4167,147 @@ FAPI_INF("%-60s = 0x%08x %d", #attr_name, attr_assign, attr_assign);
fapi_try_exit:
return fapi2::current_err;
}
+
+//large_jump_interpolate
+uint32_t large_jump_interpolate (const Pstate i_pstate,const uint32_t i_attr_mvpd_data[PV_D][PV_W],
+ const uint32_t i_step_frequency, const Pstate i_ps_pstate,
+ const PoundW_data i_data)
+{
+ VpdOperatingPoint operating_points[NUM_OP_POINTS];
+ load_mvpd_operating_point(i_attr_mvpd_data, operating_points, i_step_frequency);
+ uint8_t l_jump_value_set_ps = (i_data.poundw[POWERSAVE].vdm_small_large_normal_freq >> 4) & 0x0F;
+ uint8_t l_jump_value_set_nom = (i_data.poundw[NOMINAL].vdm_small_large_normal_freq >> 4) & 0x0F;
+
+ uint32_t l_slope_value = compute_slope_thresh(l_jump_value_set_nom,l_jump_value_set_ps,
+ operating_points[POWERSAVE].pstate,
+ operating_points[NOMINAL].pstate);
+
+ uint32_t l_vdm_jump_value = (uint32_t)((int32_t)l_jump_value_set_ps + (((int32_t)l_slope_value *
+ (i_ps_pstate - i_pstate)) >> THRESH_SLOPE_FP_SHIFT));
+ return l_vdm_jump_value;
+}
+
+//pstate2voltage
+uint32_t pstate2voltage(const Pstate i_pstate,
+ const uint32_t i_attr_mvpd_data[PV_D][PV_W],
+ const uint32_t i_step_frequency)
+{
+ VpdOperatingPoint operating_points[NUM_OP_POINTS];
+ load_mvpd_operating_point(i_attr_mvpd_data, operating_points, i_step_frequency);
+
+ uint32_t l_SlopeValue = revle16(compute_slope_4_12(revle32(operating_points[NOMINAL].vdd_mv),
+ revle32(operating_points[POWERSAVE].vdd_mv),
+ operating_points[POWERSAVE].pstate,
+ operating_points[NOMINAL].pstate));
+
+ FAPI_INF("l_globalppb.operating_points[NOMINAL].vdd_mv %x",revle32(operating_points[NOMINAL].vdd_mv));
+ FAPI_INF("l_globalppb.operating_points[POWERSAVE].vdd_mv%x",revle32(operating_points[POWERSAVE].vdd_mv));
+ FAPI_INF("l_globalppb.operating_points[NOMINAL].pstate %x",operating_points[NOMINAL].pstate);
+ FAPI_INF("l_globalppb.operating_points[POWERSAVE].pstate %x",operating_points[POWERSAVE].pstate);
+
+ FAPI_INF ("l_SlopeValue %x",l_SlopeValue);
+
+
+ uint32_t l_vdd = (( (l_SlopeValue * (-i_pstate + operating_points[POWERSAVE].pstate)) >>
+ VID_SLOPE_FP_SHIFT_12) + revle32(operating_points[POWERSAVE].vdd_mv));
+
+ FAPI_INF ("l_vdd %x",l_vdd);
+
+ return l_vdd;
+}
+
+//p9_pstate_safe_mode_computation
+fapi2::ReturnCode
+p9_pstate_safe_mode_computation(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint32_t i_attr_mvpd_data[PV_D][PV_W],const uint32_t i_reference_freq,
+ const uint32_t i_step_frequency,
+ const Pstate i_ps_pstate,
+ Safe_mode_parameters *o_safe_mode_values,
+ const PoundW_data i_poundw_data)
+{
+ Safe_mode_parameters l_safe_mode_values;
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ fapi2::ATTR_SAFE_MODE_FREQUENCY_MHZ_Type l_safe_mode_freq;
+ fapi2::ATTR_SAFE_MODE_VOLTAGE_MV_Type l_safe_mode_mv;
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FREQ_CORE_FLOOR_MHZ, FAPI_SYSTEM, l_safe_mode_values.safe_op_freq_mhz));
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_FREQUENCY_MHZ, i_target, l_safe_mode_freq));
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_VOLTAGE_MV, i_target, l_safe_mode_mv));
+
+ FAPI_INF ("l_safe_mode_values.safe_op_freq_mhz %08x",l_safe_mode_values.safe_op_freq_mhz);
+ FAPI_INF ("i_reference_freq %08x",i_reference_freq);
+ FAPI_INF ("i_step_frequency %08x",i_step_frequency);
+
+ // Calculate safe op pstate for Power save
+ l_safe_mode_values.safe_op_ps = ((float)(i_reference_freq) -
+ (float)(l_safe_mode_values.safe_op_freq_mhz * 1000)) /
+ (float)i_step_frequency;
+ FAPI_INF("l_safe_mode_values.safe_op_ps %x",l_safe_mode_values.safe_op_ps);
+
+ // Calculate safe jump value for large frequency
+ l_safe_mode_values.safe_vdm_jump_value = large_jump_interpolate
+ (l_safe_mode_values.safe_op_ps,
+ i_attr_mvpd_data, i_step_frequency,
+ i_ps_pstate, i_poundw_data);
+ FAPI_INF ("l_safe_mode_values.safe_vdm_jump_value %x",l_safe_mode_values.safe_vdm_jump_value);
+
+
+ // Calculate safe mode freq
+ l_safe_mode_values.safe_mode_freq_mhz = ((1 + l_safe_mode_values.safe_vdm_jump_value /32) *
+ l_safe_mode_values.safe_op_freq_mhz /
+ (i_step_frequency / 1000)) * //converting from khz to mhz
+ (i_step_frequency / 1000);
+
+
+ if (l_safe_mode_freq)
+ {
+ l_safe_mode_values.safe_mode_freq_mhz = l_safe_mode_freq;
+ FAPI_INF("Applying override safe mode freq value");
+ }
+ else
+ {
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_SAFE_MODE_FREQUENCY_MHZ, i_target, l_safe_mode_values.safe_mode_freq_mhz));
+ }
+ FAPI_INF ("l_safe_mode_values.safe_mode_freq_mhz %0x",l_safe_mode_values.safe_mode_freq_mhz);
+
+
+ l_safe_mode_values.safe_mode_ps = ((float)(i_reference_freq) -
+ (float)(l_safe_mode_values.safe_mode_freq_mhz * 1000)) /
+ (float)i_step_frequency;
+
+ FAPI_INF ("l_safe_mode_values.safe_mode_ps %x",l_safe_mode_values.safe_mode_ps);
+
+ // Calculate safe mode voltage
+ l_safe_mode_values.safe_mode_mv = pstate2voltage(l_safe_mode_values.safe_mode_ps,
+ i_attr_mvpd_data,
+ i_step_frequency);
+
+
+ if (l_safe_mode_mv)
+ {
+ l_safe_mode_values.safe_mode_mv = l_safe_mode_mv;
+ FAPI_INF("Applying override safe mode voltage value");
+ }
+ else
+ {
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_SAFE_MODE_VOLTAGE_MV, i_target, l_safe_mode_values.safe_mode_mv));
+ }
+
+ FAPI_INF ("l_safe_mode_values.safe_mode_mv %x",l_safe_mode_values.safe_mode_mv);
+
+
+ fapi2::ATTR_SAFE_MODE_NOVDM_UPLIFT_MV_Type l_uplift_mv;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SAFE_MODE_NOVDM_UPLIFT_MV, i_target, l_uplift_mv));
+
+ // Calculate boot mode voltage
+ l_safe_mode_values.boot_mode_mv = l_safe_mode_values.safe_mode_mv + l_uplift_mv;
+
+ FAPI_INF("l_safe_mode_values.boot_mode_mv %x",l_safe_mode_values.boot_mode_mv);
+
+ memcpy (o_safe_mode_values,&l_safe_mode_values, sizeof(Safe_mode_parameters));
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
// *INDENT-ON*
OpenPOWER on IntegriCloud