From patchwork Mon Oct 14 11:03:05 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Pieralisi X-Patchwork-Id: 3035731 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 3F8C7BF924 for ; Mon, 14 Oct 2013 11:19:06 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0A75E20256 for ; Mon, 14 Oct 2013 11:19:05 +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 CAD7F20253 for ; Mon, 14 Oct 2013 11:19:03 +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 1VVfxh-0001LX-E6; Mon, 14 Oct 2013 11:05:22 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VVfwo-0002KD-1D; Mon, 14 Oct 2013 11:04:26 +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 1VVfvK-00028Z-Vv for linux-arm-kernel@lists.infradead.org; Mon, 14 Oct 2013 11:03:07 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Mon, 14 Oct 2013 12:02:34 +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); Mon, 14 Oct 2013 12:02:32 +0100 From: Lorenzo Pieralisi To: linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH v2 08/13] arm64: kernel: implement debug monitors CPU PM notifiers Date: Mon, 14 Oct 2013 12:03:05 +0100 Message-Id: <1381748590-14279-9-git-send-email-lorenzo.pieralisi@arm.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1381748590-14279-1-git-send-email-lorenzo.pieralisi@arm.com> References: <1381748590-14279-1-git-send-email-lorenzo.pieralisi@arm.com> X-OriginalArrivalTime: 14 Oct 2013 11:02:32.0614 (UTC) FILETIME=[E1B80460:01CEC8CC] X-MC-Unique: 113101412023401201 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20131014_070255_408290_F8487136 X-CRM114-Status: GOOD ( 11.82 ) X-Spam-Score: 0.4 (/) Cc: Mark Rutland , Feng Kan , Stephen Boyd , Lorenzo Pieralisi , Russell King , Graeme Gregory , Nicolas Pitre , Marc Zyngier , Catalin Marinas , Yu Tang , Daniel Lezcano , 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=-1.7 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=no 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..28ce685 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);