blob: 7e3f17f92c665ec79850eefa328567e06c50134c [file] [log] [blame]
Thomas Gleixner297a99e2007-10-23 22:37:24 +02001/* Generic MTRR (Memory Type Range Register) ioctls.
2
3 Copyright (C) 1997-1999 Richard Gooch
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 Richard Gooch may be reached by email at rgooch@atnf.csiro.au
20 The postal address is:
21 Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
22*/
H. Peter Anvin1965aae2008-10-22 22:26:29 -070023#ifndef _ASM_X86_MTRR_H
24#define _ASM_X86_MTRR_H
Thomas Gleixner297a99e2007-10-23 22:37:24 +020025
Jaswinder Singh Rajputd1220722009-01-30 22:48:17 +053026#include <linux/types.h>
Thomas Gleixner297a99e2007-10-23 22:37:24 +020027#include <linux/ioctl.h>
28#include <linux/errno.h>
29
30#define MTRR_IOCTL_BASE 'M'
31
Thomas Gleixner297a99e2007-10-23 22:37:24 +020032/* Warning: this structure has a different order from i386
33 on x86-64. The 32bit emulation code takes care of that.
34 But you need to use this for 64bit, otherwise your X server
35 will break. */
36
37#ifdef __i386__
H. Peter Anvinb263b312012-02-27 15:15:25 -080038struct mtrr_sentry {
39 unsigned long base; /* Base address */
40 unsigned int size; /* Size of region */
41 unsigned int type; /* Type of region */
42};
43
Joe Perches9969b442008-03-23 01:02:52 -070044struct mtrr_gentry {
Thomas Gleixner297a99e2007-10-23 22:37:24 +020045 unsigned int regnum; /* Register number */
46 unsigned long base; /* Base address */
47 unsigned int size; /* Size of region */
48 unsigned int type; /* Type of region */
49};
50
51#else /* __i386__ */
52
H. Peter Anvinb263b312012-02-27 15:15:25 -080053struct mtrr_sentry {
54 __u64 base; /* Base address */
55 __u32 size; /* Size of region */
56 __u32 type; /* Type of region */
Thomas Gleixner297a99e2007-10-23 22:37:24 +020057};
H. Peter Anvinb263b312012-02-27 15:15:25 -080058
59struct mtrr_gentry {
60 __u64 base; /* Base address */
61 __u32 size; /* Size of region */
62 __u32 regnum; /* Register number */
63 __u32 type; /* Type of region */
64 __u32 _pad; /* Unused */
65};
66
Thomas Gleixner297a99e2007-10-23 22:37:24 +020067#endif /* !__i386__ */
68
Sheng Yang932d27a2008-10-09 16:01:53 +080069struct mtrr_var_range {
Kyle McMartin79f3b3c2009-01-08 10:04:30 -050070 __u32 base_lo;
71 __u32 base_hi;
72 __u32 mask_lo;
73 __u32 mask_hi;
Sheng Yang932d27a2008-10-09 16:01:53 +080074};
75
76/* In the Intel processor's MTRR interface, the MTRR type is always held in
77 an 8 bit field: */
Kyle McMartin79f3b3c2009-01-08 10:04:30 -050078typedef __u8 mtrr_type;
Sheng Yang932d27a2008-10-09 16:01:53 +080079
80#define MTRR_NUM_FIXED_RANGES 88
81#define MTRR_MAX_VAR_RANGES 256
82
83struct mtrr_state_type {
84 struct mtrr_var_range var_ranges[MTRR_MAX_VAR_RANGES];
85 mtrr_type fixed_ranges[MTRR_NUM_FIXED_RANGES];
86 unsigned char enabled;
87 unsigned char have_fixed;
88 mtrr_type def_type;
89};
90
91#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
92#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
93
Thomas Gleixner297a99e2007-10-23 22:37:24 +020094/* These are the various ioctls */
95#define MTRRIOC_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry)
96#define MTRRIOC_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry)
97#define MTRRIOC_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry)
98#define MTRRIOC_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry)
99#define MTRRIOC_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry)
100#define MTRRIOC_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry)
101#define MTRRIOC_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry)
102#define MTRRIOC_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry)
103#define MTRRIOC_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry)
104#define MTRRIOC_KILL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry)
105
106/* These are the region types */
107#define MTRR_TYPE_UNCACHABLE 0
108#define MTRR_TYPE_WRCOMB 1
109/*#define MTRR_TYPE_ 2*/
110/*#define MTRR_TYPE_ 3*/
111#define MTRR_TYPE_WRTHROUGH 4
112#define MTRR_TYPE_WRPROT 5
113#define MTRR_TYPE_WRBACK 6
114#define MTRR_NUM_TYPES 7
115
Thomas Gleixner96a388d2007-10-11 11:20:03 +0200116#ifdef __KERNEL__
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200117
118/* The following functions are for use by other drivers */
119# ifdef CONFIG_MTRR
Ingo Molnar52783fa2008-03-21 15:42:28 +0100120extern u8 mtrr_type_lookup(u64 addr, u64 end);
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200121extern void mtrr_save_fixed_ranges(void *);
122extern void mtrr_save_state(void);
Joe Perches9969b442008-03-23 01:02:52 -0700123extern int mtrr_add(unsigned long base, unsigned long size,
124 unsigned int type, bool increment);
125extern int mtrr_add_page(unsigned long base, unsigned long size,
126 unsigned int type, bool increment);
127extern int mtrr_del(int reg, unsigned long base, unsigned long size);
128extern int mtrr_del_page(int reg, unsigned long base, unsigned long size);
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200129extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
130extern void mtrr_ap_init(void);
131extern void mtrr_bp_init(void);
Suresh Siddhad0af9ee2009-08-19 18:05:36 -0700132extern void set_mtrr_aps_delayed_init(void);
133extern void mtrr_aps_init(void);
134extern void mtrr_bp_restore(void);
Jesse Barnes99fc8d42008-01-30 13:33:18 +0100135extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
Yinghai Lu35605a12008-03-24 16:02:01 -0700136extern int amd_special_default_mtrr(void);
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200137# else
Ingo Molnar52783fa2008-03-21 15:42:28 +0100138static inline u8 mtrr_type_lookup(u64 addr, u64 end)
139{
140 /*
141 * Return no-MTRRs:
142 */
143 return 0xff;
144}
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200145#define mtrr_save_fixed_ranges(arg) do {} while (0)
146#define mtrr_save_state() do {} while (0)
Joe Perches9969b442008-03-23 01:02:52 -0700147static inline int mtrr_add(unsigned long base, unsigned long size,
148 unsigned int type, bool increment)
149{
150 return -ENODEV;
151}
152static inline int mtrr_add_page(unsigned long base, unsigned long size,
Paul Jimenez2d2ee8d2008-01-30 13:30:31 +0100153 unsigned int type, bool increment)
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200154{
155 return -ENODEV;
156}
Joe Perches9969b442008-03-23 01:02:52 -0700157static inline int mtrr_del(int reg, unsigned long base, unsigned long size)
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200158{
159 return -ENODEV;
160}
Joe Perches9969b442008-03-23 01:02:52 -0700161static inline int mtrr_del_page(int reg, unsigned long base, unsigned long size)
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200162{
163 return -ENODEV;
164}
Jesse Barnes99fc8d42008-01-30 13:33:18 +0100165static inline int mtrr_trim_uncached_memory(unsigned long end_pfn)
166{
167 return 0;
168}
Joe Perches9969b442008-03-23 01:02:52 -0700169static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi)
170{
171}
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200172
173#define mtrr_ap_init() do {} while (0)
174#define mtrr_bp_init() do {} while (0)
Suresh Siddhad0af9ee2009-08-19 18:05:36 -0700175#define set_mtrr_aps_delayed_init() do {} while (0)
176#define mtrr_aps_init() do {} while (0)
177#define mtrr_bp_restore() do {} while (0)
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200178# endif
179
180#ifdef CONFIG_COMPAT
181#include <linux/compat.h>
182
Joe Perches9969b442008-03-23 01:02:52 -0700183struct mtrr_sentry32 {
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200184 compat_ulong_t base; /* Base address */
185 compat_uint_t size; /* Size of region */
186 compat_uint_t type; /* Type of region */
187};
188
Joe Perches9969b442008-03-23 01:02:52 -0700189struct mtrr_gentry32 {
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200190 compat_ulong_t regnum; /* Register number */
191 compat_uint_t base; /* Base address */
192 compat_uint_t size; /* Size of region */
193 compat_uint_t type; /* Type of region */
194};
195
196#define MTRR_IOCTL_BASE 'M'
197
Joe Perches9969b442008-03-23 01:02:52 -0700198#define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32)
199#define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32)
200#define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32)
201#define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32)
202#define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32)
203#define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32)
204#define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32)
205#define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32)
206#define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32)
207#define MTRRIOC32_KILL_PAGE_ENTRY \
208 _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32)
Thomas Gleixner297a99e2007-10-23 22:37:24 +0200209#endif /* CONFIG_COMPAT */
210
211#endif /* __KERNEL__ */
212
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700213#endif /* _ASM_X86_MTRR_H */