linux-cpupower-6.17-rc2

Fixes set subcommand -t option and enables boost control feature on
 non-x86 platforms that support boot control.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAmifjmEACgkQCwJExA0N
 Qxw18xAAtFuil/k62N/KxZ25rthyxFkxFlokEe1ZuHYPGqFpLbWlOR9xZhA89PdY
 aTlx9TqZlmBspKqtX+nzJJWlA26+n/xJIo8zhVufhnEik8WF3/f9hjOX1mXaNN4J
 5CgxPl5pJC9oxcldJ0+rBiNGwZVBG4tv+zFx5S6qoSn/D7F0tXTFXFaJeCIMuUgZ
 R5euE5diq377r8/KnLR1eOfK3UZUr215hFmDefK9NyPK3AZY+XyqFy9q1bJSIVdH
 2B9w+Vwt8/jRwt7JTLqZl+IBuIAAmaLPqj9NFBKHVt94OrqKc0PFnzct/BshAj8w
 1+KR8+wMMEn8athuVT18gZ5suFvq/980o8skdBu97LDK8JMDQccwA5uyn1BIN/37
 irTYeUa+XYHIjNhBT+I+l5OB4VnrqwFMs3+uq4zsJLkMblR/dlJ7aVqW3vOqCMaf
 0aV0oB9Ih3d0uyFiSn5QZupu4B9ZTZqTqtMem4GrchvqBIyn4S63ma+5UlKQiQah
 XZTiB8d/DwZe5Y6mxrqmEK+ig6qVI0g61HdwnsdVS+v98xDwpc15Jfnr2dnggpUu
 FcmzUyh9UsiAg3Mf/Y+Y6G8fZ4ieNgSPJZBHzqCjjwIdQ5CVWR2/V18+TYL1tF/O
 oYotS1VaxNmzumR8M71pBj2ltf7AC0gsr1xX8TDN4O5qRm2WVr4=
 =j2mj
 -----END PGP SIGNATURE-----

Merge tag 'linux-cpupower-6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux

Merge a cpupower utility fix for 6.17-rc3 from Shuah Khan:

"Fixes set subcommand -t option and enables boost control feature on
 non-x86 platforms that support boost control."

* tag 'linux-cpupower-6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux:
  cpupower: Allow control of boost feature on non-x86 based systems with boost support.
  cpupower: Fix a bug where the -t option of the set subcommand was not working.
This commit is contained in:
Rafael J. Wysocki 2025-08-18 18:40:02 +02:00
commit 2bc1adb05e
5 changed files with 83 additions and 35 deletions

View File

@ -81,10 +81,11 @@ Refer to the AMD P-State kernel documentation for further information.
.RE
.PP
\-\-turbo\-boost, \-t
\-\-turbo\-boost, \-\-boost, \-t
.RS 4
This option is used to enable or disable the turbo boost feature on
supported Intel and AMD processors.
This option is used to enable or disable the boost feature on
supported Intel and AMD processors, and other boost supported systems.
(The --boost option is an alias for the --turbo-boost option)
This option takes as parameter either \fB1\fP to enable, or \fB0\fP to disable the feature.

View File

