Skip to content

Commit bf9801b

Browse files
huangruishuahkh
authored andcommitted
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>
1 parent 33e43f3 commit bf9801b

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

tools/power/cpupower/utils/helpers/amd.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,5 +175,23 @@ static unsigned long amd_pstate_get_data(unsigned int cpu,
175175
MAX_AMD_PSTATE_VALUE_READ_FILES);
176176
}
177177

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+
178196
/* AMD P-State Helper Functions ************************************/
179197
#endif /* defined(__i386__) || defined(__x86_64__) */

tools/power/cpupower/utils/helpers/helpers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ extern int cpufreq_has_boost_support(unsigned int cpu, int *support,
140140

141141
/* AMD P-State stuff **************************/
142142
bool cpupower_amd_pstate_enabled(void);
143+
void amd_pstate_boost_init(unsigned int cpu,
144+
int *support, int *active);
143145

144146
/* AMD P-State stuff **************************/
145147

@@ -177,6 +179,9 @@ static inline int cpufreq_has_boost_support(unsigned int cpu, int *support,
177179

178180
static inline bool cpupower_amd_pstate_enabled(void)
179181
{ return false; }
182+
static inline void amd_pstate_boost_init(unsigned int cpu, int *support,
183+
int *active)
184+
{}
180185

181186
/* cpuid and cpuinfo helpers **************************/
182187

tools/power/cpupower/utils/helpers/misc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
4141
if (ret)
4242
return ret;
4343
}
44+
} else if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE) {
45+
amd_pstate_boost_init(cpu, support, active);
4446
} else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA)
4547
*support = *active = 1;
4648
return 0;

0 commit comments

Comments
 (0)