From: robherring2@gmail.com (Rob Herring)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] clocksource: arm_arch_timer: add boot and suspend sched_clock offset
Date: Thu, 18 Apr 2013 14:30:10 -0500 [thread overview]
Message-ID: <1366313410-16692-2-git-send-email-robherring2@gmail.com> (raw)
In-Reply-To: <1366313410-16692-1-git-send-email-robherring2@gmail.com>
From: Rob Herring <rob.herring@calxeda.com>
Commit 023796b (ARM: arch_timer: use full 64-bit counter for sched_clock)
fails to ensure sched_clock always starts at time 0 and counting is
suspended during suspend. arm64 sched_clock support also has the same
issues. This fixes all architected timer users by maintaining an initial
offset which is updated on resume.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
---
arch/arm/kernel/arch_timer.c | 1 +
drivers/clocksource/arm_arch_timer.c | 26 +++++++++++++++++++++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/arch/arm/kernel/arch_timer.c b/arch/arm/kernel/arch_timer.c
index df6825e..9a517fe 100644
--- a/arch/arm/kernel/arch_timer.c
+++ b/arch/arm/kernel/arch_timer.c
@@ -42,5 +42,6 @@ int __init arch_timer_arch_init(void)
arch_timer_delay_timer_register();
sched_clock_func = arch_timer_sched_clock;
+
return 0;
}
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 17ed8e4..cc0bd67 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -17,6 +17,7 @@
#include <linux/interrupt.h>
#include <linux/of_irq.h>
#include <linux/io.h>
+#include <linux/syscore_ops.h>
#include <asm/arch_timer.h>
#include <asm/virt.h>
@@ -267,14 +268,34 @@ static struct notifier_block arch_timer_cpu_nb __cpuinitdata = {
};
static u64 sched_clock_mult __read_mostly;
+static u64 arch_timer_suspend_cyc;
+static u64 arch_timer_sched_clock_offset;
unsigned long long notrace arch_timer_sched_clock(void)
{
- return arch_timer_read_counter() * sched_clock_mult;
+ u64 cyc = arch_timer_read_counter() - arch_timer_sched_clock_offset;
+ return cyc * sched_clock_mult;
}
unsigned long long sched_clock(void) \
__attribute__((weak, alias("arch_timer_sched_clock")));
+static int arch_timer_suspend(void)
+{
+ arch_timer_suspend_cyc = arch_timer_read_counter();
+ return 0;
+}
+
+static void arch_timer_resume(void)
+{
+ arch_timer_sched_clock_offset +=
+ arch_timer_read_counter() - arch_timer_suspend_cyc;
+}
+
+static struct syscore_ops arch_timer_ops = {
+ .suspend = arch_timer_suspend,
+ .resume = arch_timer_resume,
+};
+
static int __init arch_timer_register(void)
{
int err;
@@ -332,6 +353,9 @@ static int __init arch_timer_register(void)
pr_info("sched_clock: ARM arch timer >56 bits at %ukHz, resolution %lluns\n",
arch_timer_rate / 1000, sched_clock_mult);
+ arch_timer_sched_clock_offset = arch_timer_read_counter();
+ register_syscore_ops(&arch_timer_ops);
+
return 0;
out_free_irq:
--
1.7.10.4
next prev parent reply other threads:[~2013-04-18 19:30 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-18 19:30 [PATCH 1/2] clocksource: arm_arch_timer: unify sched_clock init Rob Herring
2013-04-18 19:30 ` Rob Herring [this message]
2013-04-19 14:46 ` [PATCH 2/2] clocksource: arm_arch_timer: add boot and suspend sched_clock offset Catalin Marinas
2013-04-19 0:00 ` [PATCH 1/2] clocksource: arm_arch_timer: unify sched_clock init Stephen Boyd
2013-04-19 1:37 ` Rob Herring
2013-04-19 17:34 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 0/4] ARM 64 bit sched_clock take #2 Stephen Boyd
2013-04-20 0:29 ` [PATCH 1/4] ARM: sched_clock: Remove unused needs_suspend member Stephen Boyd
2013-04-20 0:29 ` [PATCH 2/4] ARM: sched_clock: Return suspended count earlier Stephen Boyd
2013-04-20 0:29 ` [PATCH 3/4] ARM: sched_clock: Add support for >32 bit sched_clock Stephen Boyd
2013-04-22 10:48 ` Will Deacon
2013-04-22 15:35 ` Stephen Boyd
2013-04-20 0:29 ` [PATCH 4/4] ARM: arch_timer: Move to setup_sched_clock_64() Stephen Boyd
2013-04-22 15:16 ` [PATCH 0/4] ARM 64 bit sched_clock take #2 Arnd Bergmann
2013-04-22 15:34 ` Mark Rutland
2013-04-22 15:36 ` Stephen Boyd
2013-04-22 15:51 ` Mark Rutland
2013-04-22 17:00 ` John Stultz
2013-04-22 20:46 ` Rob Herring
2013-04-23 16:34 ` Stephen Boyd
2013-05-01 0:54 ` [PATCH 5/4] sched: Make ARM's sched_clock generic for all architectures Stephen Boyd
2013-05-01 0:54 ` [PATCH 6/4] arm64: Move to generic sched_clock infrastructure Stephen Boyd
2013-05-01 9:11 ` Catalin Marinas
2013-05-01 14:44 ` Christopher Covington
2013-05-31 20:40 ` [PATCH 5/4] sched: Make ARM's sched_clock generic for all architectures John Stultz
2013-05-31 22:13 ` Stephen Boyd
2013-05-31 23:50 ` John Stultz
2013-04-19 14:45 ` [PATCH 1/2] clocksource: arm_arch_timer: unify sched_clock init Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1366313410-16692-2-git-send-email-robherring2@gmail.com \
--to=robherring2@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).