summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
diff options
context:
space:
mode:
authorGreg Still <stillgs@us.ibm.com>2017-08-08 14:37:33 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-08-09 13:24:01 -0400
commite276a9bbce83803dca7fb399c5b69a174b4ade4b (patch)
treefb415625eaceb5ea06c649f7472337936369cdc0 /src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
parent872829e8abd422322ad8631ec42d2c102f63c6b5 (diff)
downloadtalos-hostboot-e276a9bbce83803dca7fb399c5b69a174b4ade4b.tar.gz
talos-hostboot-e276a9bbce83803dca7fb399c5b69a174b4ade4b.zip
WOF: p9_pstate_parameter - fix Iac zero checking
- Rearrange validity checking so that when VDMs are enabled but WOF is enabled, the Iac AC and DC values for WOF are still read from #W - Added explict error points when any of these these values are zero Change-Id: Iedf44da24f7445effb0c44ce9710dd26ea383240 CQ: SW398354 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44375 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: BRIAN D. VICTOR <brian.d.victor1@ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/44379 Reviewed-by: Hostboot Team <hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C')
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C477
1 files changed, 273 insertions, 204 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 21aede9f6..72a9f6d22 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
@@ -1219,14 +1219,7 @@ proc_get_mvpd_iddq( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
uint8_t* l_buffer_iq_c = reinterpret_cast<uint8_t*>(malloc(IQ_BUFFER_ALLOC));
uint32_t l_record = 0;
uint32_t l_bufferSize_iq = IQ_BUFFER_ALLOC;
- uint8_t i, j;
- const char* idd_meas_str[IDDQ_MEASUREMENTS] = IDDQ_ARRAY_VOLTAGES_STR;
- char l_buffer_str[256]; // Temporary formatting string buffer
- char l_line_str[256]; // Formatted output line string
- static const uint32_t IDDQ_DESC_SIZE = 56;
- static const uint32_t IDDQ_QUAD_SIZE = IDDQ_DESC_SIZE -
- strlen("Quad X:");
// --------------------------------------------
// Process IQ Keyword (IDDQ) Data
@@ -1277,193 +1270,8 @@ proc_get_mvpd_iddq( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
}
- // get IQ version and advance pointer 1-byte
- FAPI_INF(" IDDQ Version Number = %u", io_iddqt->iddq_version);
- FAPI_INF(" Sort Info: Good Quads = %02d Good Cores = %02d Good Caches = %02d",
- io_iddqt->good_quads_per_sort,
- io_iddqt->good_normal_cores_per_sort,
- io_iddqt->good_caches_per_sort);
-
- // get number of good normal cores in each quad
- strcpy(l_line_str, " Good normal cores:");
- strcpy(l_buffer_str, "");
-
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- sprintf(l_buffer_str, " Quad %d = %u ", i, io_iddqt->good_normal_cores[i]);
- strcat(l_line_str, l_buffer_str);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get number of good caches in each quad
- strcpy(l_line_str, " Good caches: ");
- strcpy(l_buffer_str, "");
-
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- sprintf(l_buffer_str, " Quad %d = %u ", i, io_iddqt->good_caches[i]);
- strcat(l_line_str, l_buffer_str);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get RDP TO TDP scalling factor
- FAPI_INF(" RDP TO TDP scalling factor = %u", revle16(io_iddqt->rdp_to_tdp_scale_factor));
-
- // get WOF IDDQ margin factor
- FAPI_INF(" WOF IDDQ margin factor = %u", revle16(io_iddqt->wof_iddq_margin_factor));
-
- // get VDD Temperature scaling factor
- FAPI_INF(" VDD Temperature scaling factor = %u", revle16(io_iddqt->vdd_temperature_scale_factor));
-
- // get VDN Temperature scaling factor
- FAPI_INF(" VDN Temperature scaling factor = %u", revle16(io_iddqt->vdn_temperature_scale_factor));
-
- // All IQ IDDQ measurements are at 5mA resolution. The OCC wants to
- // consume these at 1mA values. thus, all values are multiplied by
- // 5 upon installation into the paramater block.
- static const uint32_t CONST_5MA_1MA = 5;
- FAPI_INF(" IDDQ data is converted 5mA units to 1mA units");
-
- // Put out the measurement voltages to the trace.
- strcpy(l_line_str, " Measurement voltages:");
- sprintf(l_buffer_str, "%-*s", IDDQ_DESC_SIZE, l_line_str);
- strcpy(l_line_str, l_buffer_str);
- strcpy(l_buffer_str, "");
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- sprintf(l_buffer_str, " %sV", idd_meas_str[i]);
- strcat(l_line_str, l_buffer_str);
- }
-
- FAPI_INF("%s", l_line_str);
-
-#define IDDQ_CURRENT_EXTRACT(_member) \
- io_iddqt->_member = revle16(io_iddqt->_member) * CONST_5MA_1MA; \
- sprintf(l_buffer_str, " %04u ", io_iddqt->_member); \
- strcat(l_line_str, l_buffer_str);
-
-#define IDDQ_TEMP_EXTRACT(_member) \
- sprintf(l_buffer_str, " %04u ", io_iddqt->_member); \
- strcat(l_line_str, l_buffer_str);
-
-#define IDDQ_TRACE(string, size) \
- strcpy(l_line_str, string); \
- sprintf(l_buffer_str, "%-*s", size, l_line_str);\
- strcpy(l_line_str, l_buffer_str); \
- strcpy(l_buffer_str, "");
-
- // get IVDDQ measurements with all good cores ON
- IDDQ_TRACE (" IDDQ all good cores ON:", IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_CURRENT_EXTRACT(ivdd_all_good_cores_on_caches_on[i]);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get IVDDQ measurements with all cores and caches OFF
- IDDQ_TRACE (" IVDDQ all cores and caches OFF:", IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_CURRENT_EXTRACT(ivdd_all_cores_off_caches_off[i]);
- }
-
- FAPI_INF("%s", l_line_str);;
-
- // get IVDDQ measurements with all good cores OFF and caches ON
- IDDQ_TRACE (" IVDDQ all good cores OFF and caches ON:", IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_CURRENT_EXTRACT(ivdd_all_good_cores_off_good_caches_on[i]);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get IVDDQ measurements with all good cores in each quad
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- IDDQ_TRACE (" IVDDQ all good cores ON and caches ON ", IDDQ_QUAD_SIZE);
- sprintf(l_buffer_str, "Quad %d:", i);
- strcat(l_line_str, l_buffer_str);
-
- for (j = 0; j < IDDQ_MEASUREMENTS; j++)
- {
- IDDQ_CURRENT_EXTRACT(ivdd_quad_good_cores_on_good_caches_on[i][j]);
- }
-
- FAPI_INF("%s", l_line_str);
- }
-
- // get IVDN data
- IDDQ_TRACE (" IVDN", IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_CURRENT_EXTRACT(ivdn[i]);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get average temperature measurements with all good cores ON
- IDDQ_TRACE (" Average temp all good cores ON:",IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_TEMP_EXTRACT(avgtemp_all_good_cores_on[i]);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get average temperature measurements with all cores and caches OFF
- IDDQ_TRACE (" Average temp all cores OFF, caches OFF:", IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_TEMP_EXTRACT(avgtemp_all_cores_off_caches_off[i]);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get average temperature measurements with all good cores OFF and caches ON
- IDDQ_TRACE (" Average temp all good cores OFF, caches ON:",IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_TEMP_EXTRACT(avgtemp_all_good_cores_off[i]);
- }
-
- FAPI_INF("%s", l_line_str);
-
- // get average temperature measurements with all good cores in each quad
- for (i = 0; i < MAXIMUM_QUADS; i++)
- {
- IDDQ_TRACE (" Average temp all good cores ON, good caches ON ",IDDQ_QUAD_SIZE);
- sprintf(l_buffer_str, "Quad %d:", i);
- strcat(l_line_str, l_buffer_str);
-
- for (j = 0; j < IDDQ_MEASUREMENTS; j++)
- {
- IDDQ_TEMP_EXTRACT(avgtemp_quad_good_cores_on[i][j]);
- }
-
- FAPI_INF("%s", l_line_str);
- }
-
- // get average nest temperature nest
- IDDQ_TRACE (" Average temp Nest:",IDDQ_DESC_SIZE);
-
- for (i = 0; i < IDDQ_MEASUREMENTS; i++)
- {
- IDDQ_TEMP_EXTRACT(avgtemp_vdn[i]);
- }
-
- FAPI_INF("%s", l_line_str);
+ // Put out the structure to the trace
+ iddq_print(io_iddqt);
fapi_try_exit:
@@ -2460,7 +2268,7 @@ gppb_print(GlobalPstateParmBlock* i_gppb)
revle32(i_gppb->vcs_sysparm.loadline_uohm));
strcat(l_buffer, l_temp_buffer);
- sprintf(l_temp_buffer, " %04X (%3d) ",
+ sprintf(l_temp_buffer, " %04X (%3d)i_iddqt ",
revle32(i_gppb->vdn_sysparm.loadline_uohm),
revle32(i_gppb->vdn_sysparm.loadline_uohm));
strcat(l_buffer, l_temp_buffer);
@@ -2816,7 +2624,212 @@ oppb_print(OCCPstateParmBlock* i_oppb)
FAPI_INF("---------------------------------------------------------------------------------------");
}
+/// Print an iddq_print structure on a given stream
+///
+/// \param i_iddqt pointer to Iddq structure to output
+void
+iddq_print(IddqTable* i_iddqt)
+{
+ uint32_t i, j;
+ const char* idd_meas_str[IDDQ_MEASUREMENTS] = IDDQ_ARRAY_VOLTAGES_STR;
+ char l_buffer_str[256]; // Temporary formatting string buffer
+ char l_line_str[256]; // Formatted output line string
+
+ static const uint32_t IDDQ_DESC_SIZE = 56;
+ static const uint32_t IDDQ_QUAD_SIZE = IDDQ_DESC_SIZE -
+ strlen("Quad X:");
+
+ // Put out the endian-corrected scalars
+
+ // get IQ version and advance pointer 1-byte
+ FAPI_INF(" IDDQ Version Number = %u", i_iddqt->iddq_version);
+ FAPI_INF(" Sort Info: Good Quads = %02d Good Cores = %02d Good Caches = %02d",
+ i_iddqt->good_quads_per_sort,
+ i_iddqt->good_normal_cores_per_sort,
+ i_iddqt->good_caches_per_sort);
+
+ // get number of good normal cores in each quad
+ strcpy(l_line_str, " Good normal cores:");
+ strcpy(l_buffer_str, "");
+
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ sprintf(l_buffer_str, " Quad %d = %u ", i, i_iddqt->good_normal_cores[i]);
+ strcat(l_line_str, l_buffer_str);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get number of good caches in each quad
+ strcpy(l_line_str, " Good caches: ");
+ strcpy(l_buffer_str, "");
+
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ sprintf(l_buffer_str, " Quad %d = %u ", i, i_iddqt->good_caches[i]);
+ strcat(l_line_str, l_buffer_str);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get RDP TO TDP scalling factor
+ FAPI_INF(" RDP TO TDP scalling factor = %u", revle16(i_iddqt->rdp_to_tdp_scale_factor));
+
+ // get WOF IDDQ margin factor
+ FAPI_INF(" WOF IDDQ margin factor = %u", revle16(i_iddqt->wof_iddq_margin_factor));
+
+ // get VDD Temperature scaling factor
+ FAPI_INF(" VDD Temperature scaling factor = %u", revle16(i_iddqt->vdd_temperature_scale_factor));
+
+ // get VDN Temperature scaling factor
+ FAPI_INF(" VDN Temperature scaling factor = %u", revle16(i_iddqt->vdn_temperature_scale_factor));
+
+ // All IQ IDDQ measurements are at 5mA resolution. The OCC wants to
+ // consume these at 1mA values. thus, all values are multiplied by
+ // 5 upon installation into the paramater block.
+ static const uint32_t CONST_5MA_1MA = 5;
+ FAPI_INF(" IDDQ data is converted 5mA units to 1mA units");
+
+ // Put out the measurement voltages to the trace.
+ strcpy(l_line_str, " Measurement voltages:");
+ sprintf(l_buffer_str, "%-*s", IDDQ_DESC_SIZE, l_line_str);
+ strcpy(l_line_str, l_buffer_str);
+ strcpy(l_buffer_str, "");
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ sprintf(l_buffer_str, " %*sV", 5, idd_meas_str[i]);
+ strcat(l_line_str, l_buffer_str);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+#define IDDQ_CURRENT_EXTRACT(_member) \
+ i_iddqt->_member = revle16(i_iddqt->_member) * CONST_5MA_1MA; \
+ sprintf(l_buffer_str, " %05u ", i_iddqt->_member); \
+ strcat(l_line_str, l_buffer_str);
+
+#define IDDQ_TEMP_EXTRACT(_member) \
+ sprintf(l_buffer_str, " %05u ", i_iddqt->_member); \
+ strcat(l_line_str, l_buffer_str);
+
+#define IDDQ_TRACE(string, size) \
+ strcpy(l_line_str, string); \
+ sprintf(l_buffer_str, "%-*s", size, l_line_str);\
+ strcpy(l_line_str, l_buffer_str); \
+ strcpy(l_buffer_str, "");
+
+ // get IVDDQ measurements with all good cores ON
+ IDDQ_TRACE (" IDDQ all good cores ON:", IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_all_good_cores_on_caches_on[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get IVDDQ measurements with all cores and caches OFF
+ IDDQ_TRACE (" IVDDQ all cores and caches OFF:", IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_all_cores_off_caches_off[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);;
+
+ // get IVDDQ measurements with all good cores OFF and caches ON
+ IDDQ_TRACE (" IVDDQ all good cores OFF and caches ON:", IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_all_good_cores_off_good_caches_on[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get IVDDQ measurements with all good cores in each quad
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ IDDQ_TRACE (" IVDDQ all good cores ON and caches ON ", IDDQ_QUAD_SIZE);
+ sprintf(l_buffer_str, "Quad %d:", i);
+ strcat(l_line_str, l_buffer_str);
+
+ for (j = 0; j < IDDQ_MEASUREMENTS; j++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdd_quad_good_cores_on_good_caches_on[i][j]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+ }
+
+ // get IVDN data
+ IDDQ_TRACE (" IVDN", IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_CURRENT_EXTRACT(ivdn[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get average temperature measurements with all good cores ON
+ IDDQ_TRACE (" Average temp all good cores ON:",IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_all_good_cores_on[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get average temperatur}e measurements with all cores and caches OFF
+ IDDQ_TRACE (" Average temp all cores OFF, caches OFF:", IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_all_cores_off_caches_off[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get average temperature measurements with all good cores OFF and caches ON
+ IDDQ_TRACE (" Average temp all good cores OFF, caches ON:",IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_all_good_cores_off[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+
+ // get average temperature measurements with all good cores in each quad
+ for (i = 0; i < MAXIMUM_QUADS; i++)
+ {
+ IDDQ_TRACE (" Average temp all good cores ON, good caches ON ",IDDQ_QUAD_SIZE);
+ sprintf(l_buffer_str, "Quad %d:", i);
+ strcat(l_line_str, l_buffer_str);
+
+ for (j = 0; j < IDDQ_MEASUREMENTS; j++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_quad_good_cores_on[i][j]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+ }
+
+ // get average nest temperature nest
+ IDDQ_TRACE (" Average temp Nest:",IDDQ_DESC_SIZE);
+
+ for (i = 0; i < IDDQ_MEASUREMENTS; i++)
+ {
+ IDDQ_TEMP_EXTRACT(avgtemp_vdn[i]);
+ }
+
+ FAPI_INF("%s", l_line_str);
+}
// Convert frequency to Pstate number
///
@@ -2878,6 +2891,8 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
const uint16_t VDM_VOLTAGE_IN_MV = 512;
const uint16_t VDM_GRANULARITY = 4;
+ const char* pv_op_str[NUM_OP_POINTS] = PV_OP_ORDER_STR;
+
FAPI_INF(">> proc_get_mvpd_poundw");
do
@@ -2930,15 +2945,6 @@ 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())
- {
- 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,
@@ -2968,6 +2974,69 @@ proc_get_mvpd_poundw(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target
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())
+ {
+ bool b_tdp_ac = true;
+ bool b_tdp_dc = true;
+ // Check that the WOF currents are non-zero
+ for (auto p = 0; p < NUM_OP_POINTS; ++p)
+ {
+ FAPI_INF("%s ivdd_tdp_ac_current %5d (10mA) %6.2f (A)",
+ pv_op_str[p],
+ revle16(o_data->poundw[p].ivdd_tdp_ac_current_10ma),
+ ((double)revle16(o_data->poundw[p].ivdd_tdp_ac_current_10ma)/100));
+ FAPI_INF("%s ivdd_tdp_dc_current %5d (10mA) %6.2f (A)",
+ pv_op_str[p],
+ revle16(o_data->poundw[p].ivdd_tdp_dc_current_10ma),
+ ((double)revle16(o_data->poundw[p].ivdd_tdp_dc_current_10ma)/100));
+ if (!o_data->poundw[p].ivdd_tdp_ac_current_10ma)
+ {
+ FAPI_ERR("%s.ivdd_tdp_ac_current_10ma is zero!!!",
+ pv_op_str[p]);
+ b_tdp_ac = false;
+ o_state->iv_wof_enabled = false;
+
+ }
+ if (!o_data->poundw[p].ivdd_tdp_dc_current_10ma)
+ {
+ FAPI_ERR("%s.ivdd_tdp_dc_current_10ma is zero!!!",
+ pv_op_str[p]);
+ b_tdp_dc = false;
+ o_state->iv_wof_enabled = false;
+ }
+ }
+
+ FAPI_ASSERT_NOEXIT(b_tdp_ac,
+ fapi2::PSTATE_PB_POUND_W_TDP_IAC_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_NOMINAL_TDP_IAC(o_data->poundw[NOMINAL].ivdd_tdp_dc_current_10ma)
+ .set_POWERSAVE_TDP_IAC(o_data->poundw[POWERSAVE].ivdd_tdp_dc_current_10ma)
+ .set_TURBO_TDP_IAC(o_data->poundw[TURBO].ivdd_tdp_dc_current_10ma)
+ .set_ULTRA_TDP_IAC(o_data->poundw[ULTRA].ivdd_tdp_dc_current_10ma),
+ "Pstate Parameter Block #W : one or more Idd TDP AC values are zero");
+ FAPI_ASSERT_NOEXIT(b_tdp_dc,
+ fapi2::PSTATE_PB_POUND_W_TDP_IDC_INVALID(fapi2::FAPI2_ERRL_SEV_RECOVERED)
+ .set_CHIP_TARGET(i_target)
+ .set_NOMINAL_TDP_IDC(o_data->poundw[NOMINAL].ivdd_tdp_dc_current_10ma)
+ .set_POWERSAVE_TDP_IDC(o_data->poundw[POWERSAVE].ivdd_tdp_dc_current_10ma)
+ .set_TURBO_TDP_IDC(o_data->poundw[TURBO].ivdd_tdp_dc_current_10ma)
+ .set_ULTRA_TDP_IDC(o_data->poundw[ULTRA].ivdd_tdp_dc_current_10ma),
+ "Pstate Parameter Block #W : one or more Idd TDP DC values are zero");
+
+ // Set the return code to success to keep going.
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+ }
+
+ // 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())
+ {
+ FAPI_INF(" proc_get_mvpd_poundw: VDM is disabled. Skipping remaining checks");
+ o_state->iv_vdm_enabled = false;
+ break;
+ }
+
FAPI_INF("POWERSAVE.vdm_vid_compare_ivid %d",o_data->poundw[POWERSAVE].vdm_vid_compare_ivid);
FAPI_INF("NOMINAL.vdm_vid_compare_ivid %d",o_data->poundw[NOMINAL].vdm_vid_compare_ivid);
FAPI_INF("TURBO.vdm_vid_compare_ivid %d",o_data->poundw[TURBO].vdm_vid_compare_ivid);
OpenPOWER on IntegriCloud