Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752505AbbFBU1C (ORCPT ); Tue, 2 Jun 2015 16:27:02 -0400 Received: from mail-bl2on0130.outbound.protection.outlook.com ([65.55.169.130]:46770 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751986AbbFBU0W (ORCPT ); Tue, 2 Jun 2015 16:26:22 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; alien8.de; dkim=none (message not signed) header.d=none; X-WSS-ID: 0NPC3FR-08-TLL-02 X-M-MSG: From: Aravind Gopalakrishnan To: , , CC: , , , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Borislav Petkov , Jacob Shin , Dave Hansen , Andy Lutomirski , "Paolo Bonzini" Subject: [PATCH V2 7/9] x86, amd: Factor out number of nodes calculation Date: Tue, 2 Jun 2015 15:36:00 -0500 Message-ID: <1433277362-10911-8-git-send-email-Aravind.Gopalakrishnan@amd.com> X-Mailer: git-send-email 2.4.0 In-Reply-To: <1433277362-10911-1-git-send-email-Aravind.Gopalakrishnan@amd.com> References: <1433277362-10911-1-git-send-email-Aravind.Gopalakrishnan@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD049;1:Npf75er8rG/8NMaklHVrYiyGu+Ggo548x+Bs0cnJ6WhKjSpoP8mIax/cfmpAfIJxb218Ef7q0GU4MyeHehfbql35TFfns/UbyrdrQJ2afRC8afpeLdsMKtiArdGPHenyjz+TOYNyHdcAvccfntatJ0hG/gjaC1HhAv02hSc8gSRw0td/NbyPxMNhnryKx445e+3CpL/b4W45aGla8ia87jT5tLhKfUFAnaqLfVsrte5SpyYUuRKf7inYYGC/lMk84cTdKcuIUaBSJz4u1ZpF+xw1YP8B9Or8XzqBtL4KetY= X-Forefront-Antispam-Report: CIP:165.204.84.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(428002)(199003)(189002)(2201001)(97736004)(50986999)(77156002)(62966003)(229853001)(76176999)(5001770100001)(19580395003)(46102003)(86362001)(64706001)(47776003)(19580405001)(87936001)(48376002)(50466002)(105586002)(53416004)(189998001)(106466001)(5001860100001)(50226001)(101416001)(5001830100001)(2950100001)(77096005)(68736005)(4001540100001)(92566002)(36756003);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR02MB1119;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1119; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(520003)(3002001);SRVR:CY1PR02MB1119;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1119; X-Forefront-PRVS: 05954A7C45 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2015 20:26:19.6937 (UTC) X-MS-Exchange-CrossTenant-Id: fde4dada-be84-483f-92cc-e026cbee8e96 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fde4dada-be84-483f-92cc-e026cbee8e96;Ip=[165.204.84.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR02MB1119 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4141 Lines: 141 Factoring out number of nodes calculation out of amd_get_topology() and saving the value in a static variable. A later patch will introduce a accessor for this value so we can use the information elsewhere in EDAC. The usage will be included in a future patch too. While at it, remove X86_HT #ifdefs around the code block for amd_get_topology() and it's caller amd_detect_cmp(). Since CONFIG_X86_HT defaults to Y, this code is always built-in. Besides, amd_get_topology() extracts necessary info from cpuid_[eax|ebx](0x8000001e) for platforms that are not 'HT' Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Borislav Petkov Cc: Jacob Shin Cc: Dave Hansen Cc: Andy Lutomirski Cc: Paolo Bonzini Signed-off-by: Aravind Gopalakrishnan --- arch/x86/kernel/cpu/amd.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 94e7051..c595669 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -19,6 +19,13 @@ #include "cpu.h" +/* + * nodes_per_processor: Specifies number of nodes per socket + * Refer Fam15h Models 00-0fh BKDG- + * CPUID Fn8000_001E_ECX Node Identifiers[10:8] + */ +static u32 nodes_per_processor = 1; + static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) { u32 gprs[8] = { 0 }; @@ -282,25 +289,40 @@ static int nearby_node(int apicid) } #endif +static void amd_set_num_nodes(void) +{ + if (cpu_has_topoext) { + u32 ecx; + + ecx = cpuid_ecx(0x8000001e); + nodes_per_processor = ((ecx >> 8) & 7) + 1; + } else if (static_cpu_has(X86_FEATURE_NODEID_MSR)) { + u64 value; + + rdmsrl(MSR_FAM10H_NODE_ID, value); + nodes_per_processor = ((value >> 3) & 7) + 1; + } +} + /* * Fixup core topology information for * (1) AMD multi-node processors * Assumption: Number of cores in each internal node is the same. * (2) AMD processors supporting compute units */ -#ifdef CONFIG_X86_HT static void amd_get_topology(struct cpuinfo_x86 *c) { - u32 nodes, cores_per_cu = 1; + u32 cores_per_cu = 1; u8 node_id; int cpu = smp_processor_id(); + amd_set_num_nodes(); + /* get information required for multi-node processors */ if (cpu_has_topoext) { u32 eax, ebx, ecx, edx; cpuid(0x8000001e, &eax, &ebx, &ecx, &edx); - nodes = ((ecx >> 8) & 7) + 1; node_id = ecx & 7; /* get compute unit information */ @@ -311,18 +333,17 @@ static void amd_get_topology(struct cpuinfo_x86 *c) u64 value; rdmsrl(MSR_FAM10H_NODE_ID, value); - nodes = ((value >> 3) & 7) + 1; node_id = value & 7; } else return; /* fixup multi-node processor information */ - if (nodes > 1) { + if (nodes_per_processor > 1) { u32 cores_per_node; u32 cus_per_node; set_cpu_cap(c, X86_FEATURE_AMD_DCM); - cores_per_node = c->x86_max_cores / nodes; + cores_per_node = c->x86_max_cores / nodes_per_processor; cus_per_node = cores_per_node / cores_per_cu; /* store NodeID, use llc_shared_map to store sibling info */ @@ -333,7 +354,6 @@ static void amd_get_topology(struct cpuinfo_x86 *c) c->compute_unit_id %= cus_per_node; } } -#endif /* * On a AMD dual core setup the lower bits of the APIC id distinguish the cores. @@ -341,7 +361,6 @@ static void amd_get_topology(struct cpuinfo_x86 *c) */ static void amd_detect_cmp(struct cpuinfo_x86 *c) { -#ifdef CONFIG_X86_HT unsigned bits; int cpu = smp_processor_id(); @@ -353,7 +372,6 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c) /* use socket ID also for last level cache */ per_cpu(cpu_llc_id, cpu) = c->phys_proc_id; amd_get_topology(c); -#endif } u16 amd_get_nb_id(int cpu) -- 2.4.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/