From: Marc Zyngier <marc.zyngier@arm.com>
To: Hiroshi Doyu <hdoyu@nvidia.com>
Cc: "linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>,
"andrew@lunn.ch" <andrew@lunn.ch>,
"linux@arm.linux.org.uk" <linux@arm.linux.org.uk>,
"jason@lakedaemon.net" <jason@lakedaemon.net>,
"johnstul@us.ibm.com" <johnstul@us.ibm.com>,
"devicetree-discuss@lists.ozlabs.org"
<devicetree-discuss@lists.ozlabs.org>,
"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"rob.herring@calxeda.com" <rob.herring@calxeda.com>,
"tglx@linutronix.de" <tglx@linutronix.de>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 5/9] clocksource: tegra: Enable ARM arch_timer with TSC
Date: Thu, 20 Dec 2012 13:33:38 +0000 [thread overview]
Message-ID: <50D313B2.8050805@arm.com> (raw)
In-Reply-To: <20121220.152544.2281355586046026239.hdoyu@nvidia.com>
On 20/12/12 13:25, Hiroshi Doyu wrote:
> Marc Zyngier <marc.zyngier@arm.com> wrote @ Thu, 20 Dec 2012 13:05:45 +0100:
>
>> On 20/12/12 11:57, Hiroshi Doyu wrote:
>>> Marc Zyngier <marc.zyngier@arm.com> wrote @ Thu, 20 Dec 2012 12:01:15 +0100:
>>>
>>>> On 20/12/12 09:44, Hiroshi Doyu wrote:
>>>>> Add platform enabler for ARM arch_timer(TSC). TSC is more fine grained
>>>>> timer than TMR0. If it's available, it will be used for clock source
>>>>> and sched_clock. Otherwise, TMR0 is used. In any case TMR0 is
>>>>> necessary for clock event.
>>>>>
>>>>> Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com>
>>>>> ---
>>>>> .../bindings/arm/tegra/nvidia,tegra114-tsc.txt | 11 ++++
>>>>> drivers/clocksource/tegra20_timer.c | 64 +++++++++++++++++++-
>>>>> 2 files changed, 74 insertions(+), 1 deletion(-)
>>>>> create mode 100644 Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt
>>>>>
>>>>> diff --git a/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt b/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt
>>>>> new file mode 100644
>>>>> index 0000000..9de936a
>>>>> --- /dev/null
>>>>> +++ b/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt
>>>>> @@ -0,0 +1,11 @@
>>>>> +NVIDIA Tegra Timer Stamp Counter(TSC)
>>>>> +
>>>>> +Required properties:
>>>>> +- compatible : "nvidia,tegra114-tsc
>>>>> +- reg : Should contain 1 register ranges(address and length)
>>>>> +
>>>>> +Example:
>>>>> + tsc {
>>>>> + compatible = "nvidia,tegra114-tsc";
>>>>> + reg = <0x700f0000 0x20000>;
>>>>> + };
>>>>> diff --git a/drivers/clocksource/tegra20_timer.c b/drivers/clocksource/tegra20_timer.c
>>>>> index 1d25de8..285a6f1 100644
>>>>> --- a/drivers/clocksource/tegra20_timer.c
>>>>> +++ b/drivers/clocksource/tegra20_timer.c
>>>>> @@ -30,6 +30,7 @@
>>>>> #include <asm/mach/time.h>
>>>>> #include <asm/smp_twd.h>
>>>>> #include <asm/sched_clock.h>
>>>>> +#include <asm/arch_timer.h>
>>>>>
>>>>> #define RTC_SECONDS 0x08
>>>>> #define RTC_SHADOW_SECONDS 0x0c
>>>>> @@ -271,10 +272,71 @@ static void __init tegra20_init_tmr(void)
>>>>> clockevents_register_device(&tegra_clockevent);
>>>>> }
>>>>>
>>>>> +#define TSC_CNTCR 0 /* TSC control registers */
>>>>> +#define TSC_CNTCR_ENABLE (1 << 0) /* Enable */
>>>>> +#define TSC_CNTCR_HDBG (1 << 1) /* Halt on debug */
>>>>> +
>>>>> +#define TSC_CNTCV0 0x8 /* TSC counter (LSW) */
>>>>> +#define TSC_CNTCV1 0xc /* TSC counter (MSW) */
>>>>> +#define TSC_CNTFID0 0x20 /* TSC freq id 0 */
>>>>> +
>>>>> +static const struct of_device_id tegra_tsc_match[] __initconst = {
>>>>> + { .compatible = "nvidia,tegra114-tsc" },
>>>>> + {}
>>>>> +};
>>>>> +
>>>>> +static int tegra_arch_timer_init(void)
>>>>> +{
>>>>> + int err;
>>>>> + struct device_node *np;
>>>>> + struct clk *clk;
>>>>> + void __iomem *tsc_base;
>>>>> + u32 freq, val;
>>>>> +
>>>>> + np = of_find_matching_node(NULL, tegra_tsc_match);
>>>>> + if (!np)
>>>>> + return -ENODEV;
>>>>> +
>>>>> + tsc_base = of_iomap(np, 0);
>>>>> + if (!tsc_base)
>>>>> + return -ENODEV;
>>>>> +
>>>>> + clk = clk_get_sys("clk_m", NULL);
>>>>> + if (IS_ERR(clk)) {
>>>>> + freq = 12000000;
>>>>> + pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n");
>>>>> + } else {
>>>>> + freq = clk_get_rate(clk);
>>>>> + clk_put(clk);
>>>>> + }
>>>>> + writel_relaxed(freq, tsc_base + TSC_CNTFID0);
>>>>> +
>>>>> + /* CNTFRQ */
>>>>> + asm("mcr p15, 0, %0, c14, c0, 0\n" : : "r" (freq));
>>>>> + asm("mrc p15, 0, %0, c14, c0, 0\n" : "=r" (val));
>>>>> + BUG_ON(val != freq);
>>>>
>>>> This is scary. CNTFRQ is only writable from secure mode, and will
>>>> explode in any other situation.
>>>>
>>>> Also, writing to CNTFRQ doesn't change the timer frequency! This is just
>>>> a way for secure mode to tell the rest of the world the frequency the
>>>> timer is ticking at. Unless you've wired the input clock to be able to
>>>> change the frequency?
>>>
>>> ATM, our upstream kernel is expected in secure mode. This situation
>>> may be changed later, though....
>>
>> I appreciate this. But I expect this kernel to be also used on the
>> non-secure side if someone tried to run KVM with it. And this would go
>> bang right away.
>
> What is the common way to make the above code selective at run
> time(secure or non-secure path)?
All platforms are currently doing it in their firmware/bootloader, which
runs on the secure side. The kernel itself should be able to run on both
sides.
M.
--
Jazz is not dead. It just smells funny...
WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 5/9] clocksource: tegra: Enable ARM arch_timer with TSC
Date: Thu, 20 Dec 2012 13:33:38 +0000 [thread overview]
Message-ID: <50D313B2.8050805@arm.com> (raw)
In-Reply-To: <20121220.152544.2281355586046026239.hdoyu@nvidia.com>
On 20/12/12 13:25, Hiroshi Doyu wrote:
> Marc Zyngier <marc.zyngier@arm.com> wrote @ Thu, 20 Dec 2012 13:05:45 +0100:
>
>> On 20/12/12 11:57, Hiroshi Doyu wrote:
>>> Marc Zyngier <marc.zyngier@arm.com> wrote @ Thu, 20 Dec 2012 12:01:15 +0100:
>>>
>>>> On 20/12/12 09:44, Hiroshi Doyu wrote:
>>>>> Add platform enabler for ARM arch_timer(TSC). TSC is more fine grained
>>>>> timer than TMR0. If it's available, it will be used for clock source
>>>>> and sched_clock. Otherwise, TMR0 is used. In any case TMR0 is
>>>>> necessary for clock event.
>>>>>
>>>>> Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com>
>>>>> ---
>>>>> .../bindings/arm/tegra/nvidia,tegra114-tsc.txt | 11 ++++
>>>>> drivers/clocksource/tegra20_timer.c | 64 +++++++++++++++++++-
>>>>> 2 files changed, 74 insertions(+), 1 deletion(-)
>>>>> create mode 100644 Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt
>>>>>
>>>>> diff --git a/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt b/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt
>>>>> new file mode 100644
>>>>> index 0000000..9de936a
>>>>> --- /dev/null
>>>>> +++ b/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra114-tsc.txt
>>>>> @@ -0,0 +1,11 @@
>>>>> +NVIDIA Tegra Timer Stamp Counter(TSC)
>>>>> +
>>>>> +Required properties:
>>>>> +- compatible : "nvidia,tegra114-tsc
>>>>> +- reg : Should contain 1 register ranges(address and length)
>>>>> +
>>>>> +Example:
>>>>> + tsc {
>>>>> + compatible = "nvidia,tegra114-tsc";
>>>>> + reg = <0x700f0000 0x20000>;
>>>>> + };
>>>>> diff --git a/drivers/clocksource/tegra20_timer.c b/drivers/clocksource/tegra20_timer.c
>>>>> index 1d25de8..285a6f1 100644
>>>>> --- a/drivers/clocksource/tegra20_timer.c
>>>>> +++ b/drivers/clocksource/tegra20_timer.c
>>>>> @@ -30,6 +30,7 @@
>>>>> #include <asm/mach/time.h>
>>>>> #include <asm/smp_twd.h>
>>>>> #include <asm/sched_clock.h>
>>>>> +#include <asm/arch_timer.h>
>>>>>
>>>>> #define RTC_SECONDS 0x08
>>>>> #define RTC_SHADOW_SECONDS 0x0c
>>>>> @@ -271,10 +272,71 @@ static void __init tegra20_init_tmr(void)
>>>>> clockevents_register_device(&tegra_clockevent);
>>>>> }
>>>>>
>>>>> +#define TSC_CNTCR 0 /* TSC control registers */
>>>>> +#define TSC_CNTCR_ENABLE (1 << 0) /* Enable */
>>>>> +#define TSC_CNTCR_HDBG (1 << 1) /* Halt on debug */
>>>>> +
>>>>> +#define TSC_CNTCV0 0x8 /* TSC counter (LSW) */
>>>>> +#define TSC_CNTCV1 0xc /* TSC counter (MSW) */
>>>>> +#define TSC_CNTFID0 0x20 /* TSC freq id 0 */
>>>>> +
>>>>> +static const struct of_device_id tegra_tsc_match[] __initconst = {
>>>>> + { .compatible = "nvidia,tegra114-tsc" },
>>>>> + {}
>>>>> +};
>>>>> +
>>>>> +static int tegra_arch_timer_init(void)
>>>>> +{
>>>>> + int err;
>>>>> + struct device_node *np;
>>>>> + struct clk *clk;
>>>>> + void __iomem *tsc_base;
>>>>> + u32 freq, val;
>>>>> +
>>>>> + np = of_find_matching_node(NULL, tegra_tsc_match);
>>>>> + if (!np)
>>>>> + return -ENODEV;
>>>>> +
>>>>> + tsc_base = of_iomap(np, 0);
>>>>> + if (!tsc_base)
>>>>> + return -ENODEV;
>>>>> +
>>>>> + clk = clk_get_sys("clk_m", NULL);
>>>>> + if (IS_ERR(clk)) {
>>>>> + freq = 12000000;
>>>>> + pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n");
>>>>> + } else {
>>>>> + freq = clk_get_rate(clk);
>>>>> + clk_put(clk);
>>>>> + }
>>>>> + writel_relaxed(freq, tsc_base + TSC_CNTFID0);
>>>>> +
>>>>> + /* CNTFRQ */
>>>>> + asm("mcr p15, 0, %0, c14, c0, 0\n" : : "r" (freq));
>>>>> + asm("mrc p15, 0, %0, c14, c0, 0\n" : "=r" (val));
>>>>> + BUG_ON(val != freq);
>>>>
>>>> This is scary. CNTFRQ is only writable from secure mode, and will
>>>> explode in any other situation.
>>>>
>>>> Also, writing to CNTFRQ doesn't change the timer frequency! This is just
>>>> a way for secure mode to tell the rest of the world the frequency the
>>>> timer is ticking at. Unless you've wired the input clock to be able to
>>>> change the frequency?
>>>
>>> ATM, our upstream kernel is expected in secure mode. This situation
>>> may be changed later, though....
>>
>> I appreciate this. But I expect this kernel to be also used on the
>> non-secure side if someone tried to run KVM with it. And this would go
>> bang right away.
>
> What is the common way to make the above code selective at run
> time(secure or non-secure path)?
All platforms are currently doing it in their firmware/bootloader, which
runs on the secure side. The kernel itself should be able to run on both
sides.
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2012-12-20 13:33 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-20 9:43 [PATCH 0/9] ARM: Initial support for Tegra 114 SoC Hiroshi Doyu
2012-12-20 9:43 ` Hiroshi Doyu
2012-12-20 9:43 ` Hiroshi Doyu
2012-12-20 9:44 ` [PATCH 3/9] ARM: tegra: # of CPU cores detection w/ & w/o HAVE_ARM_SCU Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
[not found] ` <1355996654-6579-4-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 10:06 ` Felipe Balbi
2012-12-20 10:06 ` Felipe Balbi
2012-12-20 10:06 ` Felipe Balbi
2012-12-20 11:21 ` Hiroshi Doyu
2012-12-20 11:21 ` Hiroshi Doyu
2012-12-20 11:21 ` Hiroshi Doyu
[not found] ` <20121220.132136.1599315430686323669.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 18:18 ` Felipe Balbi
2012-12-20 18:18 ` Felipe Balbi
2012-12-20 18:18 ` Felipe Balbi
2012-12-20 11:17 ` Marc Zyngier
2012-12-20 11:17 ` Marc Zyngier
2012-12-20 11:26 ` Hiroshi Doyu
2012-12-20 11:26 ` Hiroshi Doyu
2012-12-20 11:32 ` Marc Zyngier
2012-12-20 11:32 ` Marc Zyngier
2012-12-20 9:44 ` [PATCH 4/9] clocksource: tegra: Reorganize funcs by clock functionarities Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` [PATCH 5/9] clocksource: tegra: Enable ARM arch_timer with TSC Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
[not found] ` <1355996654-6579-6-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 11:01 ` Marc Zyngier
2012-12-20 11:01 ` Marc Zyngier
2012-12-20 11:01 ` Marc Zyngier
2012-12-20 11:57 ` Hiroshi Doyu
2012-12-20 11:57 ` Hiroshi Doyu
2012-12-20 12:05 ` Marc Zyngier
2012-12-20 12:05 ` Marc Zyngier
[not found] ` <50D2FF19.4060600-5wv7dgnIgG8@public.gmane.org>
2012-12-20 12:22 ` Peter De Schrijver
2012-12-20 12:22 ` Peter De Schrijver
2012-12-20 12:22 ` Peter De Schrijver
[not found] ` <20121220122246.GA6819-Rysk9IDjsxmJz7etNGeUX8VPkgjIgRvpAL8bYrjMMd8@public.gmane.org>
2012-12-20 12:33 ` Marc Zyngier
2012-12-20 12:33 ` Marc Zyngier
2012-12-20 12:33 ` Marc Zyngier
[not found] ` <50D305A6.2080904-5wv7dgnIgG8@public.gmane.org>
2012-12-20 12:55 ` Peter De Schrijver
2012-12-20 12:55 ` Peter De Schrijver
2012-12-20 12:55 ` Peter De Schrijver
2012-12-20 13:32 ` Marc Zyngier
2012-12-20 13:32 ` Marc Zyngier
2012-12-20 14:42 ` Hiroshi Doyu
2012-12-20 14:42 ` Hiroshi Doyu
[not found] ` <20121220.164230.292625215885249791.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 17:09 ` Marc Zyngier
2012-12-20 17:09 ` Marc Zyngier
2012-12-20 17:09 ` Marc Zyngier
[not found] ` <50D34630.9020708-5wv7dgnIgG8@public.gmane.org>
2012-12-20 22:13 ` Peter De Schrijver
2012-12-20 22:13 ` Peter De Schrijver
2012-12-20 22:13 ` Peter De Schrijver
2012-12-20 13:25 ` Hiroshi Doyu
2012-12-20 13:25 ` Hiroshi Doyu
2012-12-20 13:25 ` Hiroshi Doyu
2012-12-20 13:33 ` Marc Zyngier [this message]
2012-12-20 13:33 ` Marc Zyngier
2012-12-20 9:44 ` [PATCH 6/9] ARM: dt: tegra114: Add new SoC base, Tegra 114 SoC Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
[not found] ` <1355996654-6579-7-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 11:27 ` Marc Zyngier
2012-12-20 11:27 ` Marc Zyngier
2012-12-20 11:27 ` Marc Zyngier
2012-12-29 6:39 ` Olof Johansson
2012-12-29 6:39 ` Olof Johansson
2012-12-29 6:39 ` Olof Johansson
2012-12-31 7:12 ` Hiroshi Doyu
2012-12-31 7:12 ` Hiroshi Doyu
2012-12-24 9:58 ` [PATCH 0/9] ARM: Initial support for " Mark Zhang
2012-12-24 9:58 ` Mark Zhang
[not found] ` <1355996654-6579-1-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 9:43 ` [PATCH 1/9] ARM: tegra: fuse: Add chipid TEGRA114 0x35 Hiroshi Doyu
2012-12-20 9:43 ` Hiroshi Doyu
2012-12-20 9:43 ` Hiroshi Doyu
2012-12-20 9:44 ` [PATCH 2/9] HACK: ARM: tegra: Use CLK_IGNORE_UNUSED for Tegra 114 SoC Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` [PATCH 7/9] ARM: dt: tegra114: Add new board, Dalmore Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` [PATCH 8/9] ARM: dt: tegra114: Add new board, Pluto Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` [PATCH 9/9] ARM: tegra: Add initial support for Tegra 114 SoC Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2012-12-20 9:44 ` Hiroshi Doyu
2013-01-03 16:28 ` Arnd Bergmann
2013-01-03 16:28 ` Arnd Bergmann
2013-01-04 7:16 ` Hiroshi Doyu
2013-01-04 7:16 ` Hiroshi Doyu
2013-01-04 7:16 ` Hiroshi Doyu
2013-01-03 14:06 ` [PATCH 0/9] ARM: Initial " Hiroshi Doyu
2013-01-03 14:06 ` Hiroshi Doyu
2013-01-03 14:06 ` Hiroshi Doyu
2013-01-03 21:00 ` Thierry Reding
2013-01-03 21:00 ` Thierry Reding
2013-01-03 21:00 ` Thierry Reding
2013-01-03 21:16 ` Stephen Warren
2013-01-03 21:16 ` Stephen Warren
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=50D313B2.8050805@arm.com \
--to=marc.zyngier@arm.com \
--cc=andrew@lunn.ch \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=hdoyu@nvidia.com \
--cc=jason@lakedaemon.net \
--cc=johnstul@us.ibm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=rob.herring@calxeda.com \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.