Skip to content

Commit

Permalink
drivers: clocksource: add support for ARM architected timer event stream
Browse files Browse the repository at this point in the history
The ARM architected timer can generate events (used for waking up
CPUs executing the wfe instruction) at a frequency represented as a
power-of-2 divisor of the clock rate.

An event stream might be used:
- To implement wfe-based timeouts for userspace locking implementations.
- To impose a timeout on a wfe for safeguarding against any programming
  error in case an expected event is not generated.

This patch computes the event stream frequency aiming for a period
of 100us between events. It uses ARM/ARM64 specific backends to configure
and enable the event stream.

Change-Id: I43906fa7d083a2c611c2047e15c34d68bb047ac7
Cc: Lorenzo Pieralisi <[email protected]>
Reviewed-by: Catalin Marinas <[email protected]>
Acked-by: Olof Johansson <[email protected]>
Signed-off-by: Will Deacon <[email protected]>
[sudeep: moving ARM/ARM64 changes into separate patches
         and adding Kconfig option]
Signed-off-by: Sudeep KarkadaNagesha <[email protected]>
Git-commit: 37f637767a82907efedda78d3ff405c34020075
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
[[email protected]: Fixed trivial merge conflicts]
Signed-off-by: Trilok Soni <[email protected]>
  • Loading branch information
wildea01 authored and Gerrit - the friendly Code Review server committed Jan 16, 2015
1 parent 2889093 commit 74381fb
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
15 changes: 15 additions & 0 deletions drivers/clocksource/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,21 @@ config ARM_ARCH_TIMER
bool
select CLKSRC_OF if OF

config ARM_ARCH_TIMER_EVTSTREAM
bool "Support for ARM architected timer event stream generation"
default y if ARM_ARCH_TIMER
help
This option enables support for event stream generation based on
the ARM architected timer. It is used for waking up CPUs executing
the wfe instruction at a frequency represented as a power-of-2
divisor of the clock rate.
The main use of the event stream is wfe-based timeouts of userspace
locking implementations. It might also be useful for imposing timeout
on wfe to safeguard against any programming errors in case an expected
event is not generated.
This must be disabled for hardware validation purposes to detect any
hardware anomalies of missing events.

config CLKSRC_METAG_GENERIC
def_bool y if METAG
help
Expand Down
17 changes: 16 additions & 1 deletion drivers/clocksource/arm_arch_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,20 @@ static void arch_counter_set_user_access(void)
arch_timer_set_cntkctl(cntkctl);
}

static int __cpuinit arch_timer_setup(struct clock_event_device *clk)
static void arch_timer_configure_evtstream(void)
{
int evt_stream_div, pos;

/* Find the closest power of two to the divisor */
evt_stream_div = arch_timer_rate / ARCH_TIMER_EVT_STREAM_FREQ;
pos = fls(evt_stream_div);
if (pos > 1 && !(evt_stream_div & (1 << (pos - 2))))
pos--;
/* enable event stream */
arch_timer_evtstrm_enable(min(pos, 15));
}

static int arch_timer_setup(struct clock_event_device *clk)
{
__arch_timer_setup(ARCH_CP15_TIMER, clk);

Expand All @@ -338,6 +351,8 @@ static int __cpuinit arch_timer_setup(struct clock_event_device *clk)
}

arch_counter_set_user_access();
if (IS_ENABLED(CONFIG_ARM_ARCH_TIMER_EVTSTREAM))
arch_timer_configure_evtstream();

return 0;
}
Expand Down
2 changes: 2 additions & 0 deletions include/clocksource/arm_arch_timer.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
#define ARCH_TIMER_USR_VT_ACCESS_EN (1 << 8) /* virtual timer registers */
#define ARCH_TIMER_USR_PT_ACCESS_EN (1 << 9) /* physical timer registers */

#define ARCH_TIMER_EVT_STREAM_FREQ 10000 /* 100us */

#ifdef CONFIG_ARM_ARCH_TIMER

extern u32 arch_timer_get_rate(void);
Expand Down

0 comments on commit 74381fb

Please sign in to comment.