1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef _ASM_X86_MTRR_H
24#define _ASM_X86_MTRR_H
25
26#include <linux/types.h>
27#include <linux/ioctl.h>
28#include <linux/errno.h>
29
30#define MTRR_IOCTL_BASE 'M'
31
32struct mtrr_sentry {
33 unsigned long base;
34 unsigned int size;
35 unsigned int type;
36};
37
38
39
40
41
42
43#ifdef __i386__
44struct mtrr_gentry {
45 unsigned int regnum;
46 unsigned long base;
47 unsigned int size;
48 unsigned int type;
49};
50
51#else
52
53struct mtrr_gentry {
54 unsigned long base;
55 unsigned int size;
56 unsigned int regnum;
57 unsigned int type;
58};
59#endif
60
61struct mtrr_var_range {
62 __u32 base_lo;
63 __u32 base_hi;
64 __u32 mask_lo;
65 __u32 mask_hi;
66};
67
68
69
70typedef __u8 mtrr_type;
71
72#define MTRR_NUM_FIXED_RANGES 88
73#define MTRR_MAX_VAR_RANGES 256
74
75struct mtrr_state_type {
76 struct mtrr_var_range var_ranges[MTRR_MAX_VAR_RANGES];
77 mtrr_type fixed_ranges[MTRR_NUM_FIXED_RANGES];
78 unsigned char enabled;
79 unsigned char have_fixed;
80 mtrr_type def_type;
81};
82
83#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
84#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
85
86
87#define MTRRIOC_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry)
88#define MTRRIOC_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry)
89#define MTRRIOC_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry)
90#define MTRRIOC_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry)
91#define MTRRIOC_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry)
92#define MTRRIOC_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry)
93#define MTRRIOC_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry)
94#define MTRRIOC_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry)
95#define MTRRIOC_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry)
96#define MTRRIOC_KILL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry)
97
98
99#define MTRR_TYPE_UNCACHABLE 0
100#define MTRR_TYPE_WRCOMB 1
101
102
103#define MTRR_TYPE_WRTHROUGH 4
104#define MTRR_TYPE_WRPROT 5
105#define MTRR_TYPE_WRBACK 6
106#define MTRR_NUM_TYPES 7
107
108#ifdef __KERNEL__
109
110
111# ifdef CONFIG_MTRR
112extern u8 mtrr_type_lookup(u64 addr, u64 end);
113extern void mtrr_save_fixed_ranges(void *);
114extern void mtrr_save_state(void);
115extern int mtrr_add(unsigned long base, unsigned long size,
116 unsigned int type, bool increment);
117extern int mtrr_add_page(unsigned long base, unsigned long size,
118 unsigned int type, bool increment);
119extern int mtrr_del(int reg, unsigned long base, unsigned long size);
120extern int mtrr_del_page(int reg, unsigned long base, unsigned long size);
121extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
122extern void mtrr_ap_init(void);
123extern void mtrr_bp_init(void);
124extern void set_mtrr_aps_delayed_init(void);
125extern void mtrr_aps_init(void);
126extern void mtrr_bp_restore(void);
127extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
128extern int amd_special_default_mtrr(void);
129# else
130static inline u8 mtrr_type_lookup(u64 addr, u64 end)
131{
132
133
134
135 return 0xff;
136}
137#define mtrr_save_fixed_ranges(arg) do {} while (0)
138#define mtrr_save_state() do {} while (0)
139static inline int mtrr_add(unsigned long base, unsigned long size,
140 unsigned int type, bool increment)
141{
142 return -ENODEV;
143}
144static inline int mtrr_add_page(unsigned long base, unsigned long size,
145 unsigned int type, bool increment)
146{
147 return -ENODEV;
148}
149static inline int mtrr_del(int reg, unsigned long base, unsigned long size)
150{
151 return -ENODEV;
152}
153static inline int mtrr_del_page(int reg, unsigned long base, unsigned long size)
154{
155 return -ENODEV;
156}
157static inline int mtrr_trim_uncached_memory(unsigned long end_pfn)
158{
159 return 0;
160}
161static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi)
162{
163}
164
165#define mtrr_ap_init() do {} while (0)
166#define mtrr_bp_init() do {} while (0)
167#define set_mtrr_aps_delayed_init() do {} while (0)
168#define mtrr_aps_init() do {} while (0)
169#define mtrr_bp_restore() do {} while (0)
170# endif
171
172#ifdef CONFIG_COMPAT
173#include <linux/compat.h>
174
175struct mtrr_sentry32 {
176 compat_ulong_t base;
177 compat_uint_t size;
178 compat_uint_t type;
179};
180
181struct mtrr_gentry32 {
182 compat_ulong_t regnum;
183 compat_uint_t base;
184 compat_uint_t size;
185 compat_uint_t type;
186};
187
188#define MTRR_IOCTL_BASE 'M'
189
190#define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32)
191#define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32)
192#define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32)
193#define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32)
194#define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32)
195#define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32)
196#define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32)
197#define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32)
198#define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32)
199#define MTRRIOC32_KILL_PAGE_ENTRY \
200 _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32)
201#endif
202
203#endif
204
205#endif
206