Skip to content

Commit 4a06806

Browse files
huangruishuahkh
authored andcommitted
cpupower: Introduce ACPI CPPC library
Kernel ACPI subsytem introduced the sysfs attributes for acpi cppc library in below path: /sys/devices/system/cpu/cpuX/acpi_cppc/ And these attributes will be used for AMD P-State driver to provide some performance and frequency values. Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> Signed-off-by: Huang Rui <ray.huang@amd.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
1 parent e3ede97 commit 4a06806

3 files changed

Lines changed: 83 additions & 3 deletions

File tree

tools/power/cpupower/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ UTIL_HEADERS = utils/helpers/helpers.h utils/idle_monitor/cpupower-monitor.h \
143143
utils/helpers/bitmask.h \
144144
utils/idle_monitor/idle_monitors.h utils/idle_monitor/idle_monitors.def
145145

146-
LIB_HEADERS = lib/cpufreq.h lib/cpupower.h lib/cpuidle.h
147-
LIB_SRC = lib/cpufreq.c lib/cpupower.c lib/cpuidle.c
148-
LIB_OBJS = lib/cpufreq.o lib/cpupower.o lib/cpuidle.o
146+
LIB_HEADERS = lib/cpufreq.h lib/cpupower.h lib/cpuidle.h lib/acpi_cppc.h
147+
LIB_SRC = lib/cpufreq.c lib/cpupower.c lib/cpuidle.c lib/acpi_cppc.c
148+
LIB_OBJS = lib/cpufreq.o lib/cpupower.o lib/cpuidle.o lib/acpi_cppc.o
149149
LIB_OBJS := $(addprefix $(OUTPUT),$(LIB_OBJS))
150150

151151
override CFLAGS += -pipe
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
3+
#include <stdio.h>
4+
#include <errno.h>
5+
#include <stdlib.h>
6+
#include <string.h>
7+
#include <sys/types.h>
8+
#include <sys/stat.h>
9+
#include <fcntl.h>
10+
#include <unistd.h>
11+
12+
#include "cpupower_intern.h"
13+
#include "acpi_cppc.h"
14+
15+
/* ACPI CPPC sysfs access ***********************************************/
16+
17+
static int acpi_cppc_read_file(unsigned int cpu, const char *fname,
18+
char *buf, size_t buflen)
19+
{
20+
char path[SYSFS_PATH_MAX];
21+
22+
snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/acpi_cppc/%s",
23+
cpu, fname);
24+
return cpupower_read_sysfs(path, buf, buflen);
25+
}
26+
27+
static const char * const acpi_cppc_value_files[] = {
28+
[HIGHEST_PERF] = "highest_perf",
29+
[LOWEST_PERF] = "lowest_perf",
30+
[NOMINAL_PERF] = "nominal_perf",
31+
[LOWEST_NONLINEAR_PERF] = "lowest_nonlinear_perf",
32+
[LOWEST_FREQ] = "lowest_freq",
33+
[NOMINAL_FREQ] = "nominal_freq",
34+
[REFERENCE_PERF] = "reference_perf",
35+
[WRAPAROUND_TIME] = "wraparound_time"
36+
};
37+
38+
unsigned long acpi_cppc_get_data(unsigned int cpu, enum acpi_cppc_value which)
39+
{
40+
unsigned long long value;
41+
unsigned int len;
42+
char linebuf[MAX_LINE_LEN];
43+
char *endp;
44+
45+
if (which >= MAX_CPPC_VALUE_FILES)
46+
return 0;
47+
48+
len = acpi_cppc_read_file(cpu, acpi_cppc_value_files[which],
49+
linebuf, sizeof(linebuf));
50+
if (len == 0)
51+
return 0;
52+
53+
value = strtoull(linebuf, &endp, 0);
54+
55+
if (endp == linebuf || errno == ERANGE)
56+
return 0;
57+
58+
return value;
59+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
3+
#ifndef __ACPI_CPPC_H__
4+
#define __ACPI_CPPC_H__
5+
6+
enum acpi_cppc_value {
7+
HIGHEST_PERF,
8+
LOWEST_PERF,
9+
NOMINAL_PERF,
10+
LOWEST_NONLINEAR_PERF,
11+
LOWEST_FREQ,
12+
NOMINAL_FREQ,
13+
REFERENCE_PERF,
14+
WRAPAROUND_TIME,
15+
MAX_CPPC_VALUE_FILES
16+
};
17+
18+
unsigned long acpi_cppc_get_data(unsigned int cpu,
19+
enum acpi_cppc_value which);
20+
21+
#endif /* _ACPI_CPPC_H */

0 commit comments

Comments
 (0)