summaryrefslogtreecommitdiffstats
path: root/src/import
diff options
context:
space:
mode:
authorGreg Still <stillgs@us.ibm.com>2017-08-04 11:25:01 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-09-08 18:21:03 -0400
commite256039dbbece313b0bc2b98b8cfb008f1afbb27 (patch)
treef8e713cf09889c19ee6f0b327c4fbff513e92d4b /src/import
parente0c44c4c489e40b92ff0071142088c5f8b9809de (diff)
downloadtalos-hostboot-e256039dbbece313b0bc2b98b8cfb008f1afbb27.tar.gz
talos-hostboot-e256039dbbece313b0bc2b98b8cfb008f1afbb27.zip
WOF: p9_pstate_parameter_block enhancements for WOF and VDM enablement
- Make STATIC VFTR mode perform the asme checking as the non-STATIC path - Enhance OCC Parameter Block trace output - Enhance Global Parameter Block trace output - Level 3 callouts added - rebased - fixed procedure callouts errors in xml file - Added biased #v data checks - Updated review comments Change-Id: Ic0b86cc7d8b2ff144bbd077eafe4fa64f4f9c718 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44258 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: Thi N. Tran <thi@us.ibm.com> Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com> Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com> Reviewed-by: Juan R. Medina <jrmedina@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44259 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')
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C1122
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.H240
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml279
3 files changed, 1071 insertions, 570 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 72a9f6d22..474c50749 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
@@ -27,11 +27,10 @@
/// @file p9_pstate_parameter_block.C
/// @brief Setup Pstate super structure for PGPE/CME HCode
///
-/// *HWP HW Owner : Sudheendra K Srivathsa <sudheendraks@in.ibm.com>
-/// *HWP HW Backup Owner : Greg Still <stillgs@us.ibm.com>
-/// *HWP FW Owner : Sangeetha T S <sangeet2@in.ibm.com>
+/// *HWP HW Owner : Greg Still <stillgs@us.ibm.com>
+/// *HWP FW Owner : Prasad Bg Ranganath <prasadbgr@in.ibm.com>
/// *HWP Team : PM
-/// *HWP Level : 2
+/// *HWP Level : 3
/// *HWP Consumed by : PGPE,CME
///
/// @verbatim
@@ -153,8 +152,9 @@ uint8_t g_sysvfrtData[] = {0x56, 0x54, 0x00, 0x00, 0x02, 0x01, 0x01, 0x06, /// V
((w | x | y | z) == 0)) \
{state = 0; }
-#define VALIDATE_WOF_HEADER_DATA(a,b,c,d,e,f,g,state) if ( ((!a) || (!b) || (!c) || (!d) || (!e) || (!f) || (!g))) \
- {state = 0; }
+#define VALIDATE_WOF_HEADER_DATA(a,b,c,d,e,f,g,state) \
+ if ( ((!a) || (!b) || (!c) || (!d) || (!e) || (!f) || (!g))) \
+ {state = 0; }
@@ -182,34 +182,44 @@ char const* region_names[] = { "REGION_POWERSAVE_NOMINAL",
};
char const* prt_region_names[] = VPD_OP_SLOPES_REGION_ORDER_STR;
+///--------------------------------------
+/// @brief Check wof is enabled or not
+/// @param[in] pstate attribute state
+/// @return true or false
+///--------------------------------------
bool
-is_wof_enabled()
+is_wof_enabled(PSTATE_attribute_state* i_state)
{
- return (!(attr.attr_system_wof_disable) && !(attr.attr_dd_wof_not_supported)) ? true : false;
+ return
+ (!(attr.attr_system_wof_disable) &&
+ !(attr.attr_dd_wof_not_supported) &&
+ i_state->iv_wof_enabled)
+ ? true : false;
}
+///--------------------------------------
+/// @brief Check vdm is enabled or not
+/// @param[in] pstate attribute state
+/// @return true or false
+///--------------------------------------
bool
-is_vdm_enabled()
+is_vdm_enabled(PSTATE_attribute_state* i_state)
{
- return (!(attr.attr_system_vdm_disable) && !(attr.attr_dd_vdm_not_supported)) ? true : false;
+ return
+ (!(attr.attr_system_vdm_disable) &&
+ !(attr.attr_dd_vdm_not_supported) &&
+ i_state->iv_vdm_enabled)
+ ? true : false;
}
// START OF PSTATE PARAMETER BLOCK function
-
-/// -------------------------------------------------------------------
-/// @brief Populate Pstate super structure from VPD data
-/// @param[in] i_target => Chip Target
-/// @param[inout] *io_pss => pointer to pstate superstructure
-/// @param[out] *o_buf => wof table data
-/// @param[inout] &io_size => wof table data size
-/// @return FAPI2::SUCCESS
-/// -------------------------------------------------------------------
-
fapi2::ReturnCode
p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- PstateSuperStructure* io_pss, uint8_t* o_buf, uint32_t& io_size)
+ PstateSuperStructure* io_pss,
+ uint8_t* o_buf,
+ uint32_t& io_size)
{
- FAPI_INF("> p9_pstate_parameter_block");
+ FAPI_DBG("> p9_pstate_parameter_block");
const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
fapi2::ReturnCode l_rc = 0;
@@ -220,18 +230,23 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// Clear the PstateSuperStructure and install the magic number
//----------------------------------------------------------
memset(io_pss, 0, sizeof(PstateSuperStructure));
+
FAPI_INF("Populating magic number in Pstate Parameter block structure");
(*io_pss).magic = revle64(PSTATE_PARMSBLOCK_MAGIC);
//Local variables for Global,local and OCC parameter blocks
// PGPE content
GlobalPstateParmBlock l_globalppb;
+ memset (&l_globalppb, 0, sizeof(GlobalPstateParmBlock));
// CME content
LocalPstateParmBlock l_localppb;
+ memset (&l_localppb, 0, sizeof(LocalPstateParmBlock));
// OCC content
OCCPstateParmBlock l_occppb;
+ memset (&l_occppb , 0, sizeof (OCCPstateParmBlock));
+
PSTATE_attribute_state l_state;
l_state.iv_pstates_enabled = true;
l_state.iv_resclk_enabled = true;
@@ -239,16 +254,10 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_state.iv_ivrm_enabled = true;
l_state.iv_wof_enabled = true;
-
- memset (&l_globalppb, 0, sizeof(GlobalPstateParmBlock));
- memset (&l_localppb, 0, sizeof(LocalPstateParmBlock));
- memset (&l_occppb , 0, sizeof (OCCPstateParmBlock));
-
+ // Enablement state
PoundW_data l_poundw_data;
memset (&l_poundw_data,0,sizeof(l_poundw_data));
- //ChipCharacterization* characterization;
-
// MVPD #V variables
uint32_t attr_mvpd_voltage_control[PV_D][PV_W];
uint8_t present_chiplets = 0;
@@ -256,10 +265,12 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
//Variables for Loadline, Distribution loss and offset
SysPowerDistParms l_vdd_sysparm;
- SysPowerDistParms l_vcs_sysparm;
- SysPowerDistParms l_vdn_sysparm;
memset(&l_vdd_sysparm,0x00,sizeof(SysPowerDistParms));
+
+ SysPowerDistParms l_vcs_sysparm;
memset(&l_vcs_sysparm,0x00,sizeof(SysPowerDistParms));
+
+ SysPowerDistParms l_vdn_sysparm;
memset(&l_vdn_sysparm,0x00,sizeof(SysPowerDistParms));
// Local IDDQ table variable
@@ -288,7 +299,6 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
VpdBias l_vpdbias[NUM_OP_POINTS];
memset (l_vpdbias,0,sizeof(VpdBias));
-
// -------------------------
// Get all attributes needed
// -------------------------
@@ -304,9 +314,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// Set the io_size to 0 so that memory allocation issues won't be
// detected by the caller.
-
io_size = 0;
-
break;
}
@@ -320,28 +328,25 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
memset(attr_mvpd_voltage_control, 0, sizeof(attr_mvpd_voltage_control));
fapi2::voltageBucketData_t l_poundv_data;
-
- FAPI_TRY(proc_get_mvpd_data( i_target, attr_mvpd_voltage_control, &valid_pdv_points, &present_chiplets,
- l_poundv_bucketId, &l_poundv_data, &l_state),
- "proc_get_mvpd_data function failed to retrieve porund V data");
+ FAPI_TRY(proc_get_mvpd_data(i_target, attr_mvpd_voltage_control,
+ &valid_pdv_points,
+ &present_chiplets,
+ l_poundv_bucketId,
+ &l_poundv_data, &l_state),
+ "proc_get_mvpd_data function failed to retrieve porund V data");
if (!present_chiplets)
{
FAPI_IMP("**** WARNING : There are no EQ chiplets present which means there is no valid #V VPD");
FAPI_IMP("**** WARNING : Pstates and all related functions will NOT be enabled.");
- l_state.iv_pstates_enabled = false;
-
-// FAPI_ASSERT(false,
-// fapi2::PSTATE_PB_NO_PRESENT_CHIPLETS_ERROR()
-// .set_CHIP_TARGET(i_target)
-// .set_PRESENT_CHIPLETS(present_chiplets),
-// "No eq chiplets are present for a give proc target");
+ l_state.iv_pstates_enabled = false;
+ l_state.iv_resclk_enabled = false;
+ l_state.iv_resclk_enabled = false;
+ l_state.iv_wof_enabled = false;
// Set the io_size to 0 so that memory allocation issues won't be
// detected by the caller.
-
io_size = 0;
-
break;
}
@@ -350,11 +355,14 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
attr_mvpd_voltage_control[ULTRA][0] * 1000);
//Calculate freq step value
- l_frequency_step_khz = (attr.attr_freq_proc_refclock_khz / attr.attr_proc_dpll_divider);
+ l_frequency_step_khz = (attr.attr_freq_proc_refclock_khz /
+ attr.attr_proc_dpll_divider);
VpdOperatingPoint l_raw_operating_points[NUM_OP_POINTS];
FAPI_INF("Load RAW VPD");
- FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control, l_raw_operating_points, l_frequency_step_khz),
+ FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control,
+ l_raw_operating_points,
+ l_frequency_step_khz),
"Loading MVPD operating point failed");
// ---------------------------------------------
@@ -362,7 +370,9 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// ---------------------------------------------
FAPI_IMP("Apply Biasing to #V");
- FAPI_TRY(proc_get_extint_bias(attr_mvpd_voltage_control, &attr, l_vpdbias),
+ FAPI_TRY(proc_get_extint_bias(attr_mvpd_voltage_control,
+ &attr,
+ l_vpdbias),
"Bias application function failed");
//Validating Bias values
@@ -373,7 +383,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
&valid_pdv_points,
i_target.getChipletNumber(),
l_poundv_bucketId,
- &l_state));
+ &l_state,true));
FAPI_DBG("Pstate Base Frequency - after bias %X (%d)",
attr_mvpd_voltage_control[ULTRA][0] * 1000,
@@ -398,7 +408,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_vdn_sysparm.distoffset_uv = revle32(attr.attr_proc_vrm_voffset_vdn_uv);
//if wof is disabled.. don't call IQ function
- if (is_wof_enabled())
+ if (is_wof_enabled(&l_state))
{
// ----------------
// get IQ (IDDQ) data
@@ -409,7 +419,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
if (l_rc)
{
FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_FUNCTION_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ fapi2::PSTATE_PB_IQ_ACCESS_ERROR(fapi2::FAPI2_ERRL_SEV_RECOVERED)
.set_CHIP_TARGET(i_target)
.set_FAPI_RC(l_rc),
"Pstate Parameter Block proc_get_mvpd_iddq function failed");
@@ -428,17 +438,21 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
FAPI_INF("Getting VDM Parameters Data");
FAPI_TRY(proc_get_vdm_parms(i_target, &attr, &l_gp_vdmpb));
- // Note: the proc_get_mvpd_poundw has the conditional checking for VDM and WOF enablement
- // as #W has both VDM and WOF content
+ // Note: the proc_get_mvpd_poundw has the conditional checking for VDM
+ // and WOF enablement as #W has both VDM and WOF content
- l_rc = proc_get_mvpd_poundw(i_target, l_poundv_bucketId, &l_lp_vdmpb, &l_poundw_data, l_poundv_data, &l_state);
+ l_rc = proc_get_mvpd_poundw(i_target,
+ l_poundv_bucketId,
+ &l_lp_vdmpb,
+ &l_poundw_data,
+ l_poundv_data, &l_state);
if (l_rc)
{
FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_FUNCTION_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
- .set_CHIP_TARGET(i_target)
- .set_FAPI_RC(l_rc),
+ fapi2::PSTATE_PB_POUND_W_ACCESS_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_FAPI_RC(l_rc),
"Pstate Parameter Block proc_get_mvpd_poundw function failed");
fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
@@ -448,7 +462,10 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// get IVRM Parameters data
// ----------------
FAPI_INF("Getting IVRM Parameters Data");
- FAPI_TRY(proc_get_ivrm_parms(i_target, &attr, &l_ivrmpb, &l_state));
+ FAPI_TRY(proc_get_ivrm_parms(i_target,
+ &attr,
+ &l_ivrmpb,
+ &l_state));
// -----------------------------------------------
// Global parameter block
@@ -462,10 +479,13 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// Pstate Options @todo RTC 161279, Check what needs to be populated here
- // @todo RTC 161279 - Corresponds to Pstate 0 . Setting to ULTRA TURBO frequency point. REVIEW with Greg
- // FIXME this should be the l_operating_points[VPD_PT_SET_BIASED][ULTRA].frequency_mhz value with
- // p9_pstate_compute_vpd_pts ahead of this!!!!
- l_globalppb.reference_frequency_khz = revle32((attr_mvpd_voltage_control[ULTRA][0] * 1000));
+ // @todo RTC 161279 - Corresponds to Pstate 0 . Setting to ULTRA TURBO
+ // frequency point.
+ // FIXME this should be the l_operating_points[VPD_PT_SET_BIASED][ULTRA].
+ // frequency_mhz value with p9_pstate_compute_vpd_pts ahead of this!!!!
+ l_globalppb.reference_frequency_khz =
+ revle32((attr_mvpd_voltage_control[ULTRA][0] * 1000));
+
FAPI_INF("Pstate Base Frequency %X (%d)",
revle32(l_globalppb.reference_frequency_khz),
revle32(l_globalppb.reference_frequency_khz));
@@ -475,11 +495,16 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_globalppb.nest_frequency_mhz = revle32(attr.attr_nest_frequency_mhz);
// External VRM parameters
- l_globalppb.ext_vrm_transition_start_ns = revle32(attr.attr_ext_vrm_transition_start_ns);
- l_globalppb.ext_vrm_transition_rate_inc_uv_per_us = revle32(attr.attr_ext_vrm_transition_rate_inc_uv_per_us);
- l_globalppb.ext_vrm_transition_rate_dec_uv_per_us = revle32(attr.attr_ext_vrm_transition_rate_dec_uv_per_us);
- l_globalppb.ext_vrm_stabilization_time_us = revle32(attr.attr_ext_vrm_stabilization_time_us);
- l_globalppb.ext_vrm_step_size_mv = revle32(attr.attr_ext_vrm_step_size_mv);
+ l_globalppb.ext_vrm_transition_start_ns =
+ revle32(attr.attr_ext_vrm_transition_start_ns);
+ l_globalppb.ext_vrm_transition_rate_inc_uv_per_us =
+ revle32(attr.attr_ext_vrm_transition_rate_inc_uv_per_us);
+ l_globalppb.ext_vrm_transition_rate_dec_uv_per_us =
+ revle32(attr.attr_ext_vrm_transition_rate_dec_uv_per_us);
+ l_globalppb.ext_vrm_stabilization_time_us =
+ revle32(attr.attr_ext_vrm_stabilization_time_us);
+ l_globalppb.ext_vrm_step_size_mv =
+ revle32(attr.attr_ext_vrm_step_size_mv);
// -----------------------------------------------
// populate VpdOperatingPoint with biased MVPD attributes
@@ -487,10 +512,13 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
FAPI_INF("Load VPD");
// VPD operating point
- FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control, l_globalppb.operating_points, l_frequency_step_khz),
+ FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control,
+ l_globalppb.operating_points,
+ l_frequency_step_khz),
"Loading MVPD operating point failed");
- // VpdBias External and Internal Biases for Global and Local parameter block
+ // VpdBias External and Internal Biases for Global and Local parameter
+ // block
for (uint8_t i = 0; i < NUM_OP_POINTS; i++)
{
l_globalppb.ext_biases[i] = l_vpdbias[i];
@@ -508,7 +536,8 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_globalppb.safe_voltage_mv = revle32(attr.attr_pm_safe_voltage_mv);
// safe_frequency_khz
- l_globalppb.safe_frequency_khz = revle32(attr.attr_pm_safe_frequency_mhz / 1000);
+ l_globalppb.safe_frequency_khz =
+ revle32(attr.attr_pm_safe_frequency_mhz / 1000);
// vrm_stepdelay_range -@todo RTC 161279 potential attributes to be defined
@@ -516,9 +545,13 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
VpdOperatingPoint l_operating_points[NUM_VPD_PTS_SET][NUM_OP_POINTS];
// Compute VPD points
- p9_pstate_compute_vpd_pts(l_operating_points, &l_globalppb, l_raw_operating_points);
+ p9_pstate_compute_vpd_pts(l_operating_points,
+ &l_globalppb,
+ l_raw_operating_points);
- memcpy(l_globalppb.operating_points_set, l_operating_points, sizeof(l_operating_points));
+ memcpy(l_globalppb.operating_points_set,
+ l_operating_points,
+ sizeof(l_operating_points));
// ----------------
// get Resonant clocking attributes
@@ -526,10 +559,15 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
{
if (attr.attr_resclk_disable == fapi2::ENUM_ATTR_SYSTEM_RESCLK_DISABLE_OFF)
{
- FAPI_TRY(proc_set_resclk_table_attrs(i_target, &l_state), "proc_set_resclk_table_attrs failed");
+ FAPI_TRY(proc_set_resclk_table_attrs(i_target,
+ &l_state),
+ "proc_set_resclk_table_attrs failed");
+
if (l_state.iv_resclk_enabled)
{
- FAPI_TRY(proc_res_clock_setup(i_target, &l_resclk_setup, &l_globalppb));
+ FAPI_TRY(proc_res_clock_setup(i_target,
+ &l_resclk_setup,
+ &l_globalppb));
l_localppb.resclk = l_resclk_setup;
l_globalppb.resclk = l_resclk_setup;
}
@@ -553,10 +591,12 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
p9_pstate_compute_PsV_slopes(l_operating_points, &l_globalppb); //Remote this RTC: 174743
p9_pstate_compute_PStateV_slope(l_operating_points, &l_globalppb);
- l_globalppb.dpll_pstate0_value = revle32(revle32(l_globalppb.reference_frequency_khz) / revle32(
- l_globalppb.frequency_step_khz));
+ l_globalppb.dpll_pstate0_value =
+ revle32(revle32(l_globalppb.reference_frequency_khz) /
+ revle32(l_globalppb.frequency_step_khz));
- FAPI_INF("l_globalppb.dpll_pstate0_value %X", revle32(l_globalppb.dpll_pstate0_value));
+ FAPI_INF("l_globalppb.dpll_pstate0_value %X",
+ revle32(l_globalppb.dpll_pstate0_value));
// -----------------------------------------------
// Local parameter block
@@ -564,7 +604,9 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_localppb.magic = revle64(LOCAL_PARMSBLOCK_MAGIC);
// VPD operating point
- FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control, l_localppb.operating_points, l_frequency_step_khz),
+ FAPI_TRY(load_mvpd_operating_point(attr_mvpd_voltage_control,
+ l_localppb.operating_points,
+ l_frequency_step_khz),
"Loading MVPD operating point failed");
l_localppb.vdd_sysparm = l_vdd_sysparm;
@@ -575,12 +617,12 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// VDMParmBlock
l_localppb.vdm = l_lp_vdmpb;
+ l_localppb.dpll_pstate0_value =
+ revle32(revle32(l_globalppb.reference_frequency_khz) /
+ revle32(l_globalppb.frequency_step_khz));
- l_localppb.dpll_pstate0_value = revle32(revle32(l_globalppb.reference_frequency_khz) / revle32(
- l_globalppb.frequency_step_khz));
-
-
- FAPI_INF("l_localppb.dpll_pstate0_value %X", revle32(l_localppb.dpll_pstate0_value));
+ FAPI_INF("l_localppb.dpll_pstate0_value %X",
+ revle32(l_localppb.dpll_pstate0_value));
uint8_t l_biased_pstate[NUM_OP_POINTS];
@@ -595,7 +637,9 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
p9_pstate_compute_vdm_threshold_pts(l_poundw_data, &l_localppb);
// VID slope calculation
- p9_pstate_compute_PsVIDCompSlopes_slopes(l_poundw_data, &l_localppb, l_biased_pstate);
+ p9_pstate_compute_PsVIDCompSlopes_slopes(l_poundw_data,
+ &l_localppb,
+ l_biased_pstate);
// VDM threshold slope calculation
p9_pstate_compute_PsVDMThreshSlopes(&l_localppb, l_biased_pstate);
@@ -604,11 +648,25 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
//Initializing threshold values for GPPB
- memcpy (l_globalppb.vid_point_set,l_localppb.vid_point_set,sizeof(l_localppb.vid_point_set));
- memcpy (l_globalppb.threshold_set, l_localppb.threshold_set, sizeof(l_localppb.threshold_set));
- memcpy (l_globalppb.PsVIDCompSlopes, l_localppb.PsVIDCompSlopes,sizeof(l_localppb.PsVIDCompSlopes));
- memcpy (l_globalppb.PsVDMThreshSlopes, l_localppb.PsVDMThreshSlopes, sizeof(l_localppb.PsVDMThreshSlopes));
- memcpy (l_globalppb.PsVDMJumpSlopes, l_localppb.PsVDMJumpSlopes, sizeof(l_localppb.PsVDMJumpSlopes));
+ memcpy ( l_globalppb.vid_point_set,
+ l_localppb.vid_point_set,
+ sizeof(l_localppb.vid_point_set));
+
+ memcpy ( l_globalppb.threshold_set,
+ l_localppb.threshold_set,
+ sizeof(l_localppb.threshold_set));
+
+ memcpy ( l_globalppb.PsVIDCompSlopes,
+ l_localppb.PsVIDCompSlopes,
+ sizeof(l_localppb.PsVIDCompSlopes));
+
+ memcpy ( l_globalppb.PsVDMThreshSlopes,
+ l_localppb.PsVDMThreshSlopes,
+ sizeof(l_localppb.PsVDMThreshSlopes));
+
+ memcpy ( l_globalppb.PsVDMJumpSlopes,
+ l_localppb.PsVDMJumpSlopes,
+ sizeof(l_localppb.PsVDMJumpSlopes));
}
// -----------------------------------------------
// OCC parameter block
@@ -623,13 +681,6 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_occppb.vcs_sysparm = l_vcs_sysparm;
l_occppb.vdn_sysparm = l_vdn_sysparm;
- // Iddq Table
- l_occppb.iddq = l_iddqt;
-
- //WOFElements - @todo RTC 161279 (VID Modification table not populated)
-
- l_occppb.wof.tdp_rdp_factor = revle32(attr.attr_tdp_rdp_current_factor);
-
// frequency_min_khz - Value from Power save operating point after biases
l_occppb.frequency_min_khz = revle32(attr_mvpd_voltage_control[VPD_PV_POWERSAVE][0] * 1000);
@@ -639,47 +690,55 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
// frequency_step_khz
l_occppb.frequency_step_khz = revle32(l_frequency_step_khz);
- //nest leakage percent
- l_occppb.nest_leakage_percent = attr.attr_nest_leakage_percent;
-
- FAPI_INF("l_occppb.nest_leakage_percent %x", l_occppb.nest_leakage_percent);
-
- l_occppb.lac_tdp_vdd_turbo_10ma = 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 %x", l_occppb.lac_tdp_vdd_turbo_10ma);
- FAPI_INF("l_occppb.lac_tdp_vdd_nominal_10ma %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 %x", (l_vpd_vdn_mv));
-
//Power bus nest freq
uint16_t l_pbus_nest_freq = revle16(l_poundv_data.pbFreq);
-
FAPI_INF("l_pbus_nest_freq %x", (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 %x", (l_vpd_idn_100ma));
- uint8_t l_nest_leakage_for_occ = 75;
+ if (is_wof_enabled(&l_state))
+ {
+ // Iddq Table
+ l_occppb.iddq = l_iddqt;
+
+ l_occppb.wof.tdp_rdp_factor = revle32(attr.attr_tdp_rdp_current_factor);
+ FAPI_INF("l_occppb.wof.tdp_rdp_factor %x", revle32(l_occppb.wof.tdp_rdp_factor));
+
+ // nest leakage percent
+ l_occppb.nest_leakage_percent = attr.attr_nest_leakage_percent;
+ FAPI_INF("l_occppb.nest_leakage_percent %x", l_occppb.nest_leakage_percent);
+
+ l_occppb.lac_tdp_vdd_turbo_10ma =
+ 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 %x", l_occppb.lac_tdp_vdd_turbo_10ma);
+ FAPI_INF("l_occppb.lac_tdp_vdd_nominal_10ma %x",l_occppb.lac_tdp_vdd_nominal_10ma);
- if (attr.attr_system_wof_disable == fapi2::ENUM_ATTR_SYSTEM_WOF_DISABLE_OFF)
- { io_size = 0;
+ //Power bus vdn voltage
+ uint16_t l_vpd_vdn_mv = revle16(l_poundv_data.VdnPbVltg);
+ FAPI_INF("l_vpd_vdn_mv %x", (l_vpd_vdn_mv));
- 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);
+ 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));
+ 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 %x", l_iac_tdp_vdn);
FAPI_INF("l_occppb.ceff_tdp_vdn %x", revle16(l_occppb.ceff_tdp_vdn));
@@ -689,7 +748,6 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_state.iv_wof_enabled = false;
}
-
// @todo RTC 161279 - Need Pstate 0 definition and freq2pstate function to be coded
Pstate pstate_min;
@@ -713,16 +771,10 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
l_occppb.pstate_min = pstate_min;
- // pstate_max
-
- gppb_print(&(l_globalppb));
- oppb_print(&(l_occppb));
-
//Check WOF is enabled or not
io_size = 0;
-
- if (!attr.attr_system_wof_disable && l_state.iv_wof_enabled)
+ if (is_wof_enabled(&l_state))
{
p9_pstate_wof_initialization(&l_globalppb,
o_buf,
@@ -737,15 +789,19 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
}
l_occppb.wof.wof_enabled = l_state.iv_wof_enabled;
+
// QuadManagerFlags
QuadManagerFlags l_qm_flags;
FAPI_TRY(p9_pstate_set_global_feature_attributes(i_target,
l_state,
&l_qm_flags));
l_localppb.qmflags = l_qm_flags;
- // -----------------------------------------------
+
+ // Put out the Parmater Blocks to the trace
+ gppb_print(&(l_globalppb));
+ oppb_print(&(l_occppb));
+
// Populate Global,local and OCC parameter blocks into Pstate super structure
- // -----------------------------------------------
(*io_pss).globalppb = l_globalppb;
(*io_pss).localppb = l_localppb;
(*io_pss).occppb = l_occppb;
@@ -753,7 +809,7 @@ p9_pstate_parameter_block( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_
while(0);
fapi_try_exit:
- FAPI_INF("< p9_pstate_parameter_block");
+ FAPI_DBG("<< p9_pstate_parameter_block");
if (fapi2::current_err)
{
@@ -766,59 +822,78 @@ fapi_try_exit:
// END OF PSTATE PARAMETER BLOCK function
-void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
- uint8_t* o_buf,
- uint32_t& io_size,
- PSTATE_attribute_state* o_state,
- const uint32_t i_base_state_frequency)
+void
+p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
+ uint8_t* o_buf,
+ uint32_t& io_size,
+ PSTATE_attribute_state* o_state,
+ const uint32_t i_base_state_frequency)
{
+
+ FAPI_DBG(">> WOF initialization");
+
fapi2::ReturnCode l_rc = 0;
- //If this attribute is set then read the VFRT data from static table.
- const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
- uint8_t l_sys_vfrt_static_data = 0;
- FAPI_ATTR_GET(fapi2::ATTR_SYS_VFRT_STATIC_DATA_ENABLE,
- FAPI_SYSTEM,
- l_sys_vfrt_static_data);
//this structure has VFRT header + data
HomerVFRTLayout_t l_vfrt;
memset (&l_vfrt, 0, sizeof(l_vfrt));
- FAPI_INF("Entering WOF initialization part");
- if (l_sys_vfrt_static_data)
- {
- FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is SET");
- // Copy WOF header data
- FAPI_INF("WFTH struct size = %d", sizeof(g_wofData));
- memcpy (o_buf, g_wofData, sizeof(g_wofData));
- uint32_t l_index = sizeof(g_wofData);
+ // Use new to avoid over-running the stack
+ fapi2::ATTR_WOF_TABLE_DATA_Type* l_wof_table_data =
+ (fapi2::ATTR_WOF_TABLE_DATA_Type*)new fapi2::ATTR_WOF_TABLE_DATA_Type;
- WofTablesHeader_t* p_wfth;
- p_wfth = reinterpret_cast<WofTablesHeader_t*>(o_buf);
- FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
+ FAPI_DBG("l_wof_table_data addr = %p size = %d",
+ l_wof_table_data, sizeof(fapi2::ATTR_WOF_TABLE_DATA_Type));
+
+ do
+ {
+ // If this attribute is set, fill in l_wof_table_data with the VFRT data
+ // from the internal, static table.
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ fapi2::ATTR_SYS_VFRT_STATIC_DATA_ENABLE_Type l_sys_vfrt_static_data = 0;
+ FAPI_ATTR_GET(fapi2::ATTR_SYS_VFRT_STATIC_DATA_ENABLE,
+ FAPI_SYSTEM,
+ l_sys_vfrt_static_data);
- for (uint32_t vfrt_index = 0; vfrt_index < (CEF_VDN_INDEX * CEF_VDD_INDEX * ACTIVE_QUADS); ++vfrt_index)
+ if (l_sys_vfrt_static_data)
{
- p9_pstate_update_vfrt (i_gppb,
- g_sysvfrtData,
- &l_vfrt,
- i_base_state_frequency);
+ FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is SET");
- memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
- l_index += sizeof (l_vfrt);
- }
- io_size = l_index;
- }
- else
- {
- FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is not SET");
+ // Copy WOF header data
+ memcpy (l_wof_table_data, g_wofData, sizeof(g_wofData));
+ uint32_t l_index = sizeof(g_wofData);
- do
+ WofTablesHeader_t* p_wfth;
+ p_wfth = reinterpret_cast<WofTablesHeader_t*>(l_wof_table_data);
+ FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
+
+ memcpy(&l_vfrt, &g_sysvfrtData, sizeof (g_sysvfrtData));
+
+ for (uint32_t vdn = 0; vdn < CEF_VDN_INDEX; ++vdn)
+ {
+ l_vfrt.vfrtHeader.res_vdnId = vdn;
+ for (uint32_t vdd = 0; vdd < CEF_VDD_INDEX; ++vdd)
+ {
+ for (uint32_t qid = 0; qid < ACTIVE_QUADS; ++qid)
+ {
+ l_vfrt.vfrtHeader.VddId_QAId = vdd << 4 | qid;
+ FAPI_DBG(" l_vfrt.vfrtHeader res_vdnId = %1X VddId_QAId = 0x%2X",
+ l_vfrt.vfrtHeader.res_vdnId,
+ l_vfrt.vfrtHeader.VddId_QAId);
+
+ memcpy((*l_wof_table_data) + l_index, &l_vfrt, sizeof (l_vfrt));
+ l_index += sizeof (g_sysvfrtData);
+ }
+ }
+ }
+ io_size = l_index;
+ FAPI_DBG(" io_size = %d", io_size);
+ }
+ else
{
+ FAPI_DBG("ATTR_SYS_VFRT_STATIC_DATA_ENABLE is not SET");
+
// Read System VFRT data
- // Use new to avoid over-running the stack
- fapi2::ATTR_WOF_TABLE_DATA_Type* l_wof_table_data =
- (fapi2::ATTR_WOF_TABLE_DATA_Type*)new fapi2::ATTR_WOF_TABLE_DATA_Type;
l_rc = FAPI_ATTR_GET(fapi2::ATTR_WOF_TABLE_DATA,
FAPI_SYSTEM,
(*l_wof_table_data));
@@ -826,89 +901,95 @@ void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
{
o_state->iv_wof_enabled = false;
FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_FUNCTION_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ fapi2::PSTATE_PB_WOF_TABLE_ACCESS_FAIL(fapi2::FAPI2_ERRL_SEV_RECOVERED)
.set_CHIP_TARGET(FAPI_SYSTEM)
.set_FAPI_RC(l_rc),
"Pstate Parameter Block ATTR_WOF_TABLE_DATA attribute failed");
break;
}
+ }
- // Copy WOF header data
- FAPI_INF("WFTH struct size = %d", sizeof(g_wofData));
- memcpy (o_buf, (*l_wof_table_data), sizeof(WofTablesHeader_t));
- uint32_t l_wof_table_index = sizeof(WofTablesHeader_t);
- uint32_t l_index = sizeof(WofTablesHeader_t);
+ // Copy WOF header data
+ memcpy (o_buf, (*l_wof_table_data), sizeof(WofTablesHeader_t));
+ uint32_t l_wof_table_index = sizeof(WofTablesHeader_t);
+ uint32_t l_index = sizeof(WofTablesHeader_t);
- //Validate WOF header part
- WofTablesHeader_t* p_wfth;
- p_wfth = reinterpret_cast<WofTablesHeader_t*>(o_buf);
- FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
+ //Validate WOF header part
+ WofTablesHeader_t* p_wfth;
+ p_wfth = reinterpret_cast<WofTablesHeader_t*>(o_buf);
+ FAPI_INF("WFTH: %X", revle32(p_wfth->magic_number));
+
+ bool l_wof_header_data_state = 1;
+ VALIDATE_WOF_HEADER_DATA(p_wfth->magic_number,
+ p_wfth->reserved_version,
+ p_wfth->vfrt_block_size,
+ p_wfth->vfrt_block_header_size,
+ p_wfth->vfrt_data_size,
+ p_wfth->quads_active_size,
+ p_wfth->core_count,
+ l_wof_header_data_state);
+
+ if (!l_wof_header_data_state)
+ {
+ o_state->iv_wof_enabled = false;
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_WOF_HEADER_DATA_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(FAPI_SYSTEM)
+ .set_MAGIC_NUMBER(p_wfth->magic_number)
+ .set_VERSION(p_wfth->reserved_version)
+ .set_VFRT_BLOCK_SIZE(p_wfth->vfrt_block_size)
+ .set_VFRT_HEADER_SIZE(p_wfth->vfrt_block_header_size)
+ .set_VFRT_DATA_SIZE(p_wfth->vfrt_data_size)
+ .set_QUADS_ACTIVE_SIZE(p_wfth->quads_active_size)
+ .set_CORE_COUNT(p_wfth->core_count),
+ "Pstate Parameter Block WOF Header validation failed");
+ break;
+
+ }
+
+ // Convert system vfrt to homer vfrt
+ for (uint32_t vfrt_index = 0;
+ vfrt_index < (CEF_VDN_INDEX * CEF_VDD_INDEX * ACTIVE_QUADS);
+ ++vfrt_index)
+ {
+
+ p9_pstate_update_vfrt (i_gppb,
+ ((*l_wof_table_data) + l_wof_table_index),
+ &l_vfrt,
+ i_base_state_frequency);
- bool l_wof_header_data_state = 1;
- VALIDATE_WOF_HEADER_DATA(p_wfth->magic_number,
- p_wfth->reserved_version,
- p_wfth->vfrt_block_size,
- p_wfth->vfrt_block_header_size,
- p_wfth->vfrt_data_size,
- p_wfth->quads_active_size,
- p_wfth->core_count,
- l_wof_header_data_state);
-
- if (!l_wof_header_data_state)
+ FAPI_INF("VFRT: %X", l_vfrt.vfrtHeader.magic_number);
+ // Check for "VT" at the start of the magic number
+ if (revle16(l_vfrt.vfrtHeader.magic_number) != 0x5654)
{
o_state->iv_wof_enabled = false;
FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_WOF_HEADER_DATA_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
- .set_CHIP_TARGET(FAPI_SYSTEM)
- .set_MAGIC_NUMBER(p_wfth->magic_number)
- .set_VERSION(p_wfth->reserved_version)
- .set_VFRT_BLOCK_SIZE(p_wfth->vfrt_block_size)
- .set_VFRT_HEADER_SIZE(p_wfth->vfrt_block_header_size)
- .set_VFRT_DATA_SIZE(p_wfth->vfrt_data_size)
- .set_QUADS_ACTIVE_SIZE(p_wfth->quads_active_size)
- .set_CORE_COUNT(p_wfth->core_count),
- "Pstate Parameter Block ATTR_WOF_TABLE_DATA attribute failed");
+ fapi2::PSTATE_PB_VFRT_HEADER_DATA_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(FAPI_SYSTEM)
+ .set_MAGIC_NUMBER(l_vfrt.vfrtHeader.magic_number)
+ .set_VFRT_INDEX(vfrt_index),
+ "Pstate Parameter Block: Invalid VFRT Magic word");
break;
-
}
+ l_wof_table_index += 128; //System vFRT size is 128B..hence need to jump after each VFRT entry
- // Convert system vfrt to homer vfrt
- for (uint32_t vfrt_index = 0; vfrt_index < (CEF_VDN_INDEX * CEF_VDD_INDEX * ACTIVE_QUADS); ++vfrt_index)
- {
-
- p9_pstate_update_vfrt (i_gppb,
- ((*l_wof_table_data) + l_wof_table_index),
- &l_vfrt,
- i_base_state_frequency);
+ memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
+ l_index += sizeof (l_vfrt);
+ }
- // Check for "VT" at the start of the magic number
- if (l_vfrt.vfrtHeader.magic_number != 0x5654)
- {
- o_state->iv_wof_enabled = false;
- FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_VFRT_HEADER_DATA_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
- .set_CHIP_TARGET(FAPI_SYSTEM)
- .set_MAGIC_NUMBER(l_vfrt.vfrtHeader.magic_number)
- .set_VFRT_INDEX(vfrt_index),
- "Pstate Parameter Block: Invalid VFRT Magic word");
- break;
- }
- l_wof_table_index += 128; //System vFRT size is 128B..hence need to jump after each VFRT entry
+ io_size = l_index;
- memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
- l_index += sizeof (l_vfrt);
- }
+ } while(0);
- io_size = l_index;
+ delete l_wof_table_data;
- delete l_wof_table_data;
- } while(0);
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
- fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ FAPI_DBG("<< WOF initialization");
+ return;
- }
}
-// START OF GET ATTRIBUTES function
+// START OF GET ATTRIBUTES functionfapi2/include/fapi2_error_scope.H
fapi2::ReturnCode
proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
@@ -938,7 +1019,7 @@ proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
// If value is 0, set a default
if (!io_attr->attr_proc_dpll_divider)
{
- FAPI_DBG("ATTR_PROC_DPLL_DIVIDER - setting default to %x", io_attr->attr_proc_dpll_divider);
+ FAPI_DBG("ATTR_PROC_DPLL_DIVIDER - settfapi2/include/fapi2_error_scope.Hing default to %x", io_attr->attr_proc_dpll_divider);
io_attr->attr_proc_dpll_divider = 8;
FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_DPLL_DIVIDER, i_target,
io_attr->attr_proc_dpll_divider), "fapiSetAttribute of ATTR_PROC_DPLL_DIVIDER failed");
@@ -1407,19 +1488,21 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
uint32_t* o_valid_pdv_points,
const uint8_t i_chiplet_num,
const uint8_t i_bucket_id,
- PSTATE_attribute_state* o_state)
+ PSTATE_attribute_state* o_state,
+ const bool i_biased_state)
{
const uint8_t pv_op_order[NUM_OP_POINTS] = VPD_PV_ORDER;
const char* pv_op_str[NUM_OP_POINTS] = VPD_PV_ORDER_STR;
uint8_t i = 0;
bool suspend_ut_check = false;
- FAPI_INF(">> proc_chk_valid_poundv");
+ FAPI_DBG(">> proc_chk_valid_poundv for %s values", (i_biased_state) ? "biased" : "non-biased" );
// check for non-zero freq, voltage, or current in valid operating points
for (i = 0; i <= NUM_OP_POINTS - 1; i++)
{
- FAPI_INF("Checking for Zero valued data in each #V operating point (%s) f=%u v=%u i=%u v=%u i=%u",
+ FAPI_INF("Checking for Zero valued %s data in each #V operating point (%s) f=%u v=%u i=%u v=%u i=%u",
+ (i_biased_state) ? "biased" : "non-biased",
pv_op_str[pv_op_order[i]],
i_chiplet_mvpd_data[pv_op_order[i]][0],
i_chiplet_mvpd_data[pv_op_order[i]][1],
@@ -1427,7 +1510,7 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
i_chiplet_mvpd_data[pv_op_order[i]][3],
i_chiplet_mvpd_data[pv_op_order[i]][4]);
- if (is_wof_enabled() && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
+ if (is_wof_enabled(o_state) && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
{
if (i_chiplet_mvpd_data[pv_op_order[i]][0] == 0 ||
@@ -1446,23 +1529,40 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
{
o_state->iv_wof_enabled = false;
}
-
+ if (i_biased_state)
+ {
// Take out an informational error log and then keep going.
- FAPI_ASSERT_NOEXIT(false,
- fapi2::PSTATE_PB_POUNDV_WOF_UT_ERROR(fapi2::FAPI2_ERRL_SEV_RECOVERED)
- .set_CHIP_TARGET(i_target)
- .set_CHIPLET_NUMBER(i_chiplet_num)
- .set_BUCKET(i_bucket_id)
- .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
- .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
- .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
- .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
- .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_BIASED_POUNDV_WOF_UT_ERROR(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block WOF Biased #V UT error being logged");
+ }
+ else
+ {
+ // Take out an informational error log and then keep going.
+ FAPI_ASSERT_NOEXIT(false,
+ fapi2::PSTATE_PB_POUNDV_WOF_UT_ERROR(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
"Pstate Parameter Block WOF #V UT error being logged");
+ }
fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
}
- else if ((!is_wof_enabled()) && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
+ else if ((!is_wof_enabled(o_state)) && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))
{
FAPI_INF("**** NOTE: WOF is disabled so the UltraTurbo VPD is not being checked");
suspend_ut_check = true;
@@ -1477,26 +1577,48 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
i_chiplet_mvpd_data[pv_op_order[i]][4] == 0 )
{
- FAPI_ERR("**** ERROR : Zero valued data found in #V (chiplet = %u bucket id = %u op point = %s)",
+ FAPI_ERR("**** ERROR : Zero valued %s data found in #V (chiplet = %u bucket id = %u op point = %s)",
+ (i_biased_state) ? "biased" : "non-biased",
i_chiplet_num, i_bucket_id, pv_op_str[pv_op_order[i]]);
{
o_state->iv_pstates_enabled = false;
}
- // Error out has Pstate and all dependent functions are suspious.
- FAPI_ASSERT(false,
- fapi2::PSTATE_PB_POUNDV_ZERO_ERROR()
- .set_CHIP_TARGET(i_target)
- .set_CHIPLET_NUMBER(i_chiplet_num)
- .set_BUCKET(i_bucket_id)
- .set_POINT(i)
- .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
- .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
- .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
- .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
- .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
- "Pstate Parameter Block #V Zero contents error being logged");
+ if (i_biased_state)
+ {
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_BIASED_POUNDV_ZERO_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_POINT(i)
+ .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block Biased #V Zero contents error being logged");
+ }
+ else
+
+ {
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_POUNDV_ZERO_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_POINT(i)
+ .set_FREQUENCY(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block #V Zero contents error being logged");
+ }
+
}
}
}
@@ -1516,11 +1638,13 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
for (i = 1; i <= (*o_valid_pdv_points) - 1; i++)
{
- FAPI_INF("Checking for relationship between #V operating point (%s <= %s)",
- pv_op_str[pv_op_order[i - 1]], pv_op_str[pv_op_order[i]]);
+ FAPI_INF("Checking for relationship between #V operating point (%s <= %s) for %s values",
+ pv_op_str[pv_op_order[i - 1]], pv_op_str[pv_op_order[i]],
+ (i_biased_state) ? "biased" : "non-biased");
// Only skip checkinug for WOF not enabled and UltraTurbo.
- if (is_wof_enabled() || (!( !is_wof_enabled() && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))))
+ if (is_wof_enabled(o_state) ||
+ (!( !is_wof_enabled(o_state) && (strcmp(pv_op_str[pv_op_order[i]], "UltraTurbo") == 0))))
{
if (i_chiplet_mvpd_data[pv_op_order[i - 1]][0] > i_chiplet_mvpd_data[pv_op_order[i]][0] ||
i_chiplet_mvpd_data[pv_op_order[i - 1]][1] > i_chiplet_mvpd_data[pv_op_order[i]][1] ||
@@ -1560,30 +1684,54 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
o_state->iv_pstates_enabled = false;
- // Error out has Pstate and all dependent functions are suspious.
- FAPI_ASSERT(false,
- fapi2::PSTATE_PB_POUNDV_SLOPE_ERROR()
- .set_CHIP_TARGET(i_target)
- .set_CHIPLET_NUMBER(i_chiplet_num)
- .set_BUCKET(i_bucket_id)
- .set_POINT(i)
- .set_FREQUENCY_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][0])
- .set_VDD_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][1])
- .set_IDD_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][2])
- .set_VCS_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][3])
- .set_ICS_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][4])
- .set_FREQUENCY_B(i_chiplet_mvpd_data[pv_op_order[i]][0])
- .set_VDD_B(i_chiplet_mvpd_data[pv_op_order[i]][1])
- .set_IDD_B(i_chiplet_mvpd_data[pv_op_order[i]][2])
- .set_VCS_B(i_chiplet_mvpd_data[pv_op_order[i]][3])
- .set_ICS_B(i_chiplet_mvpd_data[pv_op_order[i]][4]),
- "Pstate Parameter Block #V Zero contents error being logged");
+ if (i_biased_state)
+ {
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_BIASED_POUNDV_SLOPE_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_POINT(i)
+ .set_FREQUENCY_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][0])
+ .set_VDD_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][1])
+ .set_IDD_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][2])
+ .set_VCS_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][3])
+ .set_ICS_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][4])
+ .set_FREQUENCY_B(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD_B(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD_B(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS_B(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS_B(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block Biased #V disorder contents error being logged");
+ }
+ else
+ {
+ // Error out has Pstate and all dependent functions are suspious.
+ FAPI_ASSERT(false,
+ fapi2::PSTATE_PB_POUNDV_SLOPE_ERROR()
+ .set_CHIP_TARGET(i_target)
+ .set_CHIPLET_NUMBER(i_chiplet_num)
+ .set_BUCKET(i_bucket_id)
+ .set_POINT(i)
+ .set_FREQUENCY_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][0])
+ .set_VDD_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][1])
+ .set_IDD_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][2])
+ .set_VCS_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][3])
+ .set_ICS_A(i_chiplet_mvpd_data[pv_op_order[i - 1]][4])
+ .set_FREQUENCY_B(i_chiplet_mvpd_data[pv_op_order[i]][0])
+ .set_VDD_B(i_chiplet_mvpd_data[pv_op_order[i]][1])
+ .set_IDD_B(i_chiplet_mvpd_data[pv_op_order[i]][2])
+ .set_VCS_B(i_chiplet_mvpd_data[pv_op_order[i]][3])
+ .set_ICS_B(i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ "Pstate Parameter Block #V disorder contents error being logged");
+ }
}
}
}
fapi_try_exit:
- FAPI_INF("<< proc_chk_valid_poundv");
+ FAPI_DBG("<< proc_chk_valid_poundv");
return fapi2::current_err;
}
@@ -1602,7 +1750,7 @@ load_mvpd_operating_point ( const uint32_t i_src[PV_D][PV_W],
VpdOperatingPoint* o_dest,
uint32_t i_frequency_step_khz)
{
- FAPI_INF(">> load_mvpd_operating_point");
+ FAPI_DBG(">> load_mvpd_operating_point");
const uint8_t pv_op_order[NUM_OP_POINTS] = VPD_PV_ORDER;
for (uint32_t i = 0; i < NUM_OP_POINTS; i++)
@@ -1615,7 +1763,7 @@ load_mvpd_operating_point ( const uint32_t i_src[PV_D][PV_W],
o_dest[i].pstate = (i_src[ULTRA][0] - i_src[pv_op_order[i]][0]) * 1000 / i_frequency_step_khz;
}
- FAPI_INF("<< load_mvpd_operating_point");
+ FAPI_DBG("<< load_mvpd_operating_point");
return fapi2::FAPI2_RC_SUCCESS;
} // end load_mvpd_operating_point
@@ -1624,7 +1772,7 @@ proc_get_vdm_parms (const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
const AttributeList* i_attr,
GP_VDMParmBlock* o_vdmpb)
{
- FAPI_INF(">> proc_get_vdm_parms");
+ FAPI_DBG(">> proc_get_vdm_parms");
if (i_attr->attr_system_vdm_disable == fapi2::ENUM_ATTR_SYSTEM_VDM_DISABLE_OFF)
{
@@ -1660,7 +1808,7 @@ proc_get_vdm_parms (const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
}
fapi_try_exit:
- FAPI_INF("<< proc_get_vdm_parms");
+ FAPI_DBG("<< proc_get_vdm_parms");
return fapi2::current_err;
}
@@ -1671,7 +1819,7 @@ proc_res_clock_setup ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targ
ResonantClockingSetup* o_resclk_setup,
const GlobalPstateParmBlock* i_gppb)
{
- FAPI_INF(">> proc_res_clock_setup");
+ FAPI_DBG(">> proc_res_clock_setup");
uint8_t l_resclk_freq_index[RESCLK_FREQ_REGIONS];
uint16_t l_step_delay_ns;
uint16_t l_l3_threshold_mv;
@@ -1761,7 +1909,7 @@ proc_res_clock_setup ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targ
}
fapi_try_exit:
- FAPI_INF("<< proc_res_clock_setup");
+ FAPI_DBG("<< proc_res_clock_setup");
return fapi2::current_err;
}
@@ -1771,7 +1919,7 @@ proc_get_ivrm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
IvrmParmBlock* o_ivrmpb,
PSTATE_attribute_state* o_state)
{
- FAPI_INF(">> proc_get_ivrm_parms");
+ FAPI_DBG(">> proc_get_ivrm_parms");
if (i_attr->attr_system_ivrm_disable == fapi2::ENUM_ATTR_SYSTEM_IVRM_DISABLE_OFF)
{
@@ -1816,7 +1964,7 @@ proc_get_ivrm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
}
fapi_try_exit:
- FAPI_INF("<< proc_get_ivrm_parms");
+ FAPI_DBG("<< proc_get_ivrm_parms");
return fapi2::current_err;
}
@@ -2199,6 +2347,19 @@ void p9_pstate_compute_PStateV_slope(VpdOperatingPoint i_operating_points[][4],
}
}
+#define CENTER_STR(_buffer, _variable, _width) \
+ { \
+ int _w_ = _width-strlen(_variable)/2; \
+ sprintf(_buffer, " %*s%*s ", _w_, _variable, _w_, ""); \
+ }
+
+#define HEX_DEC_STR(_buffer, _hex, _dec) \
+ { \
+ char _temp_buffer[64]; \
+ sprintf(_temp_buffer, " %04X (%4d) ", _dec, _hex); \
+ strcat(_buffer, _temp_buffer); \
+ }
+
/// Print a GlobalPstateParameterBlock structure on a given stream
///
/// \param gppb The Global Pstate Parameter Block print
@@ -2209,6 +2370,7 @@ gppb_print(GlobalPstateParmBlock* i_gppb)
static const uint32_t BUFFSIZE = 256;
char l_buffer[BUFFSIZE];
char l_temp_buffer[BUFFSIZE];
+ char l_temp_buffer1[BUFFSIZE];
const char* pv_op_str[NUM_OP_POINTS] = PV_OP_ORDER_STR;
const char* thresh_op_str[NUM_THRESHOLD_POINTS] = VPD_THRESHOLD_ORDER_STR;
const char* slope_region_str[VPD_NUM_SLOPES_REGION] = VPD_OP_SLOPES_REGION_ORDER_STR;
@@ -2217,131 +2379,141 @@ gppb_print(GlobalPstateParmBlock* i_gppb)
FAPI_INF("Global Pstate Parameter Block @ %p", i_gppb);
FAPI_INF("---------------------------------------------------------------------------------------");
-// sprintf(l_buffer, "Magic: %llu", revle64(i_gppb->magic));
- FAPI_INF("Options: %X", revle32(i_gppb->options.options));
- FAPI_INF("Reference Frequency: %X (%d)",
- revle32(i_gppb->reference_frequency_khz), revle32(i_gppb->reference_frequency_khz));
- FAPI_INF("Frequency Step Size: %X (%d)",
- revle32(i_gppb->frequency_step_khz), revle32(i_gppb->frequency_step_khz));
+ FAPI_INF("%-20s : %X",
+ "Options",
+ revle32(i_gppb->options.options));
+ FAPI_INF("%-20s : %X (%d)",
+ "Reference Frequency",
+ revle32(i_gppb->reference_frequency_khz),
+ revle32(i_gppb->reference_frequency_khz));
+ FAPI_INF("%-20s : %X (%d)",
+ "Frequency Step Size",
+ revle32(i_gppb->frequency_step_khz),
+ revle32(i_gppb->frequency_step_khz));
- FAPI_INF("Operating Points: Frequency VDD(mV) IDD(100mA) VCS(mV) ICS(100mA)");
+ FAPI_INF("Operating Points: Frequency VDD(mV) IDD(100mA) VCS(mV) ICS(100mA)");
for (uint32_t i = 0; i < NUM_OP_POINTS; i++)
{
- sprintf(l_buffer, " ");
- sprintf(l_temp_buffer, " %04X (%4d) ",
+
+ strcpy(l_buffer,"");
+ sprintf (l_temp_buffer, " %-18s : ",pv_op_str[i]);
+ strcat(l_buffer, l_temp_buffer);
+
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->operating_points[i].frequency_mhz),
revle32(i_gppb->operating_points[i].frequency_mhz));
- strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%4d) ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->operating_points[i].vdd_mv),
revle32(i_gppb->operating_points[i].vdd_mv));
- strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%4d) ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->operating_points[i].idd_100ma),
revle32(i_gppb->operating_points[i].idd_100ma));
- strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%4d) ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->operating_points[i].vcs_mv),
revle32(i_gppb->operating_points[i].vcs_mv));
- strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->operating_points[i].ics_100ma),
revle32(i_gppb->operating_points[i].ics_100ma));
- strcat(l_buffer, l_temp_buffer);
+
FAPI_INF("%s", l_buffer);
}
- FAPI_INF("System Parameters: VDD VCS VDN");
- sprintf(l_buffer, " Load line (uOhm) ");
- sprintf(l_temp_buffer, " %04X (%3d) ",
- revle32(i_gppb->vdd_sysparm.loadline_uohm),
- revle32(i_gppb->vdd_sysparm.loadline_uohm));
+ FAPI_INF("System Parameters: VDD VCS VDN")
+ strcpy(l_buffer,"");
+ sprintf(l_temp_buffer, " %-30s :", "Load line (uOhm)");
strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ HEX_DEC_STR(l_buffer,
+ revle32(i_gppb->vdd_sysparm.loadline_uohm),
+ revle32(i_gppb->vdd_sysparm.loadline_uohm));
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->vcs_sysparm.loadline_uohm),
revle32(i_gppb->vcs_sysparm.loadline_uohm));
- strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%3d)i_iddqt ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->vdn_sysparm.loadline_uohm),
revle32(i_gppb->vdn_sysparm.loadline_uohm));
- strcat(l_buffer, l_temp_buffer);
FAPI_INF("%s", l_buffer);
- sprintf(l_buffer, " Distribution Loss (uOhm)");
- sprintf(l_temp_buffer, " %04X (%3d) ",
- revle32(i_gppb->vdd_sysparm.distloss_uohm),
- revle32(i_gppb->vdd_sysparm.distloss_uohm));
+ strcpy(l_buffer,"");
+ sprintf(l_temp_buffer, " %-30s :", "Distribution Loss (uOhm)");
strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ HEX_DEC_STR(l_buffer,
+ revle32(i_gppb->vdd_sysparm.distloss_uohm),
+ revle32(i_gppb->vdd_sysparm.distloss_uohm));
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->vcs_sysparm.distloss_uohm),
revle32(i_gppb->vcs_sysparm.distloss_uohm));
- strcat(l_buffer, l_temp_buffer);
-
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->vdn_sysparm.distloss_uohm),
revle32(i_gppb->vdn_sysparm.distloss_uohm));
- strcat(l_buffer, l_temp_buffer);
FAPI_INF("%s", l_buffer);
- sprintf(l_buffer, " Offset (uV) ");
- sprintf(l_temp_buffer, " %04X (%3d) ",
- revle32(i_gppb->vdd_sysparm.distoffset_uv),
- revle32(i_gppb->vdd_sysparm.distoffset_uv));
+ strcpy(l_buffer,"");
+ sprintf(l_temp_buffer, " %-30s :", "Offset (uV)");
strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ HEX_DEC_STR(l_buffer,
+ revle32(i_gppb->vdd_sysparm.distoffset_uv),
+ revle32(i_gppb->vdd_sysparm.distoffset_uv));
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->vcs_sysparm.distoffset_uv),
revle32(i_gppb->vcs_sysparm.distoffset_uv));
- strcat(l_buffer, l_temp_buffer);
-
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ HEX_DEC_STR(l_buffer,
revle32(i_gppb->vdn_sysparm.distoffset_uv),
revle32(i_gppb->vdn_sysparm.distoffset_uv));
- strcat(l_buffer, l_temp_buffer);
FAPI_INF("%s", l_buffer);
FAPI_INF("Safe Parameters:");
- FAPI_INF(" Frequency %04X (%3d) ",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "Frequency",
revle32(i_gppb->safe_frequency_khz),
revle32(i_gppb->safe_frequency_khz));
- FAPI_INF(" Voltage %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "Voltage",
revle32(i_gppb->safe_voltage_mv),
revle32(i_gppb->safe_voltage_mv));
FAPI_INF("Pstate Stepping Parameters:");
- FAPI_INF(" Delay range exponent %04X (%3d) ",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "Delay range exponent",
revle32(i_gppb->vrm_stepdelay_range),
revle32(i_gppb->vrm_stepdelay_range));
- FAPI_INF(" Significand %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "Significand",
revle32(i_gppb->vrm_stepdelay_value),
revle32(i_gppb->vrm_stepdelay_value));
FAPI_INF("External VRM Parameters:");
- FAPI_INF(" VRM Transition Start %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "VRM Transition Start",
revle32(i_gppb->ext_vrm_transition_start_ns),
revle32(i_gppb->ext_vrm_transition_start_ns));
- FAPI_INF(" VRM Transition Rate - Rising %04X (%3d) (uv/us)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "VRM Transition Rate - Rising",
revle32(i_gppb->ext_vrm_transition_rate_inc_uv_per_us),
revle32(i_gppb->ext_vrm_transition_rate_inc_uv_per_us));
- FAPI_INF(" VRM Transition Rate - Falling (uv/us) %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "VRM Transition Rate - Falling",
revle32(i_gppb->ext_vrm_transition_rate_dec_uv_per_us),
revle32(i_gppb->ext_vrm_transition_rate_dec_uv_per_us));
- FAPI_INF(" VRM Settling Time (us) %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "VRM Settling Time (us)",
revle32(i_gppb->ext_vrm_transition_rate_dec_uv_per_us),
revle32(i_gppb->ext_vrm_transition_rate_dec_uv_per_us));
- FAPI_INF(" VRM Transition Step Size (mV) %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "VRM Transition Step Size (mV)",
revle32(i_gppb->ext_vrm_step_size_mv),
revle32(i_gppb->ext_vrm_step_size_mv));
- FAPI_INF("Nest Frequency: %04X (%3d)",
+ FAPI_INF(" %-30s : %04X (%3d) ",
+ "Nest Frequency",
revle32(i_gppb->nest_frequency_mhz),
revle32(i_gppb->nest_frequency_mhz));
@@ -2431,65 +2603,130 @@ gppb_print(GlobalPstateParmBlock* i_gppb)
}
FAPI_INF("%s", l_buffer);
}
- FAPI_INF ("VID OPERATING POINTS");
+ FAPI_INF ("VID Operating Points");
- for (uint8_t i = 0; i < NUM_OP_POINTS; ++i)
+ for (auto i = 0; i < NUM_OP_POINTS; ++i)
{
- sprintf (l_buffer, " %s : %02X ",pv_op_str[i], i_gppb->vid_point_set[i]);
+ sprintf (l_buffer, " %-16s : %02X ",pv_op_str[i], i_gppb->vid_point_set[i]);
FAPI_INF("%s", l_buffer);
}
+ sprintf(l_buffer, "%-25s", "Thrshod Op Points: ");
+ for (auto j = 0; j < NUM_THRESHOLD_POINTS; ++j)
+ {
+ CENTER_STR(l_temp_buffer, thresh_op_str[j], 8);
+ strcat(l_buffer, l_temp_buffer);
+ }
+ FAPI_INF("%s", l_buffer);
- FAPI_INF ("THESHOLD OPERATING POINTS");
- for (uint8_t i = 0; i < NUM_OP_POINTS; ++i)
+ strcpy(l_buffer,"");
+ for (auto i = 0; i < NUM_OP_POINTS; ++i)
{
- strcpy(l_buffer,"");
- sprintf (l_temp_buffer, " %s ",pv_op_str[i]);
- FAPI_INF("%s", l_temp_buffer);
- for (uint8_t j = 0; j < NUM_THRESHOLD_POINTS; ++j)
+ sprintf(l_buffer, " %-16s : ", pv_op_str[i]);
+ for (auto j = 0; j < NUM_THRESHOLD_POINTS; ++j)
{
- sprintf (l_temp_buffer, "%s : %02X ",thresh_op_str[j], i_gppb->threshold_set[i][j]);
- strcat (l_buffer,l_temp_buffer);
+ sprintf(l_temp_buffer1, "%04X",
+ i_gppb->threshold_set[i][j]);
+ CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
+ strcat(l_buffer, l_temp_buffer);
}
FAPI_INF("%s", l_buffer);
}
- strcpy(l_buffer,"");
- FAPI_INF ("VID COMPARE SLOPES");
- for (uint8_t i = 0; i < VPD_NUM_SLOPES_REGION; ++i)
+ sprintf(l_buffer, "VID Compare Slopes:");
+ int l_len = strlen(l_buffer);
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
{
- sprintf (l_buffer, " %s : %02X ",slope_region_str[i], i_gppb->PsVIDCompSlopes[i]);
- FAPI_INF("%s", l_buffer);
+ sprintf(l_temp_buffer1, "%s", prt_region_names[j]);
+ CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
+ strcat(l_buffer, l_temp_buffer);
+ }
+ FAPI_INF("%s", l_buffer);
+
+ sprintf( l_buffer, "%*s", l_len+6," ");
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
+ {
+ sprintf(l_temp_buffer1, "%04X",
+ revle16(i_gppb->PsVIDCompSlopes[j]));
+ CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
+ strcat(l_buffer, l_temp_buffer);
}
- FAPI_INF ("VDM THRESHOLD SLOPES");
+ FAPI_INF("%s", l_buffer);
- for (uint8_t i = 0; i < VPD_NUM_SLOPES_REGION; ++i)
+ sprintf(l_buffer, "%-18s", "VDM Thrshld Slopes:");
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
{
- strcpy(l_buffer,"");
- sprintf (l_temp_buffer, " %s ",slope_region_str[i]);
- FAPI_INF("%s", l_temp_buffer);
- for (uint8_t j = 0; j < NUM_THRESHOLD_POINTS; ++j)
+ CENTER_STR(l_temp_buffer, slope_region_str[j], 8);
+ strcat(l_buffer, l_temp_buffer);
+ }
+ FAPI_INF("%s", l_buffer);
+ for (auto i = 0; i < NUM_THRESHOLD_POINTS; ++i)
+ {
+ sprintf(l_buffer, " %-16s : ", thresh_op_str[i]);
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
{
- sprintf (l_temp_buffer, " %s : %02X ",thresh_op_str[j], i_gppb->PsVDMThreshSlopes[i][j]);
- strcat (l_buffer, l_temp_buffer);
+ sprintf(l_temp_buffer1, " %3i ",
+ i_gppb->PsVDMThreshSlopes[i][j]);
+ CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
+ strcat(l_buffer, l_temp_buffer);
}
FAPI_INF("%s", l_buffer);
}
- FAPI_INF ("VDM JUMP SLOPES");
- for (uint8_t i = 0; i < VPD_NUM_SLOPES_REGION; ++i)
+ sprintf(l_buffer, "%-18s", "VDM Jump Slopes: ");
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
{
- strcpy(l_buffer,"");
- sprintf (l_temp_buffer, " %s ",slope_region_str[i]);
- FAPI_INF("%s", l_temp_buffer);
- for (uint8_t j = 0; j < NUM_JUMP_VALUES; ++j)
+ CENTER_STR(l_temp_buffer, slope_region_str[j], 8);
+ strcat(l_buffer, l_temp_buffer);
+ }
+ FAPI_INF("%s", l_buffer);
+ for (auto i = 0; i < NUM_THRESHOLD_POINTS; ++i)
+ {
+ sprintf(l_buffer, " %-16s : ", thresh_op_str[i]);
+ for (auto j = 0; j < VPD_NUM_SLOPES_REGION; ++j)
{
- sprintf (l_temp_buffer, " %s : %02X ",thresh_op_str[j], i_gppb->PsVDMJumpSlopes[i][j]);
- strcat (l_buffer, l_temp_buffer);
+ sprintf(l_temp_buffer1, " %02X ",
+ i_gppb->PsVDMJumpSlopes[i][j]);
+ CENTER_STR(l_temp_buffer, l_temp_buffer1, 8);
+ strcat(l_buffer, l_temp_buffer);
}
FAPI_INF("%s", l_buffer);
}
+
+//
+//
+//
+// FAPI_INF ("VDM THRESHOLD SLOPES");
+//
+// for (uint8_t i = 0; i < VPD_NUM_SLOPES_REGION; ++i)
+// {
+// strcpy(l_buffer,"");
+// sprintf (l_temp_buffer, " %s ",slope_region_str[i]);
+// FAPI_INF("%s", l_temp_buffer);
+// for (uint8_t j = 0; j < NUM_THRESHOLD_POINTS; ++j)
+// {
+// sprintf (l_temp_buffer, " %s : %02X ",thresh_op_str[j], i_gppb->PsVDMThreshSlopes[i][j]);
+// strcat (l_buffer, l_temp_buffer);
+// }
+// FAPI_INF("%s", l_buffer);
+// }
+//
+// FAPI_INF ("VDM JUMP SLOPES");
+//
+// for (uint8_t i = 0; i < VPD_NUM_SLOPES_REGION; ++i)
+// {
+// strcpy(l_buffer,"");
+// sprintf (l_temp_buffer, " %s ",slope_region_str[i]);
+// FAPI_INF("%s", l_temp_buffer);
+// for (uint8_t j = 0; j < NUM_JUMP_VALUES; ++j)
+// {
+// sprintf (l_temp_buffer, " %s : %02X ",thresh_op_str[j], i_gppb->PsVDMJumpSlopes[i][j]);
+// strcat (l_buffer, l_temp_buffer);
+// }
+// FAPI_INF("%s", l_buffer);
+// }
+
// Resonant Clocking
FAPI_DBG("Resonant Clocking Setup:");
FAPI_DBG("Pstates ResClk Index");
@@ -2523,7 +2760,7 @@ oppb_print(OCCPstateParmBlock* i_oppb)
// fprintf(stream, "Magic: %llu\n", revle64(i_oppb->magic));
FAPI_INF("Operating Points: Frequency VDD(mV) IDD(100mA) VCS(mV) ICS(100mA)");
- for (uint32_t i = 0; i < NUM_OP_POINTS; i++)
+ for (auto i = 0; i < NUM_OP_POINTS; i++)
{
sprintf(l_buffer, " ");
sprintf(l_temp_buffer, " %04X (%4d) ",
@@ -2553,8 +2790,8 @@ oppb_print(OCCPstateParmBlock* i_oppb)
FAPI_INF("%s", l_buffer);
}
- FAPI_INF("System Parameters: VDD VCS VDN");
- sprintf(l_buffer, " Load line (uOhm) ");
+ FAPI_INF("System Parameters: VDD VCS VDN");
+ sprintf(l_buffer, " Load line (uOhm) ");
sprintf(l_temp_buffer, " %04X (%3d) ",
revle32(i_oppb->vdd_sysparm.loadline_uohm),
revle32(i_oppb->vdd_sysparm.loadline_uohm));
@@ -2571,7 +2808,7 @@ oppb_print(OCCPstateParmBlock* i_oppb)
strcat(l_buffer, l_temp_buffer);
FAPI_INF("%s", l_buffer);
- sprintf(l_buffer, " Distribution Loss (uOhm)");
+ sprintf(l_buffer, " Distribution Loss (uOhm) ");
sprintf(l_temp_buffer, " %04X (%3d) ",
revle32(i_oppb->vdd_sysparm.distloss_uohm),
revle32(i_oppb->vdd_sysparm.distloss_uohm));
@@ -2588,7 +2825,7 @@ oppb_print(OCCPstateParmBlock* i_oppb)
strcat(l_buffer, l_temp_buffer);
FAPI_INF("%s", l_buffer);
- sprintf(l_buffer, " Offset (uV) ");
+ sprintf(l_buffer, " Offset (uV) ");
sprintf(l_temp_buffer, " %04X (%3d) ",
revle32(i_oppb->vdd_sysparm.distoffset_uv),
revle32(i_oppb->vdd_sysparm.distoffset_uv));
@@ -2621,6 +2858,40 @@ oppb_print(OCCPstateParmBlock* i_oppb)
i_oppb->pstate_min,
i_oppb->pstate_min);
+ FAPI_INF("Nest Frequency: %02X (%3d)",
+ i_oppb->nest_frequency_mhz,
+ i_oppb->nest_frequency_mhz);
+
+ FAPI_INF("Nest Leakage Percent: %02X (%3d)",
+ i_oppb->nest_leakage_percent,
+ i_oppb->nest_leakage_percent);
+
+ FAPI_INF("Ceff TDP Vdn: %02X (%3d)",
+ i_oppb->ceff_tdp_vdn,
+ 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);
+
+ FAPI_INF("Iac TDP VDD Nominal(10ma): %02X (%3d)",
+ i_oppb->lac_tdp_vdd_nominal_10ma,
+ i_oppb->lac_tdp_vdd_nominal_10ma);
+
+ FAPI_INF("WOF Elements");
+ sprintf(l_buffer, " WOF Enabled ");
+ sprintf(l_temp_buffer, " %1d ",
+ i_oppb->wof.wof_enabled);
+ strcat(l_buffer, l_temp_buffer);
+ FAPI_INF("%s", l_buffer);
+
+ sprintf(l_buffer, " TDP RDP Factor ");
+ sprintf(l_temp_buffer, " %04X (%3d) ",
+ i_oppb->wof.tdp_rdp_factor,
+ i_oppb->wof.tdp_rdp_factor);
+ strcat(l_buffer, l_temp_buffer);
+ FAPI_INF("%s", l_buffer);
+
FAPI_INF("---------------------------------------------------------------------------------------");
}
@@ -2893,15 +3164,15 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
const char* pv_op_str[NUM_OP_POINTS] = PV_OP_ORDER_STR;
- FAPI_INF(">> proc_get_mvpd_poundw");
+ FAPI_DBG(">> proc_get_mvpd_poundw");
do
{
FAPI_DBG("proc_get_mvpd_poundw: VDM enable = %d, WOF enable %d",
- is_vdm_enabled(), is_wof_enabled());
+ is_vdm_enabled(o_state), is_wof_enabled(o_state));
- // Exit if both VDM and WOF is disabled
- if (!is_vdm_enabled() && !is_wof_enabled())
+ // Exit if both VDM and WOF are disabled
+ if (!is_vdm_enabled(o_state) && !is_wof_enabled(o_state))
{
FAPI_INF(" proc_get_mvpd_poundw: BOTH VDM and WOF are disabled. Skipping remaining checks");
o_state->iv_vdm_enabled = false;
@@ -2945,6 +3216,15 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
}
}
+ // The rest of the processing here is all checking of the VDM content
+ // within #W. If VDMs are not enabled (or supported), skip all of it
+ if (!is_vdm_enabled(o_state))
+ {
+ FAPI_INF(" proc_get_mvpd_poundw: VDM is disabled. Skipping remaining checks");
+ o_state->iv_vdm_enabled = false;
+ break;
+ }
+
uint8_t l_poundw_static_data = 0;
const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_POUND_W_STATIC_DATA_ENABLE,
@@ -2970,12 +3250,20 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
// But we need the order PS,N,T,UT.. hence we are swapping the data
// between PS and Nominal.
poundw_entry_t l_tmp_data;
- memcpy (&l_tmp_data, &(o_data->poundw[VPD_PV_NOMINAL]), sizeof (poundw_entry_t));
- memcpy(&(o_data->poundw[VPD_PV_NOMINAL]), &(o_data->poundw[VPD_PV_POWERSAVE]), sizeof(poundw_entry_t));
- memcpy (&(o_data->poundw[VPD_PV_POWERSAVE]), &l_tmp_data, sizeof(poundw_entry_t));
+ memcpy (&l_tmp_data,
+ &(o_data->poundw[VPD_PV_NOMINAL]),
+ sizeof (poundw_entry_t));
+
+ memcpy (&(o_data->poundw[VPD_PV_NOMINAL]),
+ &(o_data->poundw[VPD_PV_POWERSAVE]),
+ sizeof(poundw_entry_t));
+
+ memcpy (&(o_data->poundw[VPD_PV_POWERSAVE]),
+ &l_tmp_data,
+ sizeof(poundw_entry_t));
// Validate the WOF content is non-zero if WOF is enabled
- if (is_wof_enabled())
+ if (is_wof_enabled(o_state))
{
bool b_tdp_ac = true;
bool b_tdp_dc = true;
@@ -3030,7 +3318,7 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
// The rest of the processing here is all checking of the VDM content
// within #W. If VDMs are not enabled (or supported), skip all of it
- if (!is_vdm_enabled())
+ if (!is_vdm_enabled(o_state))
{
FAPI_INF(" proc_get_mvpd_poundw: VDM is disabled. Skipping remaining checks");
o_state->iv_vdm_enabled = false;
@@ -3053,13 +3341,13 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
//vdm_vid_compare_ivid will be in ivid units (eg HEX((Compare
//Voltage (mv) - 512mV)/4mV).
o_data->poundw[NOMINAL].vdm_vid_compare_ivid =
- (i_poundv_data.VddNomVltg - VDM_VOLTAGE_IN_MV) / VDM_GRANULARITY;
+ (i_poundv_data.VddNomVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
o_data->poundw[POWERSAVE].vdm_vid_compare_ivid =
(i_poundv_data.VddPSVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
o_data->poundw[TURBO].vdm_vid_compare_ivid =
(i_poundv_data.VddTurboVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
o_data->poundw[ULTRA].vdm_vid_compare_ivid =
- (i_poundv_data.VddUTurboVltg - VDM_VOLTAGE_IN_MV) / VDM_GRANULARITY;
+ (i_poundv_data.VddUTurboVltg - VDM_VOLTAGE_IN_MV ) / VDM_GRANULARITY;
}//if any one of the VID compares are zero, then need to fail because of BAD VPD image.
else if ( !(o_data->poundw[NOMINAL].vdm_vid_compare_ivid) ||
!(o_data->poundw[POWERSAVE].vdm_vid_compare_ivid) ||
@@ -3187,10 +3475,13 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
for (uint8_t i = 0; i < NUM_OP_POINTS; i++)
{
l_pound_w_points[i] = calc_bias(l_bias_value[i]);
- o_data->poundw[i].vdm_vid_compare_ivid = (uint32_t)(o_data->poundw[i].vdm_vid_compare_ivid * l_pound_w_points[i]);
+ o_data->poundw[i].vdm_vid_compare_ivid =
+ (uint32_t)(o_data->poundw[i].vdm_vid_compare_ivid * l_pound_w_points[i]);
- FAPI_INF ("vdm_vid_compare_ivid %x %x, %x", o_data->poundw[i].vdm_vid_compare_ivid,
- o_data->poundw[i].vdm_vid_compare_ivid, l_pound_w_points[i]);
+ FAPI_INF("vdm_vid_compare_ivid %x %x, %x",
+ o_data->poundw[i].vdm_vid_compare_ivid,
+ o_data->poundw[i].vdm_vid_compare_ivid,
+ l_pound_w_points[i]);
}
@@ -3207,7 +3498,7 @@ fapi_try_exit:
o_state->iv_vdm_enabled = false;
o_state->iv_wof_enabled = false;
}
- FAPI_INF("<< proc_get_mvpd_poundw");
+ FAPI_DBG("<< proc_get_mvpd_poundw");
return fapi2::current_err;
}
@@ -3808,11 +4099,16 @@ p9_pstate_set_global_feature_attributes(const fapi2::Target<fapi2::TARGET_TYPE_P
l_wof_enabled = (fapi2::ATTR_WOF_ENABLED_Type)fapi2::ENUM_ATTR_WOF_ENABLED_TRUE;
}
- FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PSTATES_ENABLED, i_target, l_ps_enabled));
- FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_RESCLK_ENABLED, i_target, l_resclk_enabled));
- FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_VDM_ENABLED, i_target, l_vdm_enabled));
- FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_IVRM_ENABLED, i_target, l_ivrm_enabled));
- FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_WOF_ENABLED, i_target, l_wof_enabled));
+
+#define SET_ATTR(attr_name, target, attr_assign) \
+FAPI_TRY(FAPI_ATTR_SET(attr_name, target, attr_assign),"Attribute set failed"); \
+FAPI_INF("%-60s = 0x%08x %d", #attr_name, attr_assign, attr_assign);
+
+ SET_ATTR(fapi2::ATTR_PSTATES_ENABLED, i_target, l_ps_enabled);
+ SET_ATTR(fapi2::ATTR_RESCLK_ENABLED, i_target, l_resclk_enabled);
+ SET_ATTR(fapi2::ATTR_VDM_ENABLED, i_target, l_vdm_enabled);
+ SET_ATTR(fapi2::ATTR_IVRM_ENABLED, i_target, l_ivrm_enabled);
+ SET_ATTR(fapi2::ATTR_WOF_ENABLED, i_target, l_wof_enabled);
// ----------------
@@ -3843,22 +4139,34 @@ p9_pstate_set_global_feature_attributes(const fapi2::Target<fapi2::TARGET_TYPE_P
{
case fapi2::ENUM_ATTR_DPLL_VDM_RESPONSE_DROOP_PROTECT:
l_data16 |= CME_QM_FLAG_SYS_JUMP_PROTECT;
+ FAPI_INF("%-60s", "DPLL Response");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_JUMP_PROTECT");
break;
case fapi2::ENUM_ATTR_DPLL_VDM_RESPONSE_DROOP_PROTECT_OVERVOLT:
l_data16 |= CME_QM_FLAG_SYS_DYN_FMAX_ENABLE;
l_data16 |= CME_QM_FLAG_SYS_JUMP_PROTECT;
+ FAPI_INF("%-60s", "DPLL Response");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_DYN_FMAX_ENABLE");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_JUMP_PROTECT");
break;
case fapi2::ENUM_ATTR_DPLL_VDM_RESPONSE_DYNAMIC:
l_data16 |= CME_QM_FLAG_SYS_DYN_FMIN_ENABLE;
l_data16 |= CME_QM_FLAG_SYS_DYN_FMAX_ENABLE;
+ FAPI_INF("%-60s", "DPLL Response");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_DYN_FMIN_ENABLEE");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_DYN_FMAX_ENABLE");
break;
case fapi2::ENUM_ATTR_DPLL_VDM_RESPONSE_DYNAMIC_PROTECT:
l_data16 |= CME_QM_FLAG_SYS_DYN_FMIN_ENABLE;
l_data16 |= CME_QM_FLAG_SYS_JUMP_PROTECT;
+ FAPI_INF("%-60s", "DPLL Response");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_DYN_FMIN_ENABLE");
+ FAPI_INF("%-60s = Set", "CME_QM_FLAG_SYS_JUMP_PROTECT");
break;
}
o_qm_flags->value = revle16(l_data16);
+ FAPI_INF("%-60s = 0x%04x %d", "QM Flags", revle16(o_qm_flags->value));
fapi_try_exit:
return fapi2::current_err;
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 071edb2e2..574d66ad3 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
@@ -26,10 +26,9 @@
/// @brief Definitons of paramater information used to process pstates
///
// *HWP HW Owner : Greg Still <stillgs@us.ibm.com>
-// *HWP HW Owner : Michael Floyd <mfloyd@us.ibm.com>
-// *HWP FW Owner : Martha Broyles <mbroyles@us.ibm.com>
+// *HWP FW Owner : Prasad Bg Ranganath <prasadbgr@in.ibm.com>
// *HWP Team : PM
-// *HWP Level : 1
+// *HWP Level : 3
// *HWP Consumed by : PGPE, OCC
#ifndef __P9_PSTATE_PARAMETER_BLOCK_H__
@@ -47,8 +46,6 @@
extern "C" {
#endif
-//ssrivath, Also defined in p9_pstates.h
-// can remove from here if below structure is moved to p9_pstates.h
#define MAX_ACTIVE_CORES 24
#define HOMER_WOF_TABLE_SIZE 258176
@@ -97,8 +94,6 @@ typedef struct
/// The nominal frequency and frequency step-size is given in Hz. Load-line
/// and on-chip distribution resistances are given in micro-Ohms.
///
-/// \todo Confirm that the "eVID V[dd,cs] Eff" correction is modeled as a simple
-/// resistance similar to the load line.
typedef struct
{
@@ -136,7 +131,6 @@ typedef struct
//Section added back by ssrivath
// START OF PARMS REQUIRED VPD parsing procedures
-//#define S132A_POINTS 4 - Replaced by NUM_OP_POINTS
#define PSTATE_STEPSIZE 1
#define EVRM_DELAY_NS 100
#define DEAD_ZONE_5MV 20 // 100mV
@@ -144,10 +138,8 @@ typedef struct
#define PDV_BUFFER_ALLOC 512
#define POUND_W_VERSION_2_BUCKET_SIZE 60
-//#define PDM_BUFFER_SIZE 105
#define PDM_BUFFER_SIZE 257 // Value is for version 3 @ 256 + 1 for version number
#define PDM_BUFFER_ALLOC 513 // Value is for version 2 @ 512 + 1 for version number
-//#define BIAS_PCT_UNIT 0.005
#define BIAS_PCT_UNIT 0.5
#define BOOST_PCT_UNIT 0.001
#define POUNDM_POINTS 13
@@ -157,13 +149,6 @@ typedef struct
#define PV_D 5
#define PV_W 5
-// Replaced by VPD_PV_ORDER_STR
-//// order of operating points from slow to fast in #V
-//// 1=pwrsave 0=nominal 2=turbo. 3=ultraturbo
-//#define PV_OP_ORDER {1, 0, 2, 3}
-//#define PV_OP_ORDER_STR {"Nominal", "PowerSave", "Turbo", "UltraTurbo"}
-//#define PV_OP_ORDER_MIN_VALID {1, 1, 1, 0}
-
// IQ Keyword Sizes
#define IQ_BUFFER_SIZE 9
#define IQ_BUFFER_ALLOC 255
@@ -187,7 +172,6 @@ typedef struct
uint32_t attr_proc_r_distloss_vcs_uohm;
uint32_t attr_proc_vrm_voffset_vcs_uv;
-// uint32_t attr_freq_proc_refclock;
uint32_t attr_freq_proc_refclock_khz;
uint32_t attr_proc_dpll_divider;
uint32_t attr_nest_frequency_mhz;
@@ -286,11 +270,14 @@ typedef struct
/// ----------------------------------------------------------------
/// @brief Get #V data and put into array
-/// @param[i] i_target Chip Target
+/// @param[i] i_target Proc Target
/// @param[o] o_attr_mvpd_data 5x5 array to hold the #V data
/// @param[o] o_valid_pdv_points No of Valid VPD points
/// @param[o] o_present_chiplets No of functional chiplets
-/// @return FAPI2::SUCCESS
+/// @param[o] o_bucketId bucket id that got selected
+/// @param[o] o_poundv_data PoundV data
+/// @paran[o] o_state pstate attribute state
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ----------------------------------------------------------------
fapi2::ReturnCode
proc_get_mvpd_data ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
@@ -303,11 +290,14 @@ proc_get_mvpd_data ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
/// -------------------------------------------------------------------
/// @brief Perform data validity check on #V data
+/// @param[i] i_target Proc Target
/// @param[i] i_chiplet_mvpd_data Pointer to array of #V data
/// @param[o] o_valid_pdv_points No of Valid VPD points
-/// @param[o] i_chiplet_num Chiplet number
-/// @param[o] i_bucket_id Bucket ID
-/// @return FAPI2::SUCCESS
+/// @param[i] i_chiplet_num Chiplet number
+/// @param[i] i_bucket_id Bucket ID
+/// @param[o] o_state pstate attribute state
+/// @param[i] i_biased_state biased validity check state
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -------------------------------------------------------------------
fapi2::ReturnCode
@@ -316,14 +306,15 @@ proc_chk_valid_poundv ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_tar
uint32_t* o_valid_pdv_points,
const uint8_t i_chiplet_num,
const uint8_t i_bucket_id,
- PSTATE_attribute_state* o_state);
+ PSTATE_attribute_state* o_state,
+ const bool i_biased_state = false);
/// ----------------------------------------------------------------
/// @brief Get IQ (IDDQ) data and put into array
-/// @param[in] i_target => Chip Target
+/// @param[in] i_target => Proc Target
/// @param[inout] iddqt => IDDQ table to hold MVPD IDDQ data
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ----------------------------------------------------------------
fapi2::ReturnCode
@@ -332,12 +323,13 @@ proc_get_mvpd_iddq ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
PSTATE_attribute_state* o_state);
/// ----------------------------------------------------------------
/// @brief Get #W data and put into array
-/// @param[in] i_target => Chip Target
+/// @param[in] i_target => Proc Target
/// @param[in] i_poundv_bucketId => #V bucket id
/// @param[out] o_vdmpb => Vdmparamblock data
/// @param[out] o_poundw_data => #W data
/// @paramg[in] i_poundv_data => #V data
-/// @return FAPI2::SUCCESS
+/// @param[o] o_state => pstate attribute state
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ----------------------------------------------------------------
fapi2::ReturnCode
proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
@@ -349,21 +341,20 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
);
/// -----------------------------------------------------------------------
/// @brief Get needed attributes
-/// @param[in] i_target => Chip Target
-/// @param[inout] io_attr => pointer to attribute list structure
-/// @return FAPI2::SUCCESS
+/// @param[in] i_target => Proc Target
+/// @param[in/out] io_attr => pointer to attribute list structure
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -----------------------------------------------------------------------
-
fapi2::ReturnCode
proc_get_attributes ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
AttributeList* io_attr);
/// ---------------------------------------------------------------------------
/// @brief Check and process #V bias attributes for external and internal
-/// @param[inout] io_attr_mvpd_data => 5x5 array to hold the #V data
-/// @param[in] * i_attr => pointer to attribute list structure
-/// @param[out] * o_vpdbias => Voltage/Frequency bias values
-/// @return FAPI2::SUCCESS
+/// @param[in/out] io_attr_mvpd_data => 5x5 array to hold the #V data
+/// @param[in] i_attr => pointer to attribute list structure
+/// @param[out] o_vpdbias => Voltage/Frequency bias values
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ---------------------------------------------------------------------------
fapi2::ReturnCode
@@ -373,9 +364,9 @@ proc_get_extint_bias ( uint32_t io_attr_mvpd_data[PV_D][PV_W],
/// -------------------------------------------------------------------
/// @brief Boost max frequency in pstate table based on boost attribute
-/// @param[inout] *io_pss => pointer to pstate superstructure
+/// @param[in/out] io_pss => pointer to pstate superstructure
/// @param[in] i_attr_boost_percent => Boost percentage attribute
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -------------------------------------------------------------------
fapi2::ReturnCode
@@ -384,9 +375,9 @@ proc_boost_gpst ( PstateSuperStructure* io_pss,
/// ------------------------------------------------------------
/// @brief Update Psafe_pstate
-/// @param[inout] *io_pss => pointer to pstate superstructure
-/// @param[in] *i_attr => pointer to attribute list structure
-/// @return FAPI2::SUCCESS
+/// @param[in/out] *io_pss => pointer to pstate superstructure
+/// @param[in] *i_attr => pointer to attribute list structure
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ------------------------------------------------------------
fapi2::ReturnCode
@@ -397,7 +388,7 @@ proc_upd_psafe_ps ( PstateSuperStructure* io_pss,
/// @brief Update Floor_pstate
/// @param[inout] *io_pss => pointer to pstate superstructure
/// @param[in] *i_attr => pointer to attribute list structure
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ------------------------------------------------------------
fapi2::ReturnCode
@@ -408,7 +399,7 @@ proc_upd_floor_ps ( PstateSuperStructure* io_pss,
/// @brief Convert Resonant Clocking attributes to pstate values and update superstructure with those values
/// @param[inout] *io_pss => pointer to pstate superstructure
/// @param[in] *i_attr => pointer to attribute list structure
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -------------------------------------------------------------------
fapi2::ReturnCode
@@ -419,7 +410,7 @@ proc_res_clock ( PstateSuperStructure* io_pss,
/// @brief Populate a subset of the WOFElements structure from Attributes
/// @param[inout] *io_pss => pointer to pstate superstructure
/// @param[in] *i_attr => pointer to attribute list structure
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ------------------------------------------------------------
fapi2::ReturnCode
@@ -430,7 +421,8 @@ load_wof_attributes ( PstateSuperStructure* io_pss,
/// @brief Copy VPD operating point into destination in assending order
/// @param[in] i_src[NUM_OP_POINTS] => Source VPD structure (array)
/// @param[out] * o_dest[NUM_OP_POINTS] => pointer to destination VpdOperatingPoint structure
-/// @return FAPI2::SUCCESS
+/// @param[in] i_frequency_step_khz => frequency step size
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ------------------------------------------------------------
fapi2::ReturnCode
@@ -440,10 +432,10 @@ load_mvpd_operating_point ( const uint32_t i_src[PV_D][PV_W],
/// ----------------------------------------------------------------
/// @brief Get VDM parameters from attributes
-/// @param[in] i_target => Chip Target
+/// @param[in] i_target => Proc Target
/// @param[in] *i_attr => pointer to attribute list structure
/// @param[out] o_vdmpb => VDM parameter block
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ----------------------------------------------------------------
fapi2::ReturnCode
@@ -453,10 +445,10 @@ proc_get_vdm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
/// ----------------------------------------------------------------
/// @brief Get resonant clocking parameters from attributes
-/// @param[in] i_target => Chip Target
+/// @param[in] i_target => Proc Target
/// @param[out] o_resclk_setup => Resonant clocking setup
/// @param[in] i_gppb => The Global Pstate Parameter Block
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ----------------------------------------------------------------
fapi2::ReturnCode
@@ -466,10 +458,11 @@ proc_res_clock_setup ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targ
/// ----------------------------------------------------------------
/// @brief Get IVRM parameters from attributes
-/// @param[in] i_target => Chip Target
+/// @param[in] i_target => Proc Target
/// @param[in] *i_attr => pointer to attribute list structure
/// @param[out] o_ivrmpb => IVRM parameter block
-/// @return FAPI2::SUCCESS
+/// @param[o] o_state => pstate attribute state
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// ----------------------------------------------------------------
fapi2::ReturnCode
@@ -480,17 +473,22 @@ proc_get_ivrm_parms ( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
/// -------------------------------------------------------------------
/// @brief Set Resonant Clocking "array"/"table" attributes using p9_resclk_defines.h
-/// @param[in] i_target => Chip Target
+/// @param[in] i_target => Proc Target
/// @param[in] o_state => resclck attribute state
-/// @return FAPI2::SUCCESS
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
/// -------------------------------------------------------------------
fapi2::ReturnCode
proc_set_resclk_table_attrs(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
PSTATE_attribute_state* o_state);
//
-// p9_pstate_compute_vpd_pts
-//
+/// -------------------------------------------------------------------
+/// @brief Compute VPD points for different regions
+/// @param[out] o_operating_points => VPD operating points
+/// @param[in] i_gppb => Global pstate structure
+/// @param[in] i_raw_vpd_pts => Raw vpd operating points data
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_vpd_pts(VpdOperatingPoint (*o_operating_points)[NUM_OP_POINTS],
GlobalPstateParmBlock* i_gppb,
VpdOperatingPoint* i_raw_vpd_pts);
@@ -512,55 +510,76 @@ void p9_pstate_compute_vpd_pts(VpdOperatingPoint (*o_operating_points)[NUM_OP_PO
// Inflection Point 1 is NOMINAL
// Inflection Point 0 is POWERSAVE
//
+/// -------------------------------------------------------------------
+/// @brief Compute Pstate slope values for different frequencies and pstates
+/// @param[in] i_operating_points => VPD operating points
+/// @param[out] o_gppb => Global pstate structure
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_PsV_slopes(VpdOperatingPoint i_operating_points[][4],
GlobalPstateParmBlock* o_gppb);
+/// -------------------------------------------------------------------
+/// @brief Compute Pstate slope values for different frequencies and pstates
+/// @param[in] i_operating_points => VPD operating points
+/// @param[out] o_gppb => Global pstate structure
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_PStateV_slope(VpdOperatingPoint i_operating_points[][4],
GlobalPstateParmBlock* o_gppb);
-/// Print a GlobalPstateParameterBlock structure on a given stream
-///
-/// @param[in] gppb The Global Pstate Parameter Block to print
+/// -------------------------------------------------------------------
+/// @brief Print a GlobalPstateParameterBlock structure on a given stream
+/// @param[in] i_gppb The Global Pstate Parameter Block to print
+/// @return void
+/// -------------------------------------------------------------------
void
gppb_print(GlobalPstateParmBlock* i_gppb);
-/// Print an OCCPstateParameterBlock structure on a given stream
-///
-/// @param[in] oppb The OCC Pstate Parameter Block to print
+/// -------------------------------------------------------------------
+/// @brief Print a OCCPstateParameterBlock structure on a given stream
+/// @param[in] i_oppb The OCC Pstate Parameter Block to print
+/// @return void
+/// -------------------------------------------------------------------
void
oppb_print(OCCPstateParmBlock* i_oppb);
-/// Print an iddq_print structure on a given stream
-///
-/// \param i_iddqt pointer to Iddq structure to output
-
+/// -------------------------------------------------------------------
+/// @brief Print an iddq_print structure on a given stream
+/// @param[in] i_iddqt pointer to Iddq structure to output
+/// @return void
+/// -------------------------------------------------------------------
void
iddq_print(IddqTable* i_iddqt);
-/// Convert frequency to Pstate number
-///
-/// @param[in] gppb The Global Pstate Parameter Block
-/// @param[in] freq_khz Input frequency to convert
-/// @param[out] Computed Pstate
-int freq2pState (const GlobalPstateParmBlock* gppb,
- const uint32_t freq_khz,
- Pstate* pstate);
+/// -------------------------------------------------------------------
+/// @brief Convert frequency to Pstate number
+/// @param[in] i_gppb The Global Pstate Parameter Block
+/// @param[in] i_freq_khz Input frequency to convert
+/// @param[out] o_pstate Computed Pstate
+// @return pstate state value whether it's lesser than min or greater than max
+/// -------------------------------------------------------------------
+int freq2pState (const GlobalPstateParmBlock* i_gppb,
+ const uint32_t i_freq_khz,
+ Pstate* o_pstate);
+/// -------------------------------------------------------------------
/// @brief Pstate VFRT initialization
/// @param[in] i_gppb The Global Pstate Parameter Block
/// @param[in] i_pBuffer VFRT data coming from HB
/// @param[out] o_vfrt_data Homer VFRT version
/// @param[in] i_reference_freq Ultra frequency @todo get this from the gppb
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
uint8_t* i_pBuffer,
HomerVFRTLayout_t* o_vfrt_data,
uint32_t i_reference_freq);
/**
-* calculate_effective_capacitance
*
* Description: Generic function to perform the effective capacitance
* calculations.
@@ -573,52 +592,96 @@ void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
* 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
+/// -------------------------------------------------------------------
+/// @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 );
-///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
+/// -------------------------------------------------------------------
+/// @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);
-///round up the floating point 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
+/// @param[in] i_data => Pound W data
+/// @param[in/out] io_lppb => local pstate structure data
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_vdm_threshold_pts(PoundW_data i_data,
LocalPstateParmBlock* io_lppb);
///Biased slope calculation
+/// -------------------------------------------------------------------
+/// @brief Compute VID compare slope values
+/// @param[in] i_data => Pound W data
+/// @param[in/out] io_lppb => local pstate structure data
+/// @param[in] i_pstate => pstate values
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_PsVIDCompSlopes_slopes(PoundW_data i_data,
LocalPstateParmBlock* io_lppb,
uint8_t* i_pstate);
// p9_pstate_compute_PsVDMThreshSlopes
//
+/// -------------------------------------------------------------------
+/// @brief Compute VDM threshold slope values
+/// @param[in/out] io_lppb => local pstate structure data
+/// @param[in] i_pstate => pstate values
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_PsVDMThreshSlopes(LocalPstateParmBlock* io_lppb,
uint8_t* i_pstate);
// p9_pstate_compute_PsVDMJumpSlopes
//
+/// -------------------------------------------------------------------
+/// @brief Compute VDM jump slope values
+/// @param[in/out] io_lppb => local pstate structure data
+/// @param[in] i_pstate => pstate values
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_compute_PsVDMJumpSlopes(
LocalPstateParmBlock* io_lppb,
uint8_t* i_pstate);
+
// p9_pstate_wof_initialization
+/// -------------------------------------------------------------------
+/// @brief WOF table initialization
+/// @param[in] i_gppb => pointer to GPPB strucure
+/// @param[out] o_buf => wof data
+/// @param[in/out] io_size => total wof data size
+/// @param[out] o_state => pstate attribute values
+/// @param[in] i_base_state_frequency => base frequency value
+/// @return void
+/// -------------------------------------------------------------------
void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
uint8_t* o_buf,
uint32_t& io_size,
@@ -626,6 +689,13 @@ void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
const uint32_t i_base_state_frequency);
// p9_pstate_set_global_feature_attributes
+/// -------------------------------------------------------------------
+/// @brief Set the global pstate attributes
+/// @param[in] i_target => Proc target
+/// @param[in] i_state => pstate attribute states
+/// @param[out] o_qm_flags => Quad manager flags
+/// @return fapi::ReturnCode: FAPI2_RC_SUCCESS if success, else error code.
+/// -------------------------------------------------------------------
fapi2::ReturnCode
p9_pstate_set_global_feature_attributes(
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml
index f83220621..eb177158b 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_pstate_parameter_block_errors.xml
@@ -24,24 +24,97 @@
<!-- IBM_PROLOG_END_TAG -->
<!-- Error definitions for p9_pstate_parameter_block procedure -->
+
+
+<!--
+ Notes on callout/deconfigure/gard.
+
+ To boot the computer, good #V is needed. If failures occur, the chip and/or
+ its VPD contents is the likely suspect. The chip is called out, deconfigured,
+ and garded to allow the remainder of the computer to boot and be used.
+
+ If IQ VPD accesses or the validity checking are in error, the computer can
+ still boot but WOF will be disabled. The chip is called out but it is NOT
+ deconfigured or garded.
+
+ If #W VPD accesses or the validity checking are in error, the computer can
+ still boot but WOF and/or VDMs will be disabled depending on the portion of
+ #W in error. The chip is called out (due to VPD error) but it is NOT
+ deconfigured or garded.
+
+ If WOF Table accesses or contents are in error, the computer can still boot
+ but WOF will be disabled. As the WOF tables are part of the code, CODE
+ is called out nothing is deconfigured or garded.
+-->
+
<hwpErrors>
<!-- ******************************************************************** -->
<hwpError>
- <rc>RC_PSTATE_PB_GET_MVPD_FOR_POUND_V_FAILED</rc>
- <description>MVPD function failed to read #V VPD</description>
+ <rc>RC_PSTATE_MVPD_CHIPLET_VOLTAGE_NOT_EQUAL</rc>
+ <description>#V data is not same across EQ chiplets</description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CURRENT_EQ_CHIPLET_TARGET</ffdc>
+ <ffdc>FIRST_EQ_CHIPLET_TARGET</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>CHIP_TARGET</target>
+ </deconfigure>
+ <gard>
+ <target>CHIP_TARGET</target>
+ </gard>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_BIASED_POUNDV_SLOPE_ERROR</rc>
+ <description>During #V Biased data validity checking, the data did not have at or
+ increasing slopes (eg Power Save LE Nominal LE Turbo LE UltraTurbo).
+ Pstates are being disabled.
+ </description>
<ffdc>CHIP_TARGET</ffdc>
- <ffdc>PRESENT_CHIPLETS</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>POINT</ffdc>
+ <ffdc>FREQUENCY_A</ffdc>
+ <ffdc>VDD_A</ffdc>
+ <ffdc>IDD_A</ffdc>
+ <ffdc>VCS_A</ffdc>
+ <ffdc>ICS_A</ffdc>
+ <ffdc>FREQUENCY_B</ffdc>
+ <ffdc>VDD_B</ffdc>
+ <ffdc>IDD_B</ffdc>
+ <ffdc>VCS_B</ffdc>
+ <ffdc>ICS_B</ffdc>
<callout>
<target>CHIP_TARGET</target>
<priority>HIGH</priority>
</callout>
</hwpError>
<!-- ******************************************************************** -->
+
<hwpError>
- <rc>RC_PSTATE_PB_NO_PRESENT_CHIPLETS_ERROR</rc>
- <description>No cores are present from which to read #V VPD</description>
+ <rc>RC_PSTATE_PB_POUNDV_SLOPE_ERROR</rc>
+ <description>During #V validity checking, the data did not have at or
+ increasing slopes (eg Power Save LE Nominal LE Turbo LE UltraTurbo).
+ Pstates are being disabled.
+ </description>
<ffdc>CHIP_TARGET</ffdc>
- <ffdc>PRESENT_CHIPLETS</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>POINT</ffdc>
+ <ffdc>FREQUENCY_A</ffdc>
+ <ffdc>VDD_A</ffdc>
+ <ffdc>IDD_A</ffdc>
+ <ffdc>VCS_A</ffdc>
+ <ffdc>ICS_A</ffdc>
+ <ffdc>FREQUENCY_B</ffdc>
+ <ffdc>VDD_B</ffdc>
+ <ffdc>IDD_B</ffdc>
+ <ffdc>VCS_B</ffdc>
+ <ffdc>ICS_B</ffdc>
<callout>
<target>CHIP_TARGET</target>
<priority>HIGH</priority>
@@ -49,8 +122,49 @@
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
+ <rc>RC_PSTATE_PB_POUNDV_ZERO_ERROR</rc>
+ <description>During #V validity checking, one or more required fields
+ were found to contain zero contents. Pstates are being disabled.
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>POINT</ffdc>
+ <ffdc>FREQUENCY</ffdc>
+ <ffdc>VDD</ffdc>
+ <ffdc>IDD</ffdc>
+ <ffdc>VCS</ffdc>
+ <ffdc>ICS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+<!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_BIASED_POUNDV_ZERO_ERROR</rc>
+ <description>During #V Biased data validity checking, one or more required fields
+ were found to contain zero contents. Pstates are being disabled.
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>POINT</ffdc>
+ <ffdc>FREQUENCY</ffdc>
+ <ffdc>VDD</ffdc>
+ <ffdc>IDD</ffdc>
+ <ffdc>VCS</ffdc>
+ <ffdc>ICS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+
+ <!-- ******************************************************************** -->
+ <hwpError>
<rc>RC_PSTATE_PB_POUNDV_WOF_UT_ERROR</rc>
- <description>WOF was intending to be enable but could not due to #V validity
+ <description>WOF was intending to be enabled but could not due to #V validity
checking issue of the UltraTurbo content. The machine continues as
functional but with WOF disabled.
</description>
@@ -62,11 +176,37 @@
<ffdc>IDD</ffdc>
<ffdc>VCS</ffdc>
<ffdc>ICS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_BIASED_POUNDV_WOF_UT_ERROR</rc>
+ <description>WOF was intending to be enabled but could not due to #V validity
+ checking issue of the biased UltraTurbo content. The machine continues as
+ functional but with WOF disabled.
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>CHIPLET_NUMBER</ffdc>
+ <ffdc>BUCKET</ffdc>
+ <ffdc>FREQUENCY</ffdc>
+ <ffdc>VDD</ffdc>
+ <ffdc>IDD</ffdc>
+ <ffdc>VCS</ffdc>
+ <ffdc>ICS</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
<rc>RC_PSTATE_PB_WOF_HEADER_DATA_INVALID</rc>
- <description>WOF Header data is invalid</description>
+ <description>WOF Header data is invalid. The machine continues as
+ functional but with WOF disabled.
+ </description>
<ffdc>CHIP_TARGET</ffdc>
<ffdc>MAGIC_NUMBER</ffdc>
<ffdc>VERSION</ffdc>
@@ -75,32 +215,36 @@
<ffdc>VFRT_DATA_SIZE</ffdc>
<ffdc>QUADS_ACTIVE_SIZE</ffdc>
<ffdc>CORE_COUNT</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
<rc>RC_PSTATE_PB_VFRT_HEADER_DATA_INVALID</rc>
- <description>VFRT Header data is invalid</description>
+ <description>VFRT Header data is invalid. The machine continues as
+ functional but with WOF disabled.
+ </description>
<ffdc>CHIP_TARGET</ffdc>
<ffdc>MAGIC_NUMBER</ffdc>
<ffdc>VFRT_INDEX</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
-
<!-- ******************************************************************** -->
<hwpError>
- <rc>RC_PSTATE_PB_FUNCTION_FAIL</rc>
- <description>pstate parameter sub function failed
+ <rc>RC_PSTATE_PB_WOF_TABLE_ACCESS_FAIL</rc>
+ <description>Pstate Parameter Block ATTR_WOF_TABLE_DATA attribute access failed
</description>
<ffdc>CHIP_TARGET</ffdc>
<ffdc>FAPI_RC</ffdc>
- </hwpError>
- <!-- ******************************************************************** -->
- <hwpError>
- <rc>RC_PSTATE_MVPD_CHIPLET_VOLTAGE_NOT_EQUAL</rc>
- <description>#V data is not same across EQ chiplets</description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>CURRENT_EQ_CHIPLET_TARGET</ffdc>
- <ffdc>FIRST_EQ_CHIPLET_TARGET</ffdc>
- <ffdc>BUCKET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
@@ -111,6 +255,22 @@
<ffdc>GOOD_QUADS_PER_SORT</ffdc>
<ffdc>GOOD_NORMAL_CORES_PER_SORT</ffdc>
<ffdc>GOOD_CACHES_PER_SORT</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
+ <rc>RC_PSTATE_PB_IQ_ACCESS_ERROR</rc>
+ <description>pstate parameter accesses within proc_get_mvpd_iddq failed
+ </description>
+ <ffdc>CHIP_TARGET</ffdc>
+ <ffdc>FAPI_RC</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
@@ -149,6 +309,10 @@
<ffdc>POWERSAVE_VID_COMPARE_IVID_VALUE</ffdc>
<ffdc>TURBO_VID_COMPARE_IVID_VALUE</ffdc>
<ffdc>ULTRA_VID_COMPARE_IVID_VALUE</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
@@ -159,12 +323,13 @@
<ffdc>POWERSAVE_VID_COMPARE_IVID_VALUE</ffdc>
<ffdc>TURBO_VID_COMPARE_IVID_VALUE</ffdc>
<ffdc>ULTRA_VID_COMPARE_IVID_VALUE</ffdc>
- </hwpError>
- <!-- ******************************************************************** -->
- <hwpError> <callout>
+ <callout>
<target>CHIP_TARGET</target>
<priority>HIGH</priority>
</callout>
+ </hwpError>
+ <!-- ******************************************************************** -->
+ <hwpError>
<rc>RC_PSTATE_PB_POUND_W_INVALID_THRESHOLD_VALUE</rc>
<description>#W threshold values are invalid</description>
<ffdc>CHIP_TARGET</ffdc>
@@ -173,6 +338,10 @@
<ffdc>VDM_SMALL</ffdc>
<ffdc>VDM_EXTREME</ffdc>
<ffdc>VDM_LARGE</ffdc>
+ <callout>
+ <target>CHIP_TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
@@ -184,59 +353,26 @@
<ffdc>VDM_NORMAL_LARGE</ffdc>
<ffdc>VDM_LARGE_SMALL</ffdc>
<ffdc>VDM_SMALL_NORMAL</ffdc>
- </hwpError>
- <!-- ******************************************************************** -->
- <hwpError>
- <rc>RC_PSTATE_PB_POUNDV_ZERO_ERROR</rc>
- <description>During #V validity checking, one or more required fields
- were found to contain zero contents. Pstates are being disabled.
- </description>
- <ffdc>CHIP_TARGET</ffdc>
- <ffdc>CHIPLET_NUMBER</ffdc>
- <ffdc>BUCKET</ffdc>
- <ffdc>POINT</ffdc>
- <ffdc>FREQUENCY</ffdc>
- <ffdc>VDD</ffdc>
- <ffdc>IDD</ffdc>
- <ffdc>VCS</ffdc>
- <ffdc>ICS</ffdc>
<callout>
<target>CHIP_TARGET</target>
<priority>HIGH</priority>
</callout>
</hwpError>
- <!-- ******************************************************************** -->
+ <!-- ******************************************************************** -->
<hwpError>
- <rc>RC_PSTATE_PB_POUNDV_SLOPE_ERROR</rc>
- <description>During #V validity checking, the data did not have at or
- increasing slopes (eg Power Save LE Nominal LE Turbo LE UltraTurbo).
- Pstates are being disabled.
+ <rc>RC_PSTATE_PB_POUND_W_ACCESS_FAIL</rc>
+ <description>pstate parameter accesses within proc_get_mvpd_poundw failed
</description>
<ffdc>CHIP_TARGET</ffdc>
- <ffdc>CHIPLET_NUMBER</ffdc>
- <ffdc>BUCKET</ffdc>
- <ffdc>POINT</ffdc>
- <ffdc>FREQUENCY_A</ffdc>
- <ffdc>VDD_A</ffdc>
- <ffdc>IDD_A</ffdc>
- <ffdc>VCS_A</ffdc>
- <ffdc>ICS_A</ffdc>
- <ffdc>FREQUENCY_B</ffdc>
- <ffdc>VDD_B</ffdc>
- <ffdc>IDD_B</ffdc>
- <ffdc>VCS_B</ffdc>
- <ffdc>ICS_B</ffdc>
+ <ffdc>FAPI_RC</ffdc>
<callout>
<target>CHIP_TARGET</target>
<priority>HIGH</priority>
</callout>
- </hwpError>
- <!-- ******************************************************************** -->
- <hwpError>
- <rc>RC_PSTATE_PB_WOF_VFRT_ERROR</rc>
- <description>The WOF VFRT
- </description>
- <ffdc>CHIP_TARGET</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
</hwpError>
<!-- ******************************************************************** -->
<hwpError>
@@ -288,17 +424,4 @@
</callout>
</hwpError>
<!-- ******************************************************************** -->
- <hwpError>
- <rc>RC_PSTATE_PB_FREQ2PS_GT_PSTATE_MAX_ERROR</rc>
- <description>The calculated Pstate is greater than the allowed maximum.
- </description>
- <ffdc>FREQ</ffdc>
- <ffdc>PSTATE32</ffdc>
- <ffdc>PSTATE</ffdc>
- <callout>
- <procedure>CODE</procedure>
- <priority>HIGH</priority>
- </callout>
- </hwpError>
- <!-- ******************************************************************** -->
</hwpErrors>
OpenPOWER on IntegriCloud