From patchwork Wed Aug 28 11:36:01 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Pieralisi X-Patchwork-Id: 2850744 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 8A0269F271 for ; Wed, 28 Aug 2013 12:57:46 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4EC1820495 for ; Wed, 28 Aug 2013 12:57:45 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 86D0820488 for ; Wed, 28 Aug 2013 12:57:43 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VEe4x-0004d1-UM; Wed, 28 Aug 2013 11:38:28 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VEe4P-00011S-Lp; Wed, 28 Aug 2013 11:37:53 +0000 Received: from service87.mimecast.com ([91.220.42.44]) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VEe32-0000ry-B8 for linux-arm-kernel@lists.infradead.org; Wed, 28 Aug 2013 11:36:38 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Wed, 28 Aug 2013 12:36:10 +0100 Received: from red-moon.cambridge.arm.com ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 28 Aug 2013 12:36:06 +0100 From: Lorenzo Pieralisi To: linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC PATCH 09/14] arm64: kernel: implement debug monitors CPU PM notifiers Date: Wed, 28 Aug 2013 12:36:01 +0100 Message-Id: <1377689766-17642-10-git-send-email-lorenzo.pieralisi@arm.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1377689766-17642-1-git-send-email-lorenzo.pieralisi@arm.com> References: <1377689766-17642-1-git-send-email-lorenzo.pieralisi@arm.com> X-OriginalArrivalTime: 28 Aug 2013 11:36:06.0891 (UTC) FILETIME=[C8E80BB0:01CEA3E2] X-MC-Unique: 113082812361002201 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130828_073628_586091_5B2E8905 X-CRM114-Status: GOOD ( 11.46 ) X-Spam-Score: -2.6 (--) Cc: Mark Rutland , Feng Kan , Stephen Boyd , Lorenzo Pieralisi , Russell King , Graeme Gregory , Nicolas Pitre , Marc Zyngier , Catalin Marinas , Yu Tang , Will Deacon , Sudeep KarkadaNagesha , Santosh Shilimkar , Loc Ho , Colin Cross , Kumar Sankaran , Dave Martin , Hanjun Guo , Zhou Zhu X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-6.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When a CPU is shutdown either through CPU idle or suspend to RAM, the content of debug monitor registers must be reset or restored to proper values when CPU resume from low power states. This patch implements a CPU PM notifier that allows to restore the content of debug monitor registers to allow proper suspend/resume operations. Signed-off-by: Lorenzo Pieralisi --- arch/arm64/kernel/debug-monitors.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index cbfacf7..f78148f 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c @@ -19,6 +19,7 @@ */ #include +#include #include #include #include @@ -154,6 +155,42 @@ static struct notifier_block os_lock_nb = { .notifier_call = os_lock_notify, }; +#ifdef CONFIG_CPU_PM +static DEFINE_PER_CPU(u32, mdscr); + +static int dm_cpu_pm_notify(struct notifier_block *self, unsigned long action, + void *v) +{ + switch (action) { + case CPU_PM_ENTER: + __get_cpu_var(mdscr) = mdscr_read(); + break; + case CPU_PM_EXIT: + clear_os_lock(NULL); + mdscr_write(__get_cpu_var(mdscr)); + break; + case CPU_PM_ENTER_FAILED: + default: + return NOTIFY_DONE; + } + + return NOTIFY_OK; +} + +static struct notifier_block dm_cpu_pm_nb = { + .notifier_call = dm_cpu_pm_notify, +}; + +static void __init debug_monitors_pm_init(void) +{ + cpu_pm_register_notifier(&dm_cpu_pm_nb); +} +#else +static inline void debug_monitors_pm_init(void) +{ +} +#endif + static int debug_monitors_init(void) { /* Clear the OS lock. */ @@ -162,6 +199,7 @@ static int debug_monitors_init(void) /* Register hotplug handler. */ register_cpu_notifier(&os_lock_nb); + debug_monitors_pm_init(); return 0; } postcore_initcall(debug_monitors_init);