[Skiboot] [PATCH] occ: Filter out entries from Pmin to Pmax in pstate table

Shilpasri G Bhat shilpa.bhat at linux.vnet.ibm.com
Sat Apr 16 03:12:10 AEST 2016


Parse the entire pstate table provided by OCC and filter out the
entries that are outside the Pmax and Pmin limits. This can
occur when turbo mode is disabled and OCC limits the Pmax to
nominal pstate, but includes turbo pstates in the pstate table.
We end up with wrong pstates in such cases if we do not parse
the pstate table to filter out the correct range.

Signed-off-by: Shilpasri G Bhat <shilpa.bhat at linux.vnet.ibm.com>
---
 hw/occ.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/hw/occ.c b/hw/occ.c
index 03240b3..3329c5f 100644
--- a/hw/occ.c
+++ b/hw/occ.c
@@ -155,7 +155,7 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
 	u8 *dt_vdd, *dt_vcs;
 	s8 *dt_core_max = NULL;
 	bool rc, ultra_turbo_en;
-	int i;
+	int i, j;
 
 	prlog(PR_DEBUG, "OCC: CPU pstate state device tree init\n");
 
@@ -243,11 +243,15 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
 			dt_core_max[i] = occ_data->core_max[i];
 	}
 
-	for( i=0; i < nr_pstates; i++) {
-		dt_id[i] = occ_data->pstates[i].id;
-		dt_freq[i] = occ_data->pstates[i].freq_khz/1000;
-		dt_vdd[i] = occ_data->pstates[i].vdd;
-		dt_vcs[i] = occ_data->pstates[i].vcs;
+	for (i = 0, j = 0; i < MAX_PSTATES && j < nr_pstates; i++) {
+		if (occ_data->pstates[i].id > pmax ||
+		    occ_data->pstates[i].id < occ_data->pstate_min)
+			continue;
+		dt_id[j] = occ_data->pstates[i].id;
+		dt_freq[j] = occ_data->pstates[i].freq_khz / 1000;
+		dt_vdd[j] = occ_data->pstates[i].vdd;
+		dt_vcs[j] = occ_data->pstates[i].vcs;
+		j++;
 	}
 
 	/* Add the device-tree entries */
-- 
1.9.3



More information about the Skiboot mailing list