cpufreq: intel_pstate: Get percpu max freq via HWP MSR register if available
Subsystems (2)
PATCH v3 1/1 cpufreq: intel_pstate: Get percpu max freq via HWP MSR register if available
Currently when turbo is disabled(either by BIOS or by the user), the intel_pstate driver reads the max non-turbo frequency from the package-wide MSR_PLATFORM_INFO(0xce) register. However on asymmetric platforms it is possible in theory that small and big core with HWP enabled might have different max non-turbo cpu frequency, because the MSR_HWP_CAPABILITIES is percpu scope according to Intel Software Developer Manual.
The turbo max freq is already percpu basis in current code, thus make similar change to the max non-turbo frequency as well.
---
v2: Per Srinivas' suggestion, avoid duplicated assignment of max_pstate.
v3: Per Rafael's suggestion, do not add new argument in intel_pstate_get_hwp_max()
to avoid redundant local vars.
Per Srinivas' suggestion, refined the commit log to reflect the 'non-turbo' max frequency.
--
drivers/cpufreq/intel_pstate.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/cpufreq/intel_pstate.c +3 -2
@@ -1724,11 +1724,9 @@ static void intel_pstate_max_within_limits(struct cpudata *cpu)static void intel_pstate_get_cpu_pstates (struct cpudata *cpu) { cpu->pstate.min_pstate = pstate_funcs.get_min (); - cpu->pstate.max_pstate = pstate_funcs.get_max (); cpu->pstate.max_pstate_physical = pstate_funcs.get_max_physical (); cpu->pstate.turbo_pstate = pstate_funcs.get_turbo (); cpu->pstate.scaling = pstate_funcs.get_scaling (); - cpu->pstate.max_freq = cpu->pstate.max_pstate * cpu->pstate.scaling;if (hwp_active && !hwp_mode_bdw) {unsigned int phy_max, current_max;
@@ -1736,9 +1734,12 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)intel_pstate_get_hwp_max (cpu, &phy_max, ¤t_max); cpu->pstate.turbo_freq = phy_max * cpu->pstate.scaling; cpu->pstate.turbo_pstate = phy_max; + cpu->pstate.max_pstate =HWP_GUARANTEED_PERF (READ_ONCE (cpu->hwp_cap_cached)); }else { cpu->pstate.turbo_freq = cpu->pstate.turbo_pstate * cpu->pstate.scaling; + cpu->pstate.max_pstate = pstate_funcs.get_max (); } + cpu->pstate.max_freq = cpu->pstate.max_pstate * cpu->pstate.scaling;if (pstate_funcs.get_aperf_mperf_shift) cpu->aperf_mperf_shift = pstate_funcs.get_aperf_mperf_shift ();
Signature · 1 line
2.17.1
Rafael J. Wysocki
maintainerQuoted 11 lines · Chen Yu
Currently when turbo is disabled(either by BIOS or by the user), the
intel_pstatedriver reads the max non-turbo frequency from the package-wideMSR_PLATFORM_INFO(0xce)register. However on asymmetric platforms it is possible in theory that small and big core with HWP enabled might have different max non-turbo cpu frequency, because theMSR_HWP_CAPABILITIESis percpu scope according to Intel Software Developer Manual.The turbo max freq is already percpu basis in current code, thus make similar change to the max non-turbo frequency as well.
Quoted 8 lines
Reported-by Wendy Wang <[email protected]>Signed-off-by Chen Yu <[email protected]>---
v2: Per Srinivas' suggestion, avoid duplicated assignment ofmax_pstate.
v3: Per Rafael's suggestion, do not add new argument inintel_pstate_get_hwp_max()
to avoid redundant local vars.
Per Srinivas' suggestion, refined the commit log to reflect the 'non-turbo' max frequency.
Looks good now, thanks!
Is it needed in -stable and if so, which -stable series should it go into?
Quoted 36 lines
--
drivers/cpufreq/intel_pstate.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)drivers/cpufreq/intel_pstate.c +3
-3@@ -1724,11 +1724,9 @@ static void intel_pstate_max_within_limits(struct cpudata *cpu)static void intel_pstate_get_cpu_pstates (struct cpudata *cpu) { cpu->pstate.min_pstate = pstate_funcs.get_min (); - cpu->pstate.max_pstate = pstate_funcs.get_max (); cpu->pstate.max_pstate_physical = pstate_funcs.get_max_physical (); cpu->pstate.turbo_pstate = pstate_funcs.get_turbo (); cpu->pstate.scaling = pstate_funcs.get_scaling (); - cpu->pstate.max_freq = cpu->pstate.max_pstate * cpu->pstate.scaling;if (hwp_active && !hwp_mode_bdw) {unsigned int phy_max, current_max;@@ -1736,9 +1734,12 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)intel_pstate_get_hwp_max (cpu, &phy_max, ¤t_max); cpu->pstate.turbo_freq = phy_max * cpu->pstate.scaling; cpu->pstate.turbo_pstate = phy_max; + cpu->pstate.max_pstate =HWP_GUARANTEED_PERF (READ_ONCE (cpu->hwp_cap_cached)); }else { cpu->pstate.turbo_freq = cpu->pstate.turbo_pstate * cpu->pstate.scaling; + cpu->pstate.max_pstate = pstate_funcs.get_max (); } + cpu->pstate.max_freq = cpu->pstate.max_pstate * cpu->pstate.scaling;if (pstate_funcs.get_aperf_mperf_shift) cpu->aperf_mperf_shift = pstate_funcs.get_aperf_mperf_shift (); --2.17.1
Quoted 21 lines · Rafael J. Wysocki
Quoted 11 lines · Chen Yu
Currently when turbo is disabled(either by BIOS or by the user), the
intel_pstatedriver reads the max non-turbo frequency from the package-wideMSR_PLATFORM_INFO(0xce)register. However on asymmetric platforms it is possible in theory that small and big core with HWP enabled might have different max non-turbo cpu frequency, because theMSR_HWP_CAPABILITIESis percpu scope according to Intel Software Developer Manual.The turbo max freq is already percpu basis in current code, thus make similar change to the max non-turbo frequency as well.
Quoted 8 lines
Reported-by Wendy Wang <[email protected]>Signed-off-by Chen Yu <[email protected]>---
v2: Per Srinivas' suggestion, avoid duplicated assignment ofmax_pstate.
v3: Per Rafael's suggestion, do not add new argument inintel_pstate_get_hwp_max()
to avoid redundant local vars.
Per Srinivas' suggestion, refined the commit log to reflect the 'non-turbo' max frequency.
Quoted 4 lines
Looks good now, thanks!
Is it needed in -stable and if so, which -stable series should it go into?
Yes, I think so, it should be
Cc: [email protected] # 4.18+
as the HWP reading turbo frequency was firstly introduced in v4.18-rc2 and it was easier to be applied.
BTW, this patch is on top of your previous patch set on intel_pstate clean up:
https://patchwork.kernel.org/project/linux-pm/list/?series=410797
thanks,
Chenyu
Rafael J. Wysocki
maintainerQuoted 25 lines · Chen Yu
Quoted 23 lines · Rafael J. Wysocki
Quoted 11 lines · Chen Yu
Currently when turbo is disabled(either by BIOS or by the user), the
intel_pstatedriver reads the max non-turbo frequency from the package-wideMSR_PLATFORM_INFO(0xce)register. However on asymmetric platforms it is possible in theory that small and big core with HWP enabled might have different max non-turbo cpu frequency, because theMSR_HWP_CAPABILITIESis percpu scope according to Intel Software Developer Manual.The turbo max freq is already percpu basis in current code, thus make similar change to the max non-turbo frequency as well.
Quoted 8 lines
Reported-by Wendy Wang <[email protected]>Signed-off-by Chen Yu <[email protected]>---
v2: Per Srinivas' suggestion, avoid duplicated assignment ofmax_pstate.
v3: Per Rafael's suggestion, do not add new argument inintel_pstate_get_hwp_max()
to avoid redundant local vars.
Per Srinivas' suggestion, refined the commit log to reflect the 'non-turbo' max frequency.Looks good now, thanks!
Quoted 8 lines
Quoted 2 lines
Is it needed in -stable and if so, which -stable series should it go into?
Yes, I think so, it should be
Cc: [email protected] # 4.18+
as the HWP reading turbo frequency was firstly introduced in v4.18-rc2 and it was easier to be applied.
BTW, this patch is on top of your previous patch set onintel_pstateclean up:
https://patchwork.kernel.org/project/linux-pm/list/?series=410797
OK, applied (with a few minor edits in the subject and changelog) as 5.12 material along with those patches , thanks!