提交 74da56ce 编写于 作者: K Kristen Carlson Accardi 提交者: Rafael J. Wysocki

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: NKristen Carlson Accardi <kristen@linux.intel.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 43717aad
...@@ -260,24 +260,31 @@ static inline void update_turbo_state(void) ...@@ -260,24 +260,31 @@ static inline void update_turbo_state(void)
cpu->pstate.max_pstate == cpu->pstate.turbo_pstate); cpu->pstate.max_pstate == cpu->pstate.turbo_pstate);
} }
#define PCT_TO_HWP(x) (x * 255 / 100)
static void intel_pstate_hwp_set(void) static void intel_pstate_hwp_set(void)
{ {
int min, max, cpu; int min, hw_min, max, hw_max, cpu, range, adj_range;
u64 value, freq; u64 value, cap;
rdmsrl(MSR_HWP_CAPABILITIES, cap);
hw_min = HWP_LOWEST_PERF(cap);
hw_max = HWP_HIGHEST_PERF(cap);
range = hw_max - hw_min;
get_online_cpus(); get_online_cpus();
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
rdmsrl_on_cpu(cpu, MSR_HWP_REQUEST, &value); rdmsrl_on_cpu(cpu, MSR_HWP_REQUEST, &value);
min = PCT_TO_HWP(limits.min_perf_pct); adj_range = limits.min_perf_pct * range / 100;
min = hw_min + adj_range;
value &= ~HWP_MIN_PERF(~0L); value &= ~HWP_MIN_PERF(~0L);
value |= HWP_MIN_PERF(min); value |= HWP_MIN_PERF(min);
max = PCT_TO_HWP(limits.max_perf_pct); adj_range = limits.max_perf_pct * range / 100;
max = hw_min + adj_range;
if (limits.no_turbo) { if (limits.no_turbo) {
rdmsrl( MSR_HWP_CAPABILITIES, freq); hw_max = HWP_GUARANTEED_PERF(cap);
max = HWP_GUARANTEED_PERF(freq); if (hw_max < max)
max = hw_max;
} }
value &= ~HWP_MAX_PERF(~0L); value &= ~HWP_MAX_PERF(~0L);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册