| 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 |  | 
|---|