| From f2cdb0ee7821bd104da55490b74da715ad1a3e9f Mon Sep 17 00:00:00 2001 |
| From: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com> |
| Date: Tue, 13 Aug 2013 14:30:32 +0100 |
| Subject: ARM: arch_timer: add support to configure and enable event stream |
| |
| This patch adds support for configuring the event stream frequency |
| and enabling it. |
| |
| It also adds the hwcaps definitions to the user to detect this event |
| stream feature. |
| |
| Cc: Russell King <linux@arm.linux.org.uk> |
| Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> |
| Acked-by: Catalin Marinas <catalin.marinas@arm.com> |
| Acked-by: Will Deacon <will.deacon@arm.com> |
| Acked-by: Olof Johansson <olof@lixom.net> |
| Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com> |
| (cherry picked from commit e9faebc66ec74f1ab7f267d683b45e80faa69763) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| |
| Conflicts: |
| arch/arm/include/asm/arch_timer.h |
| --- |
| arch/arm/include/asm/arch_timer.h | 27 ++++++++++++++++++++++++--- |
| arch/arm/include/uapi/asm/hwcap.h | 1 + |
| arch/arm/kernel/setup.c | 1 + |
| 3 files changed, 26 insertions(+), 3 deletions(-) |
| |
| diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h |
| index c78c4cbd329e..0704e0cf5571 100644 |
| --- a/arch/arm/include/asm/arch_timer.h |
| +++ b/arch/arm/include/asm/arch_timer.h |
| @@ -87,11 +87,21 @@ static inline u64 arch_counter_get_cntvct(void) |
| return cval; |
| } |
| |
| -static inline void __cpuinit arch_counter_set_user_access(void) |
| +static inline u32 arch_timer_get_cntkctl(void) |
| { |
| u32 cntkctl; |
| - |
| asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (cntkctl)); |
| + return cntkctl; |
| +} |
| + |
| +static inline void arch_timer_set_cntkctl(u32 cntkctl) |
| +{ |
| + asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl)); |
| +} |
| + |
| +static inline void arch_counter_set_user_access(void) |
| +{ |
| + u32 cntkctl = arch_timer_get_cntkctl(); |
| |
| /* Disable user access to both physical/virtual counters/timers */ |
| /* Also disable virtual event stream */ |
| @@ -100,9 +110,20 @@ static inline void __cpuinit arch_counter_set_user_access(void) |
| | ARCH_TIMER_VIRT_EVT_EN |
| | ARCH_TIMER_USR_VCT_ACCESS_EN |
| | ARCH_TIMER_USR_PCT_ACCESS_EN); |
| + arch_timer_set_cntkctl(cntkctl); |
| +} |
| |
| - asm volatile("mcr p15, 0, %0, c14, c1, 0" : : "r" (cntkctl)); |
| +static inline void arch_timer_evtstrm_enable(int divider) |
| +{ |
| + u32 cntkctl = arch_timer_get_cntkctl(); |
| + cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK; |
| + /* Set the divider and enable virtual event stream */ |
| + cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT) |
| + | ARCH_TIMER_VIRT_EVT_EN; |
| + arch_timer_set_cntkctl(cntkctl); |
| + elf_hwcap |= HWCAP_EVTSTRM; |
| } |
| + |
| #endif |
| |
| #endif |
| diff --git a/arch/arm/include/uapi/asm/hwcap.h b/arch/arm/include/uapi/asm/hwcap.h |
| index 6d34d080372a..7dcc10d67253 100644 |
| --- a/arch/arm/include/uapi/asm/hwcap.h |
| +++ b/arch/arm/include/uapi/asm/hwcap.h |
| @@ -26,5 +26,6 @@ |
| #define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */ |
| #define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT) |
| #define HWCAP_LPAE (1 << 20) |
| +#define HWCAP_EVTSTRM (1 << 21) |
| |
| #endif /* _UAPI__ASMARM_HWCAP_H */ |
| diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c |
| index 6cc3db43e897..d62772f49907 100644 |
| --- a/arch/arm/kernel/setup.c |
| +++ b/arch/arm/kernel/setup.c |
| @@ -878,6 +878,7 @@ static const char *hwcap_str[] = { |
| "idiva", |
| "idivt", |
| "lpae", |
| + "evtstrm", |
| NULL |
| }; |
| |
| -- |
| 1.8.5.rc3 |
| |