summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
diff options
context:
space:
mode:
authorPrasad Bg Ranganath <prasadbgr@in.ibm.com>2017-07-12 07:21:36 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-08-04 10:44:44 -0400
commit390fd421b3e8b679d5582824a0fac9a93e37f476 (patch)
treed4c066c0be6df3139c5ff7a292fdb951819d788d /src/import/chips/p9/procedures/hwp/pm/p9_pstate_parameter_block.C
parent0213ac4d1adbdac43a057cffd4df541c861eedbc (diff)
downloadtalos-hostboot-390fd421b3e8b679d5582824a0fac9a93e37f476.tar.gz
talos-hostboot-390fd421b3e8b679d5582824a0fac9a93e37f476.zip
WOF: Vfrt header check in PPB
- Added validation checks error be more pointed for #V - Bug fix vfrt data print code - updated review comment Change-Id: I52f68b03a38c89607fce8fab1aae7741fe6192ef Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43027 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: BRIAN D. VICTOR <brian.d.victor1@ibm.com> Reviewed-by: RAHUL BATRA <rbatra@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/43030 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-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.C64
1 files changed, 47 insertions, 17 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 76fb2d26f..d766231cd 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
@@ -813,6 +813,19 @@ void p9_pstate_wof_initialization (const GlobalPstateParmBlock* i_gppb,
((*l_wof_table_data) + l_wof_table_index),
&l_vfrt,
i_base_state_frequency);
+
+ // 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
memcpy(o_buf + l_index, &l_vfrt, sizeof (l_vfrt));
@@ -1644,14 +1657,6 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
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(" f=%u <= f=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][0],
- i_chiplet_mvpd_data[pv_op_order[i]][0]);
- FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][1],
- i_chiplet_mvpd_data[pv_op_order[i]][1], i_chiplet_mvpd_data[pv_op_order[i - 1]][2],
- i_chiplet_mvpd_data[pv_op_order[i]][2]);
- FAPI_INF(" v=%u <= v=%u i=%u <= i=%u", i_chiplet_mvpd_data[pv_op_order[i - 1]][3],
- i_chiplet_mvpd_data[pv_op_order[i]][3], i_chiplet_mvpd_data[pv_op_order[i - 1]][4],
- i_chiplet_mvpd_data[pv_op_order[i]][4]);
// 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))))
@@ -1663,9 +1668,34 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
i_chiplet_mvpd_data[pv_op_order[i - 1]][4] > i_chiplet_mvpd_data[pv_op_order[i]][4] )
{
- FAPI_ERR("**** ERROR : Relationship error between #V operating point (%s <= %s)(power save <= nominal <= turbo <= ultraturbo) (chiplet = %u bucket id = %u op point = %u)",
+ FAPI_ERR("**** ERROR : Relationship error between #V operating point (%s > %s)(power save <= nominal <= turbo <= ultraturbo) (chiplet = %u bucket id = %u op point = %u)",
pv_op_str[pv_op_order[i - 1]], pv_op_str[pv_op_order[i]], i_chiplet_num, i_bucket_id,
pv_op_order[i]);
+#define POUNDV_SLOPE_CHECK(x,y) x > y ? " is GREATER (ERROR!) than " : " is less than "
+ FAPI_INF("%s Frequency value %u is %s %s Frequency value %u",
+ pv_op_str[pv_op_order[i - 1]], i_chiplet_mvpd_data[pv_op_order[i - 1]][0],
+ POUNDV_SLOPE_CHECK(i_chiplet_mvpd_data[pv_op_order[i - 1]][0], i_chiplet_mvpd_data[pv_op_order[i]][0]),
+ pv_op_str[pv_op_order[i]], i_chiplet_mvpd_data[pv_op_order[i]][0]);
+
+ FAPI_INF("%s VDD voltage value %u is %s %s Frequency value %u",
+ pv_op_str[pv_op_order[i - 1]], i_chiplet_mvpd_data[pv_op_order[i - 1]][1],
+ POUNDV_SLOPE_CHECK(i_chiplet_mvpd_data[pv_op_order[i - 1]][1], i_chiplet_mvpd_data[pv_op_order[i]][1]),
+ pv_op_str[pv_op_order[i]], i_chiplet_mvpd_data[pv_op_order[i]][1]);
+
+ FAPI_INF("%s VDD current value %u is %s %s Frequency value %u",
+ pv_op_str[pv_op_order[i - 1]], i_chiplet_mvpd_data[pv_op_order[i - 1]][2],
+ POUNDV_SLOPE_CHECK(i_chiplet_mvpd_data[pv_op_order[i - 1]][2], i_chiplet_mvpd_data[pv_op_order[i]][2]),
+ pv_op_str[pv_op_order[i]], i_chiplet_mvpd_data[pv_op_order[i]][2]);
+
+ FAPI_INF("%s VCS voltage value %u is %s %s Frequency value %u",
+ pv_op_str[pv_op_order[i - 1]], i_chiplet_mvpd_data[pv_op_order[i - 1]][3],
+ POUNDV_SLOPE_CHECK(i_chiplet_mvpd_data[pv_op_order[i - 1]][3], i_chiplet_mvpd_data[pv_op_order[i]][3]),
+ pv_op_str[pv_op_order[i]], i_chiplet_mvpd_data[pv_op_order[i]][3]);
+
+ FAPI_INF("%s VCS current value %u is %s %s Frequency value %u",
+ pv_op_str[pv_op_order[i - 1]], i_chiplet_mvpd_data[pv_op_order[i - 1]][4],
+ POUNDV_SLOPE_CHECK(i_chiplet_mvpd_data[pv_op_order[i - 1]][4], i_chiplet_mvpd_data[pv_op_order[i]][4]),
+ pv_op_str[pv_op_order[i]], i_chiplet_mvpd_data[pv_op_order[i]][4]);
o_state->iv_pstates_enabled = false;
@@ -1676,11 +1706,11 @@ proc_chk_valid_poundv(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_targe
.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]][0])
- .set_VDD_A(i_chiplet_mvpd_data[pv_op_order[i]][1])
- .set_IDD_A(i_chiplet_mvpd_data[pv_op_order[i]][2])
- .set_VCS_A(i_chiplet_mvpd_data[pv_op_order[i]][3])
- .set_ICS_A(i_chiplet_mvpd_data[pv_op_order[i]][4])
+ .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])
@@ -3173,8 +3203,8 @@ void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
// This function should exit if the input type is not "SYSTEM"
// Correct in Level 3 update.
- char l_buffer_str[512]; // Temporary formatting string buffer
- char l_line_str[512]; // Formatted output line string
+ char l_buffer_str[256]; // Temporary formatting string buffer
+ char l_line_str[256]; // Formatted output line string
strcpy(l_line_str, "VFRT:");
sprintf(l_buffer_str, " %X Ver/Type %X B5 %X B6 %X B7 %X",
@@ -3213,7 +3243,7 @@ void p9_pstate_update_vfrt(const GlobalPstateParmBlock* i_gppb,
// in a loop that is processing over 1000 tables, the first
// 8 gives a view that can correlate that the input data read
// is correct without overfilling the HB trace buffer.
- if ((l_index_1 + 1) == 8)
+ if (!((l_index_1 + 1) % 8))
{
FAPI_INF("%s", l_line_str);
strcpy(l_buffer_str, "");
OpenPOWER on IntegriCloud