diff options
Diffstat (limited to 'arch/x86/kernel/cpu/centaur_64.c')
-rw-r--r-- | arch/x86/kernel/cpu/centaur_64.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/centaur_64.c b/arch/x86/kernel/cpu/centaur_64.c new file mode 100644 index 000000000000..bac96d187d05 --- /dev/null +++ b/arch/x86/kernel/cpu/centaur_64.c | |||
@@ -0,0 +1,31 @@ | |||
1 | #include <linux/init.h> | ||
2 | #include <linux/smp.h> | ||
3 | |||
4 | #include <asm/cpufeature.h> | ||
5 | #include <asm/processor.h> | ||
6 | |||
7 | void __cpuinit early_init_centaur(struct cpuinfo_x86 *c) | ||
8 | { | ||
9 | if (c->x86 == 0x6 && c->x86_model >= 0xf) | ||
10 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | ||
11 | } | ||
12 | |||
13 | void __cpuinit init_centaur(struct cpuinfo_x86 *c) | ||
14 | { | ||
15 | /* Cache sizes */ | ||
16 | unsigned n; | ||
17 | |||
18 | n = c->extended_cpuid_level; | ||
19 | if (n >= 0x80000008) { | ||
20 | unsigned eax = cpuid_eax(0x80000008); | ||
21 | c->x86_virt_bits = (eax >> 8) & 0xff; | ||
22 | c->x86_phys_bits = eax & 0xff; | ||
23 | } | ||
24 | |||
25 | if (c->x86 == 0x6 && c->x86_model >= 0xf) { | ||
26 | c->x86_cache_alignment = c->x86_clflush_size * 2; | ||
27 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | ||
28 | set_cpu_cap(c, X86_FEATURE_REP_GOOD); | ||
29 | } | ||
30 | set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC); | ||
31 | } | ||