From patchwork Sat Jul 18 20:08:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 497405 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id DD4E0140B0E for ; Sun, 19 Jul 2015 06:18:34 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id BB3431A2A8C for ; Sun, 19 Jul 2015 06:18:34 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1on0130.outbound.protection.outlook.com [157.56.110.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id EB3A71A196A for ; Sun, 19 Jul 2015 06:09:29 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=none (message not signed) header.d=none; Received: from snotra.am.freescale.net (192.88.168.49) by CY1PR03MB1486.namprd03.prod.outlook.com (10.163.17.16) with Microsoft SMTP Server (TLS) id 15.1.213.14; Sat, 18 Jul 2015 20:09:21 +0000 From: Scott Wood To: Subject: [RFC PATCH 07/17] powerpc/e6500: kexec: Handle hardware threads Date: Sat, 18 Jul 2015 15:08:44 -0500 Message-ID: <1437250134-307-8-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1437250134-307-1-git-send-email-scottwood@freescale.com> References: <1437250134-307-1-git-send-email-scottwood@freescale.com> MIME-Version: 1.0 X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: BY2PR21CA0002.namprd21.prod.outlook.com (25.162.74.140) To CY1PR03MB1486.namprd03.prod.outlook.com (25.163.17.16) X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1486; 2:M1pTw/gZJn4Tkmvz3Qk7MCNDfIXc2QnDFoACzb75kafkGwQZDXRs1TxD+Gwr3Dzp; 3:MNf/QFTmiegs5+rQ3vLKpWAa2QRL7o7j1alfor9fKX1mkTnhe7getCxgHop9wY6Is2E0BpBqf4DhNxdR7ukwfdCcEOq4wUGTm3tuT7hC6PnHX/0GQonZ98MkAD130uTgrPOY0ddQq7Y+Nfp1Wwo2HA==; 25:08XG7V4jpJaxdd/2S1j0tIJGSGfzkT21qTXnQ8NWSMkehYeIJKFEfJGts1yFbqFJtJzWmrw3eelQbbFpJ4u9/rvTml/97vp+R/PtYD258gWA0mRppZF4v3lzNyiivdcyRdbKuDuRXQotf0JXSrSlcXhU60EdHpzb5x+mIfM7v19/a1RhTMzih6C4SsTxKJpjJpSw/dc13FEBnZOIQDbEniVeuSkaj9D2TVvUJZx4DYGfFYKPJiF01bQvCr6HamEVBdUjWKfgsSdf9xtdglrhFA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1486; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1486; 20:JmNCyPvrI+XWWKmJd8PjgMqMIeTyQDnFt72yZ5S1in6t1UT7+XZDxV0h719YjLjYYBGQQf99sn2xya9B5Z7Ny9jgIw8KkuxAhjk7tdyziJwpozV+f7A5k/LplP4hVeBLXDMpzSqW/xHsGifFr+c9jXtOf/ooae16oBpjpLv+XOkBhQTLiezqKA0sGJ5EhDnV7xfzhE97kG1U3kv4fprOPgBlIj9mppUEYph4iaazBVXDjZjbkgVrgWg3grvX5B02j5Dfw3M/jY1Uncwf5MCCqWHJOV1ypgkRsxjJzt5frhl/GriD4U+k0N/C6gH7xddJ8IR840p/NzYi5phuxggFWgUX2t1Qskt0UVhuKbDDvgda9kOEu7ORsjHHRSK7e3ZfoN/2Qsi2PZb/twtJDwuRbJGep51uOTx6uKnOz7GmWrwduunTdBWP04Gm44m4FEJyDqbaAMNJKv5OYvn67ogUlymThAnNWhWtvxQlFutbPxzX+cOSIOctdUc5k4n1Sc5n; 4:7TV7FKQ8nc1ESbSOprO7uM8QimQ0eHBje6BKspefaWqw+flL+I0/JSg/WuJyoX1RqS0xj173vkGnMwzFdxwmo9dhXJC9iNbiQWvsGbqWrEp/zQ77ZXh3vrWGMvJoJEtfHnwS6/U6Nq9yGFvCptsfRWHDjG3DF0MwnHes6AiRx5s+LhpiAXJTZTbxLjQDjZpMQwb1OmnItdCr0zIWaWomBpJ7t+bjZjgXkjyuBLz++W62jT31AoYH2P4w3fWljGhNlm9Tcdd4Quds9R/z5HA4Jas4s3iUCI8z9FB5nndZmS0= CY1PR03MB1486: X-MS-Exchange-Organization-RulesExecuted X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:CY1PR03MB1486; BCL:0; PCL:0; RULEID:; SRVR:CY1PR03MB1486; X-Forefront-PRVS: 0641678E68 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(19580395003)(50466002)(19580405001)(229853001)(36756003)(46102003)(2351001)(42186005)(40100003)(87976001)(122386002)(33646002)(575784001)(86362001)(62966003)(5001960100002)(5001920100001)(92566002)(2950100001)(110136002)(77096005)(107886002)(48376002)(77156002)(50986999)(76176999)(66066001)(47776003)(50226001)(5003940100001)(189998001)(217873001)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR03MB1486; H:snotra.am.freescale.net; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1486; 23:1OCKKnGfhjY1nGmwB9ug160HAUWnlM+pEGdwpsMnnPFalP1cIzWwU+IktHdBbfW/okJuoyM7EAFLUssdT8ShZUeobeh3mKkeCjcgnmyq0Cq9u9BA7p46nXFSL4WmqMAPc9fJegwtJ9Fp5TxwbpPcyNNi+hl/dsDbs0K0E6QnmcWz8i/cWh5/wYAR82pZgC2sGGEYl9U2DtQEnCLMBrgGo1Gi9QI+VkTRqmQrXIiLHXJ47o2adu87BoYFew3y+oOH3wJ0DL9vvgEYMtRCA80YAJ9mZjfQKQ8+GoEgto5/zx4dWiCMVdRQ/Fl+cmgMXlOdaIlqMthhB0MiGCgLlQL4BdAuakWV1L3cP8Sgv38lDQKBzXB7e4O+9M5AGRtCm2CaYas4KicFy4oPnvyC4OK1H6q4k6w4jiRpfLyTHEEdJWIgRycKT4Arb0GCpcYJzGuH7T0KeM+XXsCTfJ1MFVcUyTWOa2gr7f4lQfldPrrGAu0q9b5jafNVQU2GbHcHIRvapg1oJV1sPPUPrRHB35EEGl5H1Cmkn8If1mUeIREkayEYDP4z021UsOAdKfIJ2eMwoox4Lm7NbuJgpuujtHUeIyqFltKi4TS3HRnTglLUq+ySBiqYdpIlvPzlGXWWrJdv67hRgxLcsyo+LiFLy1zxDXfAIe0E52rewjLLBrhD0EA4SDrqMA6xGuxzMRAWmxA5M7ZAwcvJn1G5OW9Pv/W5nO52h5Pyj0Lv5x1ZuCdziGGgZEZZh0HkrnDT5iy5HamHHhKM+A9OfsGXrxB9tbfppen9dNjWl9o4WBp8Sm4AzO0auQKAVl7PbNjQnRrBWxqiXTfXDYwq/BAIbKPG0ckjcqLARkrNzTSp6ktnwQDFIQEVqHwV/v4VEg+HlzsgiLTprrVtlgAxVu9bfwbvd/6gUoWwt0oVC/HEFZY13lare2POL9SffEMYPHyiQrk39xTu X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1486; 5:kGT3kQ6mqlwN5meupT8+OIAU6iwGIR/hRwEV/jewLdkco3cBQ2eo0oAHrYgXffqpU5itzLAUwlGokA84u2XEgR3vxfr+jFOxmt71vHklJlxXHxCbBbhXTey2iS5gPf2VZZSxRPkD0LvErHIh4Aw23w==; 24:BAugnD3iKavIr91GSFFY4qRuS7bLdVux+tT46KJiSceM0WARQMQ6DfU3EmId8h0zLVk4WyIV/FmX4d04R61oyXwkqGd7c+iWMQowLyfz3vk=; 20:5ty7IHTxO6fOESbCYgo5vsTiQ+zevWCw1rdwt7ibEOwzCsC8qO6JKKFk/hHEc5DAIPc3VO8uph9kdWyVLx9x3Q== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jul 2015 20:09:21.4075 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1486 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Scott Wood , Tiejun Chen , kexec@lists.infradead.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" The new kernel will be expecting secondary threads to be disabled, not spinning. Signed-off-by: Scott Wood --- arch/powerpc/kernel/head_64.S | 16 +++++++++++++ arch/powerpc/platforms/85xx/smp.c | 48 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index d48125d..8b2bf0d 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -182,6 +182,8 @@ exception_marker: #ifdef CONFIG_PPC_BOOK3E _GLOBAL(fsl_secondary_thread_init) + mfspr r4,SPRN_BUCSR + /* Enable branch prediction */ lis r3,BUCSR_INIT@h ori r3,r3,BUCSR_INIT@l @@ -196,10 +198,24 @@ _GLOBAL(fsl_secondary_thread_init) * number. There are two threads per core, so shift everything * but the low bit right by two bits so that the cpu numbering is * continuous. + * + * If the old value of BUCSR is non-zero, this thread has run + * before. Thus, we assume we are coming from kexec or a similar + * scenario, and PIR is already set to the correct value. This + * is a bit of a hack, but there are limited opportunities for + * getting information into the thread and the alternatives + * seemed like they'd be overkill. We can't tell just by looking + * at the old PIR value which state it's in, since the same value + * could be valid for one thread out of reset and for a different + * thread in Linux. */ + mfspr r3, SPRN_PIR + cmpwi r4,0 + bne 1f rlwimi r3, r3, 30, 2, 30 mtspr SPRN_PIR, r3 +1: #endif _GLOBAL(generic_secondary_thread_init) diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index 2e46684..5152289 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c @@ -374,9 +374,57 @@ static void mpc85xx_smp_kexec_down(void *arg) #else void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary) { + int cpu = smp_processor_id(); + int sibling = cpu_last_thread_sibling(cpu); + bool notified = false; + int disable_cpu; + int disable_threadbit = 0; + long start = mftb(); + long now; + local_irq_disable(); hard_irq_disable(); mpic_teardown_this_cpu(secondary); + + if (cpu == crashing_cpu && cpu_thread_in_core(cpu) != 0) { + /* + * We enter the crash kernel on whatever cpu crashed, + * even if it's a secondary thread. If that's the case, + * disable the corresponding primary thread. + */ + int tir = cpu_thread_in_core(cpu) ^ 1; + + disable_threadbit = 1 << tir; + disable_cpu = cpu_first_thread_sibling(cpu) | tir; + } else if (sibling != crashing_cpu && + cpu_thread_in_core(cpu) == 0 && + cpu_thread_in_core(sibling) != 0) { + disable_threadbit = 2; + disable_cpu = sibling; + } + + if (disable_threadbit) { + while (paca[disable_cpu].kexec_state < KEXEC_STATE_REAL_MODE) { + barrier(); + now = mftb(); + if (!notified && now - start > 1000000) { + pr_info("%s/%d: waiting for cpu %d to enter KEXEC_STATE_REAL_MODE (%d)\n", + __func__, smp_processor_id(), + disable_cpu, + paca[disable_cpu].kexec_state); + notified = true; + } + } + + if (notified) { + pr_info("%s: cpu %d done waiting\n", + __func__, disable_cpu); + } + + mtspr(SPRN_TENC, disable_threadbit); + while (mfspr(SPRN_TENSR) & disable_threadbit) + cpu_relax(); + } } #endif