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

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

Return to bug 228344