Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751872AbbH1BmZ (ORCPT ); Thu, 27 Aug 2015 21:42:25 -0400 Received: from mail-bn1bon0136.outbound.protection.outlook.com ([157.56.111.136]:35872 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751787AbbH1BmV (ORCPT ); Thu, 27 Aug 2015 21:42:21 -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;freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Date: Fri, 28 Aug 2015 09:42:29 +0800 From: Chenhui Zhao Subject: Re: [PATCH v2,5/5] PowerPC/mpc85xx: Add CPU hotplug support for E6500 To: Scott Wood CC: , , Message-ID: <1440726149.31670.2@remotesmtp.freescale.net> In-Reply-To: <20150826224213.GC10582@home.buserror.net> References: <1440590988-25594-1-git-send-email-chenhui.zhao@freescale.com> <1440590988-25594-5-git-send-email-chenhui.zhao@freescale.com> <20150826224213.GC10582@home.buserror.net> X-Mailer: geary/0.10.0 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD010;1:fnkKM6QEnKAwFT74xhPGNJhJEvqoD8lLWwoNFMDMojJ9HrzIZCFLe55iFt+DURTc3QFTZP4bJik27ZRmBF1kLlZmoKAEi7odjoRyiJg9TWYzIwx5X0rjxBi2aV8H3JKj2vW2C6GDqDxAamBoapGDob72Bse8cWIKuGHQEqQwLvwflRaoky8NqstfEQluSKoxjd6A7bzyY7FlEBbtCcIjUgmH93fvX9ciqxl/CqWvpaeOcG9g6QPxCwZzQzsBZIQWVL3JhLHHg6IV0f8rA9/Q4jdpmETDiaRAAyfisDQ5VEnkoqQeq20bmJ0Gd/bsVWyYwqsI+2+kv/gXhtJrA/+9SykqAaazKNq87bAEBt2YjJKRhay3wwBKmQUOcRbyMRoMi5Vsf+P12BuA7fi0XFd1Xw== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(339900001)(3050300001)(24454002)(377454003)(199003)(189002)(189998001)(64706001)(47776003)(110136002)(81156007)(4001540100001)(107886002)(5001960100002)(105606002)(106466001)(46102003)(50986999)(76176999)(5001860100001)(5001830100001)(97736004)(4001450100002)(23676002)(87936001)(69596002)(62966003)(77156002)(50226001)(104016003)(92566002)(68736005)(88526003)(5007970100001)(77096005)(6806004)(50466002)(19580395003)(86362001)(2950100001)(19580405001)(85426001)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BY1PR03MB1481;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1481;2:5M0L+yg+6YaELM07NTILt9CiMeYOX3/vCGUfLP8aW17opvzqJqV56ZcdxhhSlt0yDkiGRjqAJglr50wtSUV3ps1uMbJaGCaQD3/m0/bLHiQmUDnD4q3/wcd7lRWIlQqsxpw16UmKupQXXsI6Grx2umxtnf0EcPb0NLGqRmeni1U=;3:2dtcWUZXTGaeI7SDoPnB/xt6OxpUYuX+/JlJpFdsaj7NlZlgGbf2m1F5B7D2hfCocs+/TamPtJciumgmKPSfXd4MJbtk5VNmJkB13Emb+RrWhgYOcMBko8kB89hiO1vQcOYUkZRuhSIZ8U7RZutRkVk73G+VnBZ6Insu9iJ4ZUsO5ke8+1fYcVcUsu2IMDiUEqzuc6Nk9u2Yv9b/HvnvgeCfExXNWWqolxNGsYmZLR4=;25:5uC4k2USBVL9IFsW6qtB7Y0EaMjZ+ucK/0Kp9UYV61U7pazt2y3gnWkcdDHrcoFgWtxyRq5WaYwKzifd3E3kgB499GLpOpCYVdfVXa95cLvdurVpNVAInhb8gZCsq0nvE6F6WiGI2Hf82ZG45RcMIDtLKBDqZ+S3WJNoMG+MBTkLquRr1zQUbXxomxhs92Fc3lAjSdJaRZHa3VxHV6/9m/cfbP1wURx6PoP7aQNNDquQqOwcJiI4eJPWfOkciMYvoQ5TSqISKWvB+Q/b6govHg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1481; X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1481;20:4Zj/XHXSq8Whh2ifRQrZo/Cg6Q4cPvqT2E4xMvG3l6b+eEu82qAXlp6+v4mkDeGZF/Jwn9hsX73jhCvU20v9CaRqpqR9PqZXfwxG480RGh8Sl937JMF+8MSx7ahjk444c1uuktyAUwlTPFEJgop6La9JpGpz5KqLqQQGf8Y4wBA9ekK6vacWb9Og2/ac+dYPPxixNzyjai4wswh8tjN3xe4pbMmLGTdEDyFKZs5C6NT2GPW5CD87m9htSzw8lGhZpWoDpMc97lZjafVjjZIChujI50dYKXazfWScRNZWnGcx/CDN2yeavFwx/7jBWPXmiBR/jyZgmpqAPnSeuhh4+MZSF/xSSStV/ZSxdCwmNlQ=;4:/+8PEmT0akYZzqTuySQuY7Fr4Qq/n7xcbRjBGcGtM3XWaSAfoQn/09KLkP+Qvg7Z5CdvHbk0TkMbJK/nM9zQvhCrcC4Z1ydyg2AGfS+ydpEKHIQHQeiidQYWOHd5UZPD1MKhfl3yK9uDDeqbzY8mG0jhgVMM4RCUZQk++ZRsvgpSgWuiUG6ToUUL44x8geYYKBibxLQHPTgmo9kNwZH5uFhpK55WjgV262clWs6DDPgPmTamIagOhIhLPIp/xQ4znC/7yduRYZarT58+LvHeJC0KQBup3QKCTVp16Ql3fwDSTokMA1T8VEDIOAjv1Mtp X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(8121501046)(5005006)(3002001);SRVR:BY1PR03MB1481;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1481; X-Forefront-PRVS: 0682FC00E8 X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCWTFQUjAzTUIxNDgxOzIzOmtSeWJMcGptMkR5UXFkVFYzb2I4QkJRcGda?= =?utf-8?B?Z2h2QytTWFVwKy9QSEd0aXVrRi9mM2REYTBwbUo1UVhhdmlRZDlwMEtaK3F1?= =?utf-8?B?SVRLSDcyRUtRdmV3TldZRm9sTC81bTRqL1dhR0NlYlpFOTg1VFp1QTVaY3d0?= =?utf-8?B?VE9kYkl2L0dhcjAxUHYyc1hGRXNERms1NjlXYzFiM1RJOC9DMmRwajNRbUM5?= =?utf-8?B?Q0ozWVlHYjNVL3I1bXhuNUhwMDZFdStTakVrQUFpaUFSRG1rUlFIRXRaT1ZG?= =?utf-8?B?OTU5Q3Y1TFhwbmQ5bHNsT3VTcTFQWHlXcWdhUDNwcUdKODNBSldqbjR2bUxQ?= =?utf-8?B?RDFrUlNvUnNWWWxIZFc2clJRV3BHd2hKbkhlSVBHeGFjdEF0b3o1Qi9FYU5V?= =?utf-8?B?eGhNQ0pXUUI5dXBQVnNtZjBiRVZKUnAyWTZ4aGFCR1RETnFyTjhBRlp4akhi?= =?utf-8?B?TzdnVVhTNGNEdHBsbEUramtRL2pRSmdZKy9JZTVRNHp0TmRuSC9mTGg3cXVs?= =?utf-8?B?cUlnNS9tUXplbkNZTHJPbDZlTi81eUswSFpNdUxLRjhJQmtPTGJLMHhici9P?= =?utf-8?B?dUYybEcxSjNHQkxDUmlUdWs5TEE2UzcvNm5nUDJhK04vSGoxQ0Y3Y09JT2F3?= =?utf-8?B?L2M0MUcyaGc1U09Fc0dmYnJYTVF6QlVja1Rqd2t4ZVNDamlyWUtHdjNaTnVF?= =?utf-8?B?OVBzalNKcWJnQkFBVGtrR3JvaWxxNUh5QVBNaCt3VTZXeExxVGNwNm1XbXFk?= =?utf-8?B?MURjTHpTQkY3d2JXNTlEcmMweTZFODlKa01Ed0VESVBURFlaeXN0QmZITCt4?= =?utf-8?B?T3QrZzh6RUF6R1QyQnBjQmE5dkpWWUR6RGJHM3pEaWdLRytpQVNJcUhYOWRI?= =?utf-8?B?bHZGd0haalRKbFRjT3NWQllacGFWaDI4eHlzRWRUaWltR2pUU3IxcG1LYzJv?= =?utf-8?B?Wmszb2huUkxTT29rOUJySW1Ib2Rnc09hKzNkNGYweldaeFJhWm5oZTNKWlVX?= =?utf-8?B?dER6YmxzN2lFUUgyVG53U1d4bXBsMHVXUzVhY0s0NWxaaDk1WjNyZVhPNUIx?= =?utf-8?B?c0cxWHFpNkt2N2I5YlQrYTkzcVE4dVJUY1hRZWpYWXg1dWE2T1QvQjRaRk9V?= =?utf-8?B?YTV0OTJPbVVHTGROcFhWRnFUZlJrZHBMMXpObGNKdVJZU3diMkdycXh4UzZI?= =?utf-8?B?WHJlTzJqbTEzUVRXaDlXcE5uejdTWC9tdEtDVy82bEE4Q0ZuSUl0OGU3YjRB?= =?utf-8?B?RDZCOGtGOGRkeDFOdW1OZlhkWVJSYU83U2l2MlVJWTh6RC9oazM1V3RvM2E1?= =?utf-8?B?NDZyQUcyMy96M1dLRkhOV0hESDNGS0NqZlFVbExpZ21qc3NYS0pRUmFxaHov?= =?utf-8?B?N2xoKzgvTjJCR0dMdXlIYzdXa0FpbnAzMUU3VkZuU09SMmZ0N1FRaFo0Titw?= =?utf-8?B?Q0doRmM0RmpPRWtMUGdLLzJiYXRPMWU1UzFGKzBpNWhGemUzVFp2akF1QmI2?= =?utf-8?B?dlBnOHhqcHlmSFJKVmsvNG9WQ2ZNQkhVOFhFSmIrZzd3cEgxUXprajNBemVT?= =?utf-8?B?VUZNNEFOQ3NpS3p6N1NGVnFtd0phbkhhUlNzN0lROTNsZlpWNVVmb2p2enhh?= =?utf-8?B?Z24ybFpSMHA1WWNtclhpWXRjT0hnbVFKVFNIS09BRVFEdFAwVjd4VDNnPT0=?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR03MB1481;5:B9d6abykgu7fpM/UYBZ3uatn3xzcIqoK9gDKX7qjKCXM3OztJfryTNa8EhSpdVRrtmZP/sRWFfNbTTUZbyax31wLylLoifSDnOGY9vxbbiyCPMSY57ExCOWCwv0OBm0GndvT9HXM/bqKkiMQZ4On4g==;24:dpxrmEhR2oDpMUio8HTxPs7hokI/+UGxS778SNc83JGd79iAv12X8XreQrjp8f+3WFvp1JCGyqEXfgXsHYb6FdtuLyfKEF6yx7jHWsUJK4o=;20:0peRLoxTLnpOCNSG/0BxGjvu7KiQpsww6ikinM4uiF17rK9q+nWjdKI2NJsHmEGuL/8iWc2B492bQJ7kIukZEQ== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Aug 2015 01:42:18.0072 (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: BY1PR03MB1481 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6731 Lines: 238 On Thu, Aug 27, 2015 at 6:42 AM, Scott Wood wrote: > On Wed, Aug 26, 2015 at 08:09:48PM +0800, Chenhui Zhao wrote: >> + .globl booting_thread_hwid >> +booting_thread_hwid: >> + .long INVALID_THREAD_HWID >> + .align 3 > > The commit message goes into no detail about the changes you're > making to > thread handling, nor are there relevant comments. OK. Will add some comments. > >> +/* >> + * r3 = the thread physical id >> + */ >> +_GLOBAL(book3e_stop_thread) >> + li r4, 1 >> + sld r4, r4, r3 >> + mtspr SPRN_TENC, r4 >> + isync >> + blr > > Why did the C code not have an isync, if it's required here? Just make sure "mtspr" has completed before the routine returns. > > >> _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 > > I assume the reason for this is that, unlike the kexec case, the cpu > has > been reset so PIR has been reset? Don't make me guess -- document. We can not rely on the value saved in SPRN_PIR. Every time running fsl_secondary_thread_init, SPRN_PIR may not always has a reset value. Using booting_thread_hwid to ensure SPRN_PIR has a correct value. > > >> @@ -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. >> + */ > > What ensures that only thread 0 runs this? Especially if we're > entering > via kdump on thread 1? This piece of code will be executed only when core resets (Thead0 will start first). Thead1 will run fsl_secondary_thread_init() to start. How can kdump run this on Thread1? I know little about kexec. > > > s/the piece/this piece/ > >> + LOAD_REG_ADDR(r3, booting_thread_hwid) >> + lwz r4, 0(r3) >> + cmpwi r4, INVALID_THREAD_HWID >> + beq 20f >> + cmpw r4, r24 >> + beq 20f > > Do all cores get released from the spin table before the first thread > gets kicked? Yes. > > >> + >> + /* 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); > > What does setting booting_thread_hwid to INVALID_THREAD_HWID here > accomplish? If threads_per_core != 2 it would never have been set to > anything else, and if threads_per_core == 2 you immediately overwrite > it. booting_thread_hwid is valid only for the case that one core has two threads (e6500). For e5500 and e500mc, one core one thread, "booting_thread_hwid" is invalid. "booting_thread_hwid" will determine starting which thread in generic_secondary_smp_init(). > >> + 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); > > cpu_up_prepare does rcpm_v2_cpu_exit_state(cpu, E500_PM_PH20). How do > you know the cpu is already in PH20? What if this is initial boot? > Are > you relying on it being a no-op in that case? Yes, if the cpu is in PH20, it will exit; if not, cpu_up_prepare() is equal to a no-op. > > >> + >> + 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 */ > > s/star/start/ > >> + } else if (threads_per_core > 2) { >> + pr_err("Do not support more than 2 threads per CPU."); > > WARN_ONCE(1, "More than 2 threads per core not supported: %d\n", > threads_per_core); > > -Scott OK -Chenhui -- 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/