Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
tools
power
cpupower
utils
helpers
msr.c
Go to the documentation of this file.
1
#if defined(__i386__) || defined(__x86_64__)
2
3
#include <fcntl.h>
4
#include <
stdio.h
>
5
#include <unistd.h>
6
#include <stdint.h>
7
8
#include "
helpers/helpers.h
"
9
10
/* Intel specific MSRs */
11
#define MSR_IA32_PERF_STATUS 0x198
12
#define MSR_IA32_MISC_ENABLES 0x1a0
13
#define MSR_IA32_ENERGY_PERF_BIAS 0x1b0
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
int
msr_intel_get_perf_bias(
unsigned
int
cpu)
76
{
77
unsigned
long
long
val
;
78
int
ret
;
79
80
if
(!(
cpupower_cpu_info
.
caps
&
CPUPOWER_CAP_PERF_BIAS
))
81
return
-1;
82
83
ret = read_msr(cpu,
MSR_IA32_ENERGY_PERF_BIAS
, &val);
84
if
(ret)
85
return
ret
;
86
return
val
;
87
}
88
89
int
msr_intel_set_perf_bias(
unsigned
int
cpu,
unsigned
int
val)
90
{
91
int
ret
;
92
93
if
(!(
cpupower_cpu_info
.
caps
&
CPUPOWER_CAP_PERF_BIAS
))
94
return
-1;
95
96
ret = write_msr(cpu,
MSR_IA32_ENERGY_PERF_BIAS
, val);
97
if
(ret)
98
return
ret
;
99
return
0;
100
}
101
102
unsigned
long
long
msr_intel_get_turbo_ratio(
unsigned
int
cpu)
103
{
104
unsigned
long
long
val
;
105
int
ret
;
106
107
if
(!(
cpupower_cpu_info
.
caps
&
CPUPOWER_CAP_HAS_TURBO_RATIO
))
108
return
-1;
109
110
ret = read_msr(cpu,
MSR_NEHALEM_TURBO_RATIO_LIMIT
, &val);
111
if
(ret)
112
return
ret
;
113
return
val
;
114
}
115
#endif
Generated on Thu Jan 10 2013 13:20:54 for Linux Kernel by
1.8.2