| 1 | /* |
|---|
| 2 | * local mtrr defines. |
|---|
| 3 | */ |
|---|
| 4 | |
|---|
| 5 | #ifndef TRUE |
|---|
| 6 | #define TRUE 1 |
|---|
| 7 | #define FALSE 0 |
|---|
| 8 | #endif |
|---|
| 9 | |
|---|
| 10 | #define MTRRcap_MSR 0x0fe |
|---|
| 11 | #define MTRRdefType_MSR 0x2ff |
|---|
| 12 | |
|---|
| 13 | #define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg)) |
|---|
| 14 | #define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1) |
|---|
| 15 | |
|---|
| 16 | #define NUM_FIXED_RANGES 88 |
|---|
| 17 | #define MTRRfix64K_00000_MSR 0x250 |
|---|
| 18 | #define MTRRfix16K_80000_MSR 0x258 |
|---|
| 19 | #define MTRRfix16K_A0000_MSR 0x259 |
|---|
| 20 | #define MTRRfix4K_C0000_MSR 0x268 |
|---|
| 21 | #define MTRRfix4K_C8000_MSR 0x269 |
|---|
| 22 | #define MTRRfix4K_D0000_MSR 0x26a |
|---|
| 23 | #define MTRRfix4K_D8000_MSR 0x26b |
|---|
| 24 | #define MTRRfix4K_E0000_MSR 0x26c |
|---|
| 25 | #define MTRRfix4K_E8000_MSR 0x26d |
|---|
| 26 | #define MTRRfix4K_F0000_MSR 0x26e |
|---|
| 27 | #define MTRRfix4K_F8000_MSR 0x26f |
|---|
| 28 | |
|---|
| 29 | #define MTRR_CHANGE_MASK_FIXED 0x01 |
|---|
| 30 | #define MTRR_CHANGE_MASK_VARIABLE 0x02 |
|---|
| 31 | #define MTRR_CHANGE_MASK_DEFTYPE 0x04 |
|---|
| 32 | |
|---|
| 33 | /* In the Intel processor's MTRR interface, the MTRR type is always held in |
|---|
| 34 | an 8 bit field: */ |
|---|
| 35 | typedef u8 mtrr_type; |
|---|
| 36 | |
|---|
| 37 | struct mtrr_ops { |
|---|
| 38 | u32 vendor; |
|---|
| 39 | u32 use_intel_if; |
|---|
| 40 | // void (*init)(void); |
|---|
| 41 | void (*set)(unsigned int reg, unsigned long base, |
|---|
| 42 | unsigned long size, mtrr_type type); |
|---|
| 43 | void (*set_all)(void); |
|---|
| 44 | |
|---|
| 45 | void (*get)(unsigned int reg, unsigned long *base, |
|---|
| 46 | unsigned int *size, mtrr_type * type); |
|---|
| 47 | int (*get_free_region) (unsigned long base, unsigned long size); |
|---|
| 48 | |
|---|
| 49 | int (*validate_add_page)(unsigned long base, unsigned long size, |
|---|
| 50 | unsigned int type); |
|---|
| 51 | int (*have_wrcomb)(void); |
|---|
| 52 | }; |
|---|
| 53 | |
|---|
| 54 | extern int generic_get_free_region(unsigned long base, unsigned long size); |
|---|
| 55 | extern int generic_validate_add_page(unsigned long base, unsigned long size, |
|---|
| 56 | unsigned int type); |
|---|
| 57 | |
|---|
| 58 | extern struct mtrr_ops generic_mtrr_ops; |
|---|
| 59 | |
|---|
| 60 | extern int positive_have_wrcomb(void); |
|---|
| 61 | |
|---|
| 62 | /* library functions for processor-specific routines */ |
|---|
| 63 | struct set_mtrr_context { |
|---|
| 64 | unsigned long flags; |
|---|
| 65 | unsigned long deftype_lo; |
|---|
| 66 | unsigned long deftype_hi; |
|---|
| 67 | unsigned long cr4val; |
|---|
| 68 | unsigned long ccr3; |
|---|
| 69 | }; |
|---|
| 70 | |
|---|
| 71 | struct mtrr_var_range { |
|---|
| 72 | unsigned long base_lo; |
|---|
| 73 | unsigned long base_hi; |
|---|
| 74 | unsigned long mask_lo; |
|---|
| 75 | unsigned long mask_hi; |
|---|
| 76 | }; |
|---|
| 77 | |
|---|
| 78 | void set_mtrr_done(struct set_mtrr_context *ctxt); |
|---|
| 79 | void set_mtrr_cache_disable(struct set_mtrr_context *ctxt); |
|---|
| 80 | void set_mtrr_prepare_save(struct set_mtrr_context *ctxt); |
|---|
| 81 | |
|---|
| 82 | void get_mtrr_state(void); |
|---|
| 83 | |
|---|
| 84 | extern void set_mtrr_ops(struct mtrr_ops * ops); |
|---|
| 85 | |
|---|
| 86 | extern u32 size_or_mask, size_and_mask; |
|---|
| 87 | extern struct mtrr_ops * mtrr_if; |
|---|
| 88 | |
|---|
| 89 | #define is_cpu(vnd) (mtrr_if && mtrr_if->vendor == X86_VENDOR_##vnd) |
|---|
| 90 | #define use_intel() (mtrr_if && mtrr_if->use_intel_if == 1) |
|---|
| 91 | |
|---|
| 92 | extern unsigned int num_var_ranges; |
|---|
| 93 | |
|---|
| 94 | void mtrr_state_warn(void); |
|---|
| 95 | char *mtrr_attrib_to_str(int x); |
|---|
| 96 | void mtrr_wrmsr(unsigned, unsigned, unsigned); |
|---|
| 97 | |
|---|