aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristen Carlson Accardi <kristen@linux.intel.com>2015-09-09 14:41:22 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-09-09 16:56:18 -0400
commit74da56ce5c6715630aed3ccc0fcb86a9210c1a56 (patch)
tree142d126a6f6d8612fcfe5c24cdac6d344dd14749
parent43717aadd2bc87fb10fbf1cd815c1cbae9bb95b3 (diff)
intel_pstate: fix PCT_TO_HWP macro
PCT_TO_HWP does not take the actual range of pstates exported by HWP_CAPABILITIES in account, and is broken on most platforms. Remove the macro and set the min and max pstate for hwp by determining the range and adjusting by the min and max percent limits values. Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/cpufreq/intel_pstate.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index 63075cc4a476..27faee5f0e23 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -260,24 +260,31 @@ static inline void update_turbo_state(void)
260 cpu->pstate.max_pstate == cpu->pstate.turbo_pstate); 260 cpu->pstate.max_pstate == cpu->pstate.turbo_pstate);
261} 261}
262 262
263#define PCT_TO_HWP(x) (x * 255 / 100)
264static void intel_pstate_hwp_set(void) 263static void intel_pstate_hwp_set(void)
265{ 264{
266 int min, max, cpu; 265 int min, hw_min, max, hw_max, cpu, range, adj_range;
267 u64 value, freq; 266 u64 value, cap;
267
268 rdmsrl(MSR_HWP_CAPABILITIES, cap);
269 hw_min = HWP_LOWEST_PERF(cap);
270 hw_max = HWP_HIGHEST_PERF(cap);
271 range = hw_max - hw_min;
268 272
269 get_online_cpus(); 273 get_online_cpus();
270 274
271 for_each_online_cpu(cpu) { 275 for_each_online_cpu(cpu) {
272 rdmsrl_on_cpu(cpu, MSR_HWP_REQUEST, &value); 276 rdmsrl_on_cpu(cpu, MSR_HWP_REQUEST, &value);
273 min = PCT_TO_HWP(limits.min_perf_pct); 277 adj_range = limits.min_perf_pct * range / 100;
278 min = hw_min + adj_range;
274 value &= ~HWP_MIN_PERF(~0L); 279 value &= ~HWP_MIN_PERF(~0L);
275 value |= HWP_MIN_PERF(min); 280 value |= HWP_MIN_PERF(min);
276 281
277 max = PCT_TO_HWP(limits.max_perf_pct); 282 adj_range = limits.max_perf_pct * range / 100;
283 max = hw_min + adj_range;
278 if (limits.no_turbo) { 284 if (limits.no_turbo) {
279 rdmsrl( MSR_HWP_CAPABILITIES, freq); 285 hw_max = HWP_GUARANTEED_PERF(cap);
280 max = HWP_GUARANTEED_PERF(freq); 286 if (hw_max < max)
287 max = hw_max;
281 } 288 }
282 289
283 value &= ~HWP_MAX_PERF(~0L); 290 value &= ~HWP_MAX_PERF(~0L);