@ -128,7 +128,7 @@ static int get_boost_mode_x86(unsigned int cpu)
/* ToDo: Make this more global */
unsigned long pstates[MAX_HW_PSTATES] = {0,};
ret = cpufreq_has_boost_support(cpu, &support, &active, &b_states);
ret = cpufreq_has_x86_boost_support(cpu, &support, &active, &b_states);
if (ret) {
printf(_("Error while evaluating Boost Capabilities"
" on CPU %d -- are you root?\n"), cpu);
@ -204,6 +204,18 @@ static int get_boost_mode_x86(unsigned int cpu)
return 0;
}
static int get_boost_mode_generic(unsigned int cpu)
{
bool active;
if (!cpufreq_has_generic_boost_support(&active)) {
printf(_(" boost state support:\n"));
printf(_(" Active: %s\n"), active ? _("yes") : _("no"));
}
return 0;
}
/* --boost / -b */
static int get_boost_mode(unsigned int cpu)
@ -214,6 +226,8 @@ static int get_boost_mode(unsigned int cpu)
cpupower_cpu_info.vendor == X86_VENDOR_HYGON ||
cpupower_cpu_info.vendor == X86_VENDOR_INTEL)
return get_boost_mode_x86(cpu);
else
get_boost_mode_generic(cpu);
freqs = cpufreq_get_boost_frequencies(cpu);
if (freqs) {

View File

@ -21,6 +21,7 @@ static struct option set_opts[] = {
{"epp", required_argument, NULL, 'e'},
{"amd-pstate-mode", required_argument, NULL, 'm'},
{"turbo-boost", required_argument, NULL, 't'},
{"boost", required_argument, NULL, 't'},
{ },
};
@ -62,8 +63,8 @@ int cmd_set(int argc, char **argv)
params.params = 0;
/* parameter parsing */
while ((ret = getopt_long(argc, argv, "b:e:m:",
set_opts, NULL)) != -1) {
while ((ret = getopt_long(argc, argv, "b:e:m:t:",
set_opts, NULL)) != -1) {
switch (ret) {
case 'b':
if (params.perf_bias)

View File

@ -103,6 +103,9 @@ extern struct cpupower_cpu_info cpupower_cpu_info;
/* cpuid and cpuinfo helpers **************************/
int cpufreq_has_generic_boost_support(bool *active);
int cpupower_set_turbo_boost(int turbo_boost);
/* X86 ONLY ****************************************/
#if defined(__i386__) || defined(__x86_64__)
@ -118,7 +121,6 @@ extern unsigned long long msr_intel_get_turbo_ratio(unsigned int cpu);
extern int cpupower_set_epp(unsigned int cpu, char *epp);
extern int cpupower_set_amd_pstate_mode(char *mode);
extern int cpupower_set_turbo_boost(int turbo_boost);
/* Read/Write msr ****************************/
@ -139,8 +141,8 @@ extern int decode_pstates(unsigned int cpu, int boost_states,
/* AMD HW pstate decoding **************************/
extern int cpufreq_has_boost_support(unsigned int cpu, int *support,
int *active, int * states);
int cpufreq_has_x86_boost_support(unsigned int cpu, int *support,
int *active, int *states);
/* AMD P-State stuff **************************/
bool cpupower_amd_pstate_enabled(void);
@ -181,13 +183,11 @@ static inline int cpupower_set_epp(unsigned int cpu, char *epp)
{ return -1; };
static inline int cpupower_set_amd_pstate_mode(char *mode)
{ return -1; };
static inline int cpupower_set_turbo_boost(int turbo_boost)
{ return -1; };
/* Read/Write msr ****************************/
static inline int cpufreq_has_boost_support(unsigned int cpu, int *support,
int *active, int * states)
static inline int cpufreq_has_x86_boost_support(unsigned int cpu, int *support,
int *active, int *states)
{ return -1; }
static inline bool cpupower_amd_pstate_enabled(void)

View File

@ -8,15 +8,14 @@
#include "helpers/helpers.h"
#include "helpers/sysfs.h"
#include "cpufreq.h"
#include "cpupower_intern.h"
#if defined(__i386__) || defined(__x86_64__)
#include "cpupower_intern.h"
#define MSR_AMD_HWCR 0xc0010015
int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
int *states)
int cpufreq_has_x86_boost_support(unsigned int cpu, int *support, int *active,
int *states)
{
int ret;
unsigned long long val;
@ -124,24 +123,6 @@ int cpupower_set_amd_pstate_mode(char *mode)
return 0;
}
int cpupower_set_turbo_boost(int turbo_boost)
{
char path[SYSFS_PATH_MAX];
char linebuf[2] = {};
snprintf(path, sizeof(path), PATH_TO_CPU "cpufreq/boost");
if (!is_valid_path(path))
return -1;
snprintf(linebuf, sizeof(linebuf), "%d", turbo_boost);
if (cpupower_write_sysfs(path, linebuf, 2) <= 0)
return -1;
return 0;
}
bool cpupower_amd_pstate_enabled(void)
{
char *driver = cpufreq_get_driver(0);
@ -160,6 +141,39 @@ bool cpupower_amd_pstate_enabled(void)
#endif /* #if defined(__i386__) || defined(__x86_64__) */
int cpufreq_has_generic_boost_support(bool *active)
{
char path[SYSFS_PATH_MAX];
char linebuf[2] = {};
unsigned long val;
char *endp;
snprintf(path, sizeof(path), PATH_TO_CPU "cpufreq/boost");
if (!is_valid_path(path))
return -EACCES;
if (cpupower_read_sysfs(path, linebuf, 2) <= 0)
return -EINVAL;
val = strtoul(linebuf, &endp, 0);
if (endp == linebuf || errno == ERANGE)
return -EINVAL;
switch (val) {
case 0:
*active = false;
break;
case 1:
*active = true;
break;
default:
return -EINVAL;
}
return 0;
}
/* get_cpustate
*
* Gather the information of all online CPUs into bitmask struct
@ -259,3 +273,21 @@ void print_speed(unsigned long speed, int no_rounding)
}
}
}
int cpupower_set_turbo_boost(int turbo_boost)
{
char path[SYSFS_PATH_MAX];
char linebuf[2] = {};
snprintf(path, sizeof(path), PATH_TO_CPU "cpufreq/boost");
if (!is_valid_path(path))
return -1;
snprintf(linebuf, sizeof(linebuf), "%d", turbo_boost);
if (cpupower_write_sysfs(path, linebuf, 2) <= 0)
return -1;
return 0;
}