All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: James Hogan <james.hogan@imgtec.com>
Cc: linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org,
	Arnd Bergmann <arnd@arndb.de>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH v2 22/44] metag: Time keeping
Date: Fri, 4 Jan 2013 15:35:59 +0530	[thread overview]
Message-ID: <50E6A987.207@synopsys.com> (raw)
In-Reply-To: <1354723742-6195-23-git-send-email-james.hogan@imgtec.com>

Hi James,

On Wednesday 05 December 2012 09:38 PM, James Hogan wrote:

> +static unsigned int hwtimer_freq = HARDWARE_FREQ;
> +static DEFINE_PER_CPU(struct clock_event_device, local_clockevent);
> +static DEFINE_PER_CPU(char [11], local_clockevent_name);

> +void __cpuinit local_timer_setup(unsigned int cpu)
> +{
> +	unsigned int txdivtime;
> +	struct clock_event_device *clk = &per_cpu(local_clockevent, cpu);
> +	char *name = per_cpu(local_clockevent_name, cpu);
> +
> +	txdivtime = TBI_GETREG(TXDIVTIME);
> +
> +	txdivtime &= ~TXDIVTIME_DIV_BITS;
> +	txdivtime |= (HARDWARE_DIV & TXDIVTIME_DIV_BITS);
> +
> +	TBI_SETREG(TXDIVTIME, txdivtime);
> +
> +	sprintf(name, "META %d", cpu);
> +	clk->name = name;
> +	clk->features = CLOCK_EVT_FEAT_ONESHOT,
> +
> +	clk->rating = 200,
> +	clk->shift = 12,
> +	clk->irq = TBID_SIGNUM_TRT,
> +	clk->set_mode = metag_timer_set_mode,
> +	clk->set_next_event = metag_timer_set_next_event,
> +
> +	clk->mult = div_sc(hwtimer_freq, NSEC_PER_SEC, clk->shift);
> +	clk->max_delta_ns = clockevent_delta2ns(0x7fffffff, clk);
> +	clk->min_delta_ns = clockevent_delta2ns(0xf, clk);
> +	clk->cpumask = cpumask_of(cpu);
> +
> +	clockevents_register_device(clk);
> +
> +	/*
> +	 * For all non-boot CPUs we need to synchronize our free
> +	 * running clock (TXTIMER) with the boot CPU's clock.
> +	 *
> +	 * While this won't be accurate, it should be close enough.
> +	 */
> +	if (cpu) {
> +		unsigned int thread0 = cpu_2_hwthread_id[0];
> +		unsigned long val;
> +
> +		val = core_reg_read(TXUCT_ID, TXTIMER_REGNUM, thread0);
> +
> +		asm volatile("MOV TXTIMER, %0\n" : : "r" (val));
> +	}
> +}
> +
> +void __init time_init(void)
> +{
> +	/*
> +	 * On Meta 2 SoCs, the actual frequency of the timer is based on the
> +	 * Meta core clock speed divided by an integer, so it is only
> +	 * approximately 1MHz. Calculating the real frequency here drastically
> +	 * reduces clock skew on these SoCs.
> +	 */
> +#ifdef CONFIG_METAG_META21
> +	hwtimer_freq = get_coreclock() / (metag_in32(EXPAND_TIMER_DIV) + 1);
> +#endif
> +	clocksource_register_hz(&clocksource_metag, hwtimer_freq);
> +
> +	setup_irq(TBID_SIGNUM_TRT, &metag_timer_irq);
> +
> +	local_timer_setup(smp_processor_id());
> +}

I have a kludge in ARC port in this subsystem - which I hope you could help clear.

ARC also has a local timer device used for clockevent on each CPU. A one-time
setup_irq() with IRQF_PERCPU - would indeed setup the generic IRQ subsystem - for
making registration effective for all CPUs. However don't you need some per-cpu
magic - say enabling the IRQ at cpu or embedded interrupt controller level -
assuming you starts off with all IRQs disabled (which ARC Linux does).

