Skip to content
Snippets Groups Projects
Commit 5bd2f7da authored by Sudeep KarkadaNagesha's avatar Sudeep KarkadaNagesha Committed by Devin Kim
Browse files

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.

Bug: 18273388
Change-Id: I58a9bdc06fe51587c4264af256012b5f7f3af354
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarWill Deacon <will.deacon@arm.com>
Acked-by: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarSudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


Git-commit: e9faebc6
Signed-off-by: default avatarTrilok Soni <tsoni@codeaurora.org>
parent 903f7e3e
Branches
Tags
No related merge requests found
...@@ -99,11 +99,21 @@ static notrace inline u64 arch_counter_get_cntvct_cp15(void) ...@@ -99,11 +99,21 @@ static notrace inline u64 arch_counter_get_cntvct_cp15(void)
return cval; return cval;
} }
static inline void __cpuinit arch_counter_set_user_access(void) static inline u32 arch_timer_get_cntkctl(void)
{ {
u32 cntkctl; u32 cntkctl;
asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r" (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 */ /* Disable user access to both physical/virtual counters/timers */
/* Also disable virtual event stream */ /* Also disable virtual event stream */
...@@ -112,9 +122,20 @@ static inline void __cpuinit arch_counter_set_user_access(void) ...@@ -112,9 +122,20 @@ static inline void __cpuinit arch_counter_set_user_access(void)
| ARCH_TIMER_VIRT_EVT_EN | ARCH_TIMER_VIRT_EVT_EN
| ARCH_TIMER_USR_VCT_ACCESS_EN | ARCH_TIMER_USR_VCT_ACCESS_EN
| ARCH_TIMER_USR_PCT_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
#endif #endif
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define HWCAP_IDIVT (1 << 18) #define HWCAP_IDIVT (1 << 18)
#define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */ #define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */
#define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT) #define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT)
#define HWCAP_LPAE (1 << 20)
#define HWCAP_EVTSTRM (1 << 21)
#endif /* _UAPI__ASMARM_HWCAP_H */ #endif /* _UAPI__ASMARM_HWCAP_H */
...@@ -881,6 +881,9 @@ static const char *hwcap_str[] = { ...@@ -881,6 +881,9 @@ static const char *hwcap_str[] = {
"vfpv4", "vfpv4",
"idiva", "idiva",
"idivt", "idivt",
"vfpd32",
"lpae",
"evtstrm",
NULL NULL
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment