2023-06-19 19:46:44

by Wyes Karny

[permalink] [raw]
Subject: [PATCH v3 0/5] cpupower: Add various feature control support for amd_pstate

In this series, three feature control support for amd_pstate has been
added.

1. EPP: User can control Energy Performance Preference (EPP) value,
which conveys user's performance vs energy preference to platform. This
feature is present on amd_pstate and intel_pstate active mode.

2. amd_pstate mode switch: amd_pstate has various working modes such as
'active', 'passive' and 'guided', which can be changed dynamically.

3. Turbo boost: Turbo boost feature is present in amd_pstate as well as
acpi-cpufreq. By default this is enabled, but user can control this
feature dynamically.

These features can be controlled with `cpupower set` command. The
options are respectively --epp, --amd-pstate-mode, --turbo-boost

Also, make cpupower recognise amd-pstate-epp driver.

Changelog:
v2->v3:
- Use common prefix to recognise amd-pstate-epp driver.
- Picked up review tag from Mario.

v1->v2:
- Drop patch 1, which was amd-pstate-epp driver rename change.
- Picked ACKs from Ray.

Wyes Karny (5):
cpupower: Recognise amd-pstate active mode driver
cpupower: Add is_valid_path API
cpupower: Add EPP value change support
cpupower: Add support for amd_pstate mode change
cpupower: Add turbo-boost support in cpupower

tools/power/cpupower/lib/cpupower.c | 7 +++
tools/power/cpupower/lib/cpupower_intern.h | 1 +
tools/power/cpupower/utils/cpupower-set.c | 65 +++++++++++++++++++-
tools/power/cpupower/utils/helpers/helpers.h | 11 ++++
tools/power/cpupower/utils/helpers/misc.c | 57 ++++++++++++++++-
5 files changed, 138 insertions(+), 3 deletions(-)

--
2.34.1



2023-06-19 20:03:35

by Wyes Karny

[permalink] [raw]
Subject: [PATCH v3 5/5] cpupower: Add turbo-boost support in cpupower

If boost sysfs (/sys/devices/system/cpu/cpufreq/boost) file is present
turbo-boost is feature is supported in the hardware. By default this
feature should be enabled. But to disable/enable it write to the sysfs
file. Use the same to control this feature via cpupower.

To enable:
cpupower set --turbo-boost 1

To disable:
cpupower set --turbo-boost 0

Acked-by: Huang Rui <[email protected]>
Reviewed-by: Gautham R. Shenoy <[email protected]>
Reviewed-by: Mario Limonciello <[email protected]>
Signed-off-by: Wyes Karny <[email protected]>
---
tools/power/cpupower/utils/cpupower-set.c | 22 +++++++++++++++++++-
tools/power/cpupower/utils/helpers/helpers.h | 3 +++
tools/power/cpupower/utils/helpers/misc.c | 18 ++++++++++++++++
3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/tools/power/cpupower/utils/cpupower-set.c b/tools/power/cpupower/utils/cpupower-set.c
index c2ba69b7ea54..0677b58374ab 100644
--- a/tools/power/cpupower/utils/cpupower-set.c
+++ b/tools/power/cpupower/utils/cpupower-set.c
@@ -20,6 +20,7 @@ static struct option set_opts[] = {
{"perf-bias", required_argument, NULL, 'b'},
{"epp", required_argument, NULL, 'e'},
{"amd-pstate-mode", required_argument, NULL, 'm'},
+ {"turbo-boost", required_argument, NULL, 't'},
{ },
};

@@ -41,10 +42,11 @@ int cmd_set(int argc, char **argv)
int perf_bias:1;
int epp:1;
int mode:1;
+ int turbo_boost:1;
};
int params;
} params;
- int perf_bias = 0;
+ int perf_bias = 0, turbo_boost = 1;
int ret = 0;
char epp[30], mode[20];