So we end up using different APIs - request_percpu_irq() as equivalent of
setup_irq() on boot-cpu only and then each CPU calling enable_percpu_irq() to do
the local magic. request_percpu_irq() in turn requires an apriori call to
irq_set_percpu_devid().

https://lkml.org/lkml/2012/11/7/128

Do don't seem to be requiring all of this hence I'm wondering how it works for you!

-Vineet

WARNING: multiple messages have this Message-ID (diff)
From: Vineet Gupta <Vineet.Gupta1@synopsys.com>
To: James Hogan <james.hogan@imgtec.com>
Cc: <linux-arch@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	"Arnd Bergmann" <arnd@arndb.de>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH v2 22/44] metag: Time keeping
Date: Fri, 4 Jan 2013 15:35:59 +0530	[thread overview]
Message-ID: <50E6A987.207@synopsys.com> (raw)
In-Reply-To: <1354723742-6195-23-git-send-email-james.hogan@imgtec.com>

Hi James,

On Wednesday 05 December 2012 09:38 PM, James Hogan wrote:

> +static unsigned int hwtimer_freq = HARDWARE_FREQ;
> +static DEFINE_PER_CPU(struct clock_event_device, local_clockevent);
> +static DEFINE_PER_CPU(char [11], local_clockevent_name);

> +void __cpuinit local_timer_setup(unsigned int cpu)
> +{
> +	unsigned int txdivtime;
> +	struct clock_event_device *clk = &per_cpu(local_clockevent, cpu);
> +	char *name = per_cpu(local_clockevent_name, cpu);
> +
> +	txdivtime = TBI_GETREG(TXDIVTIME);
> +
> +	txdivtime &= ~TXDIVTIME_DIV_BITS;
> +	txdivtime |= (HARDWARE_DIV & TXDIVTIME_DIV_BITS);
> +
> +	TBI_SETREG(TXDIVTIME, txdivtime);
> +
> +	sprintf(name, "META %d", cpu);
> +	clk->name = name;
> +	clk->features = CLOCK_EVT_FEAT_ONESHOT,
> +
> +	clk->rating = 200,
> +	clk->shift = 12,
> +	clk->irq = TBID_SIGNUM_TRT,
> +	clk->set_mode = metag_timer_set_mode,
> +	clk->set_next_event = metag_timer_set_next_event,
> +
> +	clk->mult = div_sc(hwtimer_freq, NSEC_PER_SEC, clk->shift);
> +	clk->max_delta_ns = clockevent_delta2ns(0x7fffffff, clk);
> +	clk->min_delta_ns = clockevent_delta2ns(0xf, clk);
> +	clk->cpumask = cpumask_of(cpu);
> +
> +	clockevents_register_device(clk);
> +
> +	/*
> +	 * For all non-boot CPUs we need to synchronize our free
> +	 * running clock (TXTIMER) with the boot CPU's clock.
> +	 *
> +	 * While this won't be accurate, it should be close enough.
> +	 */
> +	if (cpu) {
> +		unsigned int thread0 = cpu_2_hwthread_id[0];
> +		unsigned long val;
> +
> +		val = core_reg_read(TXUCT_ID, TXTIMER_REGNUM, thread0);
> +
> +		asm volatile("MOV TXTIMER, %0\n" : : "r" (val));
> +	}
> +}
> +
> +void __init time_init(void)
> +{
> +	/*
> +	 * On Meta 2 SoCs, the actual frequency of the timer is based on the
> +	 * Meta core clock speed divided by an integer, so it is only
> +	 * approximately 1MHz. Calculating the real frequency here drastically
> +	 * reduces clock skew on these SoCs.
> +	 */
> +#ifdef CONFIG_METAG_META21
> +	hwtimer_freq = get_coreclock() / (metag_in32(EXPAND_TIMER_DIV) + 1);
> +#endif
> +	clocksource_register_hz(&clocksource_metag, hwtimer_freq);
> +
> +	setup_irq(TBID_SIGNUM_TRT, &metag_timer_irq);
> +
> +	local_timer_setup(smp_processor_id());
> +}

