From patchwork Fri Nov 20 09:14:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: chenhui zhao X-Patchwork-Id: 546857 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 6A1541402C6 for ; Fri, 20 Nov 2015 20:34:16 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 4F6901A1A4E for ; Fri, 20 Nov 2015 20:34:16 +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-bn1bon0145.outbound.protection.outlook.com [157.56.111.145]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id D638C1A032F for ; Fri, 20 Nov 2015 20:29:23 +1100 (AEDT) Received: from DM2PR03CA0034.namprd03.prod.outlook.com (10.141.96.33) by CY1PR0301MB1548.namprd03.prod.outlook.com (10.162.165.158) with Microsoft SMTP Server (TLS) id 15.1.331.20; Fri, 20 Nov 2015 09:13:39 +0000 Received: from BY2FFO11OLC004.protection.gbl (2a01:111:f400:7c0c::120) by DM2PR03CA0034.outlook.office365.com (2a01:111:e400:2428::33) with Microsoft SMTP Server (TLS) id 15.1.331.20 via Frontend Transport; Fri, 20 Nov 2015 09:13:39 +0000 Authentication-Results: spf=permerror (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; Received-SPF: PermError (protection.outlook.com: domain of freescale.com used an invalid SPF mechanism) Received: from az84smr01.freescale.net (192.88.158.2) by BY2FFO11OLC004.mail.protection.outlook.com (10.1.15.184) with Microsoft SMTP Server (TLS) id 15.1.331.11 via Frontend Transport; Fri, 20 Nov 2015 09:13:39 +0000 Received: from localhost.localdomain ([10.193.20.174]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id tAK9DUPc015178; Fri, 20 Nov 2015 02:13:37 -0700 From: Chenhui Zhao To: Subject: [PATCH v3 4/6] powerpc/mpc85xx: refactor the PM operations Date: Fri, 20 Nov 2015 17:14:00 +0800 Message-ID: <1448010842-22345-4-git-send-email-chenhui.zhao@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1448010842-22345-1-git-send-email-chenhui.zhao@freescale.com> References: <1448010842-22345-1-git-send-email-chenhui.zhao@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC004; 1:henv7x0lUMXkhCWHk90wKzVwo/uBXVKSjXDvtbLwyME63f7NgqRRZsJq4i7+605kcLxCt0TwUoeYDy0BzxnxN/sC81YBKXPsLLiGwNVBWGeqV0FJ+GHEnLK40AgZ6PHcDPzEMBRUwfmEqedz+ogR9nIQl9wTDgDWiQtou+oId+zn30O2cWv9+HghFEBHmANYsKtVLu6V4wN7H2uu4z1SElrKEQBOdUJTl1G5H6u0fFUsheGXlG2J6Z08ZERbLGO4cLMynUqw0YQuRoPNz84yB5FLNZRRLQHrOap9JaprWF3gX14RunZ7V4QhGrepXWCcGhkltLJYqGiXfC8HsbuCmo3M4d2YZu5fj8yfRGCqjz66jCAIWF3KSxJCADWaDZJa2RTTUlNyMUVqNS/sAPlKUUj996nuemECjUYsTCtobAI= X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(448002)(199003)(189002)(97736004)(6806005)(50226001)(2351001)(19580405001)(5003940100001)(450100001)(19580395003)(92566002)(104016004)(106466001)(33646002)(5008740100001)(69596002)(4001430100002)(2950100001)(5007970100001)(49486002)(86362001)(76176999)(229853001)(85326001)(87936001)(5001920100001)(81156007)(36756003)(11100500001)(77096005)(50986999)(586003)(189998001)(5001960100002)(110136002)(50466002)(48376002)(107886002)(47776003)(2004002); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR0301MB1548; H:az84smr01.freescale.net; FPR:; SPF:PermError; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1548; 2:4KiLhuxC3kO1q1Y1sOt2dA/ndE299ug7cld29Rkvk8jIzEuvj35+vDS1F3pBR4kzc1UO0HxIEkVRy7wQmG9BgUUmwOVwtsT3fvsQL0ZIFq53cFkq2Ga6IgG54HaoZWpL/xrPvAzIsVwso6GuXks2yw==; 3:ldc78xYPnRWoKSYiSbJMrkWPPjz2s0Ui+OvkP7n+xZMRHODRs/esJWszmv45+Ofxs/1fn55LAHfag3b0c36XN9P0zIl1SmnghbufiTPtn3cFH4VcJDsDYbsGoRDtVJYoCxHgf6ZDnPPC0CQxsgx1RoVJFRMaGyX0XfQM+dplwpJVhEuruq/arUPJPMHtoDpP3YniNu6B4Xlonpu9b5mLdb5G9yPcMtstrATxlJVCzcs=; 25:2ba15qlvBGayDOktDKW1oud6Rpp/SNxdrHLjTRxP25aUFR0BiZIKvK3UyBaA7sfHrmzMmAGewMF+wJ8Q1uSQqypN8ClWj9ki/zBa/EbzCTOlhqPBZahHRN+YfhnUwNwVUVEgk0p5LiAcqmUbknR87XAOstwcS2B1E6KlAzEJM0LPa/n/uvXtl5tfA5zHqUwyxVS/sSgFkHup1B9fMCYr+HV0tffSlmj7KWv2koGx3mb75DjbfGXYpsGuKH51LURqivmchlL8nen2z5pCM8FhEg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1548; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1548; 20:yx3ptf3IgqIc0MFmkxw+44zDODYl7bAxREaqU8TCKJGbQHmyqax78PNL3jrD9yXP8vfVnbaD7NB/ejwDSqflLA4g5FAyFrluuA8LLBZs4ObBOTFocYsGRonvKv4N4aEzi1NdFatbjJA7/kUBZJ8TuRWlolxTu18fb4PVx5eUE+vbDzseWSfLKe0VSPHLnLDXrxGIXuoYnkoA/35BW0lwsgU9zg/sI2weheD+MMh7LQoaLo9HUf91aYacWGmxVZPWIUucwnn8yyYuWlP9T7vw+Z+QTXnNDdxqbEGPLBuFoL3QtFcNWwYbk1UFBmMNnID02lXSV820NcwFaJbHolhDfeKdKy/KQVGgJRDlvhvmTKU=; 4:lt0WEuVK/AQj1IdKCQuCzRx5IpslMIOmNQPQW09que54om++aVXctJu4Qu7nv/J27HgbUTtbtbpmLLLsukN2+w+y4nBi+M4n5T+q9qxyCO9zmmKuWbSxpX8djOojrNJeRUb8lqmzPK3COOeKlqkC0zRAwpvOp6RNt1XNM5IUQw0MmSY/wjy3yYPhDFW9QtS8HNA10risvfla7/dbafEy+50vi4C3J+Y05utxrNkg4/3FTDUDJexGoyl4N1pmXxTuokQj/MpWLzkarky2cSZA7L+pNvWFxEGQG9SWrlgzV+eEmcPA7/UVVda1RxS6AkhFX7wZ4y37lxjrcSf0Dje5hfpy2qPHcbebVSoa0rZRMgUXrYO9djyMBia0F11PmFevFjvq9uFjeV7/0aagRmZkoQtPCJ+ZmP47UIq1AAhKpW1J53F0QxXb3iTbgEqYA0t8 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(10201501046)(3002001); SRVR:CY1PR0301MB1548; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0301MB1548; X-Forefront-PRVS: 07665BE9D1 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB1548; 23:1xj+CHMmOtv6bqdlK0KewxySN3pNUxoqZrh//h8?= =?us-ascii?Q?5FpAAs35YJP5aQzjJpRAbWmNGzetqrHsh8M4HDoAWrzyBL8IqJGTCf2a5iS9?= =?us-ascii?Q?gsx0KdtxbJFk499EzbK54GaFQ/LA5Oc0J/fylzcJ15VLKr5LprZmLsg/RzZ8?= =?us-ascii?Q?+QUfwgsPA2aRT7V6r9g9iLKxffndQS4wAlcoEldLBQdc7G5TZY+OmiMqG9VN?= =?us-ascii?Q?rw1kkSKSLjzgX+tW7YGPNqt9L2ZpxbWyWqDjmRY9Akh9Y1l2QCuaRg8kaN9Y?= =?us-ascii?Q?eZyzRJVpG0bRJaEDHt9fZgyQDt1JC22/u4SJYvwET/2nKZlzcRG1025Il5KR?= =?us-ascii?Q?RQ2TPW8YjR8czXdDWfodAyosdtW9izzMN4P/BAKmhyu5STzzhJTjCgW896m/?= =?us-ascii?Q?SLDYobGxDNxurV0IEbyFW5qePf7OMTE929PBSkd4tKyF+24EMBJoFvnPlkGf?= =?us-ascii?Q?jUHyidU6yyf1HVAwdUpOKRXetSdQEdmbcP/7vkyfUHYJtz/y45iBQzzVh6dl?= =?us-ascii?Q?wCfT2ZHCse4aFF9vOq+u57GHAuebM+5p8OBDp2hyWEw8YnQyNbHpLZKbH2V3?= =?us-ascii?Q?IqpQSVz3VzvkFKmkzBvQhIUOTJohBYbzM3PUwEvsbftR/qYpppBJ7nI2TVUk?= =?us-ascii?Q?ww9IV/vh595aeRzDS6p0tQgR26GovXrT32dMGAV7AuBjinD9rSHX6bR+pcRc?= =?us-ascii?Q?PyTdPovSlQlxQsVnsB0bKfuRHOJq1gQUgghXjvFc5yfUIvxAZKrRDAdCYh+E?= =?us-ascii?Q?TKPusyJRWe0hpYw4XmydL1oWJebIgVGVnS9OnRYZ1c4+FWeJHGj3BikwcA4z?= =?us-ascii?Q?iwwEqZx2iLdvU9I6y7IkGCJ+8niOMT3OX6bH9J1Og2HTic2HtS4MHiebudIU?= =?us-ascii?Q?Vh5m6FRzHY06msPcuwWgEWZfa5fYd3ux77gdXxiB/hkU5N5gad3szFN9PFcs?= =?us-ascii?Q?OtCplsmElXLwC75YfLSEnimohL4J9WY65J6SB7YHzvV672BIbOYYOJ3+3+bG?= =?us-ascii?Q?kUUmb19U5FJZwhpS5/R+cQHR9YYFUsA6AcFo6JJNTTYiFvBvMb8V0ve8I+ej?= =?us-ascii?Q?cHFzhaoYURRlWTvv5hWZK/qFXPeDOySvP9DgwVXaEIyrLhhK0p3fyLH+vXar?= =?us-ascii?Q?n77mnJibCnvt4hQCUHTO7VGsoY7dGqOcJFxCbrTsqQiu8KWNiRZRa3Q=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1548; 5:dvaY7p+zRmhASSvcE9N+R1fGRLkjBbz3uNnTUFLUr1YkzXypk0Scg+EoKFiK/jsGNQAEZQslRaoA2IqXJ3IEXxfZvbxTyvOHk/E+H6FOZbTl4Ol1pvcKBGlz3j7XLyHj+CeCS+dihodYa+IwYDyzAg==; 24:GGaReVhi7O4/igIYKPMMoT5i9+itcdSLyPyyie0FTuHnjZnQi7Ivig+RX+p45UXoAvhX3zLmwjSkKYg07H6Or7VXUOZJZ4o6CizxCqJb5OE= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2015 09:13:39.1003 (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: CY1PR0301MB1548 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: scottwood@freescale.com Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Freescale CoreNet-based and Non-CoreNet-based platforms require different PM operations. This patch extracted existing PM operations on Non-CoreNet-based platforms to a new file which can accommodate both platforms. In this way, PM operation codes are clearer structurally. Signed-off-by: Chenhui Zhao Signed-off-by: Tang Yuantian --- arch/powerpc/platforms/85xx/Makefile | 1 + arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c | 106 +++++++++++++++++++++++++++ arch/powerpc/platforms/85xx/smp.c | 73 +++++------------- arch/powerpc/platforms/85xx/smp.h | 1 + 4 files changed, 127 insertions(+), 54 deletions(-) create mode 100644 arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index 1fe7fb9..7bc86da 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile @@ -2,6 +2,7 @@ # Makefile for the PowerPC 85xx linux kernel. # obj-$(CONFIG_SMP) += smp.o +obj-$(CONFIG_FSL_PMC) += mpc85xx_pm_ops.o obj-y += common.o diff --git a/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c new file mode 100644 index 0000000..f05325f --- /dev/null +++ b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c @@ -0,0 +1,106 @@ +/* + * MPC85xx PM operators + * + * Copyright 2015 Freescale Semiconductor Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#define pr_fmt(fmt) "%s: " fmt, __func__ + +#include +#include +#include +#include + +#include +#include + +static struct ccsr_guts __iomem *guts; + +static void mpc85xx_irq_mask(int cpu) +{ + +} + +static void mpc85xx_irq_unmask(int cpu) +{ + +} + +static void mpc85xx_cpu_die(int cpu) +{ + u32 tmp; + + tmp = (mfspr(SPRN_HID0) & ~(HID0_DOZE|HID0_SLEEP)) | HID0_NAP; + mtspr(SPRN_HID0, tmp); + + /* Enter NAP mode. */ + tmp = mfmsr(); + tmp |= MSR_WE; + asm volatile( + "msync\n" + "mtmsr %0\n" + "isync\n" + : + : "r" (tmp)); +} + +static void mpc85xx_cpu_up_prepare(int cpu) +{ + +} + +static void mpc85xx_freeze_time_base(bool freeze) +{ + uint32_t mask; + + mask = CCSR_GUTS_DEVDISR_TB0 | CCSR_GUTS_DEVDISR_TB1; + if (freeze) + setbits32(&guts->devdisr, mask); + else + clrbits32(&guts->devdisr, mask); + + in_be32(&guts->devdisr); +} + +static const struct of_device_id mpc85xx_smp_guts_ids[] = { + { .compatible = "fsl,mpc8572-guts", }, + { .compatible = "fsl,p1020-guts", }, + { .compatible = "fsl,p1021-guts", }, + { .compatible = "fsl,p1022-guts", }, + { .compatible = "fsl,p1023-guts", }, + { .compatible = "fsl,p2020-guts", }, + { .compatible = "fsl,bsc9132-guts", }, + {}, +}; + +static const struct fsl_pm_ops mpc85xx_pm_ops = { + .freeze_time_base = mpc85xx_freeze_time_base, + .irq_mask = mpc85xx_irq_mask, + .irq_unmask = mpc85xx_irq_unmask, + .cpu_die = mpc85xx_cpu_die, + .cpu_up_prepare = mpc85xx_cpu_up_prepare, +}; + +int __init mpc85xx_setup_pmc(void) +{ + struct device_node *np; + + np = of_find_matching_node(NULL, mpc85xx_smp_guts_ids); + if (np) { + guts = of_iomap(np, 0); + of_node_put(np); + if (!guts) { + pr_err("Could not map guts node address\n"); + return -ENOMEM; + } + } + + qoriq_pm_ops = &mpc85xx_pm_ops; + + return 0; +} diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index 4a78416..ab0459d 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c @@ -2,7 +2,7 @@ * Author: Andy Fleming * Kumar Gala * - * Copyright 2006-2008, 2011-2012 Freescale Semiconductor Inc. + * Copyright 2006-2008, 2011-2012, 2015 Freescale Semiconductor Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -29,6 +28,7 @@ #include #include #include +#include #include #include @@ -43,24 +43,11 @@ struct epapr_spin_table { u32 pir; }; -static struct ccsr_guts __iomem *guts; +#ifdef CONFIG_HOTPLUG_CPU static u64 timebase; static int tb_req; static int tb_valid; -static void mpc85xx_timebase_freeze(int freeze) -{ - uint32_t mask; - - mask = CCSR_GUTS_DEVDISR_TB0 | CCSR_GUTS_DEVDISR_TB1; - if (freeze) - setbits32(&guts->devdisr, mask); - else - clrbits32(&guts->devdisr, mask); - - in_be32(&guts->devdisr); -} - static void mpc85xx_give_timebase(void) { unsigned long flags; @@ -71,7 +58,7 @@ static void mpc85xx_give_timebase(void) barrier(); tb_req = 0; - mpc85xx_timebase_freeze(1); + qoriq_pm_ops->freeze_time_base(true); #ifdef CONFIG_PPC64 /* * e5500/e6500 have a workaround for erratum A-006958 in place @@ -104,7 +91,7 @@ static void mpc85xx_give_timebase(void) while (tb_valid) barrier(); - mpc85xx_timebase_freeze(0); + qoriq_pm_ops->freeze_time_base(false); local_irq_restore(flags); } @@ -126,31 +113,25 @@ static void mpc85xx_take_timebase(void) local_irq_restore(flags); } -#ifdef CONFIG_HOTPLUG_CPU static void smp_85xx_mach_cpu_die(void) { unsigned int cpu = smp_processor_id(); - u32 tmp; local_irq_disable(); + hard_irq_disable(); + /* mask all irqs to prevent cpu wakeup */ + qoriq_pm_ops->irq_mask(cpu); + idle_task_exit(); - generic_set_cpu_dead(cpu); - mb(); mtspr(SPRN_TCR, 0); + mtspr(SPRN_TSR, mfspr(SPRN_TSR)); - cur_cpu_spec->cpu_down_flush(); + generic_set_cpu_dead(cpu); - tmp = (mfspr(SPRN_HID0) & ~(HID0_DOZE|HID0_SLEEP)) | HID0_NAP; - mtspr(SPRN_HID0, tmp); - isync(); + cur_cpu_spec->cpu_down_flush(); - /* Enter NAP mode. */ - tmp = mfmsr(); - tmp |= MSR_WE; - mb(); - mtmsr(tmp); - isync(); + qoriq_pm_ops->cpu_die(cpu); while (1) ; @@ -468,16 +449,6 @@ static void smp_85xx_setup_cpu(int cpu_nr) smp_85xx_basic_setup(cpu_nr); } -static const struct of_device_id mpc85xx_smp_guts_ids[] = { - { .compatible = "fsl,mpc8572-guts", }, - { .compatible = "fsl,p1020-guts", }, - { .compatible = "fsl,p1021-guts", }, - { .compatible = "fsl,p1022-guts", }, - { .compatible = "fsl,p1023-guts", }, - { .compatible = "fsl,p2020-guts", }, - {}, -}; - void __init mpc85xx_smp_init(void) { struct device_node *np; @@ -501,22 +472,16 @@ void __init mpc85xx_smp_init(void) smp_85xx_ops.probe = NULL; } - np = of_find_matching_node(NULL, mpc85xx_smp_guts_ids); - if (np) { - guts = of_iomap(np, 0); - of_node_put(np); - if (!guts) { - pr_err("%s: Could not map guts node address\n", - __func__); - return; - } +#ifdef CONFIG_HOTPLUG_CPU +#ifdef CONFIG_FSL_PMC + mpc85xx_setup_pmc(); +#endif + if (qoriq_pm_ops) { smp_85xx_ops.give_timebase = mpc85xx_give_timebase; smp_85xx_ops.take_timebase = mpc85xx_take_timebase; -#ifdef CONFIG_HOTPLUG_CPU ppc_md.cpu_die = smp_85xx_mach_cpu_die; -#endif } - +#endif smp_ops = &smp_85xx_ops; #ifdef CONFIG_KEXEC diff --git a/arch/powerpc/platforms/85xx/smp.h b/arch/powerpc/platforms/85xx/smp.h index e2b4493..0b20ae3 100644 --- a/arch/powerpc/platforms/85xx/smp.h +++ b/arch/powerpc/platforms/85xx/smp.h @@ -5,6 +5,7 @@ #ifdef CONFIG_SMP void __init mpc85xx_smp_init(void); +int __init mpc85xx_setup_pmc(void); #else static inline void mpc85xx_smp_init(void) {