@@ -94,6 +96,18 @@ int cmd_set(int argc, char **argv)
}
params.mode = 1;
break;
+ case 't':
+ if (params.turbo_boost)
+ print_wrong_arg_exit();
+ turbo_boost = atoi(optarg);
+ if (turbo_boost < 0 || turbo_boost > 1) {
+ printf("--turbo-boost param out of range [0-1]\n");
+ print_wrong_arg_exit();
+ }
+ params.turbo_boost = 1;
+ break;
+
+
default:
print_wrong_arg_exit();
}
@@ -108,6 +122,12 @@ int cmd_set(int argc, char **argv)
fprintf(stderr, "Error setting mode\n");
}

+ if (params.turbo_boost) {
+ ret = cpupower_set_turbo_boost(turbo_boost);
+ if (ret)
+ fprintf(stderr, "Error setting turbo-boost\n");
+ }
+
/* Default is: set all CPUs */
if (bitmask_isallclear(cpus_chosen))
bitmask_setall(cpus_chosen);
diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h
index d35596631eef..95749b8ee475 100644
--- a/tools/power/cpupower/utils/helpers/helpers.h
+++ b/tools/power/cpupower/utils/helpers/helpers.h
@@ -118,6 +118,7 @@ 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 ****************************/

@@ -180,6 +181,8 @@ 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 ****************************/

diff --git a/tools/power/cpupower/utils/helpers/misc.c b/tools/power/cpupower/utils/helpers/misc.c
index 075c136a100c..76e461ff4f74 100644
--- a/tools/power/cpupower/utils/helpers/misc.c
+++ b/tools/power/cpupower/utils/helpers/misc.c
@@ -124,6 +124,24 @@ 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);
--
2.34.1


2023-06-20 03:50:10

by Perry Yuan

[permalink] [raw]
Subject: RE: [PATCH v3 5/5] cpupower: Add turbo-boost support in cpupower

[AMD Official Use Only - General]

Hi Wyes.

> -----Original Message-----
> From: Karny, Wyes <[email protected]>
> Sent: Tuesday, June 20, 2023 3:05 AM
> To: [email protected]; [email protected]
> Cc: [email protected]; [email protected]; [email protected];
> Shenoy, Gautham Ranjal <[email protected]>; Limonciello, Mario
> <[email protected]>; Huang, Ray <[email protected]>; Yuan,
> Perry <[email protected]>; Karny, Wyes <[email protected]>; Huang,
> Ray <[email protected]>; Limonciello, Mario
> <[email protected]>
> Subject: [PATCH v3 5/5] cpupower: Add turbo-boost support in cpupower
>
> If boost sysfs (/sys/devices/system/cpu/cpufreq/boost) file is present turbo-
> boost is feature is supported in the hardware. By default this feature should be
> enabled. But to disable/enable it write to the sysfs file. Use the same to control
> this feature via cpupower.
>
> To enable:
> cpupower set --turbo-boost 1
>
> To disable:
> cpupower set --turbo-boost 0
>
> Acked-by: Huang Rui <[email protected]>
> Reviewed-by: Gautham R. Shenoy <[email protected]>
> Reviewed-by: Mario Limonciello <[email protected]>
> Signed-off-by: Wyes Karny <[email protected]>
> ---
> tools/power/cpupower/utils/cpupower-set.c | 22 +++++++++++++++++++-
> tools/power/cpupower/utils/helpers/helpers.h | 3 +++
> tools/power/cpupower/utils/helpers/misc.c | 18 ++++++++++++++++
> 3 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/tools/power/cpupower/utils/cpupower-set.c
> b/tools/power/cpupower/utils/cpupower-set.c
> index c2ba69b7ea54..0677b58374ab 100644
> --- a/tools/power/cpupower/utils/cpupower-set.c
> +++ b/tools/power/cpupower/utils/cpupower-set.c
> @@ -20,6 +20,7 @@ static struct option set_opts[] = {
> {"perf-bias", required_argument, NULL, 'b'},
> {"epp", required_argument, NULL, 'e'},
> {"amd-pstate-mode", required_argument, NULL, 'm'},
> + {"turbo-boost", required_argument, NULL, 't'},
> { },
> };
>
> @@ -41,10 +42,11 @@ int cmd_set(int argc, char **argv)
> int perf_bias:1;
> int epp:1;
> int mode:1;
> + int turbo_boost:1;
> };
> int params;
> } params;
> - int perf_bias = 0;
> + int perf_bias = 0, turbo_boost = 1;
> int ret = 0;
> char epp[30], mode[20];
>
> @@ -94,6 +96,18 @@ int cmd_set(int argc, char **argv)
> }
> params.mode = 1;
> break;
> + case 't':
> + if (params.turbo_boost)
> + print_wrong_arg_exit();
> + turbo_boost = atoi(optarg);
> + if (turbo_boost < 0 || turbo_boost > 1) {
> + printf("--turbo-boost param out of range [0-
> 1]\n");
> + print_wrong_arg_exit();
> + }
> + params.turbo_boost = 1;
> + break;
> +
> +
> default:
> print_wrong_arg_exit();
> }
> @@ -108,6 +122,12 @@ int cmd_set(int argc, char **argv)
> fprintf(stderr, "Error setting mode\n");
> }
>
> + if (params.turbo_boost) {
> + ret = cpupower_set_turbo_boost(turbo_boost);
> + if (ret)
> + fprintf(stderr, "Error setting turbo-boost\n");
> + }
> +
> /* Default is: set all CPUs */
> if (bitmask_isallclear(cpus_chosen))
> bitmask_setall(cpus_chosen);
> diff --git a/tools/power/cpupower/utils/helpers/helpers.h
> b/tools/power/cpupower/utils/helpers/helpers.h
> index d35596631eef..95749b8ee475 100644
> --- a/tools/power/cpupower/utils/helpers/helpers.h
> +++ b/tools/power/cpupower/utils/helpers/helpers.h
> @@ -118,6 +118,7 @@ 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 ****************************/
>
> @@ -180,6 +181,8 @@ 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 ****************************/
>
> diff --git a/tools/power/cpupower/utils/helpers/misc.c
> b/tools/power/cpupower/utils/helpers/misc.c
> index 075c136a100c..76e461ff4f74 100644
> --- a/tools/power/cpupower/utils/helpers/misc.c
> +++ b/tools/power/cpupower/utils/helpers/misc.c
> @@ -124,6 +124,24 @@ 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);
> --
> 2.34.1

