Commit 41ddb7e1 authored by Thomas Renninger's avatar Thomas Renninger Committed by Shuah Khan

cpupower: Revert library ABI changes from commit ae291709

Commit ae291709 ("tools/power/cpupower: Display boost frequency
separately") modified the library function:

struct cpufreq_available_frequencies
*cpufreq_get_available_frequencies(unsigned int cpu)

to
struct cpufreq_frequencies
*cpufreq_get_frequencies(const char *type, unsigned int cpu)

This patch recovers the old API and implements the new functionality
in a newly introduce method:
struct cpufreq_boost_frequencies
*cpufreq_get_available_frequencies(unsigned int cpu)

This one should get merged into stable kernels back to 5.0 when
the above had been introduced.

Fixes: ae291709 ("tools/power/cpupower: Display boost frequency separately")

Cc: stable@vger.kernel.org
Signed-off-by: default avatarThomas Renninger <trenn@suse.de>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent b3a987b0
...@@ -332,20 +332,73 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any) ...@@ -332,20 +332,73 @@ void cpufreq_put_available_governors(struct cpufreq_available_governors *any)
} }
struct cpufreq_frequencies struct cpufreq_available_frequencies
*cpufreq_get_frequencies(const char *type, unsigned int cpu) *cpufreq_get_available_frequencies(unsigned int cpu)
{ {
struct cpufreq_frequencies *first = NULL; struct cpufreq_available_frequencies *first = NULL;
struct cpufreq_frequencies *current = NULL; struct cpufreq_available_frequencies *current = NULL;
char one_value[SYSFS_PATH_MAX]; char one_value[SYSFS_PATH_MAX];
char linebuf[MAX_LINE_LEN]; char linebuf[MAX_LINE_LEN];
char fname[MAX_LINE_LEN];
unsigned int pos, i; unsigned int pos, i;
unsigned int len; unsigned int len;
snprintf(fname, MAX_LINE_LEN, "scaling_%s_frequencies", type); len = sysfs_cpufreq_read_file(cpu, "scaling_available_frequencies",
linebuf, sizeof(linebuf));
if (len == 0)
return NULL;
len = sysfs_cpufreq_read_file(cpu, fname, pos = 0;
for (i = 0; i < len; i++) {
if (linebuf[i] == ' ' || linebuf[i] == '\n') {
if (i - pos < 2)
continue;
if (i - pos >= SYSFS_PATH_MAX)
goto error_out;
if (current) {
current->next = malloc(sizeof(*current));
if (!current->next)
goto error_out;
current = current->next;
} else {
first = malloc(sizeof(*first));
if (!first)
goto error_out;
current = first;
}
current->first = first;
current->next = NULL;
memcpy(one_value, linebuf + pos, i - pos);
one_value[i - pos] = '\0';
if (sscanf(one_value, "%lu", &current->frequency) != 1)
goto error_out;
pos = i + 1;
}
}
return first;
error_out:
while (first) {
current = first->next;
free(first);
first = current;
}
return NULL;
}
struct cpufreq_available_frequencies
*cpufreq_get_boost_frequencies(unsigned int cpu)
{
struct cpufreq_available_frequencies *first = NULL;
struct cpufreq_available_frequencies *current = NULL;
char one_value[SYSFS_PATH_MAX];
char linebuf[MAX_LINE_LEN];
unsigned int pos, i;
unsigned int len;
len = sysfs_cpufreq_read_file(cpu, "scaling_boost_frequencies",
linebuf, sizeof(linebuf)); linebuf, sizeof(linebuf));
if (len == 0) if (len == 0)
return NULL; return NULL;
...@@ -391,9 +444,9 @@ struct cpufreq_frequencies ...@@ -391,9 +444,9 @@ struct cpufreq_frequencies
return NULL; return NULL;
} }
void cpufreq_put_frequencies(struct cpufreq_frequencies *any) void cpufreq_put_available_frequencies(struct cpufreq_available_frequencies *any)
{ {
struct cpufreq_frequencies *tmp, *next; struct cpufreq_available_frequencies *tmp, *next;
if (!any) if (!any)
return; return;
...@@ -406,6 +459,11 @@ void cpufreq_put_frequencies(struct cpufreq_frequencies *any) ...@@ -406,6 +459,11 @@ void cpufreq_put_frequencies(struct cpufreq_frequencies *any)
} }
} }
void cpufreq_put_boost_frequencies(struct cpufreq_available_frequencies *any)
{
cpufreq_put_available_frequencies(any);
}
static struct cpufreq_affected_cpus *sysfs_get_cpu_list(unsigned int cpu, static struct cpufreq_affected_cpus *sysfs_get_cpu_list(unsigned int cpu,
const char *file) const char *file)
{ {
......
...@@ -20,10 +20,10 @@ struct cpufreq_available_governors { ...@@ -20,10 +20,10 @@ struct cpufreq_available_governors {
struct cpufreq_available_governors *first; struct cpufreq_available_governors *first;
}; };
struct cpufreq_frequencies { struct cpufreq_available_frequencies {
unsigned long frequency; unsigned long frequency;
struct cpufreq_frequencies *next; struct cpufreq_available_frequencies *next;
struct cpufreq_frequencies *first; struct cpufreq_available_frequencies *first;
}; };
...@@ -124,11 +124,17 @@ void cpufreq_put_available_governors( ...@@ -124,11 +124,17 @@ void cpufreq_put_available_governors(
* cpufreq_put_frequencies after use. * cpufreq_put_frequencies after use.
*/ */
struct cpufreq_frequencies struct cpufreq_available_frequencies
*cpufreq_get_frequencies(const char *type, unsigned int cpu); *cpufreq_get_available_frequencies(unsigned int cpu);
void cpufreq_put_frequencies( void cpufreq_put_available_frequencies(
struct cpufreq_frequencies *first); struct cpufreq_available_frequencies *first);
struct cpufreq_available_frequencies
*cpufreq_get_boost_frequencies(unsigned int cpu);
void cpufreq_put_boost_frequencies(
struct cpufreq_available_frequencies *first);
/* determine affected CPUs /* determine affected CPUs
......
...@@ -244,14 +244,14 @@ static int get_boost_mode_x86(unsigned int cpu) ...@@ -244,14 +244,14 @@ static int get_boost_mode_x86(unsigned int cpu)
static int get_boost_mode(unsigned int cpu) static int get_boost_mode(unsigned int cpu)
{ {
struct cpufreq_frequencies *freqs; struct cpufreq_available_frequencies *freqs;
if (cpupower_cpu_info.vendor == X86_VENDOR_AMD || if (cpupower_cpu_info.vendor == X86_VENDOR_AMD ||
cpupower_cpu_info.vendor == X86_VENDOR_HYGON || cpupower_cpu_info.vendor == X86_VENDOR_HYGON ||
cpupower_cpu_info.vendor == X86_VENDOR_INTEL) cpupower_cpu_info.vendor == X86_VENDOR_INTEL)
return get_boost_mode_x86(cpu); return get_boost_mode_x86(cpu);
freqs = cpufreq_get_frequencies("boost", cpu); freqs = cpufreq_get_boost_frequencies(cpu);
if (freqs) { if (freqs) {
printf(_(" boost frequency steps: ")); printf(_(" boost frequency steps: "));
while (freqs->next) { while (freqs->next) {
...@@ -261,7 +261,7 @@ static int get_boost_mode(unsigned int cpu) ...@@ -261,7 +261,7 @@ static int get_boost_mode(unsigned int cpu)
} }
print_speed(freqs->frequency); print_speed(freqs->frequency);
printf("\n"); printf("\n");
cpufreq_put_frequencies(freqs); cpufreq_put_available_frequencies(freqs);
} }
return 0; return 0;
...@@ -475,7 +475,7 @@ static int get_latency(unsigned int cpu, unsigned int human) ...@@ -475,7 +475,7 @@ static int get_latency(unsigned int cpu, unsigned int human)
static void debug_output_one(unsigned int cpu) static void debug_output_one(unsigned int cpu)
{ {
struct cpufreq_frequencies *freqs; struct cpufreq_available_frequencies *freqs;
get_driver(cpu); get_driver(cpu);
get_related_cpus(cpu); get_related_cpus(cpu);
...@@ -483,7 +483,7 @@ static void debug_output_one(unsigned int cpu) ...@@ -483,7 +483,7 @@ static void debug_output_one(unsigned int cpu)
get_latency(cpu, 1); get_latency(cpu, 1);
get_hardware_limits(cpu, 1); get_hardware_limits(cpu, 1);
freqs = cpufreq_get_frequencies("available", cpu); freqs = cpufreq_get_available_frequencies(cpu);
if (freqs) { if (freqs) {
printf(_(" available frequency steps: ")); printf(_(" available frequency steps: "));
while (freqs->next) { while (freqs->next) {
...@@ -493,7 +493,7 @@ static void debug_output_one(unsigned int cpu) ...@@ -493,7 +493,7 @@ static void debug_output_one(unsigned int cpu)
} }
print_speed(freqs->frequency); print_speed(freqs->frequency);
printf("\n"); printf("\n");
cpufreq_put_frequencies(freqs); cpufreq_put_available_frequencies(freqs);
} }
get_available_governors(cpu); get_available_governors(cpu);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment