|
Line
Link Here
|
| 0 |
-- linux-2.6.20/arch/i386/kernel/cpu/mtrr/generic.c |
0 |
++ linux-228344/arch/i386/kernel/cpu/mtrr/generic.c |
|
Lines 20-31
Link Here
|
| 20 |
mtrr_type def_type; |
20 |
mtrr_type def_type; |
| 21 |
}; |
21 |
}; |
| 22 |
|
22 |
|
|
|
23 |
struct fixed_range_block { |
| 24 |
int base_msr; |
| 25 |
int ranges; |
| 26 |
}; |
| 27 |
|
| 28 |
static struct fixed_range_block fixed_range_blocks[] = { |
| 29 |
{ MTRRfix64K_00000_MSR, 1}, |
| 30 |
{ MTRRfix16K_80000_MSR, 2}, |
| 31 |
{ MTRRfix4K_C0000_MSR, 8}, |
| 32 |
{ 0, 0} |
| 33 |
}; |
| 34 |
|
| 23 |
static unsigned long smp_changes_mask; |
35 |
static unsigned long smp_changes_mask; |
| 24 |
static struct mtrr_state mtrr_state = {}; |
36 |
static struct mtrr_state mtrr_state = {}; |
| 25 |
|
37 |
|
| 26 |
#undef MODULE_PARAM_PREFIX |
38 |
#undef MODULE_PARAM_PREFIX |
| 27 |
#define MODULE_PARAM_PREFIX "mtrr." |
39 |
#define MODULE_PARAM_PREFIX "mtrr." |
| 28 |
|
40 |
|
|
|
41 |
#define MSR_K8_SYSCFG 0xC0010010 |
| 42 |
#define MSR_K8_SYSCFG_ENABLE_IORRs 0x000C0000 |
| 43 |
#define MTRR_K8_RDMEM_WRMEM_MASK 0x18181818 |
| 44 |
|
| 29 |
static __initdata int mtrr_show; |
45 |
static __initdata int mtrr_show; |
| 30 |
module_param_named(show, mtrr_show, bool, 0); |
46 |
module_param_named(show, mtrr_show, bool, 0); |
| 31 |
|
47 |
|
|
Lines 37-43
Link Here
|
| 37 |
rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); |
53 |
rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); |
| 38 |
} |
54 |
} |
| 39 |
|
55 |
|
| 40 |
static void __init |
56 |
/* |
|
|
57 |
* Retrieves the current fixed-range MTRRs from the CPU |
| 58 |
*/ |
| 59 |
static void |
| 41 |
get_fixed_ranges(mtrr_type * frs) |
60 |
get_fixed_ranges(mtrr_type * frs) |
| 42 |
{ |
61 |
{ |
| 43 |
unsigned int *p = (unsigned int *) frs; |
62 |
unsigned int *p = (unsigned int *) frs; |
|
Lines 51-56
Link Here
|
| 51 |
rdmsr(MTRRfix4K_C0000_MSR + i, p[6 + i * 2], p[7 + i * 2]); |
70 |
rdmsr(MTRRfix4K_C0000_MSR + i, p[6 + i * 2], p[7 + i * 2]); |
| 52 |
} |
71 |
} |
| 53 |
|
72 |
|
|
|
73 |
/* |
| 74 |
* Called from save_processor_context() to update our copy of the MTRRs |
| 75 |
*/ |
| 76 |
void mtrr_save_fixed_ranges(void) |
| 77 |
{ |
| 78 |
get_fixed_ranges(mtrr_state.fixed_ranges); |
| 79 |
} |
| 80 |
|
| 81 |
/* |
| 82 |
* Enables the extended fixed-range MTRR bits on K8 CPUs |
| 83 |
*/ |
| 84 |
static inline void k8_enable_fixed_iorrs(void) |
| 85 |
{ |
| 86 |
unsigned lo, hi; |
| 87 |
|
| 88 |
rdmsr(MSR_K8_SYSCFG, lo, hi); |
| 89 |
mtrr_wrmsr(MSR_K8_SYSCFG, lo | MSR_K8_SYSCFG_ENABLE_IORRs, hi); |
| 90 |
} |
| 91 |
|
| 92 |
/* |
| 93 |
* Updates an MTRR. Updates *changed if changes were made (or tried) |
| 94 |
*/ |
| 95 |
static void set_fixed_range(int msr, int * changed, unsigned int * msrwords) |
| 96 |
{ |
| 97 |
unsigned lo, hi; |
| 98 |
|
| 99 |
rdmsr(msr, lo, hi); |
| 100 |
|
| 101 |
if (lo != msrwords[0] || hi != msrwords[1]) { |
| 102 |
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && |
| 103 |
boot_cpu_data.x86 == 15 && |
| 104 |
((msrwords[0] | msrwords[1]) & MTRR_K8_RDMEM_WRMEM_MASK)) |
| 105 |
k8_enable_fixed_iorrs(); |
| 106 |
mtrr_wrmsr(msr, msrwords[0], msrwords[1]); |
| 107 |
*changed = TRUE; |
| 108 |
} |
| 109 |
} |
| 110 |
|
| 54 |
static void __init print_fixed(unsigned base, unsigned step, const mtrr_type*types) |
111 |
static void __init print_fixed(unsigned base, unsigned step, const mtrr_type*types) |
| 55 |
{ |
112 |
{ |
| 56 |
unsigned i; |
113 |
unsigned i; |
|
Lines 196-231
Link Here
|
| 196 |
*type = base_lo & 0xff; |
253 |
*type = base_lo & 0xff; |
| 197 |
} |
254 |
} |
| 198 |
|
255 |
|
| 199 |
static int set_fixed_ranges(mtrr_type * frs) |
256 |
static int set_fixed_ranges(mtrr_type * fixed_range_setup) |
| 200 |
{ |
257 |
{ |
| 201 |
unsigned int *p = (unsigned int *) frs; |
258 |
unsigned long long *saved = (unsigned long long *) fixed_range_setup; |
| 202 |
int changed = FALSE; |
259 |
int changed = FALSE; |
| 203 |
int i; |
260 |
int block=-1, range; |
| 204 |
unsigned int lo, hi; |
261 |
|
| 205 |
|
262 |
while (fixed_range_blocks[++block].ranges) |
| 206 |
rdmsr(MTRRfix64K_00000_MSR, lo, hi); |
263 |
for (range=0; range < fixed_range_blocks[block].ranges; range++) |
| 207 |
if (p[0] != lo || p[1] != hi) { |
264 |
set_fixed_range(fixed_range_blocks[block].base_msr + range, |
| 208 |
mtrr_wrmsr(MTRRfix64K_00000_MSR, p[0], p[1]); |
265 |
&changed, (unsigned int *) saved++); |
| 209 |
changed = TRUE; |
|
|
| 210 |
} |
| 211 |
|
| 212 |
for (i = 0; i < 2; i++) { |
| 213 |
rdmsr(MTRRfix16K_80000_MSR + i, lo, hi); |
| 214 |
if (p[2 + i * 2] != lo || p[3 + i * 2] != hi) { |
| 215 |
mtrr_wrmsr(MTRRfix16K_80000_MSR + i, p[2 + i * 2], |
| 216 |
p[3 + i * 2]); |
| 217 |
changed = TRUE; |
| 218 |
} |
| 219 |
} |
| 220 |
|
266 |
|
| 221 |
for (i = 0; i < 8; i++) { |
|
|
| 222 |
rdmsr(MTRRfix4K_C0000_MSR + i, lo, hi); |
| 223 |
if (p[6 + i * 2] != lo || p[7 + i * 2] != hi) { |
| 224 |
mtrr_wrmsr(MTRRfix4K_C0000_MSR + i, p[6 + i * 2], |
| 225 |
p[7 + i * 2]); |
| 226 |
changed = TRUE; |
| 227 |
} |
| 228 |
} |
| 229 |
return changed; |
267 |
return changed; |
| 230 |
} |
268 |
} |
| 231 |
|
269 |
|
| 232 |
-- linux-2.6.20/arch/i386/power/cpu.c |
270 |
++ linux-228344/arch/i386/power/cpu.c |
|
Lines 21-26
Link Here
|
| 21 |
|
21 |
|
| 22 |
void __save_processor_state(struct saved_context *ctxt) |
22 |
void __save_processor_state(struct saved_context *ctxt) |
| 23 |
{ |
23 |
{ |
|
|
24 |
mtrr_save_fixed_ranges(); |
| 24 |
kernel_fpu_begin(); |
25 |
kernel_fpu_begin(); |
| 25 |
|
26 |
|
| 26 |
/* |
27 |
/* |
| 27 |
-- linux-2.6.20/arch/x86_64/kernel/suspend.c |
28 |
++ linux-228344/arch/x86_64/kernel/suspend.c |
|
Lines 46-51
Link Here
|
| 46 |
rdmsrl(MSR_FS_BASE, ctxt->fs_base); |
46 |
rdmsrl(MSR_FS_BASE, ctxt->fs_base); |
| 47 |
rdmsrl(MSR_GS_BASE, ctxt->gs_base); |
47 |
rdmsrl(MSR_GS_BASE, ctxt->gs_base); |
| 48 |
rdmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base); |
48 |
rdmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base); |
|
|
49 |
mtrr_save_fixed_ranges(); |
| 49 |
|
50 |
|
| 50 |
/* |
51 |
/* |
| 51 |
* control registers |
52 |
* control registers |
| 52 |
-- linux-2.6.20/include/asm-i386/mtrr.h |
53 |
++ linux-228344/include/asm-i386/mtrr.h |
|
Lines 78-84
Link Here
|
| 78 |
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi); |
78 |
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi); |
| 79 |
extern void mtrr_ap_init(void); |
79 |
extern void mtrr_ap_init(void); |
| 80 |
extern void mtrr_bp_init(void); |
80 |
extern void mtrr_bp_init(void); |
| 81 |
# else |
81 |
extern void mtrr_save_fixed_ranges(void); |
|
|
82 |
# else /* CONFIG_MTRR set/not set */ |
| 82 |
static __inline__ int mtrr_add (unsigned long base, unsigned long size, |
83 |
static __inline__ int mtrr_add (unsigned long base, unsigned long size, |
| 83 |
unsigned int type, char increment) |
84 |
unsigned int type, char increment) |
| 84 |
{ |
85 |
{ |
|
Lines 104-111
Link Here
|
| 104 |
|
105 |
|
| 105 |
#define mtrr_ap_init() do {} while (0) |
106 |
#define mtrr_ap_init() do {} while (0) |
| 106 |
#define mtrr_bp_init() do {} while (0) |
107 |
#define mtrr_bp_init() do {} while (0) |
| 107 |
# endif |
108 |
#define mtrr_save_fixed_ranges() do {} while (0) |
|
|
109 |
# endif /* !CONFIG_MTRR */ |
| 108 |
|
110 |
|
| 109 |
#endif |
111 |
#endif /* __KERNEL__ */ |
| 110 |
|
112 |
|
| 111 |
#endif /* _LINUX_MTRR_H */ |
113 |
#endif /* _LINUX_MTRR_H */ |
| 112 |
-- linux-2.6.20/include/asm-x86_64/proto.h |
114 |
++ linux-228344/include/asm-x86_64/proto.h |
|
Lines 19-25
Link Here
|
| 19 |
#ifdef CONFIG_MTRR |
19 |
#ifdef CONFIG_MTRR |
| 20 |
extern void mtrr_ap_init(void); |
20 |
extern void mtrr_ap_init(void); |
| 21 |
extern void mtrr_bp_init(void); |
21 |
extern void mtrr_bp_init(void); |
|
|
22 |
extern void mtrr_save_fixed_ranges(void); |
| 22 |
#else |
23 |
#else |
|
|
24 |
#define mtrr_save_fixed_ranges() do {} while (0) |
| 23 |
#define mtrr_ap_init() do {} while (0) |
25 |
#define mtrr_ap_init() do {} while (0) |
| 24 |
#define mtrr_bp_init() do {} while (0) |
26 |
#define mtrr_bp_init() do {} while (0) |
| 25 |
#endif |
27 |
#endif |