Thanks for the new commands for pstate driver

Tested-by: Perry Yuan <[email protected]>

2023-06-20 06:19:14

by Wyes Karny

[permalink] [raw]
Subject: Re: [PATCH v3 5/5] cpupower: Add turbo-boost support in cpupower

On 20 Jun 08:37, Yuan, Perry wrote:
> [AMD Official Use Only - General]
>
> Hi Wyes.
>
> > -----Original Message-----
> > From: Karny, Wyes <[email protected]>
> > Sent: Tuesday, June 20, 2023 3:05 AM
> > To: [email protected]; [email protected]
> > Cc: [email protected]; [email protected]; [email protected];
> > Shenoy, Gautham Ranjal <[email protected]>; Limonciello, Mario
> > <[email protected]>; Huang, Ray <[email protected]>; Yuan,
> > Perry <[email protected]>; Karny, Wyes <[email protected]>; Huang,
> > Ray <[email protected]>; Limonciello, Mario
> > <[email protected]>
> > Subject: [PATCH v3 5/5] cpupower: Add turbo-boost support in cpupower
> >
> > If boost sysfs (/sys/devices/system/cpu/cpufreq/boost) file is present turbo-
> > boost is feature is supported in the hardware. By default this feature should be
> > enabled. But to disable/enable it write to the sysfs file. Use the same to control
> > this feature via cpupower.
> >
> > To enable:
> > cpupower set --turbo-boost 1
> >
> > To disable:
> > cpupower set --turbo-boost 0
> >
> > Acked-by: Huang Rui <[email protected]>
> > Reviewed-by: Gautham R. Shenoy <[email protected]>
> > Reviewed-by: Mario Limonciello <[email protected]>
> > Signed-off-by: Wyes Karny <[email protected]>
> > ---
> > tools/power/cpupower/utils/cpupower-set.c | 22 +++++++++++++++++++-
> > tools/power/cpupower/utils/helpers/helpers.h | 3 +++
> > tools/power/cpupower/utils/helpers/misc.c | 18 ++++++++++++++++
> > 3 files changed, 42 insertions(+), 1 deletion(-)
> >
> > diff --git a/tools/power/cpupower/utils/cpupower-set.c
> > b/tools/power/cpupower/utils/cpupower-set.c
> > index c2ba69b7ea54..0677b58374ab 100644
> > --- a/tools/power/cpupower/utils/cpupower-set.c
> > +++ b/tools/power/cpupower/utils/cpupower-set.c
> > @@ -20,6 +20,7 @@ static struct option set_opts[] = {
> > {"perf-bias", required_argument, NULL, 'b'},
> > {"epp", required_argument, NULL, 'e'},
> > {"amd-pstate-mode", required_argument, NULL, 'm'},
> > + {"turbo-boost", required_argument, NULL, 't'},
> > { },
> > };
> >
> > @@ -41,10 +42,11 @@ int cmd_set(int argc, char **argv)
> > int perf_bias:1;
> > int epp:1;
> > int mode:1;
> > + int turbo_boost:1;
> > };
> > int params;
> > } params;
> > - int perf_bias = 0;
> > + int perf_bias = 0, turbo_boost = 1;
> > int ret = 0;
> > char epp[30], mode[20];
> >
> > @@ -94,6 +96,18 @@ int cmd_set(int argc, char **argv)
> > }
> > params.mode = 1;
> > break;
> > + case 't':
> > + if (params.turbo_boost)
> > + print_wrong_arg_exit();
> > + turbo_boost = atoi(optarg);
> > + if (turbo_boost < 0 || turbo_boost > 1) {
> > + printf("--turbo-boost param out of range [0-
> > 1]\n");
> > + print_wrong_arg_exit();
> > + }
> > + params.turbo_boost = 1;
> > + break;
> > +
> > +
> > default:
> > print_wrong_arg_exit();
> > }
> > @@ -108,6 +122,12 @@ int cmd_set(int argc, char **argv)
> > fprintf(stderr, "Error setting mode\n");
> > }
> >
> > + if (params.turbo_boost) {
> > + ret = cpupower_set_turbo_boost(turbo_boost);
> > + if (ret)
> > + fprintf(stderr, "Error setting turbo-boost\n");
> > + }
> > +
> > /* Default is: set all CPUs */
> > if (bitmask_isallclear(cpus_chosen))
> > bitmask_setall(cpus_chosen);
> > diff --git a/tools/power/cpupower/utils/helpers/helpers.h
> > b/tools/power/cpupower/utils/helpers/helpers.h
> > index d35596631eef..95749b8ee475 100644
> > --- a/tools/power/cpupower/utils/helpers/helpers.h
> > +++ b/tools/power/cpupower/utils/helpers/helpers.h
> > @@ -118,6 +118,7 @@ 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 ****************************/
> >
> > @@ -180,6 +181,8 @@ 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 ****************************/
> >
> > diff --git a/tools/power/cpupower/utils/helpers/misc.c
> > b/tools/power/cpupower/utils/helpers/misc.c
> > index 075c136a100c..76e461ff4f74 100644
> > --- a/tools/power/cpupower/utils/helpers/misc.c
> > +++ b/tools/power/cpupower/utils/helpers/misc.c
> > @@ -124,6 +124,24 @@ 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);
> > --
> > 2.34.1
>
> Thanks for the new commands for pstate driver
>
> Tested-by: Perry Yuan <[email protected]>

