summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9
diff options
context:
space:
mode:
authorPrasad Bg Ranganath <prasadbgr@in.ibm.com>2018-05-23 05:02:06 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-06-08 15:49:45 -0400
commit261923ec2039da55f441407e2406e04110bb6efd (patch)
tree3f257ffbab3722289f6e49f1c39f3fb90467ba9f /src/import/chips/p9
parent77eb9fe3e55ace204f597a7a525ae2a4be1122be (diff)
downloadtalos-hostboot-261923ec2039da55f441407e2406e04110bb6efd.tar.gz
talos-hostboot-261923ec2039da55f441407e2406e04110bb6efd.zip
PPB: Bug fix in computing IAC Vdn value
- Hardcode the Vdn Ceff value to 1 as the dimension is not supported in the WOF Tables. This avoids the root of the issue noted which was VPD data dependent in the previous algoithm for an unused element. - Update OCC Pstate Parameter Block comments on Iddq units to 5mA -- This is non-functional update to ensure the header comments represent reality and is for documentation only!!! (no pre/co-req) Key_Cronus_Test=PM_REGRESS Change-Id: I3a790160998eda4e384d9bcb9da7198aa45f457c CQ:SW429936 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59241 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> Reviewed-by: Martha Broyles <mbroyles@us.ibm.com> Reviewed-by: Francesco A. Campisano <campisan@us.ibm.com> Dev-Ready: Francesco A. Campisano <campisan@us.ibm.com> UseHW-Fleetwood: Francesco A. Campisano <campisan@us.ibm.com> Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/59247 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/p9')
-rw-r--r--src/import/chips/p9/procedures/hwp/lib/p9_pstates_occ.h10
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C221
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H47
3 files changed, 29 insertions, 249 deletions
diff --git a/src/import/chips/p9/procedures/hwp/lib/p9_pstates_occ.h b/src/import/chips/p9/procedures/hwp/lib/p9_pstates_occ.h
index 058759642..6ef85286e 100644
--- a/src/import/chips/p9/procedures/hwp/lib/p9_pstates_occ.h
+++ b/src/import/chips/p9/procedures/hwp/lib/p9_pstates_occ.h
@@ -107,19 +107,19 @@ typedef struct
/// Spare
uint8_t spare[8];
- /// IVDD ALL Good Cores ON; 1mA units
+ /// IVDD ALL Good Cores ON; 5mA units
iddq_entry_t ivdd_all_good_cores_on_caches_on[IDDQ_MEASUREMENTS];
- /// IVDD ALL Cores OFF; 1mA units
+ /// IVDD ALL Cores OFF; 5mA units
iddq_entry_t ivdd_all_cores_off_caches_off[IDDQ_MEASUREMENTS];
- /// IVDD ALL Good Cores OFF; 1mA units
+ /// IVDD ALL Good Cores OFF; 5mA units
iddq_entry_t ivdd_all_good_cores_off_good_caches_on[IDDQ_MEASUREMENTS];
- /// IVDD Quad 0 Good Cores ON, Caches ON; 1mA units
+ /// IVDD Quad 0 Good Cores ON, Caches ON; 5mA units
iddq_entry_t ivdd_quad_good_cores_on_good_caches_on[MAXIMUM_QUADS][IDDQ_MEASUREMENTS];
- /// IVDDN; 1mA units
+ /// IVDDN; 5mA units
iddq_entry_t ivdn[IDDQ_MEASUREMENTS];
/// IVDD ALL Good Cores ON, Caches ON; 0.5C units
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 1b1c4f113..267dd36c4 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
@@ -826,13 +826,13 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// frequency_step_khz
l_occppb.frequency_step_khz = l_globalppb.frequency_step_khz;
- //Power bus nest freq
+ // Power bus nest freq
uint16_t l_pbus_nest_freq = revle16(l_poundv_data.pbFreq);
- FAPI_INF("l_pbus_nest_freq 0x%x", (l_pbus_nest_freq));
+ FAPI_INF("l_pbus_nest_freq 0x%x (%d)", l_pbus_nest_freq, l_pbus_nest_freq);
// I- VDN PB current
uint16_t l_vpd_idn_100ma = revle16(l_poundv_data.IdnPbCurr);
- FAPI_INF("l_vpd_idn_100ma 0x%x", (l_vpd_idn_100ma));
+ FAPI_INF("l_vpd_idn_100ma 0x%x (%d)", l_vpd_idn_100ma, l_vpd_idn_100ma);
if (is_wof_enabled(i_target,&l_state))
{
@@ -850,34 +850,17 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
revle16(l_poundw_data.poundw[TURBO].ivdd_tdp_ac_current_10ma);
l_occppb.lac_tdp_vdd_nominal_10ma =
revle16(l_poundw_data.poundw[NOMINAL].ivdd_tdp_ac_current_10ma);
- FAPI_INF("l_occppb.lac_tdp_vdd_turbo_10ma 0x%x", l_occppb.lac_tdp_vdd_turbo_10ma);
- FAPI_INF("l_occppb.lac_tdp_vdd_nominal_10ma 0x%x",l_occppb.lac_tdp_vdd_nominal_10ma);
-
- //Power bus vdn voltage
- uint16_t l_vpd_vdn_mv = revle16(l_poundv_data.VdnPbVltg);
- FAPI_INF("l_vpd_vdn_mv 0x%x (%d)", l_vpd_vdn_mv, l_vpd_vdn_mv);
-
- uint8_t l_nest_leakage_for_occ = 75;
- uint16_t l_iac_tdp_vdn = get_iac_vdn_value ( l_vpd_vdn_mv,
- l_iddqt,
- l_nest_leakage_for_occ,
- l_vpd_idn_100ma);
- if (!l_iac_tdp_vdn)
- {
- l_state.iv_wof_enabled = false;
- }
- else
- {
- l_occppb.ceff_tdp_vdn =
- revle16(
- pstate_calculate_effective_capacitance(l_iac_tdp_vdn,
- l_vpd_vdn_mv * 1000,
- l_pbus_nest_freq)
- );
- }
-
- FAPI_INF("l_iac_tdp_vdn 0x%x", l_iac_tdp_vdn);
- FAPI_INF("l_occppb.ceff_tdp_vdn 0x%x", revle16(l_occppb.ceff_tdp_vdn));
+ FAPI_INF("l_occppb.lac_tdp_vdd_turbo_10ma 0x%x (%d)",
+ l_occppb.lac_tdp_vdd_turbo_10ma, l_occppb.lac_tdp_vdd_turbo_10ma);
+ FAPI_INF("l_occppb.lac_tdp_vdd_nominal_10ma 0x%x (%d)",
+ l_occppb.lac_tdp_vdd_nominal_10ma, l_occppb.lac_tdp_vdd_nominal_10ma);
+
+ // As the Vdn dimension is not supported in the WOF tables,
+ // hardcoding this value to the OCC as non-zero to keep it
+ // happy.
+ l_occppb.ceff_tdp_vdn = 1;
+ FAPI_INF(" l_occppb.ceff_tdp_vdn 0x%x (note: the Vdn dimension is not supported; this value is forced)",
+ l_occppb.ceff_tdp_vdn);
// Put the good_normal_cores value into the GPPB for PGPE
// This is done as a union overlay so that the inter-platform headers
@@ -3252,24 +3235,24 @@ oppb_print(OCCPstateParmBlock* i_oppb)
i_oppb->pstate_min);
FAPI_INF("Nest Frequency: %02X (%3d)",
- i_oppb->nest_frequency_mhz,
- i_oppb->nest_frequency_mhz);
+ revle32(i_oppb->nest_frequency_mhz),
+ revle32(i_oppb->nest_frequency_mhz));
FAPI_INF("Nest Leakage Percent: %02X (%3d)",
- i_oppb->nest_leakage_percent,
- i_oppb->nest_leakage_percent);
+ revle16(i_oppb->nest_leakage_percent),
+ revle16(i_oppb->nest_leakage_percent));
FAPI_INF("Ceff TDP Vdn: %02X (%3d)",
- i_oppb->ceff_tdp_vdn,
- i_oppb->ceff_tdp_vdn);
+ revle16(i_oppb->ceff_tdp_vdn),
+ revle16(i_oppb->ceff_tdp_vdn));
FAPI_INF("Iac TDP VDD Turbo(10ma): %02X (%3d)",
- i_oppb->lac_tdp_vdd_turbo_10ma,
- i_oppb->lac_tdp_vdd_turbo_10ma);
+ revle16(i_oppb->lac_tdp_vdd_turbo_10ma),
+ revle16(i_oppb->lac_tdp_vdd_turbo_10ma));
FAPI_INF("Iac TDP VDD Nominal(10ma): %02X (%3d)",
- i_oppb->lac_tdp_vdd_nominal_10ma,
- i_oppb->lac_tdp_vdd_nominal_10ma);
+ revle16(i_oppb->lac_tdp_vdd_nominal_10ma),
+ revle16(i_oppb->lac_tdp_vdd_nominal_10ma));
FAPI_INF("WOF Elements");
sprintf(l_buffer, " WOF Enabled ");
@@ -4285,162 +4268,6 @@ fapi_try_exit:
return fapi2::current_err;
}
-/// Get IAC VDN vlue
-uint16_t get_iac_vdn_value (uint16_t i_vpd_vdn_mv,
- IddqTable i_iddq,
- uint8_t nest_leakage_percent,
- uint16_t i_vpd_idn_100ma)
-{
- uint16_t l_ac_vdn_value = 0;
- uint8_t l_iddq_index = 0;
- const uint8_t MIN_IDDQ_VALUE = 6; //considering 0.6 as 6 here for easy math
- const uint16_t IDDQ_MIN_VOLT_LEVEL = 600;
- uint8_t l_measured_temp_C[2] = {0};
- uint16_t l_Ivdnq_5ma[2] = {0};
- float l_scaled_leakage_ma[2] = {0};
- uint16_t l_Ivdnq_vpd_ma = 0;
- uint8_t i = 0;
- uint8_t j = 0;
-
- //check bonunding is required or not
- uint16_t l_bounding_value = i_vpd_vdn_mv % 100;
- //Index to read from IDDQ table
- //Assumption here i_vpd_vdn_mv value will be greater than 600 and lesser
- //than 1100 mv
- l_iddq_index = (i_vpd_vdn_mv / 100) - MIN_IDDQ_VALUE;
- i = l_iddq_index;
- j = l_iddq_index + 1;
- uint16_t l_iq_mv[2] = {0};
- l_iq_mv[0] = IDDQ_MIN_VOLT_LEVEL + (100 * i);
- l_iq_mv[1] = IDDQ_MIN_VOLT_LEVEL + (100 * (i + 1));
- uint8_t l_diff_value = 0;
- do
- {
- if (!l_bounding_value)
- {
- //Read measured temp
- l_measured_temp_C[0] = i_iddq.avgtemp_vdn[i];
-
- if ((l_measured_temp_C[0] == 0))
- {
- FAPI_INF("Non Bounded measured temp value is 0");
- break;
- }
- else if (l_measured_temp_C[0] < nest_leakage_percent)
- {
- l_diff_value = nest_leakage_percent - l_measured_temp_C[0];
- }
- else
- {
- l_diff_value = l_measured_temp_C[0] - nest_leakage_percent;
- }
-
- //Read ivdnq_5ma
- l_Ivdnq_5ma[0] = i_iddq.ivdn[i];
-
- //Scale each bounding Ivdnq_5ma value to 75C in mA
-
- l_scaled_leakage_ma[0] = l_Ivdnq_5ma[0] * 5 * pow (1.3, (l_diff_value / 10));
-
- l_Ivdnq_vpd_ma = l_scaled_leakage_ma[0];
-
- l_ac_vdn_value = (i_vpd_idn_100ma * 10) - (l_Ivdnq_vpd_ma * 10);
- }
- else
- {
- //Read measured temp
- l_measured_temp_C[0] = i_iddq.avgtemp_vdn[i];
- l_measured_temp_C[1] = i_iddq.avgtemp_vdn[i + 1];
-
- //Read ivdnq_5ma
- l_Ivdnq_5ma[0] = i_iddq.ivdn[i];
- l_Ivdnq_5ma[1] = i_iddq.ivdn[i + 1];
-
- //Scale each bounding Ivdnq_5ma value to 75C in mA
-
- for (j = 0; j < 2; j++)
- {
- if ((l_measured_temp_C[j] == 0))
- {
- FAPI_INF("Bounded measured temp value is 0");
- break;
- }
- else if (l_measured_temp_C[j] < nest_leakage_percent)
- {
- l_diff_value = nest_leakage_percent - l_measured_temp_C[j];
- }
- else
- {
- l_diff_value = l_measured_temp_C[j] - nest_leakage_percent;
- }
-
- l_scaled_leakage_ma[j] = l_Ivdnq_5ma[j] * 5 * pow (1.3, (l_diff_value / 10));
- }
-
- //Interpolate between scaled_leakage_ma[i] and scaled_leakage_ma[i+1]
- //using the same ratio as the VPD voltage is to the bounding volages) to
- //arrive at Ivdnq_vpd_ma
- l_Ivdnq_vpd_ma = l_scaled_leakage_ma[i] + roundUp((i_vpd_vdn_mv - 600 + (100 * i)) / ((l_iq_mv[1] - l_iq_mv[0]) *
- (l_scaled_leakage_ma[1] - l_scaled_leakage_ma[0])));
-
- l_ac_vdn_value = (i_vpd_idn_100ma * 10) - (l_Ivdnq_vpd_ma * 10);
- }
- }while(0);
-
- return l_ac_vdn_value;
-}
-/**
- * calculate_effective_capacitance
- *
- * Description: Generic function to perform the effective capacitance
- * calculations.
- * C_eff = I / (V^1.3 * F)
- *
- * I is the AC component of Idd in 0.01 Amps (or10 mA)
- * V is the silicon voltage in 100 uV
- * F is the frequency in MHz
- *
- * Note: Caller must ensure they check for a 0 return value
- * and disable wof if that is the case
- *
- * Param[in]: i_iAC - the AC component
- * Param[in]: i_voltage - the voltage component in 100uV
- * Param[in]: i_frequency - the frequency component
- *
- * Return: The calculated effective capacitance
- */
-uint16_t pstate_calculate_effective_capacitance( uint16_t i_iAC,
- uint16_t i_voltage,
- uint16_t i_frequency )
-{
-
- // Compute V^1.3 using a best-fit equation
- // (V^1.3) = (21374 * (voltage in 100uV) - 50615296)>>10
- uint32_t v_exp_1_dot_3 = (21374 * i_voltage - 50615296) >> 10;
-
- // Compute I / (V^1.3)
- uint32_t I = i_iAC << 14; // * 16384
-
- // Prevent divide by zero
- if( v_exp_1_dot_3 == 0 )
- {
- // Return 0 causing caller to disable wof.
- return 0;
- }
-
- uint32_t c_eff = (I / v_exp_1_dot_3);
- c_eff = c_eff << 14; // * 16384
-
- // Divide by frequency and return the final value.
- // (I / (V^1.3 * F)) == I / V^1.3 /F
- return c_eff / i_frequency;
-
-}
-
-uint16_t roundUp(float i_value)
-{
- return ((uint16_t)(i_value == (uint16_t)i_value ? i_value : i_value + 1));
-}
//
// p9_pstate_compute_vdm_threshold_pts
//
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H
index 6a1317594..c25edb428 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H
@@ -677,53 +677,6 @@ p9_pstate_update_vfrt(
HomerVFRTLayout_t* o_vfrt_data,
uint32_t i_reference_freq);
-/**
-*
-* Description: Generic function to perform the effective capacitance
-* calculations.
-* C_eff = I / (V^1.3 * F)
-*
-* I is the AC component of Idd in 0.01 Amps (or10 mA)
-* V is the silicon voltage in 100 uV
-* F is the frequency in MHz
-*
-* Note: Caller must ensure they check for a 0 return value
-* and disable wof if that is the case
-*
-/// -------------------------------------------------------------------
-/// @brief calculate_effective_capacitance
-/// @param[in]: i_iAC - the AC component
-/// @param[in]: i_voltage - the voltage component in 100uV
-/// @param[in]: i_frequency - the frequency component
-/// @return: The calculated effective capacitance
-/// -------------------------------------------------------------------
-*/
-uint16_t pstate_calculate_effective_capacitance( uint16_t i_iAC,
- uint16_t i_voltage,
- uint16_t i_frequency );
-
-
-/// -------------------------------------------------------------------
-/// @brief Get IAC VDN value
-/// @param[in]: i_vdd_value VDD value from #V
-/// @param[in]: i_iddq IQ vpd data
-/// @param[in]: nest_leakage_percent leakage in 60C
-/// @param[in]: i_vdn_vpd_value VPD value from power bus #V data
-/// @return iaac vdn value
-/// -------------------------------------------------------------------
-uint16_t get_iac_vdn_value (uint16_t i_vdd_value,
- IddqTable i_iddq,
- uint8_t nest_leakage_percent,
- uint16_t i_vdn_vpd_value);
-
-/// -------------------------------------------------------------------
-/// @brief round up the floating point value
-/// @param[in]: i_vdd_value VDD value from #V
-/// @return nearest value
-/// -------------------------------------------------------------------
-uint16_t roundUp(float i_value);
-
-
///Compute VID points
/// -------------------------------------------------------------------
/// @brief Compute VDM threshold points based on pound W data
OpenPOWER on IntegriCloud