diff options
| author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2025-08-18 18:40:02 +0200 | 
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2025-08-18 18:40:02 +0200 | 
| commit | 2bc1adb05e360fe0b78065d0ae43c47e336940c3 (patch) | |
| tree | 261ebb07f7cd3896e73294abf5fce982736ab1e4 /tools | |
| parent | c17b750b3ad9f45f2b6f7e6f7f4679844244f0b9 (diff) | |
| parent | 357d1fc38aad2cf4ea6626138cbf68299d20170c (diff) | |
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.
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/power/cpupower/man/cpupower-set.1 | 7 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/cpufreq-info.c | 16 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/cpupower-set.c | 5 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/helpers/helpers.h | 14 | ||||
| -rw-r--r-- | tools/power/cpupower/utils/helpers/misc.c | 76 | 
5 files changed, 83 insertions, 35 deletions
| diff --git a/tools/power/cpupower/man/cpupower-set.1 b/tools/power/cpupower/man/cpupower-set.1 index 500653ef98c7..8ac82b6f9189 100644 --- a/tools/power/cpupower/man/cpupower-set.1 +++ b/tools/power/cpupower/man/cpupower-set.1 @@ -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. diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c index fc750e127404..7d3732f5f2f6 100644 --- a/tools/power/cpupower/utils/cpufreq-info.c +++ b/tools/power/cpupower/utils/cpufreq-info.c @@ -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) { diff --git a/tools/power/cpupower/utils/cpupower-set.c b/tools/power/cpupower/utils/cpupower-set.c index 0677b58374ab..c2117e5650dd 100644 --- a/tools/power/cpupower/utils/cpupower-set.c +++ b/tools/power/cpupower/utils/cpupower-set.c @@ -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) diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h index 95749b8ee475..82ea62bdf5a2 100644 --- a/tools/power/cpupower/utils/helpers/helpers.h +++ b/tools/power/cpupower/utils/helpers/helpers.h @@ -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) diff --git a/tools/power/cpupower/utils/helpers/misc.c b/tools/power/cpupower/utils/helpers/misc.c index 76e461ff4f74..166dc1e470ea 100644 --- a/tools/power/cpupower/utils/helpers/misc.c +++ b/tools/power/cpupower/utils/helpers/misc.c @@ -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; +} | 
