|
@@ -87,11 +87,21 @@ static inline u64 arch_counter_get_cntvct(void)
|
|
|
return cval;
|
|
|
}
|
|
|
|
|
|
-static inline void 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 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
|