Skip to content

Commit

Permalink
cpupower: Add support for showing energy performance preference
Browse files Browse the repository at this point in the history
The EPP value is useful for characterization of performance. Show
it in cpupower frequency-info output.

Link: https://lore.kernel.org/r/20241218191144.3440854-6-superm1@kernel.org
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
  • Loading branch information
Mario Limonciello authored and Shuah Khan committed Dec 20, 2024
1 parent 26e1617 commit 5f567af
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
14 changes: 14 additions & 0 deletions tools/power/cpupower/lib/cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,14 @@ static unsigned long sysfs_cpufreq_get_one_value(unsigned int cpu,
enum cpufreq_string {
SCALING_DRIVER,
SCALING_GOVERNOR,
ENERGY_PERFORMANCE_PREFERENCE,
MAX_CPUFREQ_STRING_FILES
};

static const char *cpufreq_string_files[MAX_CPUFREQ_STRING_FILES] = {
[SCALING_DRIVER] = "scaling_driver",
[SCALING_GOVERNOR] = "scaling_governor",
[ENERGY_PERFORMANCE_PREFERENCE] = "energy_performance_preference",
};


Expand Down Expand Up @@ -207,6 +209,18 @@ unsigned long cpufreq_get_transition_latency(unsigned int cpu)
return sysfs_cpufreq_get_one_value(cpu, CPUINFO_LATENCY);
}

char *cpufreq_get_energy_performance_preference(unsigned int cpu)
{
return sysfs_cpufreq_get_one_string(cpu, ENERGY_PERFORMANCE_PREFERENCE);
}

void cpufreq_put_energy_performance_preference(char *ptr)
{
if (!ptr)
return;
free(ptr);
}

int cpufreq_get_hardware_limits(unsigned int cpu,
unsigned long *min,
unsigned long *max)
Expand Down
8 changes: 8 additions & 0 deletions tools/power/cpupower/lib/cpufreq.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@ unsigned long cpufreq_get_freq_hardware(unsigned int cpu);
unsigned long cpufreq_get_transition_latency(unsigned int cpu);


/* determine energy performance preference
*
* returns NULL on failure, else the string that represents the energy performance
* preference requested.
*/
char *cpufreq_get_energy_performance_preference(unsigned int cpu);
void cpufreq_put_energy_performance_preference(char *ptr);

/* determine hardware CPU frequency limits
*
* These may be limited further by thermal, energy or other
Expand Down
25 changes: 24 additions & 1 deletion tools/power/cpupower/utils/cpufreq-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,23 @@ static int get_freq_stats(unsigned int cpu, unsigned int human)
return 0;
}

/* --epp / -z */

static int get_epp(unsigned int cpu, bool interactive)
{
char *epp;

epp = cpufreq_get_energy_performance_preference(cpu);
if (!epp)
return -EINVAL;
if (interactive)
printf(_(" energy performance preference: %s\n"), epp);

cpufreq_put_energy_performance_preference(epp);

return 0;
}

/* --latency / -y */

static int get_latency(unsigned int cpu, unsigned int human)
Expand Down Expand Up @@ -461,6 +478,7 @@ static void debug_output_one(unsigned int cpu)
get_related_cpus(cpu);
get_affected_cpus(cpu);
get_latency(cpu, 1);
get_epp(cpu, true);
get_hardware_limits(cpu, 1);

freqs = cpufreq_get_available_frequencies(cpu);
Expand Down Expand Up @@ -501,6 +519,7 @@ static struct option info_opts[] = {
{"human", no_argument, NULL, 'm'},
{"no-rounding", no_argument, NULL, 'n'},
{"performance", no_argument, NULL, 'c'},
{"epp", no_argument, NULL, 'z'},
{ },
};

Expand All @@ -514,7 +533,7 @@ int cmd_freq_info(int argc, char **argv)
int output_param = 0;

do {
ret = getopt_long(argc, argv, "oefwldpgrasmybnc", info_opts,
ret = getopt_long(argc, argv, "oefwldpgrasmybncz", info_opts,
NULL);
switch (ret) {
case '?':
Expand All @@ -538,6 +557,7 @@ int cmd_freq_info(int argc, char **argv)
case 's':
case 'y':
case 'c':
case 'z':
if (output_param) {
output_param = -1;
cont = 0;
Expand Down Expand Up @@ -647,6 +667,9 @@ int cmd_freq_info(int argc, char **argv)
case 'c':
ret = get_perf_cap(cpu);
break;
case 'z':
ret = get_epp(cpu, true);
break;
}
if (ret)
return ret;
Expand Down

0 comments on commit 5f567af

Please sign in to comment.