diff options
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/centaur.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cyrix.c | 32 |
3 files changed, 44 insertions, 8 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index cae9cabc3031..18514ed26104 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -31,6 +31,11 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c) | |||
| 31 | if (c->x86_power & (1<<8)) | 31 | if (c->x86_power & (1<<8)) |
| 32 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 32 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
| 33 | } | 33 | } |
| 34 | |||
| 35 | /* Set MTRR capability flag if appropriate */ | ||
| 36 | if (c->x86_model == 13 || c->x86_model == 9 || | ||
| 37 | (c->x86_model == 8 && c->x86_mask >= 8)) | ||
| 38 | set_cpu_cap(c, X86_FEATURE_K6_MTRR); | ||
| 34 | } | 39 | } |
| 35 | 40 | ||
| 36 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) | 41 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) |
| @@ -166,10 +171,6 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
| 166 | mbytes); | 171 | mbytes); |
| 167 | } | 172 | } |
| 168 | 173 | ||
| 169 | /* Set MTRR capability flag if appropriate */ | ||
| 170 | if (c->x86_model == 13 || c->x86_model == 9 || | ||
| 171 | (c->x86_model == 8 && c->x86_mask >= 8)) | ||
| 172 | set_cpu_cap(c, X86_FEATURE_K6_MTRR); | ||
| 173 | break; | 174 | break; |
| 174 | } | 175 | } |
| 175 | 176 | ||
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index e0f45edd6a55..a0534c04d38a 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c | |||
| @@ -314,6 +314,16 @@ enum { | |||
| 314 | EAMD3D = 1<<20, | 314 | EAMD3D = 1<<20, |
| 315 | }; | 315 | }; |
| 316 | 316 | ||
| 317 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) | ||
| 318 | { | ||
| 319 | switch (c->x86) { | ||
| 320 | case 5: | ||
| 321 | /* Emulate MTRRs using Centaur's MCR. */ | ||
| 322 | set_cpu_cap(c, X86_FEATURE_CENTAUR_MCR); | ||
| 323 | break; | ||
| 324 | } | ||
| 325 | } | ||
| 326 | |||
| 317 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | 327 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) |
| 318 | { | 328 | { |
| 319 | 329 | ||
| @@ -462,6 +472,7 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) | |||
| 462 | static struct cpu_dev centaur_cpu_dev __cpuinitdata = { | 472 | static struct cpu_dev centaur_cpu_dev __cpuinitdata = { |
| 463 | .c_vendor = "Centaur", | 473 | .c_vendor = "Centaur", |
| 464 | .c_ident = { "CentaurHauls" }, | 474 | .c_ident = { "CentaurHauls" }, |
| 475 | .c_early_init = early_init_centaur, | ||
| 465 | .c_init = init_centaur, | 476 | .c_init = init_centaur, |
| 466 | .c_size_cache = centaur_size_cache, | 477 | .c_size_cache = centaur_size_cache, |
| 467 | }; | 478 | }; |
diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index e710a21bb6e8..898a5a2002ed 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c | |||
| @@ -15,13 +15,11 @@ | |||
| 15 | /* | 15 | /* |
| 16 | * Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU | 16 | * Read NSC/Cyrix DEVID registers (DIR) to get more detailed info. about the CPU |
| 17 | */ | 17 | */ |
| 18 | static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) | 18 | static void __cpuinit __do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) |
| 19 | { | 19 | { |
| 20 | unsigned char ccr2, ccr3; | 20 | unsigned char ccr2, ccr3; |
| 21 | unsigned long flags; | ||
| 22 | 21 | ||
| 23 | /* we test for DEVID by checking whether CCR3 is writable */ | 22 | /* we test for DEVID by checking whether CCR3 is writable */ |
| 24 | local_irq_save(flags); | ||
| 25 | ccr3 = getCx86(CX86_CCR3); | 23 | ccr3 = getCx86(CX86_CCR3); |
| 26 | setCx86(CX86_CCR3, ccr3 ^ 0x80); | 24 | setCx86(CX86_CCR3, ccr3 ^ 0x80); |
| 27 | getCx86(0xc0); /* dummy to change bus */ | 25 | getCx86(0xc0); /* dummy to change bus */ |
| @@ -44,9 +42,16 @@ static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) | |||
| 44 | *dir0 = getCx86(CX86_DIR0); | 42 | *dir0 = getCx86(CX86_DIR0); |
| 45 | *dir1 = getCx86(CX86_DIR1); | 43 | *dir1 = getCx86(CX86_DIR1); |
| 46 | } | 44 | } |
| 47 | local_irq_restore(flags); | ||
| 48 | } | 45 | } |
| 49 | 46 | ||
| 47 | static void __cpuinit do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) | ||
| 48 | { | ||
| 49 | unsigned long flags; | ||
| 50 | |||
| 51 | local_irq_save(flags); | ||
| 52 | __do_cyrix_devid(dir0, dir1); | ||
| 53 | local_irq_restore(flags); | ||
| 54 | } | ||
| 50 | /* | 55 | /* |
| 51 | * Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in | 56 | * Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in |
| 52 | * order to identify the Cyrix CPU model after we're out of setup.c | 57 | * order to identify the Cyrix CPU model after we're out of setup.c |
| @@ -161,6 +166,24 @@ static void __cpuinit geode_configure(void) | |||
| 161 | local_irq_restore(flags); | 166 | local_irq_restore(flags); |
| 162 | } | 167 | } |
| 163 | 168 | ||
| 169 | static void __cpuinit early_init_cyrix(struct cpuinfo_x86 *c) | ||
| 170 | { | ||
| 171 | unsigned char dir0, dir0_msn, dir1 = 0; | ||
| 172 | |||
| 173 | __do_cyrix_devid(&dir0, &dir1); | ||
| 174 | dir0_msn = dir0 >> 4; /* identifies CPU "family" */ | ||
| 175 | |||
| 176 | switch (dir0_msn) { | ||
| 177 | case 3: /* 6x86/6x86L */ | ||
| 178 | /* Emulate MTRRs using Cyrix's ARRs. */ | ||
| 179 | set_cpu_cap(c, X86_FEATURE_CYRIX_ARR); | ||
| 180 | break; | ||
| 181 | case 5: /* 6x86MX/M II */ | ||
| 182 | /* Emulate MTRRs using Cyrix's ARRs. */ | ||
| 183 | set_cpu_cap(c, X86_FEATURE_CYRIX_ARR); | ||
| 184 | break; | ||
| 185 | } | ||
| 186 | } | ||
| 164 | 187 | ||
| 165 | static void __cpuinit init_cyrix(struct cpuinfo_x86 *c) | 188 | static void __cpuinit init_cyrix(struct cpuinfo_x86 *c) |
| 166 | { | 189 | { |
| @@ -416,6 +439,7 @@ static void __cpuinit cyrix_identify(struct cpuinfo_x86 *c) | |||
| 416 | static struct cpu_dev cyrix_cpu_dev __cpuinitdata = { | 439 | static struct cpu_dev cyrix_cpu_dev __cpuinitdata = { |
| 417 | .c_vendor = "Cyrix", | 440 | .c_vendor = "Cyrix", |
| 418 | .c_ident = { "CyrixInstead" }, | 441 | .c_ident = { "CyrixInstead" }, |
| 442 | .c_early_init = early_init_cyrix, | ||
| 419 | .c_init = init_cyrix, | 443 | .c_init = init_cyrix, |
| 420 | .c_identify = cyrix_identify, | 444 | .c_identify = cyrix_identify, |
| 421 | }; | 445 | }; |
