diff options
Diffstat (limited to 'arch/x86/kernel/cpu/mtrr/generic.c')
-rw-r--r-- | arch/x86/kernel/cpu/mtrr/generic.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index 992f08dfbb6c..103d61a59b19 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c | |||
@@ -9,11 +9,12 @@ | |||
9 | #include <asm/msr.h> | 9 | #include <asm/msr.h> |
10 | #include <asm/system.h> | 10 | #include <asm/system.h> |
11 | #include <asm/cpufeature.h> | 11 | #include <asm/cpufeature.h> |
12 | #include <asm/processor-flags.h> | ||
12 | #include <asm/tlbflush.h> | 13 | #include <asm/tlbflush.h> |
13 | #include "mtrr.h" | 14 | #include "mtrr.h" |
14 | 15 | ||
15 | struct mtrr_state { | 16 | struct mtrr_state { |
16 | struct mtrr_var_range *var_ranges; | 17 | struct mtrr_var_range var_ranges[MAX_VAR_RANGES]; |
17 | mtrr_type fixed_ranges[NUM_FIXED_RANGES]; | 18 | mtrr_type fixed_ranges[NUM_FIXED_RANGES]; |
18 | unsigned char enabled; | 19 | unsigned char enabled; |
19 | unsigned char have_fixed; | 20 | unsigned char have_fixed; |
@@ -85,12 +86,6 @@ void __init get_mtrr_state(void) | |||
85 | struct mtrr_var_range *vrs; | 86 | struct mtrr_var_range *vrs; |
86 | unsigned lo, dummy; | 87 | unsigned lo, dummy; |
87 | 88 | ||
88 | if (!mtrr_state.var_ranges) { | ||
89 | mtrr_state.var_ranges = kmalloc(num_var_ranges * sizeof (struct mtrr_var_range), | ||
90 | GFP_KERNEL); | ||
91 | if (!mtrr_state.var_ranges) | ||
92 | return; | ||
93 | } | ||
94 | vrs = mtrr_state.var_ranges; | 89 | vrs = mtrr_state.var_ranges; |
95 | 90 | ||
96 | rdmsr(MTRRcap_MSR, lo, dummy); | 91 | rdmsr(MTRRcap_MSR, lo, dummy); |
@@ -188,7 +183,7 @@ static inline void k8_enable_fixed_iorrs(void) | |||
188 | * \param changed pointer which indicates whether the MTRR needed to be changed | 183 | * \param changed pointer which indicates whether the MTRR needed to be changed |
189 | * \param msrwords pointer to the MSR values which the MSR should have | 184 | * \param msrwords pointer to the MSR values which the MSR should have |
190 | */ | 185 | */ |
191 | static void set_fixed_range(int msr, int * changed, unsigned int * msrwords) | 186 | static void set_fixed_range(int msr, bool *changed, unsigned int *msrwords) |
192 | { | 187 | { |
193 | unsigned lo, hi; | 188 | unsigned lo, hi; |
194 | 189 | ||
@@ -200,7 +195,7 @@ static void set_fixed_range(int msr, int * changed, unsigned int * msrwords) | |||
200 | ((msrwords[0] | msrwords[1]) & K8_MTRR_RDMEM_WRMEM_MASK)) | 195 | ((msrwords[0] | msrwords[1]) & K8_MTRR_RDMEM_WRMEM_MASK)) |
201 | k8_enable_fixed_iorrs(); | 196 | k8_enable_fixed_iorrs(); |
202 | mtrr_wrmsr(msr, msrwords[0], msrwords[1]); | 197 | mtrr_wrmsr(msr, msrwords[0], msrwords[1]); |
203 | *changed = TRUE; | 198 | *changed = true; |
204 | } | 199 | } |
205 | } | 200 | } |
206 | 201 | ||
@@ -260,7 +255,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, | |||
260 | static int set_fixed_ranges(mtrr_type * frs) | 255 | static int set_fixed_ranges(mtrr_type * frs) |
261 | { | 256 | { |
262 | unsigned long long *saved = (unsigned long long *) frs; | 257 | unsigned long long *saved = (unsigned long long *) frs; |
263 | int changed = FALSE; | 258 | bool changed = false; |
264 | int block=-1, range; | 259 | int block=-1, range; |
265 | 260 | ||
266 | while (fixed_range_blocks[++block].ranges) | 261 | while (fixed_range_blocks[++block].ranges) |
@@ -273,17 +268,17 @@ static int set_fixed_ranges(mtrr_type * frs) | |||
273 | 268 | ||
274 | /* Set the MSR pair relating to a var range. Returns TRUE if | 269 | /* Set the MSR pair relating to a var range. Returns TRUE if |
275 | changes are made */ | 270 | changes are made */ |
276 | static int set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr) | 271 | static bool set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr) |
277 | { | 272 | { |
278 | unsigned int lo, hi; | 273 | unsigned int lo, hi; |
279 | int changed = FALSE; | 274 | bool changed = false; |
280 | 275 | ||
281 | rdmsr(MTRRphysBase_MSR(index), lo, hi); | 276 | rdmsr(MTRRphysBase_MSR(index), lo, hi); |
282 | if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL) | 277 | if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL) |
283 | || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) != | 278 | || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) != |
284 | (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) { | 279 | (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) { |
285 | mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi); | 280 | mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi); |
286 | changed = TRUE; | 281 | changed = true; |
287 | } | 282 | } |
288 | 283 | ||
289 | rdmsr(MTRRphysMask_MSR(index), lo, hi); | 284 | rdmsr(MTRRphysMask_MSR(index), lo, hi); |
@@ -292,7 +287,7 @@ static int set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr) | |||
292 | || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) != | 287 | || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) != |
293 | (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) { | 288 | (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) { |
294 | mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); | 289 | mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); |
295 | changed = TRUE; | 290 | changed = true; |
296 | } | 291 | } |
297 | return changed; | 292 | return changed; |
298 | } | 293 | } |
@@ -350,7 +345,7 @@ static void prepare_set(void) __acquires(set_atomicity_lock) | |||
350 | spin_lock(&set_atomicity_lock); | 345 | spin_lock(&set_atomicity_lock); |
351 | 346 | ||
352 | /* Enter the no-fill (CD=1, NW=0) cache mode and flush caches. */ | 347 | /* Enter the no-fill (CD=1, NW=0) cache mode and flush caches. */ |
353 | cr0 = read_cr0() | 0x40000000; /* set CD flag */ | 348 | cr0 = read_cr0() | X86_CR0_CD; |
354 | write_cr0(cr0); | 349 | write_cr0(cr0); |
355 | wbinvd(); | 350 | wbinvd(); |
356 | 351 | ||
@@ -417,8 +412,6 @@ static void generic_set_mtrr(unsigned int reg, unsigned long base, | |||
417 | <base> The base address of the region. | 412 | <base> The base address of the region. |
418 | <size> The size of the region. If this is 0 the region is disabled. | 413 | <size> The size of the region. If this is 0 the region is disabled. |
419 | <type> The type of the region. | 414 | <type> The type of the region. |
420 | <do_safe> If TRUE, do the change safely. If FALSE, safety measures should | ||
421 | be done externally. | ||
422 | [RETURNS] Nothing. | 415 | [RETURNS] Nothing. |
423 | */ | 416 | */ |
424 | { | 417 | { |