cpupower: Allow control of boost feature on non-x86 based systems with boost support.
authorShinji Nomoto <fj5851bi@fujitsu.com>
Thu, 22 May 2025 06:10:59 +0000 (15:10 +0900)
committerShuah Khan <skhan@linuxfoundation.org>
Fri, 15 Aug 2025 16:49:14 +0000 (10:49 -0600)
The cpufreq subsystem has a generic sysfs interface for controlling boost
(/sys/devices/system/cpu/cpufreq/boost).
The sysfs interface can be used to enable boost control from the cpupower
command on non-x86 platforms as well. So, allow boost controlling
on non-x86 system if boost sysfs file exists.

The set subcommand enables/disables the boost feature using the following
syntax:
    cpupower set --boost 1
    cpupower set --boost 0

The --boost option is an alias for --turbo-boost. We provided the neutral
option name because the name "turbo boost" is specific to Intel technology.

The frequency-info subcommand displays the enabled/disabled state of
the boost feature as follows:
    boost state support:
        Active: yes (or no)

Link: https://lore.kernel.org/r/20250522061122.2149188-3-fj5851bi@fujitsu.com
Signed-off-by: Shinji Nomoto <fj5851bi@fujitsu.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/power/cpupower/man/cpupower-set.1
tools/power/cpupower/utils/cpufreq-info.c
tools/power/cpupower/utils/cpupower-set.c
tools/power/cpupower/utils/helpers/helpers.h
tools/power/cpupower/utils/helpers/misc.c

index 500653ef98c77effcd2075fdeb4fd061f8485caf..8ac82b6f9189b9546c5aab874ba711db34e1284d 100644 (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.
 
index fc750e127404c25f31f6f5238193848a6d227980..7d3732f5f2f6f5fd5cc90e32465a94b4c10a654e 100644 (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) {
index 59ace394cf3ef9f97d27eef2d3a66000de3bace1..c2117e5650dd3f407c327d132aec62fcb5f96fab 100644 (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'},
        { },
 };
 
index 95749b8ee475e805f53e2d1133fe44bc83de9ffd..82ea62bdf5a26981f4df38a5cff4746d712c05c2 100644 (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)
index 76e461ff4f74031dc9a353d471ae734bcc401248..166dc1e470ea6d70079fea6570750885d549603a 100644 (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;
+}