diff options
author | Andi Kleen <ak@suse.de> | 2008-01-30 07:32:40 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:32:40 -0500 |
commit | 2b16a2353814a513cdb5c5c739b76a19d7ea39ce (patch) | |
tree | caee8a54a0e85b4839078286114f4c9f920ac89e /arch/x86/kernel/setup_64.c | |
parent | 68071a96655c883b316da9ef497f6dec8953529f (diff) |
x86: move X86_FEATURE_CONSTANT_TSC into early cpu feature detection
Need this in the next patch in time_init and that happens early.
This includes a minor fix on i386 where early_intel_workarounds()
[which is now called early_init_intel] really executes early as
the comments say.
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/setup_64.c')
-rw-r--r-- | arch/x86/kernel/setup_64.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index 8618178db842..3cae326093cb 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -544,9 +544,6 @@ static void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c) | |||
544 | printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n", | 544 | printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n", |
545 | c->x86_cache_size, ecx & 0xFF); | 545 | c->x86_cache_size, ecx & 0xFF); |
546 | } | 546 | } |
547 | |||
548 | if (n >= 0x80000007) | ||
549 | cpuid(0x80000007, &dummy, &dummy, &dummy, &c->x86_power); | ||
550 | if (n >= 0x80000008) { | 547 | if (n >= 0x80000008) { |
551 | cpuid(0x80000008, &eax, &dummy, &dummy, &dummy); | 548 | cpuid(0x80000008, &eax, &dummy, &dummy, &dummy); |
552 | c->x86_virt_bits = (eax >> 8) & 0xff; | 549 | c->x86_virt_bits = (eax >> 8) & 0xff; |
@@ -624,7 +621,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) | |||
624 | #endif | 621 | #endif |
625 | } | 622 | } |
626 | 623 | ||
627 | static void __cpuinit early_init_amd(struct cpuinfo_x86 *c) | 624 | static void __cpuinit early_init_amd_mc(struct cpuinfo_x86 *c) |
628 | { | 625 | { |
629 | #ifdef CONFIG_SMP | 626 | #ifdef CONFIG_SMP |
630 | unsigned bits, ecx; | 627 | unsigned bits, ecx; |
@@ -682,6 +679,15 @@ static __cpuinit int amd_apic_timer_broken(void) | |||
682 | return 0; | 679 | return 0; |
683 | } | 680 | } |
684 | 681 | ||
682 | static void __cpuinit early_init_amd(struct cpuinfo_x86 *c) | ||
683 | { | ||
684 | early_init_amd_mc(c); | ||
685 | |||
686 | /* c->x86_power is 8000_0007 edx. Bit 8 is constant TSC */ | ||
687 | if (c->x86_power & (1<<8)) | ||
688 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | ||
689 | } | ||
690 | |||
685 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) | 691 | static void __cpuinit init_amd(struct cpuinfo_x86 *c) |
686 | { | 692 | { |
687 | unsigned level; | 693 | unsigned level; |
@@ -731,10 +737,6 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
731 | } | 737 | } |
732 | display_cacheinfo(c); | 738 | display_cacheinfo(c); |
733 | 739 | ||
734 | /* c->x86_power is 8000_0007 edx. Bit 8 is constant TSC */ | ||
735 | if (c->x86_power & (1<<8)) | ||
736 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | ||
737 | |||
738 | /* Multi core CPU? */ | 740 | /* Multi core CPU? */ |
739 | if (c->extended_cpuid_level >= 0x80000008) | 741 | if (c->extended_cpuid_level >= 0x80000008) |
740 | amd_detect_cmp(c); | 742 | amd_detect_cmp(c); |
@@ -845,6 +847,13 @@ static void srat_detect_node(void) | |||
845 | #endif | 847 | #endif |
846 | } | 848 | } |
847 | 849 | ||
850 | static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | ||
851 | { | ||
852 | if ((c->x86 == 0xf && c->x86_model >= 0x03) || | ||
853 | (c->x86 == 0x6 && c->x86_model >= 0x0e)) | ||
854 | set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability); | ||
855 | } | ||
856 | |||
848 | static void __cpuinit init_intel(struct cpuinfo_x86 *c) | 857 | static void __cpuinit init_intel(struct cpuinfo_x86 *c) |
849 | { | 858 | { |
850 | /* Cache sizes */ | 859 | /* Cache sizes */ |
@@ -1056,6 +1065,20 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
1056 | #ifdef CONFIG_NUMA | 1065 | #ifdef CONFIG_NUMA |
1057 | numa_add_cpu(smp_processor_id()); | 1066 | numa_add_cpu(smp_processor_id()); |
1058 | #endif | 1067 | #endif |
1068 | |||
1069 | c->extended_cpuid_level = cpuid_eax(0x80000000); | ||
1070 | |||
1071 | if (c->extended_cpuid_level >= 0x80000007) | ||
1072 | c->x86_power = cpuid_edx(0x80000007); | ||
1073 | |||
1074 | switch (c->x86_vendor) { | ||
1075 | case X86_VENDOR_AMD: | ||
1076 | early_init_amd(c); | ||
1077 | break; | ||
1078 | case X86_VENDOR_INTEL: | ||
1079 | early_init_intel(c); | ||
1080 | break; | ||
1081 | } | ||
1059 | } | 1082 | } |
1060 | 1083 | ||
1061 | void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) | 1084 | void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) |