diff options
Diffstat (limited to 'arch/arm/include/asm/arch_timer.h')
| -rw-r--r-- | arch/arm/include/asm/arch_timer.h | 36 | 
1 files changed, 31 insertions, 5 deletions
diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h index 5665134bfa3e..0704e0cf5571 100644 --- a/arch/arm/include/asm/arch_timer.h +++ b/arch/arm/include/asm/arch_timer.h @@ -87,17 +87,43 @@ 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; +} -	/* disable user access to everything */ -	cntkctl &= ~((3 << 8) | (7 << 0)); - +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 */ +	cntkctl &= ~(ARCH_TIMER_USR_PT_ACCESS_EN +			| ARCH_TIMER_USR_VT_ACCESS_EN +			| ARCH_TIMER_VIRT_EVT_EN +			| ARCH_TIMER_USR_VCT_ACCESS_EN +			| ARCH_TIMER_USR_PCT_ACCESS_EN); +	arch_timer_set_cntkctl(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  |