I have a kludge in ARC port in this subsystem - which I hope you could help clear.

ARC also has a local timer device used for clockevent on each CPU. A one-time
setup_irq() with IRQF_PERCPU - would indeed setup the generic IRQ subsystem - for
making registration effective for all CPUs. However don't you need some per-cpu
magic - say enabling the IRQ at cpu or embedded interrupt controller level -
assuming you starts off with all IRQs disabled (which ARC Linux does).

So we end up using different APIs - request_percpu_irq() as equivalent of
setup_irq() on boot-cpu only and then each CPU calling enable_percpu_irq() to do
the local magic. request_percpu_irq() in turn requires an apriori call to
irq_set_percpu_devid().

https://lkml.org/lkml/2012/11/7/128

Do don't seem to be requiring all of this hence I'm wondering how it works for you!

-Vineet

  reply	other threads:[~2013-01-04 10:06 UTC|newest]

Thread overview: 151+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-05 16:08 [PATCH v2 00/44] Meta Linux Kernel Port James Hogan
2012-12-05 16:08 ` James Hogan
2012-12-05 16:08 ` [PATCH v2 01/44] asm-generic/io.h: remove asm/cacheflush.h include James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 02/44] asm-generic/unistd.h: handle symbol prefixes in cond_syscall James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 03/44] Add CONFIG_HAVE_64BIT_ALIGNED_STRUCT for taskstats James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-08  3:43   ` H. Peter Anvin
2012-12-10 10:22     ` James Hogan
2012-12-10 10:22       ` James Hogan
2012-12-10 12:55       ` Geert Uytterhoeven
2012-12-17  9:51         ` James Hogan
2012-12-17  9:51           ` James Hogan
2012-12-17 19:11           ` David Miller
2012-12-05 16:08 ` [PATCH v2 04/44] trace/ring_buffer: handle 64bit aligned structs James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-08  1:24   ` Steven Rostedt
2012-12-10 10:27     ` James Hogan
2012-12-10 10:27       ` James Hogan
2012-12-05 16:08 ` [PATCH v2 05/44] Revert some of "binfmt_elf: cleanups" James Hogan
2012-12-05 16:08   ` James Hogan
     [not found] ` <1354723742-6195-1-git-send-email-james.hogan-1AXoQHu6uovQT0dZR+AlfA@public.gmane.org>
