summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRahul Batra <rbatra@us.ibm.com>2017-09-22 19:38:52 -0500
committerJoshua Hunsberger <jahunsbe@us.ibm.com>2017-10-23 19:24:00 -0500
commit1faad3a5ca8a28c311a85ccafae4159e5a52afe1 (patch)
treeecd8827c384b2c5fe12036569b2ed1c9fc1f8250
parentf70fda49d8410eeb8cec6ededa1970cd1cb5ec09 (diff)
downloadtalos-hcode-1faad3a5ca8a28c311a85ccafae4159e5a52afe1.tar.gz
talos-hcode-1faad3a5ca8a28c311a85ccafae4159e5a52afe1.zip
PGPE: Roundoff Error Fix
Change-Id: I4b1f6c6bfe762f336978d2df6a4fc23f638ae7e2 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46653 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com> Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
-rw-r--r--import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_gppb.c13
-rw-r--r--import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c22
2 files changed, 31 insertions, 4 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_gppb.c b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_gppb.c
index c4d90d54..03db491e 100644
--- a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_gppb.c
+++ b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_gppb.c
@@ -66,9 +66,12 @@ uint32_t p9_pgpe_gppb_intp_vdd_from_ps(Pstate ps, uint8_t vpd_pt_set)
uint32_t vdd;
uint8_t r = p9_pgpe_gppb_get_ps_region(ps, vpd_pt_set);
+ //Round-up by adding 1/2
vdd = (((G_gppb->PStateVSlopes[vpd_pt_set][r]) *
- (-ps + G_gppb->operating_points_set[vpd_pt_set][r].pstate)) >> VID_SLOPE_FP_SHIFT_12)
- + G_gppb->operating_points_set[vpd_pt_set][r].vdd_mv;
+ (-ps + G_gppb->operating_points_set[vpd_pt_set][r].pstate)) >> (VID_SLOPE_FP_SHIFT_12 - 1)) +
+ (G_gppb->operating_points_set[vpd_pt_set][r].vdd_mv << 1) + 1;
+
+ vdd = vdd >> 1; //Shift back
return vdd;
}
@@ -106,9 +109,11 @@ uint8_t p9_pgpe_gppb_intp_ps_from_ext_vdd(uint16_t ext_vdd)
Pstate ps;
uint8_t r = p9_pgpe_gppb_get_ext_vdd_region(ext_vdd);
+ //Do the math using shifted by 1.
ps = -(((G_gppb->VPStateSlopes[VPD_PT_SET_BIASED_SYSP][r]) *
- (ext_vdd - G_gppb->operating_points_set[VPD_PT_SET_BIASED_SYSP][r].vdd_mv)) >> VID_SLOPE_FP_SHIFT_12)
- + G_gppb->operating_points_set[VPD_SLOPES_BIASED][r].pstate;
+ (ext_vdd - G_gppb->operating_points_set[VPD_PT_SET_BIASED_SYSP][r].vdd_mv)) >> (VID_SLOPE_FP_SHIFT_12 - 1)) +
+ (G_gppb->operating_points_set[VPD_SLOPES_BIASED][r].pstate << 1) ;
+ ps = ps >> 1;//Shift it back
return ps;
}
diff --git a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c
index 3b29f726..1c817786 100644
--- a/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c
+++ b/import/chips/p9/procedures/ppe_closed/pgpe/pstate_gpe/p9_pgpe_pstate.c
@@ -1219,6 +1219,17 @@ void p9_pgpe_pstate_do_step()
G_pgpe_pstate_record.eVidNext = G_pgpe_pstate_record.eVidCurr - G_gppb->ext_vrm_step_size_mv;
G_pgpe_pstate_record.globalPSNext = p9_pgpe_gppb_intp_ps_from_ext_vdd(G_pgpe_pstate_record.eVidNext);
+ //It's possible that the interpolation function returns Pstate higher than
+ //target due to rounding errors, so we adjust back.
+ if (G_pgpe_pstate_record.globalPSNext > G_pgpe_pstate_record.globalPSTarget)
+ {
+ G_pgpe_pstate_record.globalPSNext = G_pgpe_pstate_record.globalPSTarget;
+ }
+
+ //Make sure voltage written corresponds exactly to a pstate
+ G_pgpe_pstate_record.eVidNext = p9_pgpe_gppb_intp_vdd_from_ps(G_pgpe_pstate_record.globalPSNext,
+ VPD_PT_SET_BIASED_SYSP);
+
for (q = 0; q < MAX_QUADS; q++)
{
if(G_pgpe_pstate_record.activeQuads & QUAD_MASK(q))
@@ -1261,6 +1272,17 @@ void p9_pgpe_pstate_do_step()
G_pgpe_pstate_record.eVidNext = G_pgpe_pstate_record.eVidCurr + G_gppb->ext_vrm_step_size_mv;
G_pgpe_pstate_record.globalPSNext = p9_pgpe_gppb_intp_ps_from_ext_vdd(G_pgpe_pstate_record.eVidNext);
+ //It's possible that the interpolation function returns Pstate lower than
+ //target due to rounding errors, so we adjust back.
+ if (G_pgpe_pstate_record.globalPSNext < G_pgpe_pstate_record.globalPSTarget)
+ {
+ G_pgpe_pstate_record.globalPSNext = G_pgpe_pstate_record.globalPSTarget;
+ }
+
+ //Make sure voltage written corresponds exactly to a pstate
+ G_pgpe_pstate_record.eVidNext = p9_pgpe_gppb_intp_vdd_from_ps(G_pgpe_pstate_record.globalPSNext,
+ VPD_PT_SET_BIASED_SYSP);
+
for (q = 0; q < MAX_QUADS; q++)
{
if(G_pgpe_pstate_record.activeQuads & QUAD_MASK(q))
OpenPOWER on IntegriCloud