Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/power/cpupower/utils/helpers/msr.c
26299 views
1
// SPDX-License-Identifier: GPL-2.0
2
#if defined(__i386__) || defined(__x86_64__)
3
4
#include <fcntl.h>
5
#include <stdio.h>
6
#include <unistd.h>
7
#include <stdint.h>
8
9
#include "helpers/helpers.h"
10
11
/* Intel specific MSRs */
12
#define MSR_IA32_PERF_STATUS 0x198
13
#define MSR_IA32_MISC_ENABLES 0x1a0
14
#define MSR_NEHALEM_TURBO_RATIO_LIMIT 0x1ad
15
16
/*
17
* read_msr
18
*
19
* Will return 0 on success and -1 on failure.
20
* Possible errno values could be:
21
* EFAULT -If the read/write did not fully complete
22
* EIO -If the CPU does not support MSRs
23
* ENXIO -If the CPU does not exist
24
*/
25
26
int read_msr(int cpu, unsigned int idx, unsigned long long *val)
27
{
28
int fd;
29
char msr_file_name[64];
30
31
sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu);
32
fd = open(msr_file_name, O_RDONLY);
33
if (fd < 0)
34
return -1;
35
if (lseek(fd, idx, SEEK_CUR) == -1)
36
goto err;
37
if (read(fd, val, sizeof *val) != sizeof *val)
38
goto err;
39
close(fd);
40
return 0;
41
err:
42
close(fd);
43
return -1;
44
}
45
46
/*
47
* write_msr
48
*
49
* Will return 0 on success and -1 on failure.
50
* Possible errno values could be:
51
* EFAULT -If the read/write did not fully complete
52
* EIO -If the CPU does not support MSRs
53
* ENXIO -If the CPU does not exist
54
*/
55
int write_msr(int cpu, unsigned int idx, unsigned long long val)
56
{
57
int fd;
58
char msr_file_name[64];
59
60
sprintf(msr_file_name, "/dev/cpu/%d/msr", cpu);
61
fd = open(msr_file_name, O_WRONLY);
62
if (fd < 0)
63
return -1;
64
if (lseek(fd, idx, SEEK_CUR) == -1)
65
goto err;
66
if (write(fd, &val, sizeof val) != sizeof val)
67
goto err;
68
close(fd);
69
return 0;
70
err:
71
close(fd);
72
return -1;
73
}
74
75
unsigned long long msr_intel_get_turbo_ratio(unsigned int cpu)
76
{
77
unsigned long long val;
78
int ret;
79
80
if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_HAS_TURBO_RATIO))
81
return -1;
82
83
ret = read_msr(cpu, MSR_NEHALEM_TURBO_RATIO_LIMIT, &val);
84
if (ret)
85
return ret;
86
return val;
87
}
88
#endif
89
90