Thanks Perry for the tested-by.

Regards,
Wyes

2023-07-14 11:42:01

by Thomas Renninger

[permalink] [raw]
Subject: Re: [PATCH v3 0/5] cpupower: Add various feature control support for amd_pstate

Hi,

sorry for the late answer, I wanted to give this a test, but could not
make it (yet).

My 2 cents on this one:

what Ray already mentioned is greatly appreciated: Find common APIs, not only
AMD vs Intel, but general ones, outside of the driver specific sysfs dir, e.g.:
/sys/devices/system/cpu/cpufreq/...

But not at all costs and if the epp part is (AMD) specific and varies to others
in meaning or in values, it has to be a specific file/API.

(Another Example/Request at the end)

And...: It would be nice to see some documentation in form of manpage
enhancements. At least for the newly introduced arguments.
If not yet, there should be: possible value range, which machines (CPU flags,
Zen 4, ...), if more complex technology, some kind of introduction or
reference where to find things would be really great.

I wonder whether it could be possible to connect this with:
Documentation/admin-guide/pm/intel_pstate.rst
Documentation/admin-guide/pm/amd-pstate.rst

I guess there is a static web site address people could rely on where above
kernel docs are hosted forever?
Then it would make sense to link the cpupower manpage with it and keep the
description short and avoid duplication?

