Commit 5f567afc authored by Mario Limonciello's avatar Mario Limonciello Committed by Shuah Khan
Browse files

cpupower: Add support for showing energy performance preference

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: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 26e16174
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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",
};


@@ -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)
+8 −0
Original line number Diff line number Diff line
@@ -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
+24 −1
Original line number Diff line number Diff line
@@ -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)
@@ -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);
@@ -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'},
	{ },
};

@@ -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 '?':
@@ -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;
@@ -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;