]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpupower: Add support for showing energy performance preference
authorMario Limonciello <mario.limonciello@amd.com>
Wed, 18 Dec 2024 19:09:54 +0000 (13:09 -0600)
committerShuah Khan <skhan@linuxfoundation.org>
Fri, 20 Dec 2024 16:12:07 +0000 (09:12 -0700)
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>
tools/power/cpupower/lib/cpufreq.c
tools/power/cpupower/lib/cpufreq.h
tools/power/cpupower/utils/cpufreq-info.c

index f27ee6d4b000cc9038c99a5c564a3665b57fe02b..8dda3db2dff0e40813bc1e09de70a92d53f4d3c7 100644 (file)
@@ -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)
index 2f3c840358063c17348efcc13621d6b5d71bdb79..bfc617311ebd62d9aa4ff8ddd262146c696cd4b9 100644 (file)
@@ -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
index 3df28e45be4210893ec3289fe369c4e989f70c9b..eb9cc0f10634297250ddb514ea6c42dc4eaf8045 100644 (file)
@@ -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;