blob: fac2e58502763b830ea4bd9db2ce0b8c99ccf36c [file] [log] [blame]
Graeme Russ98568f02012-12-02 04:55:11 +00001/*
2 * Generic MTRR (Memory Type Range Register) ioctls.
3 * Taken from the Linux kernel
4 *
5 * (C) Copyright 2012
6 * Graeme Russ, <graeme.russ@gmail.com>
7 *
8 * Copyright (C) 1997-1999 Richard Gooch <rgooch@atnf.csiro.au>
9 *
Wolfgang Denk1a459662013-07-08 09:37:19 +020010 * SPDX-License-Identifier: GPL-2.0+
Graeme Russ98568f02012-12-02 04:55:11 +000011 */
12
13#ifndef _ASM_X86_MTRR_H
14#define _ASM_X86_MTRR_H
15
16#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
17#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
18
19#ifndef __ASSEMBLY__
20
21#include <linux/types.h>
22#include <linux/ioctl.h>
23#include <errno.h>
24
25#define MTRR_IOCTL_BASE 'M'
26
27struct mtrr_sentry {
28 unsigned long base; /* Base address */
29 unsigned int size; /* Size of region */
30 unsigned int type; /* Type of region */
31};
32
33/*
34 * Warning: this structure has a different order from i386
35 * on x86-64. The 32bit emulation code takes care of that.
36 * But you need to use this for 64bit, otherwise your X server
37 * will break.
38 */
39
40#ifdef __i386__
41struct mtrr_gentry {
42 unsigned int regnum; /* Register number */
43 unsigned long base; /* Base address */
44 unsigned int size; /* Size of region */
45 unsigned int type; /* Type of region */
46};
47
48#else /* __i386__ */
49
50struct mtrr_gentry {
51 unsigned long base; /* Base address */
52 unsigned int size; /* Size of region */
53 unsigned int regnum; /* Register number */
54 unsigned int type; /* Type of region */
55};
56#endif /* !__i386__ */
57
58struct mtrr_var_range {
59 __u32 base_lo;
60 __u32 base_hi;
61 __u32 mask_lo;
62 __u32 mask_hi;
63};
64
65/*
66 * In the Intel processor's MTRR interface, the MTRR type is always held in
67 * an 8 bit field:
68 */
69typedef __u8 mtrr_type;
70
71#define MTRR_NUM_FIXED_RANGES 88
72#define MTRR_MAX_VAR_RANGES 256
73
74struct mtrr_state_type {
75 struct mtrr_var_range var_ranges[MTRR_MAX_VAR_RANGES];
76 mtrr_type fixed_ranges[MTRR_NUM_FIXED_RANGES];
77 unsigned char enabled;
78 unsigned char have_fixed;
79 mtrr_type def_type;
80};
81
82/* These are the various ioctls */
83#define MTRRIOC_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry)
84#define MTRRIOC_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry)
85#define MTRRIOC_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry)
86#define MTRRIOC_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry)
87#define MTRRIOC_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry)
88#define MTRRIOC_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry)
89#define MTRRIOC_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry)
90#define MTRRIOC_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry)
91#define MTRRIOC_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry)
92#define MTRRIOC_KILL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry)
93
94/* These are the region types */
95#define MTRR_TYPE_UNCACHABLE 0
96#define MTRR_TYPE_WRCOMB 1
97/*#define MTRR_TYPE_ 2*/
98/*#define MTRR_TYPE_ 3*/
99#define MTRR_TYPE_WRTHROUGH 4
100#define MTRR_TYPE_WRPROT 5
101#define MTRR_TYPE_WRBACK 6
102#define MTRR_NUM_TYPES 7
103
104#ifdef __KERNEL__
105
106/* The following functions are for use by other drivers */
107# ifdef CONFIG_MTRR
108extern u8 mtrr_type_lookup(u64 addr, u64 end);
109extern void mtrr_save_fixed_ranges(void *);
110extern void mtrr_save_state(void);
111extern int mtrr_add(unsigned long base, unsigned long size,
112 unsigned int type, bool increment);
113extern int mtrr_add_page(unsigned long base, unsigned long size,
114 unsigned int type, bool increment);
115extern int mtrr_del(int reg, unsigned long base, unsigned long size);
116extern int mtrr_del_page(int reg, unsigned long base, unsigned long size);
117extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi);
118extern void mtrr_ap_init(void);
119extern void mtrr_bp_init(void);
120extern void set_mtrr_aps_delayed_init(void);
121extern void mtrr_aps_init(void);
122extern void mtrr_bp_restore(void);
123extern int mtrr_trim_uncached_memory(unsigned long end_pfn);
124extern int amd_special_default_mtrr(void);
125# else
126static inline u8 mtrr_type_lookup(u64 addr, u64 end)
127{
128 /*
129 * Return no-MTRRs:
130 */
131 return 0xff;
132}
133#define mtrr_save_fixed_ranges(arg) do {} while (0)
134#define mtrr_save_state() do {} while (0)
135static inline int mtrr_del(int reg, unsigned long base, unsigned long size)
136{
137 return -ENODEV;
138}
139static inline int mtrr_del_page(int reg, unsigned long base, unsigned long size)
140{
141 return -ENODEV;
142}
143static inline int mtrr_trim_uncached_memory(unsigned long end_pfn)
144{
145 return 0;
146}
147static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi)
148{
149}
150
151#define mtrr_ap_init() do {} while (0)
152#define mtrr_bp_init() do {} while (0)
153#define set_mtrr_aps_delayed_init() do {} while (0)
154#define mtrr_aps_init() do {} while (0)
155#define mtrr_bp_restore() do {} while (0)
156# endif
157
158#ifdef CONFIG_COMPAT
159#include <linux/compat.h>
160
161struct mtrr_sentry32 {
162 compat_ulong_t base; /* Base address */
163 compat_uint_t size; /* Size of region */
164 compat_uint_t type; /* Type of region */
165};
166
167struct mtrr_gentry32 {
168 compat_ulong_t regnum; /* Register number */
169 compat_uint_t base; /* Base address */
170 compat_uint_t size; /* Size of region */
171 compat_uint_t type; /* Type of region */
172};
173
174#define MTRR_IOCTL_BASE 'M'
175
176#define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32)
177#define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32)
178#define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32)
179#define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32)
180#define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32)
181#define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32)
182#define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32)
183#define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32)
184#define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32)
185#define MTRRIOC32_KILL_PAGE_ENTRY \
186 _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32)
187#endif /* CONFIG_COMPAT */
188
189#endif /* __KERNEL__ */
190
191#endif /* __ASSEMBLY__ */
192
193#endif /* _ASM_X86_MTRR_H */