]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpupower: Enable boost state support for AMD P-State module
authorHuang Rui <ray.huang@amd.com>
Tue, 22 Feb 2022 15:34:23 +0000 (23:34 +0800)
committerShuah Khan <skhan@linuxfoundation.org>
Wed, 23 Feb 2022 01:37:01 +0000 (18:37 -0700)
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>
tools/power/cpupower/utils/helpers/amd.c
tools/power/cpupower/utils/helpers/helpers.h
tools/power/cpupower/utils/helpers/misc.c

index 4d45d1b44164facd29f4588e9e65ee63f33db0ed..f5ba528dc7db855dd574d9e4822f0cbdac2322a4 100644 (file)
@@ -175,5 +175,23 @@ static unsigned long amd_pstate_get_data(unsigned int cpu,
                                                  MAX_AMD_PSTATE_VALUE_READ_FILES);
 }
 
+void amd_pstate_boost_init(unsigned int cpu, int *support, int *active)
+{
+       unsigned long highest_perf, nominal_perf, cpuinfo_min,
+                     cpuinfo_max, amd_pstate_max;
+
+       highest_perf = amd_pstate_get_data(cpu, AMD_PSTATE_HIGHEST_PERF);
+       nominal_perf = acpi_cppc_get_data(cpu, NOMINAL_PERF);
+
+       *support = highest_perf > nominal_perf ? 1 : 0;
+       if (!(*support))
+               return;
+
+       cpufreq_get_hardware_limits(cpu, &cpuinfo_min, &cpuinfo_max);
+       amd_pstate_max = amd_pstate_get_data(cpu, AMD_PSTATE_MAX_FREQ);
+
+       *active = cpuinfo_max == amd_pstate_max ? 1 : 0;
+}
+
 /* AMD P-State Helper Functions ************************************/
 #endif /* defined(__i386__) || defined(__x86_64__) */
index 62771a08687127c7f3ce5946b850f07a67e44871..326491e11c6ec6baa84ed09ffdeff074dbb5232d 100644 (file)
@@ -140,6 +140,8 @@ extern int cpufreq_has_boost_support(unsigned int cpu, int *support,
 
 /* AMD P-State stuff **************************/
 bool cpupower_amd_pstate_enabled(void);
+void amd_pstate_boost_init(unsigned int cpu,
+                          int *support, int *active);
 
 /* AMD P-State stuff **************************/
 
@@ -177,6 +179,9 @@ static inline int cpufreq_has_boost_support(unsigned int cpu, int *support,
 
 static inline bool cpupower_amd_pstate_enabled(void)
 { return false; }
+static inline void amd_pstate_boost_init(unsigned int cpu, int *support,
+                                        int *active)
+{}
 
 /* cpuid and cpuinfo helpers  **************************/
 
index 0c483cdefcc26242b421088303c7ffedd792639f..e0d3145434d3132d3266ff404a6446e6054503ce 100644 (file)
@@ -41,6 +41,8 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
                        if (ret)
                                return ret;
                }
+       } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE) {
+               amd_pstate_boost_init(cpu, support, active);
        } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA)
                *support = *active = 1;
        return 0;