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

(-)file_not_specified_in_diff (-34 / +54 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 37-43 Link Here
37
	rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
37
	rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
38
}
38
}
39
39
40
static void __init
40
static void 
41
get_fixed_ranges(mtrr_type * frs)
41
get_fixed_ranges(mtrr_type * frs)
42
{
42
{
43
	unsigned int *p = (unsigned int *) frs;
43
	unsigned int *p = (unsigned int *) frs;
Lines 196-231 Link Here
196
	*type = base_lo & 0xff;
196
	*type = base_lo & 0xff;
197
}
197
}
198
198
199
void mtrr_save_fixed_ranges(void)
200
{
201
	get_fixed_ranges(mtrr_state.fixed_ranges);
202
}
203
204
#define MSR_K8_SYSCFG                   0xC0010010
205
#define MSR_K8_SYSCFG_ENABLE_IORRs      0x000C0000
206
#define K8_RdMemWrMem_MASK              0x18181818
207
208
static void k8_enable_fixed_iorrs(void)
209
{
210
	unsigned lo, hi;
211
212
	rdmsr(MSR_K8_SYSCFG, lo, hi);
213
	mtrr_wrmsr(MSR_K8_SYSCFG, lo | MSR_K8_SYSCFG_ENABLE_IORRs, hi);
214
}
215
216
static void update_fixed_range(int msr, int * changed, u32 * msrwords)
217
{
218
	unsigned lo, hi;
219
220
	rdmsr(msr, lo, hi);
221
222
	if (lo != msrwords[0] || hi != msrwords[1]) {
223
		if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
224
		    boot_cpu_data.x86 == 15 &&
225
		    ((msrwords[0] | msrwords[1]) & K8_RdMemWrMem_MASK))
226
			k8_enable_fixed_iorrs();
227
		mtrr_wrmsr(msr, msrwords[0], msrwords[1]);
228
		*changed = TRUE;
229
	}
230
}
231
199
static int set_fixed_ranges(mtrr_type * frs)
232
static int set_fixed_ranges(mtrr_type * frs)
200
{
233
{
201
	unsigned int *p = (unsigned int *) frs;
234
	unsigned long long *p = (unsigned long long *) frs;
202
	int changed = FALSE;
235
	int changed = FALSE;
203
	int i;
236
	int i;
204
	unsigned int lo, hi;
205
206
	rdmsr(MTRRfix64K_00000_MSR, lo, hi);
207
	if (p[0] != lo || p[1] != hi) {
208
		mtrr_wrmsr(MTRRfix64K_00000_MSR, p[0], p[1]);
209
		changed = TRUE;
210
	}
211
237
212
	for (i = 0; i < 2; i++) {
238
	update_fixed_range(MTRRfix64K_00000_MSR, &changed, (u32*)p++);
213
		rdmsr(MTRRfix16K_80000_MSR + i, lo, hi);
239
	update_fixed_range(MTRRfix16K_80000_MSR, &changed, (u32*)p++);
214
		if (p[2 + i * 2] != lo || p[3 + i * 2] != hi) {
240
	update_fixed_range(MTRRfix16K_A0000_MSR, &changed, (u32*)p++);
215
			mtrr_wrmsr(MTRRfix16K_80000_MSR + i, p[2 + i * 2],
241
	for(i=0; i<8; i++)
216
			      p[3 + i * 2]);
242
		update_fixed_range(MTRRfix4K_C0000_MSR+i, &changed, (u32*)p++);
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;
243
	return changed;
230
}
244
}
231
245
232
-- linux-2.6.20/arch/i386/power/cpu.c
246
++ 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