* [PATCH RESEND] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
2009-10-16 12:22 Andreas Herrmann
@ 2009-10-27 9:33 ` Andreas Herrmann
0 siblings, 0 replies; 9+ messages in thread
From: Andreas Herrmann @ 2009-10-27 9:33 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin; +Cc: linux-kernel
Use newly introduced NodeId MSR to get NodeId and number of nodes per
processor. Production systems will support this from scratch. Thus the
PCI config space accesses are superfluous and should be removed asap.
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
---
arch/x86/include/asm/cpufeature.h | 1 +
arch/x86/kernel/cpu/amd.c | 53 ++++++++++--------------------------
2 files changed, 16 insertions(+), 38 deletions(-)
Please apply for .32.
Thanks,
Andreas
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 9cfc88b..2cbf0a2 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -153,6 +153,7 @@
#define X86_FEATURE_SSE5 (6*32+11) /* SSE-5 */
#define X86_FEATURE_SKINIT (6*32+12) /* SKINIT/STGI instructions */
#define X86_FEATURE_WDT (6*32+13) /* Watchdog timer */
+#define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */
/*
* Auxiliary flags: Linux defined - For features scattered in various
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index c910a71..3f56759 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -254,59 +254,36 @@ static int __cpuinit nearby_node(int apicid)
/*
* Fixup core topology information for AMD multi-node processors.
- * Assumption 1: Number of cores in each internal node is the same.
- * Assumption 2: Mixed systems with both single-node and dual-node
- * processors are not supported.
+ * Assumption: Number of cores in each internal node is the same.
*/
#ifdef CONFIG_X86_HT
static void __cpuinit amd_fixup_dcm(struct cpuinfo_x86 *c)
{
-#ifdef CONFIG_PCI
- u32 t, cpn;
- u8 n, n_id;
+ unsigned long long value;
+ u32 nodes, cores_per_node;
int cpu = smp_processor_id();
+ if (!cpu_has(c, X86_FEATURE_NODEID_MSR))
+ return;
+
/* fixup topology information only once for a core */
if (cpu_has(c, X86_FEATURE_AMD_DCM))
return;
- /* check for multi-node processor on boot cpu */
- t = read_pci_config(0, 24, 3, 0xe8);
- if (!(t & (1 << 29)))
+ rdmsrl(0xc001100c, value);
+
+ nodes = ((value >> 3) & 7) + 1;
+ if (nodes == 1)
return;
set_cpu_cap(c, X86_FEATURE_AMD_DCM);
+ cores_per_node = c->x86_max_cores / nodes;
- /* cores per node: each internal node has half the number of cores */
- cpn = c->x86_max_cores >> 1;
+ /* store NodeID, use llc_shared_map to store sibling info */
+ per_cpu(cpu_llc_id, cpu) = value & 7;
- /* even-numbered NB_id of this dual-node processor */
- n = c->phys_proc_id << 1;
-
- /*
- * determine internal node id and assign cores fifty-fifty to
- * each node of the dual-node processor
- */
- t = read_pci_config(0, 24 + n, 3, 0xe8);
- n = (t>>30) & 0x3;
- if (n == 0) {
- if (c->cpu_core_id < cpn)
- n_id = 0;
- else
- n_id = 1;
- } else {
- if (c->cpu_core_id < cpn)
- n_id = 1;
- else
- n_id = 0;
- }
-
- /* compute entire NodeID, use llc_shared_map to store sibling info */
- per_cpu(cpu_llc_id, cpu) = (c->phys_proc_id << 1) + n_id;
-
- /* fixup core id to be in range from 0 to cpn */
- c->cpu_core_id = c->cpu_core_id % cpn;
-#endif
+ /* fixup core id to be in range from 0 to (cores_per_node - 1) */
+ c->cpu_core_id = c->cpu_core_id % cores_per_node;
}
#endif
--
1.6.0.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
@ 2009-12-15 12:44 Andreas Herrmann
2009-12-15 19:31 ` Ingo Molnar
2009-12-16 14:43 ` [PATCH v2] " Andreas Herrmann
0 siblings, 2 replies; 9+ messages in thread
From: Andreas Herrmann @ 2009-12-15 12:44 UTC (permalink / raw)
To: Ingo Molnar, H. Peter Anvin, Thomas Gleixner; +Cc: linux-kernel
Use NodeId MSR to get NodeId and number of nodes per processor.
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
---
arch/x86/include/asm/cpufeature.h | 1 +
arch/x86/kernel/cpu/amd.c | 53 ++++++++++--------------------------
2 files changed, 16 insertions(+), 38 deletions(-)
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 9cfc88b..2cbf0a2 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -153,6 +153,7 @@
#define X86_FEATURE_SSE5 (6*32+11) /* SSE-5 */
#define X86_FEATURE_SKINIT (6*32+12) /* SKINIT/STGI instructions */
#define X86_FEATURE_WDT (6*32+13) /* Watchdog timer */
+#define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */
/*
* Auxiliary flags: Linux defined - For features scattered in various
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index c910a71..85ee6c3 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -254,59 +254,36 @@ static int __cpuinit nearby_node(int apicid)
/*
* Fixup core topology information for AMD multi-node processors.
- * Assumption 1: Number of cores in each internal node is the same.
- * Assumption 2: Mixed systems with both single-node and dual-node
- * processors are not supported.
+ * Assumption: Number of cores in each internal node is the same.
*/
#ifdef CONFIG_X86_HT
static void __cpuinit amd_fixup_dcm(struct cpuinfo_x86 *c)
{
-#ifdef CONFIG_PCI
- u32 t, cpn;
- u8 n, n_id;
+ unsigned long long value;
+ u32 nodes, cores_per_node;
int cpu = smp_processor_id();
+ if (!cpu_has(c, X86_FEATURE_NODEID_MSR))
+ return;
+
/* fixup topology information only once for a core */
if (cpu_has(c, X86_FEATURE_AMD_DCM))
return;
- /* check for multi-node processor on boot cpu */
- t = read_pci_config(0, 24, 3, 0xe8);
- if (!(t & (1 << 29)))
+ rdmsrl(0xc001100c, value);
+
+ nodes = ((value >> 3) & 7) + 1;
+ if (nodes == 1)
return;
set_cpu_cap(c, X86_FEATURE_AMD_DCM);
+ cores_per_node = c->x86_max_cores / nodes;
- /* cores per node: each internal node has half the number of cores */
- cpn = c->x86_max_cores >> 1;
+ /* store NodeID, use llc_shared_map to store sibling info */
+ per_cpu(cpu_llc_id, cpu) = value & 7;
- /* even-numbered NB_id of this dual-node processor */
- n = c->phys_proc_id << 1;
-
- /*
- * determine internal node id and assign cores fifty-fifty to
- * each node of the dual-node processor
- */
- t = read_pci_config(0, 24 + n, 3, 0xe8);
- n = (t>>30) & 0x3;
- if (n == 0) {
- if (c->cpu_core_id < cpn)
- n_id = 0;
- else
- n_id = 1;
- } else {
- if (c->cpu_core_id < cpn)
- n_id = 1;
- else
- n_id = 0;
- }
-
- /* compute entire NodeID, use llc_shared_map to store sibling info */
- per_cpu(cpu_llc_id, cpu) = (c->phys_proc_id << 1) + n_id;
-
- /* fixup core id to be in range from 0 to cpn */
- c->cpu_core_id = c->cpu_core_id % cpn;
-#endif
+ /* fixup core id to be in range from 0 to (cores_per_node - 1) */
+ c->cpu_core_id = c->cpu_core_id % cores_per_node;
}
#endif
--
1.6.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
2009-12-15 12:44 [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space Andreas Herrmann
@ 2009-12-15 19:31 ` Ingo Molnar
2009-12-15 19:45 ` Borislav Petkov
2009-12-16 14:43 ` [PATCH v2] " Andreas Herrmann
1 sibling, 1 reply; 9+ messages in thread
From: Ingo Molnar @ 2009-12-15 19:31 UTC (permalink / raw)
To: Andreas Herrmann; +Cc: H. Peter Anvin, Thomas Gleixner, linux-kernel
* Andreas Herrmann <herrmann.der.user@googlemail.com> wrote:
> + rdmsrl(0xc001100c, value);
Dont we want some nice, meaningfully named symbolic constant here, instead of
0xc001100c?
Ingo
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
2009-12-15 19:31 ` Ingo Molnar
@ 2009-12-15 19:45 ` Borislav Petkov
0 siblings, 0 replies; 9+ messages in thread
From: Borislav Petkov @ 2009-12-15 19:45 UTC (permalink / raw)
To: Ingo Molnar
Cc: Andreas Herrmann, H. Peter Anvin, Thomas Gleixner, linux-kernel
On Tue, Dec 15, 2009 at 08:31:50PM +0100, Ingo Molnar wrote:
>
> * Andreas Herrmann <herrmann.der.user@googlemail.com> wrote:
>
> > + rdmsrl(0xc001100c, value);
>
> Dont we want some nice, meaningfully named symbolic constant here, instead of
> 0xc001100c?
The MSR name is actually in the commit msg, maybe something like
MSR_F10H_NODE_ID.
--
Regards/Gruss,
Boris.
Operating | Advanced Micro Devices GmbH
System | Karl-Hammerschmidt-Str. 34, 85609 Dornach b. München, Germany
Research | Geschäftsführer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni
Center | Sitz: Dornach, Gemeinde Aschheim, Landkreis München
(OSRC) | Registergericht München, HRB Nr. 43632
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
@ 2009-12-15 19:51 H. Peter Anvin
0 siblings, 0 replies; 9+ messages in thread
From: H. Peter Anvin @ 2009-12-15 19:51 UTC (permalink / raw)
To: Ingo Molnar, Andreas Herrmann; +Cc: Thomas Gleixner, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 380 bytes --]
Absolutely - the only place for MSR numbers is in msr-index.h
"Ingo Molnar" <mingo@elte.hu> wrote:
>
>* Andreas Herrmann <herrmann.der.user@googlemail.com> wrote:
>
>> + rdmsrl(0xc001100c, value);
>
>Dont we want some nice, meaningfully named symbolic constant here, instead of
>0xc001100c?
>
> Ingo
--
Sent from my mobile phone. Please excuse any lack of formatting.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
@ 2009-12-15 20:00 H. Peter Anvin
2009-12-15 20:46 ` Borislav Petkov
0 siblings, 1 reply; 9+ messages in thread
From: H. Peter Anvin @ 2009-12-15 20:00 UTC (permalink / raw)
To: Borislav Petkov, Ingo Molnar
Cc: Andreas Herrmann, Thomas Gleixner, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 915 bytes --]
That's nice. It should be in the code, not in the commit message.
"Borislav Petkov" <borislav.petkov@amd.com> wrote:
>On Tue, Dec 15, 2009 at 08:31:50PM +0100, Ingo Molnar wrote:
>>
>> * Andreas Herrmann <herrmann.der.user@googlemail.com> wrote:
>>
>> > + rdmsrl(0xc001100c, value);
>>
>> Dont we want some nice, meaningfully named symbolic constant here, instead of
>> 0xc001100c?
>
>The MSR name is actually in the commit msg, maybe something like
>MSR_F10H_NODE_ID.
>
>--
>Regards/Gruss,
>Boris.
>
>Operating | Advanced Micro Devices GmbH
> System | Karl-Hammerschmidt-Str. 34, 85609 Dornach b. München, Germany
> Research | Geschäftsführer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni
> Center | Sitz: Dornach, Gemeinde Aschheim, Landkreis München
> (OSRC) | Registergericht München, HRB Nr. 43632
>
--
Sent from my mobile phone. Please excuse any lack of formatting.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
2009-12-15 20:00 [PATCH resend] " H. Peter Anvin
@ 2009-12-15 20:46 ` Borislav Petkov
0 siblings, 0 replies; 9+ messages in thread
From: Borislav Petkov @ 2009-12-15 20:46 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Ingo Molnar, Andreas Herrmann, Thomas Gleixner, linux-kernel
On Tue, Dec 15, 2009 at 12:00:36PM -0800, H. Peter Anvin wrote:
> That's nice. It should be in the code, not in the commit message.
I'm pretty sure it'll land there tomorrow :).
--
Regards/Gruss,
Boris.
Operating | Advanced Micro Devices GmbH
System | Karl-Hammerschmidt-Str. 34, 85609 Dornach b. München, Germany
Research | Geschäftsführer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni
Center | Sitz: Dornach, Gemeinde Aschheim, Landkreis München
(OSRC) | Registergericht München, HRB Nr. 43632
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
2009-12-15 12:44 [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space Andreas Herrmann
2009-12-15 19:31 ` Ingo Molnar
@ 2009-12-16 14:43 ` Andreas Herrmann
2009-12-17 1:00 ` [tip:x86/urgent] " tip-bot for Andreas Herrmann
1 sibling, 1 reply; 9+ messages in thread
From: Andreas Herrmann @ 2009-12-16 14:43 UTC (permalink / raw)
To: Ingo Molnar, H. Peter Anvin, Thomas Gleixner
Cc: linux-kernel, Borislav Petkov
Use NodeId MSR to get NodeId and number of nodes per processor.
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
---
arch/x86/include/asm/cpufeature.h | 1 +
arch/x86/include/asm/msr-index.h | 1 +
arch/x86/kernel/cpu/amd.c | 53 ++++++++++--------------------------
3 files changed, 17 insertions(+), 38 deletions(-)
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 613700f..637e1ec 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -153,6 +153,7 @@
#define X86_FEATURE_SSE5 (6*32+11) /* SSE-5 */
#define X86_FEATURE_SKINIT (6*32+12) /* SKINIT/STGI instructions */
#define X86_FEATURE_WDT (6*32+13) /* Watchdog timer */
+#define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */
/*
* Auxiliary flags: Linux defined - For features scattered in various
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 4ffe09b..9d976a7 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -123,6 +123,7 @@
#define FAM10H_MMIO_CONF_BUSRANGE_SHIFT 2
#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffff
#define FAM10H_MMIO_CONF_BASE_SHIFT 20
+#define MSR_FAM10H_NODE_ID 0xc001100c
/* K8 MSRs */
#define MSR_K8_TOP_MEM1 0xc001001a
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 7128b37..5dcd638 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -254,59 +254,36 @@ static int __cpuinit nearby_node(int apicid)
/*
* Fixup core topology information for AMD multi-node processors.
- * Assumption 1: Number of cores in each internal node is the same.
- * Assumption 2: Mixed systems with both single-node and dual-node
- * processors are not supported.
+ * Assumption: Number of cores in each internal node is the same.
*/
#ifdef CONFIG_X86_HT
static void __cpuinit amd_fixup_dcm(struct cpuinfo_x86 *c)
{
-#ifdef CONFIG_PCI
- u32 t, cpn;
- u8 n, n_id;
+ unsigned long long value;
+ u32 nodes, cores_per_node;
int cpu = smp_processor_id();
+ if (!cpu_has(c, X86_FEATURE_NODEID_MSR))
+ return;
+
/* fixup topology information only once for a core */
if (cpu_has(c, X86_FEATURE_AMD_DCM))
return;
- /* check for multi-node processor on boot cpu */
- t = read_pci_config(0, 24, 3, 0xe8);
- if (!(t & (1 << 29)))
+ rdmsrl(MSR_FAM10H_NODE_ID, value);
+
+ nodes = ((value >> 3) & 7) + 1;
+ if (nodes == 1)
return;
set_cpu_cap(c, X86_FEATURE_AMD_DCM);
+ cores_per_node = c->x86_max_cores / nodes;
- /* cores per node: each internal node has half the number of cores */
- cpn = c->x86_max_cores >> 1;
+ /* store NodeID, use llc_shared_map to store sibling info */
+ per_cpu(cpu_llc_id, cpu) = value & 7;
- /* even-numbered NB_id of this dual-node processor */
- n = c->phys_proc_id << 1;
-
- /*
- * determine internal node id and assign cores fifty-fifty to
- * each node of the dual-node processor
- */
- t = read_pci_config(0, 24 + n, 3, 0xe8);
- n = (t>>30) & 0x3;
- if (n == 0) {
- if (c->cpu_core_id < cpn)
- n_id = 0;
- else
- n_id = 1;
- } else {
- if (c->cpu_core_id < cpn)
- n_id = 1;
- else
- n_id = 0;
- }
-
- /* compute entire NodeID, use llc_shared_map to store sibling info */
- per_cpu(cpu_llc_id, cpu) = (c->phys_proc_id << 1) + n_id;
-
- /* fixup core id to be in range from 0 to cpn */
- c->cpu_core_id = c->cpu_core_id % cpn;
-#endif
+ /* fixup core id to be in range from 0 to (cores_per_node - 1) */
+ c->cpu_core_id = c->cpu_core_id % cores_per_node;
}
#endif
--
1.6.5.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:x86/urgent] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
2009-12-16 14:43 ` [PATCH v2] " Andreas Herrmann
@ 2009-12-17 1:00 ` tip-bot for Andreas Herrmann
0 siblings, 0 replies; 9+ messages in thread
From: tip-bot for Andreas Herrmann @ 2009-12-17 1:00 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, andreas.herrmann3, herrmann.der.user,
tglx
Commit-ID: 9d260ebc09a0ad6b5c73e17676df42c7bc75ff64
Gitweb: http://git.kernel.org/tip/9d260ebc09a0ad6b5c73e17676df42c7bc75ff64
Author: Andreas Herrmann <herrmann.der.user@googlemail.com>
AuthorDate: Wed, 16 Dec 2009 15:43:55 +0100
Committer: H. Peter Anvin <hpa@zytor.com>
CommitDate: Wed, 16 Dec 2009 15:06:23 -0800
x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space
Use NodeId MSR to get NodeId and number of nodes per processor.
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
LKML-Reference: <20091216144355.GB28798@alberich.amd.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
arch/x86/include/asm/cpufeature.h | 1 +
arch/x86/include/asm/msr-index.h | 1 +
arch/x86/kernel/cpu/amd.c | 53 ++++++++++--------------------------
3 files changed, 17 insertions(+), 38 deletions(-)
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 613700f..637e1ec 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -153,6 +153,7 @@
#define X86_FEATURE_SSE5 (6*32+11) /* SSE-5 */
#define X86_FEATURE_SKINIT (6*32+12) /* SKINIT/STGI instructions */
#define X86_FEATURE_WDT (6*32+13) /* Watchdog timer */
+#define X86_FEATURE_NODEID_MSR (6*32+19) /* NodeId MSR */
/*
* Auxiliary flags: Linux defined - For features scattered in various
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index ac98d29..1cd58cd 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -124,6 +124,7 @@
#define FAM10H_MMIO_CONF_BUSRANGE_SHIFT 2
#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffff
#define FAM10H_MMIO_CONF_BASE_SHIFT 20
+#define MSR_FAM10H_NODE_ID 0xc001100c
/* K8 MSRs */
#define MSR_K8_TOP_MEM1 0xc001001a
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 8dc3ea1..e485825 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -254,59 +254,36 @@ static int __cpuinit nearby_node(int apicid)
/*
* Fixup core topology information for AMD multi-node processors.
- * Assumption 1: Number of cores in each internal node is the same.
- * Assumption 2: Mixed systems with both single-node and dual-node
- * processors are not supported.
+ * Assumption: Number of cores in each internal node is the same.
*/
#ifdef CONFIG_X86_HT
static void __cpuinit amd_fixup_dcm(struct cpuinfo_x86 *c)
{
-#ifdef CONFIG_PCI
- u32 t, cpn;
- u8 n, n_id;
+ unsigned long long value;
+ u32 nodes, cores_per_node;
int cpu = smp_processor_id();
+ if (!cpu_has(c, X86_FEATURE_NODEID_MSR))
+ return;
+
/* fixup topology information only once for a core */
if (cpu_has(c, X86_FEATURE_AMD_DCM))
return;
- /* check for multi-node processor on boot cpu */
- t = read_pci_config(0, 24, 3, 0xe8);
- if (!(t & (1 << 29)))
+ rdmsrl(MSR_FAM10H_NODE_ID, value);
+
+ nodes = ((value >> 3) & 7) + 1;
+ if (nodes == 1)
return;
set_cpu_cap(c, X86_FEATURE_AMD_DCM);
+ cores_per_node = c->x86_max_cores / nodes;
- /* cores per node: each internal node has half the number of cores */
- cpn = c->x86_max_cores >> 1;
+ /* store NodeID, use llc_shared_map to store sibling info */
+ per_cpu(cpu_llc_id, cpu) = value & 7;
- /* even-numbered NB_id of this dual-node processor */
- n = c->phys_proc_id << 1;
-
- /*
- * determine internal node id and assign cores fifty-fifty to
- * each node of the dual-node processor
- */
- t = read_pci_config(0, 24 + n, 3, 0xe8);
- n = (t>>30) & 0x3;
- if (n == 0) {
- if (c->cpu_core_id < cpn)
- n_id = 0;
- else
- n_id = 1;
- } else {
- if (c->cpu_core_id < cpn)
- n_id = 1;
- else
- n_id = 0;
- }
-
- /* compute entire NodeID, use llc_shared_map to store sibling info */
- per_cpu(cpu_llc_id, cpu) = (c->phys_proc_id << 1) + n_id;
-
- /* fixup core id to be in range from 0 to cpn */
- c->cpu_core_id = c->cpu_core_id % cpn;
-#endif
+ /* fixup core id to be in range from 0 to (cores_per_node - 1) */
+ c->cpu_core_id = c->cpu_core_id % cores_per_node;
}
#endif
^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-12-17 1:01 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-15 12:44 [PATCH resend] x86, amd: Get multi-node CPU info from NodeId MSR instead of PCI config space Andreas Herrmann
2009-12-15 19:31 ` Ingo Molnar
2009-12-15 19:45 ` Borislav Petkov
2009-12-16 14:43 ` [PATCH v2] " Andreas Herrmann
2009-12-17 1:00 ` [tip:x86/urgent] " tip-bot for Andreas Herrmann
-- strict thread matches above, loose matches on Subject: below --
2009-12-15 20:00 [PATCH resend] " H. Peter Anvin
2009-12-15 20:46 ` Borislav Petkov
2009-12-15 19:51 H. Peter Anvin
2009-10-16 12:22 Andreas Herrmann
2009-10-27 9:33 ` [PATCH RESEND] " Andreas Herrmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox