* [PATCH 1/3] x86_64: store core id bits in cpuinfo_x86
@ 2007-07-22 0:49 Yinghai Lu
2007-07-22 12:43 ` Andi Kleen
0 siblings, 1 reply; 2+ messages in thread
From: Yinghai Lu @ 2007-07-22 0:49 UTC (permalink / raw)
To: Andi Kleen, Andrew Morton; +Cc: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 406 bytes --]
[PATCH 1/3] x86_64: store core id bits in cpuinfo_x86
We need to store core id bits to cpuinfo_x86 in early_identify_cpu. So we
use it to create acpiid_to_node array in k8topolgy.c
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
arch/x86_64/kernel/setup.c | 72 +++++++++++++++++++++++++++--------------
include/asm-x86_64/processor.h | 1
2 files changed, 49 insertions(+), 24 deletions(-)
[-- Attachment #2: 1.patch --]
[-- Type: text/x-patch, Size: 3405 bytes --]
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index 33ef718..24e6a52 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -499,18 +505,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
int node = 0;
unsigned apicid = hard_smp_processor_id();
#endif
- unsigned ecx = cpuid_ecx(0x80000008);
-
- c->x86_max_cores = (ecx & 0xff) + 1;
-
- /* CPU telling us the core id bits shift? */
- bits = (ecx >> 12) & 0xF;
-
- /* Otherwise recompute */
- if (bits == 0) {
- while ((1 << bits) < c->x86_max_cores)
- bits++;
- }
+ bits = c->x86_coreid_bits;
/* Low order bits define the core id (index of core in socket) */
c->cpu_core_id = c->phys_proc_id & ((1 << bits)-1);
@@ -546,6 +541,34 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
#endif
}
+static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
+{
+#ifdef CONFIG_SMP
+ unsigned bits;
+ unsigned ecx;
+
+ /* Multi core CPU? */
+ if (c->extended_cpuid_level < 0x80000008)
+ return;
+
+ ecx = cpuid_ecx(0x80000008);
+
+ c->x86_max_cores = (ecx & 0xff) + 1;
+
+ /* CPU telling us the core id bits shift? */
+ bits = (ecx >> 12) & 0xF;
+
+ /* Otherwise recompute */
+ if (bits == 0) {
+ while ((1 << bits) < c->x86_max_cores)
+ bits++;
+ }
+
+ c->x86_coreid_bits = bits;
+
+#endif
+}
+
static void __cpuinit init_amd(struct cpuinfo_x86 *c)
{
unsigned level;
@@ -768,6 +791,7 @@ struct cpu_model_info {
void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
{
u32 tfms;
+ u32 xlvl;
c->loops_per_jiffy = loops_per_jiffy;
c->x86_cache_size = -1;
@@ -778,6 +802,7 @@ void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
c->x86_clflush_size = 64;
c->x86_cache_alignment = c->x86_clflush_size;
c->x86_max_cores = 1;
+ c->x86_coreid_bits = 0;
c->extended_cpuid_level = 0;
memset(&c->x86_capability, 0, sizeof c->x86_capability);
@@ -814,18 +839,6 @@ void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
#ifdef CONFIG_SMP
c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
#endif
-}
-
-/*
- * This does the hard work of actually picking apart the CPU stuff...
- */
-void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
-{
- int i;
- u32 xlvl;
-
- early_identify_cpu(c);
-
/* AMD-defined flags: level 0x80000001 */
xlvl = cpuid_eax(0x80000000);
c->extended_cpuid_level = xlvl;
@@ -846,6 +859,23 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
c->x86_capability[2] = cpuid_edx(0x80860001);
}
+ switch (c->x86_vendor) {
+ case X86_VENDOR_AMD:
+ early_init_amd(c);
+ break;
+ }
+
+}
+
+/*
+ * This does the hard work of actually picking apart the CPU stuff...
+ */
+void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
+{
+ int i;
+
+ early_identify_cpu(c);
+
init_scattered_cpuid_features(c);
c->apicid = phys_pkg_id(0);
diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h
index efc87a5..a5ac309 100644
--- a/include/asm-x86_64/processor.h
+++ b/include/asm-x86_64/processor.h
@@ -63,6 +63,7 @@ struct cpuinfo_x86 {
int x86_tlbsize; /* number of 4K pages in DTLB/ITLB combined(in pages)*/
__u8 x86_virt_bits, x86_phys_bits;
__u8 x86_max_cores; /* cpuid returned max cores value */
+ __u8 x86_coreid_bits; /* cpuid returned core id bits */
__u32 x86_power;
__u32 extended_cpuid_level; /* Max extended CPUID function supported */
unsigned long loops_per_jiffy;
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 1/3] x86_64: store core id bits in cpuinfo_x86
2007-07-22 0:49 [PATCH 1/3] x86_64: store core id bits in cpuinfo_x86 Yinghai Lu
@ 2007-07-22 12:43 ` Andi Kleen
0 siblings, 0 replies; 2+ messages in thread
From: Andi Kleen @ 2007-07-22 12:43 UTC (permalink / raw)
To: Yinghai Lu; +Cc: Andrew Morton, linux-kernel
On Sunday 22 July 2007 02:49:26 Yinghai Lu wrote:
> [PATCH 1/3] x86_64: store core id bits in cpuinfo_x86
>
> We need to store core id bits to cpuinfo_x86 in early_identify_cpu. So we
> use it to create acpiid_to_node array in k8topolgy.c
Looks good
-Andi
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-07-22 12:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-22 0:49 [PATCH 1/3] x86_64: store core id bits in cpuinfo_x86 Yinghai Lu
2007-07-22 12:43 ` Andi Kleen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox