Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/power/cpupower/lib/acpi_cppc.c
25923 views
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
}
60
61