diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-03-19 13:25:05 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-17 11:41:00 -0400 |
commit | 1d89a7f072d4f76f0538edfb474d527066ee7838 (patch) | |
tree | 8d9ae2788f90923a3c31c5fc6b8400b2387c416a /arch/x86/kernel/smpboot.c | |
parent | f7401f7fe653f90f8f80a241840b9b499779e87d (diff) |
x86: merge smp_store_cpu_info
now that it is the same between arches, put it into smpboot.c
Signed-off-by: Glauber Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r-- | arch/x86/kernel/smpboot.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index b13b9d55f9ce..a157a5245923 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -45,6 +45,83 @@ unsigned char *trampoline_base = __va(SMP_TRAMPOLINE_BASE); | |||
45 | /* representing cpus for which sibling maps can be computed */ | 45 | /* representing cpus for which sibling maps can be computed */ |
46 | static cpumask_t cpu_sibling_setup_map; | 46 | static cpumask_t cpu_sibling_setup_map; |
47 | 47 | ||
48 | #ifdef CONFIG_X86_32 | ||
49 | /* Set if we find a B stepping CPU */ | ||
50 | int __cpuinitdata smp_b_stepping; | ||
51 | #endif | ||
52 | |||
53 | static void __cpuinit smp_apply_quirks(struct cpuinfo_x86 *c) | ||
54 | { | ||
55 | #ifdef CONFIG_X86_32 | ||
56 | /* | ||
57 | * Mask B, Pentium, but not Pentium MMX | ||
58 | */ | ||
59 | if (c->x86_vendor == X86_VENDOR_INTEL && | ||
60 | c->x86 == 5 && | ||
61 | c->x86_mask >= 1 && c->x86_mask <= 4 && | ||
62 | c->x86_model <= 3) | ||
63 | /* | ||
64 | * Remember we have B step Pentia with bugs | ||
65 | */ | ||
66 | smp_b_stepping = 1; | ||
67 | |||
68 | /* | ||
69 | * Certain Athlons might work (for various values of 'work') in SMP | ||
70 | * but they are not certified as MP capable. | ||
71 | */ | ||
72 | if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) { | ||
73 | |||
74 | if (num_possible_cpus() == 1) | ||
75 | goto valid_k7; | ||
76 | |||
77 | /* Athlon 660/661 is valid. */ | ||
78 | if ((c->x86_model == 6) && ((c->x86_mask == 0) || | ||
79 | (c->x86_mask == 1))) | ||
80 | goto valid_k7; | ||
81 | |||
82 | /* Duron 670 is valid */ | ||
83 | if ((c->x86_model == 7) && (c->x86_mask == 0)) | ||
84 | goto valid_k7; | ||
85 | |||
86 | /* | ||
87 | * Athlon 662, Duron 671, and Athlon >model 7 have capability | ||
88 | * bit. It's worth noting that the A5 stepping (662) of some | ||
89 | * Athlon XP's have the MP bit set. | ||
90 | * See http://www.heise.de/newsticker/data/jow-18.10.01-000 for | ||
91 | * more. | ||
92 | */ | ||
93 | if (((c->x86_model == 6) && (c->x86_mask >= 2)) || | ||
94 | ((c->x86_model == 7) && (c->x86_mask >= 1)) || | ||
95 | (c->x86_model > 7)) | ||
96 | if (cpu_has_mp) | ||
97 | goto valid_k7; | ||
98 | |||
99 | /* If we get here, not a certified SMP capable AMD system. */ | ||
100 | add_taint(TAINT_UNSAFE_SMP); | ||
101 | } | ||
102 | |||
103 | valid_k7: | ||
104 | ; | ||
105 | #endif | ||
106 | } | ||
107 | |||
108 | /* | ||
109 | * The bootstrap kernel entry code has set these up. Save them for | ||
110 | * a given CPU | ||
111 | */ | ||
112 | |||
113 | void __cpuinit smp_store_cpu_info(int id) | ||
114 | { | ||
115 | struct cpuinfo_x86 *c = &cpu_data(id); | ||
116 | |||
117 | *c = boot_cpu_data; | ||
118 | c->cpu_index = id; | ||
119 | if (id != 0) | ||
120 | identify_secondary_cpu(c); | ||
121 | smp_apply_quirks(c); | ||
122 | } | ||
123 | |||
124 | |||
48 | void __cpuinit set_cpu_sibling_map(int cpu) | 125 | void __cpuinit set_cpu_sibling_map(int cpu) |
49 | { | 126 | { |
50 | int i; | 127 | int i; |