]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
tools/power/cpupower: Display boost frequency separately
authorAbhishek Goel <huntbag@linux.vnet.ibm.com>
Tue, 5 Feb 2019 10:51:28 +0000 (04:51 -0600)
committerShuah Khan <shuah@kernel.org>
Wed, 13 Feb 2019 16:26:17 +0000 (09:26 -0700)
cpufreq driver creates sysfs file "scaling_boost_frequency" for platforms
which support boost frequency. Cpupower now prints boost frequencies
separately. For few x86 vendors who already have different way to get boost
frequency, will continue to use the existing logic. Rest of the platforms
will rely on "scaling_boost_frequency" file to display boost frequency.

Signed-off-by: Abhishek Goel <huntbag@linux.vnet.ibm.com>
Signed-off-by: Shuah Khan <shuah@kernel.org>
tools/power/cpupower/lib/cpufreq.c
tools/power/cpupower/lib/cpufreq.h
tools/power/cpupower/utils/cpufreq-info.c

index 0c0f3e3f0d8038e138077b40d428faff6083cff8..80650497fb800773444c297020338c33923cda5e 100644 (file)
@@ -333,17 +333,20 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any)
 }
 
 
-struct cpufreq_available_frequencies
-*cpufreq_get_available_frequencies(unsigned int cpu)
+struct cpufreq_frequencies
+*cpufreq_get_frequencies(const char *type, unsigned int cpu)
 {
-       struct cpufreq_available_frequencies *first = NULL;
-       struct cpufreq_available_frequencies *current = NULL;
+       struct cpufreq_frequencies *first = NULL;
+       struct cpufreq_frequencies *current = NULL;
        char one_value[SYSFS_PATH_MAX];
        char linebuf[MAX_LINE_LEN];
+       char fname[MAX_LINE_LEN];
        unsigned int pos, i;
        unsigned int len;
 
-       len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies",
+       snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type);
+
+       len = sysfs_cpufreq_read_file(cpu, fname,
                                linebuf, sizeof(linebuf));
        if (len == 0)
                return NULL;
@@ -389,9 +392,9 @@ struct cpufreq_available_frequencies
        return NULL;
 }
 
-void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies
-                               *any) {
-       struct cpufreq_available_frequencies *tmp, *next;
+void cpufreq_put_frequencies(struct cpufreq_frequencies *any)
+{
+       struct cpufreq_frequencies *tmp, *next;
 
        if (!any)
                return;
index 60beaf5ed2ea4da7d69850de8719a67097c3e6e6..775738269cbfc7792f428e01fd7c8db4837643a0 100644 (file)
@@ -28,10 +28,10 @@ struct cpufreq_available_governors {
        struct cpufreq_available_governors *first;
 };
 
-struct cpufreq_available_frequencies {
+struct cpufreq_frequencies {
        unsigned long frequency;
-       struct cpufreq_available_frequencies *next;
-       struct cpufreq_available_frequencies *first;
+       struct cpufreq_frequencies *next;
+       struct cpufreq_frequencies *first;
 };
 
 
@@ -129,14 +129,14 @@ void cpufreq_put_available_governors(
  *
  * Only present on _some_ ->target() cpufreq drivers. For information purposes
  * only. Please free allocated memory by calling
- * cpufreq_put_available_frequencies after use.
+ * cpufreq_put_frequencies after use.
  */
 
-struct cpufreq_available_frequencies
-*cpufreq_get_available_frequencies(unsigned int cpu);
+struct cpufreq_frequencies
+*cpufreq_get_frequencies(const char *type, unsigned int cpu);
 
-void cpufreq_put_available_frequencies(
-               struct cpufreq_available_frequencies *first);
+void cpufreq_put_frequencies(
+               struct cpufreq_frequencies *first);
 
 
 /* determine affected CPUs
index c3f39d5128ee4e8445cb0921f1485224fc252914..10290b308797a83aa74ae3a83a0b3bb833250f88 100644 (file)
@@ -161,19 +161,12 @@ static void print_duration(unsigned long duration)
        return;
 }
 
-/* --boost / -b */
-
-static int get_boost_mode(unsigned int cpu)
+static int get_boost_mode_x86(unsigned int cpu)
 {
        int support, active, b_states = 0, ret, pstate_no, i;
        /* ToDo: Make this more global */
        unsigned long pstates[MAX_HW_PSTATES] = {0,};
 
-       if (cpupower_cpu_info.vendor != X86_VENDOR_AMD &&
-           cpupower_cpu_info.vendor != X86_VENDOR_HYGON &&
-           cpupower_cpu_info.vendor != X86_VENDOR_INTEL)
-               return 0;
-
        ret = cpufreq_has_boost_support(cpu, &support, &active, &b_states);
        if (ret) {
                printf(_("Error while evaluating Boost Capabilities"
@@ -248,6 +241,33 @@ static int get_boost_mode(unsigned int cpu)
        return 0;
 }
 
+/* --boost / -b */
+
+static int get_boost_mode(unsigned int cpu)
+{
+       struct cpufreq_frequencies *freqs;
+
+       if (cpupower_cpu_info.vendor == X86_VENDOR_AMD ||
+           cpupower_cpu_info.vendor == X86_VENDOR_HYGON ||
+           cpupower_cpu_info.vendor == X86_VENDOR_INTEL)
+               return get_boost_mode_x86(cpu);
+
+       freqs = cpufreq_get_frequencies("boost", cpu);
+       if (freqs) {
+               printf(_("  boost frequency steps: "));
+               while (freqs->next) {
+                       print_speed(freqs->frequency);
+                       printf(", ");
+                       freqs = freqs->next;
+               }
+               print_speed(freqs->frequency);
+               printf("\n");
+               cpufreq_put_frequencies(freqs);
+       }
+
+       return 0;
+}
+
 /* --freq / -f */
 
 static int get_freq_kernel(unsigned int cpu, unsigned int human)
@@ -456,7 +476,7 @@ static int get_latency(unsigned int cpu, unsigned int human)
 
 static void debug_output_one(unsigned int cpu)
 {
-       struct cpufreq_available_frequencies *freqs;
+       struct cpufreq_frequencies *freqs;
 
        get_driver(cpu);
        get_related_cpus(cpu);
@@ -464,7 +484,7 @@ static void debug_output_one(unsigned int cpu)
        get_latency(cpu, 1);
        get_hardware_limits(cpu, 1);
 
-       freqs = cpufreq_get_available_frequencies(cpu);
+       freqs = cpufreq_get_frequencies("available", cpu);
        if (freqs) {
                printf(_("  available frequency steps:  "));
                while (freqs->next) {
@@ -474,7 +494,7 @@ static void debug_output_one(unsigned int cpu)
                }
                print_speed(freqs->frequency);
                printf("\n");
-               cpufreq_put_available_frequencies(freqs);
+               cpufreq_put_frequencies(freqs);
        }
 
        get_available_governors(cpu);