From: fu.wei@linaro.org
To: rjw@rjwysocki.net, lenb@kernel.org, daniel.lezcano@linaro.org,
tglx@linutronix.de, marc.zyngier@arm.com, mark.rutland@arm.com,
lorenzo.pieralisi@arm.com, sudeep.holla@arm.com,
hanjun.guo@linaro.org
Cc: linux-arm-kernel@lists.infradead.org,
linaro-acpi@lists.linaro.org, linux-kernel@vger.kernel.org,
linux-acpi@vger.kernel.org, rruigrok@codeaurora.org,
harba@codeaurora.org, cov@codeaurora.org, timur@codeaurora.org,
graeme.gregory@linaro.org, al.stone@linaro.org, jcm@redhat.com,
wei@redhat.com, arnd@arndb.de, catalin.marinas@arm.com,
will.deacon@arm.com, Suravee.Suthikulpanit@amd.com,
leo.duran@amd.com, wim@iguana.be, linux@roeck-us.net,
linux-watchdog@vger.kernel.org, tn@semihalf.com,
christoffer.dall@linaro.org, julien.grall@arm.com,
Fu Wei <fu.wei@linaro.org>
Subject: [PATCH v24 10/11] clocksource: arm_arch_timer: add GTDT support for memory-mapped timer
Date: Sat, 15 Apr 2017 02:40:13 +0800 [thread overview]
Message-ID: <20170414184014.8524-11-fu.wei@linaro.org> (raw)
In-Reply-To: <20170414184014.8524-1-fu.wei@linaro.org>
From: Fu Wei <fu.wei@linaro.org>
The patch add memory-mapped timer register support by using the
information provided by the new GTDT driver of ACPI.
Signed-off-by: Fu Wei <fu.wei@linaro.org>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
[Mark: verify CNTFRQ, only register the first frame]
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
---
drivers/clocksource/arm_arch_timer.c | 78 ++++++++++++++++++++++++++++++++++--
1 file changed, 75 insertions(+), 3 deletions(-)
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index 05f2f7a..8981173 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -1385,10 +1385,78 @@ CLOCKSOURCE_OF_DECLARE(armv7_arch_timer_mem, "arm,armv7-timer-mem",
arch_timer_mem_of_init);
#ifdef CONFIG_ACPI_GTDT
-/* Initialize per-processor generic timer */
+static int __init
+arch_timer_mem_verify_cntfrq(struct arch_timer_mem *timer_mem)
+{
+ struct arch_timer_mem_frame *frame;
+ u32 rate;
+ int i;
+
+ for (i = 0; i < ARCH_TIMER_MEM_MAX_FRAMES; i++) {
+ frame = &timer_mem->frame[i];
+
+ if (!frame->valid)
+ continue;
+
+ rate = arch_timer_mem_frame_get_cntfrq(frame);
+ if (rate == arch_timer_rate)
+ continue;
+
+ pr_err(FW_BUG "CNTFRQ mismatch: frame @ %pa: (0x%08lx), CPU: (0x%08lx)\n",
+ &frame->cntbase,
+ (unsigned long)rate, (unsigned long)arch_timer_rate);
+
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int __init arch_timer_mem_acpi_init(int platform_timer_count)
+{
+ struct arch_timer_mem *timers, *timer;
+ struct arch_timer_mem_frame *frame;
+ int timer_count, i, ret = 0;
+
+ timers = kcalloc(platform_timer_count, sizeof(*timers), GFP_KERNEL);
+ if (!timers)
+ return -ENOMEM;
+
+ ret = acpi_arch_timer_mem_init(timers, &timer_count);
+ if (ret || !timer_count)
+ goto out;
+
+ for (i = 0; i < timer_count; i++) {
+ ret = arch_timer_mem_verify_cntfrq(&timers[i]);
+ if (ret) {
+ pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n");
+ goto out;
+ }
+ }
+
+ /*
+ * While unlikely, it's theoretically possible that none of the frames
+ * in a timer expose the combination of feature we want.
+ */
+ for (i = i; i < timer_count; i++) {
+ timer = &timers[i];
+
+ frame = arch_timer_mem_find_best_frame(timer);
+ if (frame)
+ break;
+ }
+
+ if (frame)
+ ret = arch_timer_mem_frame_register(frame);
+out:
+ kfree(timers);
+ return ret;
+}
+
+/* Initialize per-processor generic timer and memory-mapped timer(if present) */
static int __init arch_timer_acpi_init(struct acpi_table_header *table)
{
- int ret;
+ int ret, platform_timer_count;
if (arch_timers_present & ARCH_TIMER_TYPE_CP15) {
pr_warn("already initialized, skipping\n");
@@ -1397,7 +1465,7 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table)
arch_timers_present |= ARCH_TIMER_TYPE_CP15;
- ret = acpi_gtdt_init(table, NULL);
+ ret = acpi_gtdt_init(table, &platform_timer_count);
if (ret) {
pr_err("Failed to init GTDT table.\n");
return ret;
@@ -1440,6 +1508,10 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table)
if (ret)
return ret;
+ if (platform_timer_count &&
+ arch_timer_mem_acpi_init(platform_timer_count))
+ pr_err("Failed to initialize memory-mapped timer.\n");
+
return arch_timer_common_init();
}
CLOCKSOURCE_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init);
--
2.9.3
next prev parent reply other threads:[~2017-04-14 18:43 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-14 18:40 [PATCH v24 00/11] acpi, clocksource: add GTDT driver and GTDT support in arm_arch_timer fu.wei
2017-04-14 18:40 ` [PATCH v24 01/11] clocksource: arm_arch_timer: split dt-only rate handling fu.wei
2017-04-14 18:40 ` [PATCH v24 02/11] clocksource: arm_arch_timer: refactor arch_timer_needs_probing fu.wei
2017-04-14 18:40 ` [PATCH v24 03/11] clocksource: arm_arch_timer: move arch_timer_needs_of_probing into DT init call fu.wei
2017-04-14 18:40 ` [PATCH v24 04/11] clocksource: arm_arch_timer: add structs to describe MMIO timer fu.wei
2017-04-14 18:40 ` [PATCH v24 05/11] clocksource: arm_arch_timer: split MMIO timer probing fu.wei
2017-04-14 18:40 ` [PATCH v24 06/11] acpi/arm64: Add GTDT table parse driver fu.wei
2017-04-14 18:40 ` [PATCH v24 07/11] clocksource: arm_arch_timer: simplify ACPI support code fu.wei
2017-04-14 18:40 ` [PATCH v24 08/11] acpi: Introduce acpi_unregister_irq function fu.wei
2017-04-18 15:58 ` Mark Rutland
2017-04-19 15:09 ` Mark Rutland
2017-04-14 18:40 ` [PATCH v24 09/11] acpi/arm64: Add memory-mapped timer support in GTDT driver fu.wei
2017-04-18 17:21 ` Lorenzo Pieralisi
2017-04-19 15:07 ` Mark Rutland
2017-04-19 15:45 ` Mark Rutland
2017-04-19 15:56 ` Lorenzo Pieralisi
2017-04-14 18:40 ` fu.wei [this message]
2017-04-14 18:40 ` [PATCH v24 11/11] acpi/arm64: Add SBSA Generic Watchdog " fu.wei
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=20170414184014.8524-11-fu.wei@linaro.org \
--to=fu.wei@linaro.org \
--cc=Suravee.Suthikulpanit@amd.com \
--cc=al.stone@linaro.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=christoffer.dall@linaro.org \
--cc=cov@codeaurora.org \
--cc=daniel.lezcano@linaro.org \
--cc=graeme.gregory@linaro.org \
--cc=hanjun.guo@linaro.org \
--cc=harba@codeaurora.org \
--cc=jcm@redhat.com \
--cc=julien.grall@arm.com \
--cc=lenb@kernel.org \
--cc=leo.duran@amd.com \
--cc=linaro-acpi@lists.linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-watchdog@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=lorenzo.pieralisi@arm.com \
--cc=marc.zyngier@arm.com \
--cc=mark.rutland@arm.com \
--cc=rjw@rjwysocki.net \
--cc=rruigrok@codeaurora.org \
--cc=sudeep.holla@arm.com \
--cc=tglx@linutronix.de \
--cc=timur@codeaurora.org \
--cc=tn@semihalf.com \
--cc=wei@redhat.com \
--cc=will.deacon@arm.com \
--cc=wim@iguana.be \
/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).