All of lore.kernel.org
 help / color / mirror / Atom feed
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 12:05:45 +0000	[thread overview]
Message-ID: <50D2FF19.4060600@arm.com> (raw)
In-Reply-To: <20121220.135758.1347753620353343245.hdoyu@nvidia.com>

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.

	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 12:05:45 +0000	[thread overview]
Message-ID: <50D2FF19.4060600@arm.com> (raw)
In-Reply-To: <20121220.135758.1347753620353343245.hdoyu@nvidia.com>

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.

	M.

-- 
Jazz is not dead. It just smells funny...

  reply	other threads:[~2012-12-20 12:05 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 [this message]
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
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
     [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
2012-12-24  9:58 ` Mark Zhang
2012-12-24  9:58   ` Mark Zhang

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=50D2FF19.4060600@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.