|
Line
Link Here
|
| 0 |
-- linux-2.6.20.orig/arch/i386/kernel/cpu/mtrr/generic.c |
0 |
++ linux-2.6.20.mtrr/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 MtrrFixDramEn 0x00040000 |
| 43 |
#define MtrrFixDramModEn 0x00080000 |
| 44 |
#define MTRR_K8_RDMEM_WRMEM_MASK 0x18181818 |
| 45 |
|
| 29 |
static __initdata int mtrr_show; |
46 |
static __initdata int mtrr_show; |
| 30 |
module_param_named(show, mtrr_show, bool, 0); |
47 |
module_param_named(show, mtrr_show, bool, 0); |
| 31 |
|
48 |
|
|
Lines 37-43
Link Here
|
| 37 |
rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); |
52 |
rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); |
| 38 |
} |
53 |
} |
| 39 |
|
54 |
|
| 40 |
static void __init |
55 |
/* |
|
|
56 |
* Retrieves the current fixed-range MTRRs from the CPU |
| 57 |
*/ |
| 58 |
static void |
| 41 |
get_fixed_ranges(mtrr_type * frs) |
59 |
get_fixed_ranges(mtrr_type * frs) |
| 42 |
{ |
60 |
{ |
| 43 |
unsigned int *p = (unsigned int *) frs; |
61 |
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]); |
69 |
rdmsr(MTRRfix4K_C0000_MSR + i, p[6 + i * 2], p[7 + i * 2]); |
| 52 |
} |
70 |
} |
| 53 |
|
71 |
|
|
|
72 |
/* |
| 73 |
* In some situations, the setup of fixed ranges can be changed |
| 74 |
* during or after early boot and we have to update our copy of |
| 75 |
* the MTRR configuration for consitent MTRRs after resume from |
| 76 |
* disk and when when initializing secondary CPUs: |
| 77 |
*/ |
| 78 |
void mtrr_save_fixed_ranges(void *info) |
| 79 |
{ |
| 80 |
get_fixed_ranges(mtrr_state.fixed_ranges); |
| 81 |
} |
| 82 |
|
| 83 |
/* |
| 84 |
* Enable and allow read/write of extended fixed-range MTRR bits on K8 CPUs, |
| 85 |
* see AMD publication no. 24593, chapter 7.8.1, page 233 for information: |
| 86 |
*/ |
| 87 |
static inline void k8_enable_fixed_iorrs(void) |
| 88 |
{ |
| 89 |
unsigned lo, hi; |
| 90 |
|
| 91 |
rdmsr(MSR_K8_SYSCFG, lo, hi); |
| 92 |
mtrr_wrmsr(MSR_K8_SYSCFG, lo | MtrrFixDramEn | MtrrFixDramModEn, hi); |
| 93 |
} |
| 94 |
|
| 95 |
/* |
| 96 |
* Updates an MTRR. Updates changed if changes were made (or tried) |
| 97 |
* If extended bits are set on Hammer CPUs, the K8 SYSCFG MSR needs an update: |
| 98 |
*/ |
| 99 |
static void set_fixed_range(int msr, int * changed, unsigned int * msrwords) |
| 100 |
{ |
| 101 |
unsigned lo, hi; |
| 102 |
|
| 103 |
rdmsr(msr, lo, hi); |
| 104 |
|
| 105 |
if (lo != msrwords[0] || hi != msrwords[1]) { |
| 106 |
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && |
| 107 |
boot_cpu_data.x86 == 15 && |
| 108 |
((msrwords[0] | msrwords[1]) & MTRR_K8_RDMEM_WRMEM_MASK)) |
| 109 |
k8_enable_fixed_iorrs(); |
| 110 |
mtrr_wrmsr(msr, msrwords[0], msrwords[1]); |
| 111 |
*changed = TRUE; |
| 112 |
} |
| 113 |
} |
| 114 |
|
| 54 |
static void __init print_fixed(unsigned base, unsigned step, const mtrr_type*types) |
115 |
static void __init print_fixed(unsigned base, unsigned step, const mtrr_type*types) |
| 55 |
{ |
116 |
{ |
| 56 |
unsigned i; |
117 |
unsigned i; |
|
Lines 196-231
Link Here
|
| 196 |
*type = base_lo & 0xff; |
257 |
*type = base_lo & 0xff; |
| 197 |
} |
258 |
} |
| 198 |
|
259 |
|
| 199 |
static int set_fixed_ranges(mtrr_type * frs) |
260 |
static int set_fixed_ranges(mtrr_type * fixed_range_setup) |
| 200 |
{ |
261 |
{ |
| 201 |
unsigned int *p = (unsigned int *) frs; |
262 |
unsigned long long *saved = (unsigned long long *) fixed_range_setup; |
| 202 |
int changed = FALSE; |
263 |
int changed = FALSE; |
| 203 |
int i; |
264 |
int block=-1, range; |
| 204 |
unsigned int lo, hi; |
|
|
| 205 |
|
265 |
|
| 206 |
rdmsr(MTRRfix64K_00000_MSR, lo, hi); |
266 |
while (fixed_range_blocks[++block].ranges) |
| 207 |
if (p[0] != lo || p[1] != hi) { |
267 |
for (range=0; range < fixed_range_blocks[block].ranges; range++) |
| 208 |
mtrr_wrmsr(MTRRfix64K_00000_MSR, p[0], p[1]); |
268 |
set_fixed_range(fixed_range_blocks[block].base_msr + range, |
| 209 |
changed = TRUE; |
269 |
&changed, (unsigned int *) saved++); |
| 210 |
} |
|
|
| 211 |
|
270 |
|
| 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 |
|
| 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; |
271 |
return changed; |
| 230 |
} |
272 |
} |
| 231 |
|
273 |
|
| 232 |
-- linux-2.6.20.orig/arch/i386/kernel/smpboot.c |
274 |
++ linux-2.6.20.mtrr/arch/i386/kernel/smpboot.c |
|
Lines 59-64
Link Here
|
| 59 |
#include <asm/nmi.h> |
59 |
#include <asm/nmi.h> |
| 60 |
#include <asm/pda.h> |
60 |
#include <asm/pda.h> |
| 61 |
#include <asm/genapic.h> |
61 |
#include <asm/genapic.h> |
|
|
62 |
#include <asm/mtrr.h> |
| 62 |
|
63 |
|
| 63 |
#include <mach_apic.h> |
64 |
#include <mach_apic.h> |
| 64 |
#include <mach_wakecpu.h> |
65 |
#include <mach_wakecpu.h> |
|
Lines 951-956
Link Here
|
| 951 |
unsigned short nmi_high = 0, nmi_low = 0; |
952 |
unsigned short nmi_high = 0, nmi_low = 0; |
| 952 |
|
953 |
|
| 953 |
/* |
954 |
/* |
|
|
955 |
* Save current MTRR state in case it was changed since early boot |
| 956 |
* (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync: |
| 957 |
*/ |
| 958 |
mtrr_save_state(); |
| 959 |
|
| 960 |
/* |
| 954 |
* We can't use kernel_thread since we must avoid to |
961 |
* We can't use kernel_thread since we must avoid to |
| 955 |
* reschedule the child. |
962 |
* reschedule the child. |
| 956 |
*/ |
963 |
*/ |
| 957 |
-- linux-2.6.20.orig/arch/i386/power/cpu.c |
964 |
++ linux-2.6.20.mtrr/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(NULL); |
| 24 |
kernel_fpu_begin(); |
25 |
kernel_fpu_begin(); |
| 25 |
|
26 |
|
| 26 |
/* |
27 |
/* |
| 27 |
-- linux-2.6.20.orig/arch/x86_64/kernel/smpboot.c |
28 |
++ linux-2.6.20.mtrr/arch/x86_64/kernel/smpboot.c |
|
Lines 1157-1162
Link Here
|
| 1157 |
return -ENOSYS; |
1157 |
return -ENOSYS; |
| 1158 |
} |
1158 |
} |
| 1159 |
|
1159 |
|
|
|
1160 |
/* |
| 1161 |
* Save current MTRR state in case it was changed since early boot |
| 1162 |
* (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync: |
| 1163 |
*/ |
| 1164 |
mtrr_save_state(); |
| 1165 |
|
| 1160 |
per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
1166 |
per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
| 1161 |
/* Boot it! */ |
1167 |
/* Boot it! */ |
| 1162 |
err = do_boot_cpu(cpu, apicid); |
1168 |
err = do_boot_cpu(cpu, apicid); |
| 1163 |
-- linux-2.6.20.orig/arch/x86_64/kernel/suspend.c |
1169 |
++ linux-2.6.20.mtrr/arch/x86_64/kernel/suspend.c |
|
Lines 46-51
__save_processor_context()
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(NULL); |
| 49 |
|
50 |
|
| 50 |
/* |
51 |
/* |
| 51 |
* control registers |
52 |
* control registers |
| 52 |
-- linux-2.6.20.orig/include/asm-i386/mtrr.h |
53 |
++ linux-2.6.20.mtrr/include/asm-i386/mtrr.h |
|
Lines 25-30
Link Here
|
| 25 |
|
25 |
|
| 26 |
#include <linux/ioctl.h> |
26 |
#include <linux/ioctl.h> |
| 27 |
#include <linux/errno.h> |
27 |
#include <linux/errno.h> |
|
|
28 |
#include <linux/smp.h> |
| 28 |
|
29 |
|
| 29 |
#define MTRR_IOCTL_BASE 'M' |
30 |
#define MTRR_IOCTL_BASE 'M' |
| 30 |
|
31 |
|
|
Lines 78-84
Link Here
|
| 78 |
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi); |
79 |
extern void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi); |
| 79 |
extern void mtrr_ap_init(void); |
80 |
extern void mtrr_ap_init(void); |
| 80 |
extern void mtrr_bp_init(void); |
81 |
extern void mtrr_bp_init(void); |
| 81 |
# else |
82 |
extern void mtrr_save_fixed_ranges(void *); |
|
|
83 |
static __inline__ void mtrr_save_state (void) |
| 84 |
{ |
| 85 |
/* |
| 86 |
* Save current fixed-range MTRR state of the BSP: |
| 87 |
*/ |
| 88 |
if (smp_processor_id() == 0) |
| 89 |
mtrr_save_fixed_ranges(NULL); |
| 90 |
else |
| 91 |
smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1); |
| 92 |
} |
| 93 |
# else /* CONFIG_MTRR set/not set */ |
| 82 |
static __inline__ int mtrr_add (unsigned long base, unsigned long size, |
94 |
static __inline__ int mtrr_add (unsigned long base, unsigned long size, |
| 83 |
unsigned int type, char increment) |
95 |
unsigned int type, char increment) |
| 84 |
{ |
96 |
{ |
|
Lines 104-111
Link Here
|
| 104 |
|
117 |
|
| 105 |
#define mtrr_ap_init() do {} while (0) |
118 |
#define mtrr_ap_init() do {} while (0) |
| 106 |
#define mtrr_bp_init() do {} while (0) |
119 |
#define mtrr_bp_init() do {} while (0) |
| 107 |
# endif |
120 |
#define mtrr_save_fixed_ranges(arg) do {} while (0) |
|
|
121 |
#define mtrr_save_state() do {} while (0) |
| 122 |
# endif /* !CONFIG_MTRR */ |
| 108 |
|
123 |
|
| 109 |
#endif |
124 |
#endif /* __KERNEL__ */ |
| 110 |
|
125 |
|
| 111 |
#endif /* _LINUX_MTRR_H */ |
126 |
#endif /* _LINUX_MTRR_H */ |
| 112 |
-- linux-2.6.20.orig/include/asm-x86_64/proto.h |
127 |
++ linux-2.6.20.mtrr/include/asm-x86_64/proto.h |
|
Lines 2-7
Link Here
|
| 2 |
#define _ASM_X8664_PROTO_H 1 |
2 |
#define _ASM_X8664_PROTO_H 1 |
| 3 |
|
3 |
|
| 4 |
#include <asm/ldt.h> |
4 |
#include <asm/ldt.h> |
|
|
5 |
#include <linux/smp.h> |
| 5 |
|
6 |
|
| 6 |
/* misc architecture specific prototypes */ |
7 |
/* misc architecture specific prototypes */ |
| 7 |
|
8 |
|
|
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 *); |
| 23 |
static __inline__ void mtrr_save_state (void) |
| 24 |
{ |
| 25 |
/* |
| 26 |
* Save current fixed-range MTRR state of the BSP: |
| 27 |
*/ |
| 28 |
if (smp_processor_id() == 0) |
| 29 |
mtrr_save_fixed_ranges(NULL); |
| 30 |
else |
| 31 |
smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1); |
| 32 |
} |
| 22 |
#else |
33 |
#else |
|
|
34 |
#define mtrr_save_fixed_ranges(arg) do {} while (0) |
| 35 |
#define mtrr_save_state() do {} while (0) |
| 23 |
#define mtrr_ap_init() do {} while (0) |
36 |
#define mtrr_ap_init() do {} while (0) |
| 24 |
#define mtrr_bp_init() do {} while (0) |
37 |
#define mtrr_bp_init() do {} while (0) |
| 25 |
#endif |
38 |
#endif |