Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cpupower: Enable boost state support for AMD P-State module

The legacy ACPI hardware P-States function has 3 P-States on ACPI table,
the CPU frequency only can be switched between the 3 P-States. While the
processor supports the boost state, it will have another boost state
that the frequency can be higher than P0 state, and the state can be
decoded by the function of decode_pstates() and read by
amd_pci_get_num_boost_states().

However, the new AMD P-State function is different than legacy ACPI
hardware P-State on AMD processors. That has a finer grain frequency
range between the highest and lowest frequency. And boost frequency is
actually the frequency which is mapped on highest performance ratio. The
similar previous P0 frequency is mapped on nominal performance ratio.
If the highest performance on the processor is higher than nominal
performance, then we think the current processor supports the boost
state. And it uses amd_pstate_boost_init() to initialize boost for AMD
P-State function.

Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
Signed-off-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Huang Rui and committed by
Shuah Khan
bf9801ba 33e43f36

+25
+18
tools/power/cpupower/utils/helpers/amd.c
··· 175 175 MAX_AMD_PSTATE_VALUE_READ_FILES); 176 176 } 177 177 178 + void amd_pstate_boost_init(unsigned int cpu, int *support, int *active) 179 + { 180 + unsigned long highest_perf, nominal_perf, cpuinfo_min, 181 + cpuinfo_max, amd_pstate_max; 182 + 183 + highest_perf = amd_pstate_get_data(cpu, AMD_PSTATE_HIGHEST_PERF); 184 + nominal_perf = acpi_cppc_get_data(cpu, NOMINAL_PERF); 185 + 186 + *support = highest_perf > nominal_perf ? 1 : 0; 187 + if (!(*support)) 188 + return; 189 + 190 + cpufreq_get_hardware_limits(cpu, &cpuinfo_min, &cpuinfo_max); 191 + amd_pstate_max = amd_pstate_get_data(cpu, AMD_PSTATE_MAX_FREQ); 192 + 193 + *active = cpuinfo_max == amd_pstate_max ? 1 : 0; 194 + } 195 + 178 196 /* AMD P-State Helper Functions ************************************/ 179 197 #endif /* defined(__i386__) || defined(__x86_64__) */
+5
tools/power/cpupower/utils/helpers/helpers.h
··· 140 140 141 141 /* AMD P-State stuff **************************/ 142 142 bool cpupower_amd_pstate_enabled(void); 143 + void amd_pstate_boost_init(unsigned int cpu, 144 + int *support, int *active); 143 145 144 146 /* AMD P-State stuff **************************/ 145 147 ··· 179 177 180 178 static inline bool cpupower_amd_pstate_enabled(void) 181 179 { return false; } 180 + static inline void amd_pstate_boost_init(unsigned int cpu, int *support, 181 + int *active) 182 + {} 182 183 183 184 /* cpuid and cpuinfo helpers **************************/ 184 185
+2
tools/power/cpupower/utils/helpers/misc.c
··· 41 41 if (ret) 42 42 return ret; 43 43 } 44 + } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE) { 45 + amd_pstate_boost_init(cpu, support, active); 44 46 } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA) 45 47 *support = *active = 1; 46 48 return 0;