diff options
| -rw-r--r-- | arch/x86/Kconfig.cpu | 17 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/Makefile | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/centaur.c | 34 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/centaur_64.c | 37 |
4 files changed, 29 insertions, 62 deletions
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index a95eaf0e582a..924e156a85ab 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -456,24 +456,9 @@ config CPU_SUP_AMD | |||
| 456 | 456 | ||
| 457 | If unsure, say N. | 457 | If unsure, say N. |
| 458 | 458 | ||
| 459 | config CPU_SUP_CENTAUR_32 | 459 | config CPU_SUP_CENTAUR |
| 460 | default y | 460 | default y |
| 461 | bool "Support Centaur processors" if PROCESSOR_SELECT | 461 | bool "Support Centaur processors" if PROCESSOR_SELECT |
| 462 | depends on !64BIT | ||
| 463 | ---help--- | ||
| 464 | This enables detection, tunings and quirks for Centaur processors | ||
| 465 | |||
| 466 | You need this enabled if you want your kernel to run on a | ||
| 467 | Centaur CPU. Disabling this option on other types of CPUs | ||
| 468 | makes the kernel a tiny bit smaller. Disabling it on a Centaur | ||
| 469 | CPU might render the kernel unbootable. | ||
| 470 | |||
| 471 | If unsure, say N. | ||
| 472 | |||
| 473 | config CPU_SUP_CENTAUR_64 | ||
| 474 | default y | ||
| 475 | bool "Support Centaur processors" if PROCESSOR_SELECT | ||
| 476 | depends on 64BIT | ||
| 477 | ---help--- | 462 | ---help--- |
| 478 | This enables detection, tunings and quirks for Centaur processors | 463 | This enables detection, tunings and quirks for Centaur processors |
| 479 | 464 | ||
diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile index d4356f8b7522..4e242f9a06e4 100644 --- a/arch/x86/kernel/cpu/Makefile +++ b/arch/x86/kernel/cpu/Makefile | |||
| @@ -19,8 +19,7 @@ obj-$(CONFIG_X86_CPU_DEBUG) += cpu_debug.o | |||
| 19 | obj-$(CONFIG_CPU_SUP_INTEL) += intel.o | 19 | obj-$(CONFIG_CPU_SUP_INTEL) += intel.o |
| 20 | obj-$(CONFIG_CPU_SUP_AMD) += amd.o | 20 | obj-$(CONFIG_CPU_SUP_AMD) += amd.o |
| 21 | obj-$(CONFIG_CPU_SUP_CYRIX_32) += cyrix.o | 21 | obj-$(CONFIG_CPU_SUP_CYRIX_32) += cyrix.o |
| 22 | obj-$(CONFIG_CPU_SUP_CENTAUR_32) += centaur.o | 22 | obj-$(CONFIG_CPU_SUP_CENTAUR) += centaur.o |
| 23 | obj-$(CONFIG_CPU_SUP_CENTAUR_64) += centaur_64.o | ||
| 24 | obj-$(CONFIG_CPU_SUP_TRANSMETA_32) += transmeta.o | 23 | obj-$(CONFIG_CPU_SUP_TRANSMETA_32) += transmeta.o |
| 25 | obj-$(CONFIG_CPU_SUP_UMC_32) += umc.o | 24 | obj-$(CONFIG_CPU_SUP_UMC_32) += umc.o |
| 26 | 25 | ||
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index 983e0830f0da..c95e831bb095 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | #include <linux/bitops.h> | ||
| 1 | #include <linux/kernel.h> | 2 | #include <linux/kernel.h> |
| 2 | #include <linux/init.h> | 3 | #include <linux/init.h> |
| 3 | #include <linux/bitops.h> | ||
| 4 | 4 | ||
| 5 | #include <asm/processor.h> | 5 | #include <asm/processor.h> |
| 6 | #include <asm/msr.h> | ||
| 7 | #include <asm/e820.h> | 6 | #include <asm/e820.h> |
| 8 | #include <asm/mtrr.h> | 7 | #include <asm/mtrr.h> |
| 8 | #include <asm/msr.h> | ||
| 9 | 9 | ||
| 10 | #include "cpu.h" | 10 | #include "cpu.h" |
| 11 | 11 | ||
| @@ -276,7 +276,7 @@ static void __cpuinit init_c3(struct cpuinfo_x86 *c) | |||
| 276 | */ | 276 | */ |
| 277 | c->x86_capability[5] = cpuid_edx(0xC0000001); | 277 | c->x86_capability[5] = cpuid_edx(0xC0000001); |
| 278 | } | 278 | } |
| 279 | 279 | #ifdef CONFIG_X86_32 | |
| 280 | /* Cyrix III family needs CX8 & PGE explicitly enabled. */ | 280 | /* Cyrix III family needs CX8 & PGE explicitly enabled. */ |
| 281 | if (c->x86_model >= 6 && c->x86_model <= 9) { | 281 | if (c->x86_model >= 6 && c->x86_model <= 9) { |
| 282 | rdmsr(MSR_VIA_FCR, lo, hi); | 282 | rdmsr(MSR_VIA_FCR, lo, hi); |
| @@ -288,6 +288,11 @@ static void __cpuinit init_c3(struct cpuinfo_x86 *c) | |||
| 288 | /* Before Nehemiah, the C3's had 3dNOW! */ | 288 | /* Before Nehemiah, the C3's had 3dNOW! */ |
| 289 | if (c->x86_model >= 6 && c->x86_model < 9) | 289 | if (c->x86_model >= 6 && c->x86_model < 9) |
| 290 | set_cpu_cap(c, X86_FEATURE_3DNOW); | 290 | set_cpu_cap(c, X86_FEATURE_3DNOW); |
| 291 | #endif | ||
| 292 | if (c->x86 == 0x6 && c->x86_model >= 0xf) { | ||
| 293 | c->x86_cache_alignment = c->x86_clflush_size * 2; | ||
| 294 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); | ||
| 295 | } | ||
| 291 | 296 | ||
| 292 | display_cacheinfo(c); | 297 | display_cacheinfo(c); |
| 293 | } | 298 | } |
| @@ -316,16 +321,25 @@ enum { | |||
| 316 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) | 321 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) |
| 317 | { | 322 | { |
| 318 | switch (c->x86) { | 323 | switch (c->x86) { |
| 324 | #ifdef CONFIG_X86_32 | ||
| 319 | case 5: | 325 | case 5: |
| 320 | /* Emulate MTRRs using Centaur's MCR. */ | 326 | /* Emulate MTRRs using Centaur's MCR. */ |
| 321 | set_cpu_cap(c, X86_FEATURE_CENTAUR_MCR); | 327 | set_cpu_cap(c, X86_FEATURE_CENTAUR_MCR); |
| 322 | break; | 328 | break; |
| 329 | #endif | ||
| 330 | case 6: | ||
| 331 | if (c->x86_model >= 0xf) | ||
| 332 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | ||
| 333 | break; | ||
| 323 | } | 334 | } |
| 335 | #ifdef CONFIG_X86_64 | ||
| 336 | set_cpu_cap(c, X86_FEATURE_SYSENTER32); | ||
| 337 | #endif | ||
| 324 | } | 338 | } |
| 325 | 339 | ||
| 326 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | 340 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) |
| 327 | { | 341 | { |
| 328 | 342 | #ifdef CONFIG_X86_32 | |
| 329 | char *name; | 343 | char *name; |
| 330 | u32 fcr_set = 0; | 344 | u32 fcr_set = 0; |
| 331 | u32 fcr_clr = 0; | 345 | u32 fcr_clr = 0; |
| @@ -337,8 +351,10 @@ static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | |||
| 337 | * 3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway | 351 | * 3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway |
| 338 | */ | 352 | */ |
| 339 | clear_cpu_cap(c, 0*32+31); | 353 | clear_cpu_cap(c, 0*32+31); |
| 340 | 354 | #endif | |
| 355 | early_init_centaur(c); | ||
| 341 | switch (c->x86) { | 356 | switch (c->x86) { |
| 357 | #ifdef CONFIG_X86_32 | ||
| 342 | case 5: | 358 | case 5: |
| 343 | switch (c->x86_model) { | 359 | switch (c->x86_model) { |
| 344 | case 4: | 360 | case 4: |
| @@ -442,16 +458,20 @@ static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | |||
| 442 | } | 458 | } |
| 443 | sprintf(c->x86_model_id, "WinChip %s", name); | 459 | sprintf(c->x86_model_id, "WinChip %s", name); |
| 444 | break; | 460 | break; |
| 445 | 461 | #endif | |
| 446 | case 6: | 462 | case 6: |
| 447 | init_c3(c); | 463 | init_c3(c); |
| 448 | break; | 464 | break; |
| 449 | } | 465 | } |
| 466 | #ifdef CONFIG_X86_64 | ||
| 467 | set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC); | ||
| 468 | #endif | ||
| 450 | } | 469 | } |
| 451 | 470 | ||
| 452 | static unsigned int __cpuinit | 471 | static unsigned int __cpuinit |
| 453 | centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) | 472 | centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) |
| 454 | { | 473 | { |
| 474 | #ifdef CONFIG_X86_32 | ||
| 455 | /* VIA C3 CPUs (670-68F) need further shifting. */ | 475 | /* VIA C3 CPUs (670-68F) need further shifting. */ |
| 456 | if ((c->x86 == 6) && ((c->x86_model == 7) || (c->x86_model == 8))) | 476 | if ((c->x86 == 6) && ((c->x86_model == 7) || (c->x86_model == 8))) |
| 457 | size >>= 8; | 477 | size >>= 8; |
| @@ -464,7 +484,7 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) | |||
| 464 | if ((c->x86 == 6) && (c->x86_model == 9) && | 484 | if ((c->x86 == 6) && (c->x86_model == 9) && |
| 465 | (c->x86_mask == 1) && (size == 65)) | 485 | (c->x86_mask == 1) && (size == 65)) |
| 466 | size -= 1; | 486 | size -= 1; |
| 467 | 487 | #endif | |
| 468 | return size; | 488 | return size; |
| 469 | } | 489 | } |
| 470 | 490 | ||
diff --git a/arch/x86/kernel/cpu/centaur_64.c b/arch/x86/kernel/cpu/centaur_64.c deleted file mode 100644 index 51b09c48c9c7..000000000000 --- a/arch/x86/kernel/cpu/centaur_64.c +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | #include <linux/init.h> | ||
| 2 | #include <linux/smp.h> | ||
| 3 | |||
| 4 | #include <asm/cpufeature.h> | ||
| 5 | #include <asm/processor.h> | ||
| 6 | |||
| 7 | #include "cpu.h" | ||
| 8 | |||
| 9 | static void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) | ||
| 10 | { | ||
| 11 | if (c->x86 == 0x6 && c->x86_model >= 0xf) | ||
| 12 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | ||
| 13 | |||
| 14 | set_cpu_cap(c, X86_FEATURE_SYSENTER32); | ||
| 15 | } | ||
| 16 | |||
| 17 | static void __cpuinit init_centaur(struct cpuinfo_x86 *c) | ||
| 18 | { | ||
| 19 | early_init_centaur(c); | ||
| 20 | |||
| 21 | if (c->x86 == 0x6 && c->x86_model >= 0xf) { | ||
| 22 | c->x86_cache_alignment = c->x86_clflush_size * 2; | ||
| 23 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); | ||
| 24 | } | ||
| 25 | set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC); | ||
| 26 | } | ||
| 27 | |||
| 28 | static const struct cpu_dev centaur_cpu_dev __cpuinitconst = { | ||
| 29 | .c_vendor = "Centaur", | ||
| 30 | .c_ident = { "CentaurHauls" }, | ||
| 31 | .c_early_init = early_init_centaur, | ||
| 32 | .c_init = init_centaur, | ||
| 33 | .c_x86_vendor = X86_VENDOR_CENTAUR, | ||
| 34 | }; | ||
| 35 | |||
| 36 | cpu_dev_register(centaur_cpu_dev); | ||
| 37 | |||
