From patchwork Wed Oct 7 03:48:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 527105 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 [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 423A8140D8B for ; Wed, 7 Oct 2015 14:59:24 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 27DE41A0BAB for ; Wed, 7 Oct 2015 14:59:24 +1100 (AEDT) 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-bn1on0134.outbound.protection.outlook.com [157.56.110.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id AECC91A00B7 for ; Wed, 7 Oct 2015 14:48:47 +1100 (AEDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Received: from snotra.am.freescale.net (192.88.168.49) by BY1PR03MB1483.namprd03.prod.outlook.com (10.162.210.141) with Microsoft SMTP Server (TLS) id 15.1.286.20; Wed, 7 Oct 2015 03:48:41 +0000 From: Scott Wood To: Subject: [PATCH v2 08/18] powerpc/e6500: kexec: Handle hardware threads Date: Tue, 6 Oct 2015 22:48:12 -0500 Message-ID: <1444189702-17241-9-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1444189702-17241-1-git-send-email-scottwood@freescale.com> References: <1444189702-17241-1-git-send-email-scottwood@freescale.com> MIME-Version: 1.0 X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: BLUPR08CA0034.namprd08.prod.outlook.com (10.141.200.14) To BY1PR03MB1483.namprd03.prod.outlook.com (25.162.210.141) X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1483; 2:k/8woEsvsT/L37eqqdnX1vDJrIyO+ruEsbLAtXKB+D/1b4hHa59aT2qC/PnZ6hJ2Df9CKvKvmhvF8Ljgo2yt4i0mDp2lmDeChF5sg3KC2xSx3bVMYoQfOielN2GorvI4ba9XxFIenovkRd18uH7PAEZY5USgQeaL6zdY2gcKPOk=; 3:Fnps6TaR3RbjCdx5/oW9iFVV+06EL2iNdQH3Jc2Mp4iesqQtDCiuMsFYjegcQFGqEeuwujma/lPxT+qwFjt8uUr4f6ul8IHVp32+M6N1VJ122IgkstPV87NMi07BqLyOkw9imjt3dWM5HdryF7bmoQ==; 25:AxcdvvPdB9C+p/gZi3seoyRY53D6DTFAyk7+8ZuUmRxmjCILhrkXF3z+V9MHM8EfxGiIx5/xFVWaEEiJnm1GKxxEdaFojWRyq6sM2sHDVJd87G1PReQgk0uDXTaiNMRJBae8PgRWyJgqJkE8QG58RiI1xPpGLvM90Mse0mr512cvxfIbl954xbhDchAQOpFT9H4nbEsY+7a7JbQKAy6eiVa+jdcPxtOukGzxZMTF4/zT81XINK8qPRYuH2GncNUP4yNAENOBJ8gRZzVpad1A3g== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1483; X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1483; 20:D9IyE83knYOQd3FkMXTjtSYw7p7qEf2+MJ0HBCUAr3z7ks+wurBs8gR8HpZcfwp4sOBfNRuakEUcjZNpNlq9IAsCOe1PkuIw+GDj+kR049f5je9524X1KHnzxEEZAtZGwOlpWmvYddY9sPCteufCvxrFZYY8kHTp+KwUyaVpt/WioeIH3LhAq1qBkCRgVP3J9dJqKF3rJQABYbI4Xh0XbIAZ+Fk7w3FUSCIEJ7vEx5zjhgHFy4p4EfX8g9+WPxjfKOVmIU8nAeDuGacDpfP9uy6tTxGYU2TNG2Gg4mYI9T4g/Pc/56qHE6OmTe/abFuUBo/VdXPDIkn7YKt0IzRa2hTLLyfwFJ2J6cIX6PrxcK5gr7BnTrN8oVbd4ZWQMHPjOj7mGec83GZv65Cz+KFPKuS/2V6u8iwQW/XIhaZHhAYThDaLAq9+JqUNZPoP1B8Y/odlXD0LtmCoW6HSc2ozKiP9xtbesfuOs5vFSGtEd0HcqM6/24tK2V8LTbbS/Zb7; 4:s29kzY/dvPrycvPTgyBMMHQg1n5gzlS3JTHsPiM1c8ejrX74aKLUvhRJLTdi43eMue+S7LYm7sYZ8Tba+47wcw8KPziIH6vcZ/gd5WaxpTtFbZeVqONltLudaXJk6zLFMfNmW3+Qk4uf6TCz7bcs7HHUI0COh4sCXS4/bt7sB5Wp5/a1A+AAKh84sj1lgjyCdFiADPmYW28r9rLacc5PkVZL7KNvqmU9c98RKXY/f2TGTzmh1tN4ekzESbR1+UNYPeNAU91VDWzkAsTDZFSH6QuWIVrsOoVicc44SGUxFyp1zXJPInr2YrKqQHozlCfqpz38YnORhha/O5pMsjYgNWj1R/mxy8BqO2iOEfD+MOA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001); SRVR:BY1PR03MB1483; BCL:0; PCL:0; RULEID:; SRVR:BY1PR03MB1483; X-Forefront-PRVS: 0722981D2A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(199003)(189002)(122386002)(19580395003)(5007970100001)(5003940100001)(189998001)(19580405001)(107886002)(105586002)(46102003)(106356001)(50466002)(77096005)(40100003)(2351001)(110136002)(575784001)(50986999)(64706001)(42186005)(87976001)(86362001)(5004730100002)(47776003)(5001960100002)(76176999)(229853001)(101416001)(50226001)(92566002)(5008740100001)(2950100001)(66066001)(33646002)(36756003)(81156007)(5001920100001)(97736004)(48376002)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY1PR03MB1483; H:snotra.am.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: freescale.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR03MB1483; 23:Ej2JgxsUGC73dDojgeMLxaBaTXH+xjQwPnb/RI9Gy?= =?us-ascii?Q?Qp4tiJHYGu5O1br/qZV2USFlJVvEQwA/ybIUNo+Kx0Buj5IVH9SY2XypHiiB?= =?us-ascii?Q?/gNg/0C3eigRRylqmvSxfTyFyQ9eEv5nUA95BbngCmcjkNtZPoVl8zlg9N0h?= =?us-ascii?Q?1i5ypi7oN8/RqAo2Lb5yshm4KDt7Xz4RWOh6vahhlYWziYbEGfPyIl8gER3l?= =?us-ascii?Q?J3xRutSlMfLesBVVoKOSdPWnHXMin2zeTdComMpZCc1mWA7JF3P9wkDEgzuw?= =?us-ascii?Q?wag3S2yejnAOowexqPG9WGqpqRe3PTc0v/cUwbaOaP8um2xS9crkvck0vMkF?= =?us-ascii?Q?MkbjGqwR7bECHsE6lXRN+0ftTeCwgLRY8hUU1su0aPFGtwoMKPw2QmqskY6F?= =?us-ascii?Q?hiCT6GUfhH1/eUQm8tfr+BmAndz8HpAW0W/qzhs3DVpsv7wduSHnfjfZk3p+?= =?us-ascii?Q?PU+3oQI1cqG+LhZ2d3CoHZ4FYjyKjMYRvrKa1C57uAknnEYiyAR8ccec9ptB?= =?us-ascii?Q?aRcmPuYqG1Xko2mna4HtxDinE3mjUi1uZGo5xu0GCb3ofkWhPrAtXAzvot9K?= =?us-ascii?Q?XGiEpHUL02uqDgmz453lOrTTYcXAM+CE4M4DJivWLe4XQtSdeat5C7sIyqWM?= =?us-ascii?Q?lAZW8Geqm8tP0tdOvWjJQjos4t6/VJri+RtpMKWG5ld/kywX8jC8FMmBWuBp?= =?us-ascii?Q?7b8bBiAIRswX4hwfdm5fypbgiHX9NlHZsuUbJiKnq+WOexbTNlB3JiZSRCPx?= =?us-ascii?Q?1aRdrfYe59Hb4BrX5LVpZY9TQu995pu31wASmS2k7nAzUOs2ZnG/NfFjS7wJ?= =?us-ascii?Q?G3q9/DxPg/NriejKKz/wMebD8ZjOHP9yY2zZJUIB0MKClFbl9WTt92nU4BM5?= =?us-ascii?Q?F2Wr7M8RIOPnkoe+JeUKM8bEUFuVFZ1jmCqCPGUAQd8OXf03U1jUnQuxRb0e?= =?us-ascii?Q?bv9MCTuCdO6BQZ7H8r1M0adm2UiCJKctAxbQCuHUhDP/YXfOXs2KdHURSp2S?= =?us-ascii?Q?I1qw23vMbHgZLFbVx49+cKKKQaNy4wGQfsqi34H1cPXUNt6U96QxhQTawtAV?= =?us-ascii?Q?76o3QGf57AErvcjJsf2UhK01/YcgrJfd/JEmkPc3rQeTqptOimyiPt5j/Cpw?= =?us-ascii?Q?cZ4u8KK338dQLDD7ZoImm5IXZ3j/WjZjt0nk82bQy9cwEEiS2Hu/w=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1483; 5:C685sb4I+0GS/4lMSodPq56Q6Kplq/vtovnOHGqA/voz4btlbWpEJibpqgfVPKp6IOqt1cSiFxhnY5Ze0amHh4TtHlnyMu4TCQk5DEO7MAexvYn40nWfeVm5eYR0NvJJN5Yr/LzXuLGWXoJOh8fCCw==; 24:cOmURchsP2RAJA98UawmHTJfPLWtPoBU4IaAL6i0XFMK8hHxCc7V+vvi9SVAFlKYtP2h030FCET3DIv/l3GVAgqVWicWKqT9b6j80uMq0AA=; 20:l1xPx954hnZ6PNwMwAKegEXkRXcjL0DqIsoTUOO9JafpQmDUeOtxhHbLIDwSq9uO6yh4qGbZvO73BFmDhHcS5g== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2015 03:48:41.6697 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR03MB1483 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 --- v2: minor cleanup arch/powerpc/kernel/head_64.S | 16 ++++++++++++++ arch/powerpc/platforms/85xx/smp.c | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 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..712764f 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c @@ -374,9 +374,55 @@ 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. + */ + disable_threadbit = 1; + disable_cpu = cpu_first_thread_sibling(cpu); + } 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