View | Details | Raw Unified | Return to bug 228344
Collapse All | Expand All

(-)file_not_specified_in_diff (-37 / +81 lines)
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

Return to bug 228344