diff options
Diffstat (limited to 'drivers/clocksource')
-rw-r--r-- | drivers/clocksource/timer-riscv.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/clocksource/timer-riscv.c b/drivers/clocksource/timer-riscv.c index eb5ba2d8c2..ef67cff475 100644 --- a/drivers/clocksource/timer-riscv.c +++ b/drivers/clocksource/timer-riscv.c @@ -30,10 +30,17 @@ static u64 notrace riscv_timer_get_count_sbi(void) static u64 notrace riscv_timer_get_count_rdcycle(void) { - u64 ticks; - asm volatile("rdcycle %0" : "=r" (ticks)); + __maybe_unused u32 hi, lo; + + if (IS_ENABLED(CONFIG_64BIT)) + return csr_read(CSR_CYCLE); - return ticks; + do { + hi = csr_read(CSR_CYCLEH); + lo = csr_read(CSR_CYCLE); + } while (hi != csr_read(CSR_CYCLEH)); + + return ((u64)hi << 32) | lo; } static u64 notrace riscv_timer_get_count(void) |