Thomas


Another Example/Request at the end:

One example I recently got asked for, the bug is private:
"cpupower is not returning max turbo active cores information on latest Intel
processors."

Here are examples of 2 newer cpus that don't return the active core
information like this:
3600 MHz max turbo 4 active cores
3600 MHz max turbo 3 active cores
3700 MHz max turbo 2 active cores
3800 MHz max turbo 1 active cores

Not sure whether there finally is some kind of consolidation on turbo/boost/
dynamic/hw/bios interfaces in respect to turbo/boosting technology. But if
anyhow possible and it makes sense, it would be really great to see one sysfs
file exposed to userspace to read/enable/disable.

Possible cpufreqs (including or only) boost freqs, maybe with active cores if
this is a general technique optionally added if avail?

Nothing which has to be implemented at all costs and right now, just an idea
on how things could be consolidated at some point of time which might be wise
to think about now already...




2023-07-18 22:45:40

by Shuah Khan

[permalink] [raw]
Subject: Re: [PATCH v3 0/5] cpupower: Add various feature control support for amd_pstate

On 7/14/23 05:19, Thomas Renninger wrote:
> Hi,
>
> sorry for the late answer, I wanted to give this a test, but could not
> make it (yet).
>
> My 2 cents on this one:
>
> what Ray already mentioned is greatly appreciated: Find common APIs, not only
> AMD vs Intel, but general ones, outside of the driver specific sysfs dir, e.g.:
> /sys/devices/system/cpu/cpufreq/...
>
> But not at all costs and if the epp part is (AMD) specific and varies to others
> in meaning or in values, it has to be a specific file/API.
>
> (Another Example/Request at the end)
>
> And...: It would be nice to see some documentation in form of manpage
> enhancements. At least for the newly introduced arguments.
> If not yet, there should be: possible value range, which machines (CPU flags,
> Zen 4, ...), if more complex technology, some kind of introduction or
> reference where to find things would be really great.
>
> I wonder whether it could be possible to connect this with:
> Documentation/admin-guide/pm/intel_pstate.rst
> Documentation/admin-guide/pm/amd-pstate.rst
>
> I guess there is a static web site address people could rely on where above
> kernel docs are hosted forever?
> Then it would make sense to link the cpupower manpage with it and keep the
> description short and avoid duplication?
>
> Thomas
>
>
> Another Example/Request at the end:
>
> One example I recently got asked for, the bug is private:
> "cpupower is not returning max turbo active cores information on latest Intel
> processors."
>
> Here are examples of 2 newer cpus that don't return the active core
> information like this:
> 3600 MHz max turbo 4 active cores
> 3600 MHz max turbo 3 active cores
> 3700 MHz max turbo 2 active cores
> 3800 MHz max turbo 1 active cores
>
> Not sure whether there finally is some kind of consolidation on turbo/boost/
> dynamic/hw/bios interfaces in respect to turbo/boosting technology. But if
> anyhow possible and it makes sense, it would be really great to see one sysfs
> file exposed to userspace to read/enable/disable.
>
> Possible cpufreqs (including or only) boost freqs, maybe with active cores if
> this is a general technique optionally added if avail?
>
> Nothing which has to be implemented at all costs and right now, just an idea
> on how things could be consolidated at some point of time which might be wise
> to think about now already...
>

I applied these for Linux 6.6-rc1 - ran quick tests.

Please act on feedback from Thomas and send me patches on top of

https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux.git/log/?h=cpupower

thanks,
-- Shuah