1 /* SPDX-License-Identifier: LGPL-2.0+ */ 2 /* Generic MTRR (Memory Type Range Register) ioctls. 3 4 Copyright (C) 1997-1999 Richard Gooch 5 6 Richard Gooch may be reached by email at rgooch@atnf.csiro.au 7 The postal address is: 8 Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. 9 */ 10 #ifndef _ASM_X86_MTRR_H 11 #define _ASM_X86_MTRR_H 12 13 #include <linux/bits.h> 14 #include <uapi/asm/mtrr.h> 15 16 /* Defines for hardware MTRR registers. */ 17 #define MTRR_CAP_VCNT GENMASK(7, 0) 18 #define MTRR_CAP_FIX BIT_MASK(8) 19 #define MTRR_CAP_WC BIT_MASK(10) 20 21 #define MTRR_DEF_TYPE_TYPE GENMASK(7, 0) 22 #define MTRR_DEF_TYPE_FE BIT_MASK(10) 23 #define MTRR_DEF_TYPE_E BIT_MASK(11) 24 25 #define MTRR_DEF_TYPE_ENABLE (MTRR_DEF_TYPE_FE | MTRR_DEF_TYPE_E) 26 #define MTRR_DEF_TYPE_DISABLE ~(MTRR_DEF_TYPE_TYPE | MTRR_DEF_TYPE_ENABLE) 27 28 #define MTRR_PHYSBASE_TYPE GENMASK(7, 0) 29 #define MTRR_PHYSBASE_RSVD GENMASK(11, 8) 30 31 #define MTRR_PHYSMASK_RSVD GENMASK(10, 0) 32 #define MTRR_PHYSMASK_V BIT_MASK(11) 33 34 struct mtrr_state_type { 35 struct mtrr_var_range var_ranges[MTRR_MAX_VAR_RANGES]; 36 mtrr_type fixed_ranges[MTRR_NUM_FIXED_RANGES]; 37 unsigned char enabled; 38 bool have_fixed; 39 mtrr_type def_type; 40 }; 41 42 /* 43 * The following functions are for use by other drivers that cannot use 44 * arch_phys_wc_add and arch_phys_wc_del. 45 */ 46 # ifdef CONFIG_MTRR 47 void mtrr_bp_init(void); 48 void guest_force_mtrr_state(struct mtrr_var_range *var, unsigned int num_var, 49 mtrr_type def_type); 50 extern u8 mtrr_type_lookup(u64 addr, u64 end, u8 *uniform); 51 extern void mtrr_save_fixed_ranges(void *); 52 extern void mtrr_save_state(void); 53 extern int mtrr_add(unsigned long base, unsigned long size, 54 unsigned int type, bool increment); 55 extern int mtrr_add_page(unsigned long base, unsigned long size, 56 unsigned int type, bool increment); 57 extern int mtrr_del(int reg, unsigned long base, unsigned long size); 58 extern int mtrr_del_page(int reg, unsigned long base, unsigned long size); 59 extern int mtrr_trim_uncached_memory(unsigned long end_pfn); 60 extern int amd_special_default_mtrr(void); 61 void mtrr_disable(void); 62 void mtrr_enable(void); 63 void mtrr_generic_set_state(void); 64 # else 65 static inline void guest_force_mtrr_state(struct mtrr_var_range *var, 66 unsigned int num_var, 67 mtrr_type def_type) 68 { 69 } 70 71 static inline u8 mtrr_type_lookup(u64 addr, u64 end, u8 *uniform) 72 { 73 /* 74 * Return the default MTRR type, without any known other types in 75 * that range. 76 */ 77 *uniform = 1; 78 79 return MTRR_TYPE_UNCACHABLE; 80 } 81 #define mtrr_save_fixed_ranges(arg) do {} while (0) 82 #define mtrr_save_state() do {} while (0) 83 static inline int mtrr_add(unsigned long base, unsigned long size, 84 unsigned int type, bool increment) 85 { 86 return -ENODEV; 87 } 88 static inline int mtrr_add_page(unsigned long base, unsigned long size, 89 unsigned int type, bool increment) 90 { 91 return -ENODEV; 92 } 93 static inline int mtrr_del(int reg, unsigned long base, unsigned long size) 94 { 95 return -ENODEV; 96 } 97 static inline int mtrr_del_page(int reg, unsigned long base, unsigned long size) 98 { 99 return -ENODEV; 100 } 101 static inline int mtrr_trim_uncached_memory(unsigned long end_pfn) 102 { 103 return 0; 104 } 105 #define mtrr_bp_init() do {} while (0) 106 #define mtrr_disable() do {} while (0) 107 #define mtrr_enable() do {} while (0) 108 #define mtrr_generic_set_state() do {} while (0) 109 # endif 110 111 #ifdef CONFIG_COMPAT 112 #include <linux/compat.h> 113 114 struct mtrr_sentry32 { 115 compat_ulong_t base; /* Base address */ 116 compat_uint_t size; /* Size of region */ 117 compat_uint_t type; /* Type of region */ 118 }; 119 120 struct mtrr_gentry32 { 121 compat_ulong_t regnum; /* Register number */ 122 compat_uint_t base; /* Base address */ 123 compat_uint_t size; /* Size of region */ 124 compat_uint_t type; /* Type of region */ 125 }; 126 127 #define MTRR_IOCTL_BASE 'M' 128 129 #define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32) 130 #define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32) 131 #define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32) 132 #define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32) 133 #define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32) 134 #define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32) 135 #define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32) 136 #define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32) 137 #define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32) 138 #define MTRRIOC32_KILL_PAGE_ENTRY \ 139 _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32) 140 #endif /* CONFIG_COMPAT */ 141 142 /* Bit fields for enabled in struct mtrr_state_type */ 143 #define MTRR_STATE_SHIFT 10 144 #define MTRR_STATE_MTRR_FIXED_ENABLED (MTRR_DEF_TYPE_FE >> MTRR_STATE_SHIFT) 145 #define MTRR_STATE_MTRR_ENABLED (MTRR_DEF_TYPE_E >> MTRR_STATE_SHIFT) 146 147 #endif /* _ASM_X86_MTRR_H */ 148