Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756912AbbHZMKH (ORCPT ); Wed, 26 Aug 2015 08:10:07 -0400 Received: from mail-bn1on0133.outbound.protection.outlook.com ([157.56.110.133]:6816 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756879AbbHZMJ7 (ORCPT ); Wed, 26 Aug 2015 08:09:59 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; From: Chenhui Zhao To: , CC: , Subject: [PATCH v2,5/5] PowerPC/mpc85xx: Add CPU hotplug support for E6500 Date: Wed, 26 Aug 2015 20:09:48 +0800 Message-ID: <1440590988-25594-5-git-send-email-chenhui.zhao@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1440590988-25594-1-git-send-email-chenhui.zhao@freescale.com> References: <1440590988-25594-1-git-send-email-chenhui.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD056;1:HPJ/EXzOROOmps2jvdoAeL8OjmwM2XyXANboNIHIapJykH78RMNsccRJvQi06bG7RrvJJ21mRlrSKeLU0KMD8+uL7S9b454GzV7AktN950SzaGvKwvOb3QkEitLZC8bvHBpaakLlbYpedRnpHQj7reuHR//y6/Cy1oPcqSuATMYSZtoTCkPAuahF8GIUPFnMJ4LHmJ5+XvuK9svu+YYjcPzOL8cOoJSknghrHpBrv1/NrQMoLBp3FLSamw4H6lgNJDgHly9jTnH033D9j3+oZfeSQPiZqyXzkUhAJUqPG522bUz+KqrcSrmpzJjbH3zUyM5hGN2dkZSEDsc06VK2dQ4FPbIj1pyq20bcANwfLUCYObSfbEAO5RQwnktA2nrhG++LsD5lzDr9mtg6ENvadYuJy8yDB4svGm6k1UaQEYI= X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(3050300001)(339900001)(199003)(189002)(107886002)(575784001)(50226001)(85426001)(2950100001)(50986999)(189998001)(5001860100001)(4001450100002)(5003940100001)(5001830100001)(97736004)(5001960100002)(50466002)(48376002)(5001770100001)(5007970100001)(69596002)(46102003)(76176999)(86362001)(36756003)(49486002)(19580395003)(33646002)(104016003)(106466001)(64706001)(105606002)(4001540100001)(87936001)(47776003)(68736005)(77156002)(229853001)(62966003)(6806004)(92566002)(81156007)(19580405001)(77096005)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BN3PR0301MB1284;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB1284;2:U7MG0gsxCQJqtzlmCQnGhyf4rbPRxKiCOxgqn7TJ/yWs1ADdnd3XIPhUMIxcabLztb343NfbmKsjdUSHYFmy8WrrG0wuORm8KD+oATACwHE0ZGmk/u8XiKlAT4TxuHmTmwSYa0/aBxE1CJ3JURlWBpvG3lhs9tU/hB27gnnGKZE=;3:7Ufwc4TAIfoCCHYYVMXFClzQy/Q/awtaQYIvPUXjVkg9U1sYlHMoTGQJ+DQhyR6YIW9vwWMyozASfrNgVMfFIsjFMtd4AP8jVMoJ6PMpSfGt5R/DWxSYIWmmkoxXN+WTomRizNo25ecbcT4G7l1//HdUBR089WCQJsQQKC7dY+SABvuZ0E/BfGdQwqfyhblrVHyYlUXtvcrQ3vLnkWBQZa6eNLwf7qLoiR6ydkbHV2I=;25:bv9ClP7vrqWHG+rltfPE4UEhXFuR6TCnWwT/mcyjxku3Rbn43/p7Fcg8R373ZHibnVeZxbN73gQSOSMv6WC+EBHtwRVRQBi2Ll1x9FPBv6LFLEtbr7G4yVKq8dr/SgKKUQSshjkTHXJ7CYtSaaM1RuCqXXdblRNlD7XtSmMxumXO7QW8ApAeim0AP3VnQUyaxJXEqUh90qS3OdpvFihFZ0nUY39pIu0IAQzkw2TiV+xNztTD1E1xqoUnu+g/Y+j2 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN3PR0301MB1284; X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB1284;20:dKN8eBiapbG2z3GqnfRIR+mPQz0UeAgSLHzbs8xvvh/wPjNOxW5CPZSJCu6QEgzkRiDOIM4fW//guVf9e0eCCZt1eWG9E+dCMTKBs97rz3q2yTeqnTAsyA69BYDSnwHr0eQpeST9UdmqQbDeRGqbO7AN4guf0RSWBBbGBWbqq4VfhDH6i0nojinB+2+HMrGFFDCAwd5RhT+Hi21X2NhZNbuCP4qCa8AzQbabusBMCfFeesAZWg0ZCqlIriPCp5vkarxuBy9LTJGj1moRbjTud1yuaZibmZZHz0niDytPczspQ+C59GmKxJFxXoh7pV/jJNT9GqaweuERSFYx4u3Wa+qI/NIyVT56hqlBbd0zKos=;4:UWMXS+iJ+Lc9RPIkcvXZzl95xGUmln41LSWE/7z/WqzubP9Q6hdMmBEirblHdPNw/GLq7OQbe+wXuSgPzrTG0XyUoFNJZmXNSuyOsrrE3+bVR8V5Jz+EjiJWy/fq9B0tjm7YmI964qz46xKPpMCNp6Z8oar3tNzW40N5zeRSfb/Z5cbbEJkjpBaeov/E0V11mJRCgmZJlBxa/iBjdJEjdf/lw7QpQDLxe8KCR8UOeCKEs+97oXDxeN40DNuG5ewl9dIsOdq+EnGf6Z/TDOwIiY8S14IJa8neJHt7cF8Km/h0YheeZq8VvxoE+yOV6q8E X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(8121501046)(3002001);SRVR:BN3PR0301MB1284;BCL:0;PCL:0;RULEID:;SRVR:BN3PR0301MB1284; X-Forefront-PRVS: 0680FADD48 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN3PR0301MB1284;23:ukjrh1buwOGYBeFI444E6BgB4a02HhoMPfpeEHq?= =?us-ascii?Q?ASdFyShHpir7JyHIVIaZZJvkkKs36i+jeQcDwpKsJ0ORV113RtBPSKxfGTfZ?= =?us-ascii?Q?Y0SpjzQk828swAM5Imf0L5U0YVOKGDcRY+1fPeOmnMpkl3t9+jBJbNTlvyBT?= =?us-ascii?Q?y056EqrVc+3Xg6QPcPn+tykyXQsUimTXR2ldEauVkElYtSmsOWsVr3i8Qf4Y?= =?us-ascii?Q?YMIbF66UwavTWnFfJ6OunetGZreOQomjCrfkJhzNHWHtMZg5JlNmz1pVtXxp?= =?us-ascii?Q?7NB23GZBEsgo/8snN96BInIzSHlYqq6UDF+ELqkSWiRh5yTUH3mZnzIohPwV?= =?us-ascii?Q?Y5qtT58svhjQ6owr8ht4j29ipry/br5zuJLkkDVPyqv1yJvqPpdQY4jwnxrQ?= =?us-ascii?Q?HR9Xfs7osz33VPdITPDTcOu5Tx1jbH8/CGxtfDCGHOiWtwdWhvR3oPjHdchY?= =?us-ascii?Q?zbKWSXarr4vXD3v5S+EePQjT0BaiNeCxvlGq8jyD1wumnUOKhu2A24Ghzr0X?= =?us-ascii?Q?VG39uI5V+QsDpy5quzKekvq5dl89H2Pvki/j5h3znYWsshk1YoKNM9WA/urf?= =?us-ascii?Q?UntbmO2/oYQu7ySe4b16fhNAvfn36bGHqNDxFZgGy81xbpg0rkugA0eNePdl?= =?us-ascii?Q?BipHwwYcWUFezIIGEnTI4YUQpxB47zc6bfOAobBnIVhGhxhwwu2UsD7GdWSv?= =?us-ascii?Q?Ct26GgxYBU8h1ZXYmhzMSPW4GUboYBojOBoikx4YHkfMvrctSFoBrlJKKEIK?= =?us-ascii?Q?G2hZ8huS1Js1A/ZhwkaLpE5/dLQWrckfKT6WwjyvM1bOxUvrENrDZ9vuQiRd?= =?us-ascii?Q?UqSQYnn453MKaUy/ctTBopgIrEHxEWojFylaphSvmpFVhFIEnkkkNWAZGTJz?= =?us-ascii?Q?Ss2hr3cQBOLrInM/Qv066w5CgNOtxYvjp5WJjhlJiD86XfAZQh6aX2xeUGLR?= =?us-ascii?Q?jtzRisJBp0pQKB6uGL/Nd1//y9Jh1KUYX/2YHbbFjEvtJ5ObFDJho/txPpSA?= =?us-ascii?Q?eSUXWfFQD9w+grP1A1QfBhJdN6ZDKmKszGes8bp21Qg8y/bZYYP4F5QxvY59?= =?us-ascii?Q?xTPTXCdCBhTQj+SGPJNqcg8+C9P969D/yVuk+Y3n7NJE/djISbDz8NEBeEPd?= =?us-ascii?Q?8a9oYwY22f1DjlD/W6Y6e1c1Eel09uou4MjO0uifDJwYyxZ9xGeUdUBpIjQD?= =?us-ascii?Q?TF0mT4MWo8dIzcvMg/TDVxDHtUa7QMr9x9JQ6YlnA4JkndF0tN6YANYXDQzh?= =?us-ascii?Q?fd199TJ3yYRRDuFhavmSYV92O95wsmA9yc3Vp0Hjz4vvvRoj6LM2f2vMnVJG?= =?us-ascii?Q?PTApQU2nRRYulLXcQIzBBiJA=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN3PR0301MB1284;5:uG8B75HnvpVbswNilKKzuNz0/75S6W/EWiY+wuGiboLlQKXRRENXJb+U/A2k3j7An15huUm2ajY51wegTsLKpUCxPGXibrNfaCc5JwU6CyRQ3tjI22k8b6iUkG6C4Pr/aeZOxkb3y8mh2In5YVcHCA==;24:l1BgWH5BrDRQ3fZyonkdkIaRxr2wt/oDcTxyrII3YWzAL+m4RUmHsAn2TKf/9+8y4swhGrFxaow0U5J07S5Nkgtwggb7NTC7UpwoqhF90jg=;20:sphmCsc11y0/5aEjieTSMj41KB1XhU/fctCgw4M6YOeDYU2/yj8IO6IjUhDVU83x4F/dMZSivrL3hyMW+2oXoA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Aug 2015 12:09:56.2252 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR0301MB1284 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7340 Lines: 269 Support Freescale E6500 core-based platforms, like t4240. Support disabling/enabling individual CPU thread dynamically. Signed-off-by: Chenhui Zhao --- major changes for v2: * start Thread1 by Thread0 when we want to boot Thread1 only replacing the method of changing cpu physical id arch/powerpc/include/asm/cputhreads.h | 9 +++++ arch/powerpc/include/asm/smp.h | 1 + arch/powerpc/kernel/head_64.S | 69 ++++++++++++++++++++++++++++++++++- arch/powerpc/platforms/85xx/smp.c | 53 ++++++++++++++------------- arch/powerpc/sysdev/fsl_rcpm.c | 2 +- 5 files changed, 106 insertions(+), 28 deletions(-) diff --git a/arch/powerpc/include/asm/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h index ba42e46..9920f61 100644 --- a/arch/powerpc/include/asm/cputhreads.h +++ b/arch/powerpc/include/asm/cputhreads.h @@ -1,6 +1,7 @@ #ifndef _ASM_POWERPC_CPUTHREADS_H #define _ASM_POWERPC_CPUTHREADS_H +#ifndef __ASSEMBLY__ #include /* @@ -95,6 +96,14 @@ static inline int cpu_last_thread_sibling(int cpu) } +#ifdef CONFIG_PPC_BOOK3E +void book3e_start_thread(int thread, unsigned long addr); +void book3e_stop_thread(int thread); +#endif + +#endif /* __ASSEMBLY__ */ + +#define INVALID_THREAD_HWID 0x0fff #endif /* _ASM_POWERPC_CPUTHREADS_H */ diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 4ff5b71..a1faa4c 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h @@ -200,6 +200,7 @@ extern void generic_secondary_thread_init(void); extern unsigned long __secondary_hold_spinloop; extern unsigned long __secondary_hold_acknowledge; extern char __secondary_hold; +extern unsigned int booting_thread_hwid; extern void __early_start(void); #endif /* __ASSEMBLY__ */ diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index d48125d..6df2aa4 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -40,6 +40,7 @@ #include #include #include +#include /* The physical memory is laid out such that the secondary processor * spin code sits at 0x0000...0x00ff. On server, the vectors follow @@ -181,6 +182,44 @@ exception_marker: #endif #ifdef CONFIG_PPC_BOOK3E + .globl booting_thread_hwid +booting_thread_hwid: + .long INVALID_THREAD_HWID + .align 3 +/* + * start threads in the same cpu + * input parameters: + * r3 = the thread physical id + * r4 = the entry point where thread starts + */ +_GLOBAL(book3e_start_thread) + LOAD_REG_IMMEDIATE(r5, MSR_KERNEL) + cmpi 0, r3, 0 + bne 10f + mttmr TMRN_IMSR0, r5 + mttmr TMRN_INIA0, r4 + b 11f +10: + mttmr TMRN_IMSR1, r5 + mttmr TMRN_INIA1, r4 +11: + isync + li r6, 1 + sld r6, r6, r3 + mtspr SPRN_TENS, r6 + isync + blr + +/* + * r3 = the thread physical id + */ +_GLOBAL(book3e_stop_thread) + li r4, 1 + sld r4, r4, r3 + mtspr SPRN_TENC, r4 + isync + blr + _GLOBAL(fsl_secondary_thread_init) /* Enable branch prediction */ lis r3,BUCSR_INIT@h @@ -197,8 +236,10 @@ _GLOBAL(fsl_secondary_thread_init) * but the low bit right by two bits so that the cpu numbering is * continuous. */ - mfspr r3, SPRN_PIR - rlwimi r3, r3, 30, 2, 30 + bl 10f +10: mflr r5 + addi r5,r5,(booting_thread_hwid - 10b) + lwz r3,0(r5) mtspr SPRN_PIR, r3 #endif @@ -245,6 +286,30 @@ _GLOBAL(generic_secondary_smp_init) mr r3,r24 mr r4,r25 bl book3e_secondary_core_init + +/* + * If we want to boot Thread1, start Thread1 and stop Thread0. + * Note that only Thread0 will run the piece of code. + */ + LOAD_REG_ADDR(r3, booting_thread_hwid) + lwz r4, 0(r3) + cmpwi r4, INVALID_THREAD_HWID + beq 20f + cmpw r4, r24 + beq 20f + + /* start Thread1 */ + LOAD_REG_ADDR(r5, fsl_secondary_thread_init) + ld r4, 0(r5) + li r3, 1 + bl book3e_start_thread + + /* stop Thread0 */ + li r3, 0 + bl book3e_stop_thread +10: + b 10b +20: #endif generic_secondary_common_init: diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index 73eb994..61f68ad 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c @@ -181,17 +181,11 @@ static inline u32 read_spin_table_addr_l(void *spin_table) static void wake_hw_thread(void *info) { void fsl_secondary_thread_init(void); - unsigned long imsr1, inia1; - int nr = *(const int *)info; + unsigned long inia; + int hw_cpu = get_hard_smp_processor_id(*(const int *)info); - imsr1 = MSR_KERNEL; - inia1 = *(unsigned long *)fsl_secondary_thread_init; - - mttmr(TMRN_IMSR1, imsr1); - mttmr(TMRN_INIA1, inia1); - mtspr(SPRN_TENS, TEN_THREAD(1)); - - smp_generic_kick_cpu(nr); + inia = *(unsigned long *)fsl_secondary_thread_init; + book3e_start_thread(cpu_thread_in_core(hw_cpu), inia); } #endif @@ -279,7 +273,6 @@ static int smp_85xx_kick_cpu(int nr) int ret = 0; #ifdef CONFIG_PPC64 int primary = nr; - int primary_hw = get_hard_smp_processor_id(primary); #endif WARN_ON(nr < 0 || nr >= num_possible_cpus()); @@ -287,33 +280,43 @@ static int smp_85xx_kick_cpu(int nr) pr_debug("kick CPU #%d\n", nr); #ifdef CONFIG_PPC64 + booting_thread_hwid = INVALID_THREAD_HWID; /* Threads don't use the spin table */ - if (cpu_thread_in_core(nr) != 0) { - int primary = cpu_first_thread_sibling(nr); + if (threads_per_core == 2) { + booting_thread_hwid = get_hard_smp_processor_id(nr); + primary = cpu_first_thread_sibling(nr); if (WARN_ON_ONCE(!cpu_has_feature(CPU_FTR_SMT))) return -ENOENT; - if (cpu_thread_in_core(nr) != 1) { - pr_err("%s: cpu %d: invalid hw thread %d\n", - __func__, nr, cpu_thread_in_core(nr)); - return -ENOENT; - } - - if (!cpu_online(primary)) { - pr_err("%s: cpu %d: primary %d not online\n", - __func__, nr, primary); - return -ENOENT; + /* + * If either one of threads in the same core is online, + * use the online one to start the other. + */ + if (qoriq_pm_ops) + qoriq_pm_ops->cpu_up_prepare(nr); + + if (cpu_online(primary)) { + smp_call_function_single(primary, + wake_hw_thread, &nr, 1); + goto done; + } else if (cpu_online(primary + 1)) { + smp_call_function_single(primary + 1, + wake_hw_thread, &nr, 1); + goto done; } - smp_call_function_single(primary, wake_hw_thread, &nr, 0); - return 0; + /* If both threads are offline, continue to star primary cpu */ + } else if (threads_per_core > 2) { + pr_err("Do not support more than 2 threads per CPU."); + return -EINVAL; } ret = smp_85xx_start_cpu(primary); if (ret) return ret; +done: paca[nr].cpu_start = 1; generic_set_cpu_up(nr); diff --git a/arch/powerpc/sysdev/fsl_rcpm.c b/arch/powerpc/sysdev/fsl_rcpm.c index ed59881..f52d02a 100644 --- a/arch/powerpc/sysdev/fsl_rcpm.c +++ b/arch/powerpc/sysdev/fsl_rcpm.c @@ -140,7 +140,7 @@ static void qoriq_disable_thread(int cpu) int hw_cpu = get_hard_smp_processor_id(cpu); int thread = cpu_thread_in_core(hw_cpu); - mtspr(SPRN_TENC, TEN_THREAD(thread)); + book3e_stop_thread(thread); } #endif -- 1.9.1 -- 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/