2012-12-05 16:08   ` [PATCH v2 06/44] of/vendor-prefixes: add Imagination Technologies James Hogan
2012-12-05 16:08     ` James Hogan
2012-12-05 16:08     ` James Hogan
2012-12-05 22:28     ` Grant Likely
2012-12-05 22:28       ` Grant Likely
2012-12-05 22:28       ` Grant Likely
2012-12-06  9:24       ` James Hogan
2012-12-06  9:24         ` James Hogan
2012-12-05 16:08 ` [PATCH v2 07/44] metag: Add MAINTAINERS entry James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 08/44] metag: Headers for core arch constants James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 09/44] metag: Header for core memory mapped registers James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 10/44] metag: Boot James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 11/44] metag; TBX header James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 12/44] metag: TBX source James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 18:53   ` Joe Perches
2012-12-06  9:35     ` James Hogan
2012-12-06  9:35       ` James Hogan
2012-12-06 12:59       ` Joe Perches
2012-12-06 15:03         ` James Hogan
2012-12-06 15:03           ` James Hogan
2012-12-05 16:08 ` [PATCH v2 13/44] metag: Cache/TLB handling James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 14/44] metag: Memory management James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 15/44] metag: Memory handling James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 16/44] metag: Huge TLB James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 17/44] metag: Highmem support James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 18/44] metag: TCM support James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 19/44] metag: Signal handling James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 17:16   ` Al Viro
2012-12-06 11:17     ` James Hogan
2012-12-06 11:17       ` James Hogan
2012-12-06 22:09       ` [braindump][RFC] signals and syscall restarts (Re: [PATCH v2 19/44] metag: Signal handling) Al Viro
2012-12-08  7:44         ` Al Viro
2012-12-15 16:26           ` Jonas Bonn
2012-12-15 17:07             ` Al Viro
2012-12-08 18:14         ` Al Viro
2012-12-12  9:44           ` James Hogan
2012-12-12  9:44             ` James Hogan
2012-12-10 10:40         ` James Hogan
2012-12-10 10:40           ` James Hogan
2012-12-05 16:08 ` [PATCH v2 20/44] metag: Device tree James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 21/44] metag: ptrace James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 22/44] metag: Time keeping James Hogan
2012-12-05 16:08   ` James Hogan
2013-01-04 10:05   ` Vineet Gupta [this message]
2013-01-04 10:05     ` Vineet Gupta
2013-01-04 12:21     ` James Hogan
2013-01-04 12:21       ` James Hogan
2013-01-04 12:48       ` Vineet Gupta
2013-01-04 12:48         ` Vineet Gupta
2013-01-04 13:11         ` James Hogan
2013-01-04 13:11           ` James Hogan
2012-12-05 16:08 ` [PATCH v2 23/44] metag: Traps James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 17:40   ` Al Viro
2012-12-06 11:43     ` James Hogan
2012-12-06 11:43       ` James Hogan
2012-12-05 16:08 ` [PATCH v2 24/44] metag: IRQ handling James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 25/44] metag: System Calls James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 26/44] metag: Scheduling/Process management James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 27/44] metag: Module support James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 28/44] metag: Atomics, locks and bitops James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 29/44] metag: Basic documentation James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 30/44] metag: SMP support James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 31/44] metag: DMA James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 32/44] metag: Optimised library functions James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 33/44] metag: Stack unwinding James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 34/44] metag: Various other headers James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 35/44] mm: define VM_GROWSUP for CONFIG_METAG James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 36/44] Add metag to various Kconfig dependency lists James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 37/44] metag: Build infrastructure James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 38/44] metag: Perf James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 39/44] metag: ftrace support James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 40/44] scripts/checkstack.pl: Add metag support James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:08 ` [PATCH v2 41/44] metag: OProfile James Hogan
2012-12-05 16:08   ` James Hogan
2012-12-05 16:09 ` [PATCH v2 42/44] metag: Add JTAG Debug Adapter (DA) support James Hogan
2012-12-05 16:09   ` James Hogan
2012-12-05 16:09 ` [PATCH v2 43/44] tty/metag_da: Add metag DA TTY driver James Hogan
2012-12-05 16:09   ` James Hogan
2012-12-05 17:24   ` Alan Cox
2012-12-05 17:24     ` Alan Cox
2013-01-04 14:11     ` James Hogan
2013-01-04 14:11       ` James Hogan
2013-01-04 17:00       ` Alan Cox
2013-01-04 17:00         ` Alan Cox
2013-01-07 11:30         ` James Hogan
2013-01-07 11:30           ` James Hogan
2013-01-07 11:54           ` Alan Cox
2013-01-07 11:54             ` Alan Cox
2012-12-05 16:09 ` [PATCH v2 44/44] fs: imgdafs: Add IMG DAFS filesystem for metag James Hogan
2012-12-05 16:09   ` James Hogan
2012-12-05 17:11 ` [PATCH v2 00/44] Meta Linux Kernel Port Al Viro
2012-12-05 18:39   ` Al Viro
2012-12-18 16:09     ` James Hogan
2012-12-18 16:09       ` James Hogan
2012-12-06  9:19   ` James Hogan
2012-12-06  9:19     ` James Hogan

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=50E6A987.207@synopsys.com \
    --to=vineet.gupta1@synopsys.com \
    --cc=arnd@arndb.de \
    --cc=james.hogan@imgtec.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --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.