|
@@ -158,6 +158,7 @@ u32 arch_timer_reg_read(int access, enum arch_timer_reg reg,
|
|
|
* if we don't have the cp15 accessors we won't have a problem.
|
|
|
*/
|
|
|
u64 (*arch_timer_read_counter)(void) = arch_counter_get_cntvct;
|
|
|
+EXPORT_SYMBOL_GPL(arch_timer_read_counter);
|
|
|
|
|
|
static u64 arch_counter_read(struct clocksource *cs)
|
|
|
{
|
|
@@ -329,16 +330,19 @@ static void erratum_set_next_event_tval_generic(const int access, unsigned long
|
|
|
struct clock_event_device *clk)
|
|
|
{
|
|
|
unsigned long ctrl;
|
|
|
- u64 cval = evt + arch_counter_get_cntvct();
|
|
|
+ u64 cval;
|
|
|
|
|
|
ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk);
|
|
|
ctrl |= ARCH_TIMER_CTRL_ENABLE;
|
|
|
ctrl &= ~ARCH_TIMER_CTRL_IT_MASK;
|
|
|
|
|
|
- if (access == ARCH_TIMER_PHYS_ACCESS)
|
|
|
+ if (access == ARCH_TIMER_PHYS_ACCESS) {
|
|
|
+ cval = evt + arch_counter_get_cntpct();
|
|
|
write_sysreg(cval, cntp_cval_el0);
|
|
|
- else
|
|
|
+ } else {
|
|
|
+ cval = evt + arch_counter_get_cntvct();
|
|
|
write_sysreg(cval, cntv_cval_el0);
|
|
|
+ }
|
|
|
|
|
|
arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk);
|
|
|
}
|
|
@@ -913,7 +917,7 @@ static void __init arch_counter_register(unsigned type)
|
|
|
|
|
|
/* Register the CP15 based counter if we have one */
|
|
|
if (type & ARCH_TIMER_TYPE_CP15) {
|
|
|
- if (IS_ENABLED(CONFIG_ARM64) ||
|
|
|
+ if ((IS_ENABLED(CONFIG_ARM64) && !is_hyp_mode_available()) ||
|
|
|
arch_timer_uses_ppi == ARCH_TIMER_VIRT_PPI)
|
|
|
arch_timer_read_counter = arch_counter_get_cntvct;
|
|
|
else
|