The K210 doesn't implement rdtime in M-mode, and since that's where Linux runs in the NOMMU systems that means we can't use rdtime. The K210 is the only system that anyone is currently running NOMMU or M-mode on, so here we're just inlining the timer read directly. This also adds the CLINT driver as an !MMU dependency, as it's currently the only timer driver availiable for these systems and without it we get a build failure for some configurations. Tested-by: Damien Le Moal <damien.lemoal@wdc.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
79 lines
1.4 KiB
C
79 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2012 Regents of the University of California
|
|
*/
|
|
|
|
#ifndef _ASM_RISCV_TIMEX_H
|
|
#define _ASM_RISCV_TIMEX_H
|
|
|
|
#include <asm/csr.h>
|
|
|
|
typedef unsigned long cycles_t;
|
|
|
|
#ifdef CONFIG_RISCV_M_MODE
|
|
|
|
#include <asm/clint.h>
|
|
|
|
#ifdef CONFIG_64BIT
|
|
static inline cycles_t get_cycles(void)
|
|
{
|
|
return readq_relaxed(clint_time_val);
|
|
}
|
|
#else /* !CONFIG_64BIT */
|
|
static inline u32 get_cycles(void)
|
|
{
|
|
return readl_relaxed(((u32 *)clint_time_val));
|
|
}
|
|
#define get_cycles get_cycles
|
|
|
|
static inline u32 get_cycles_hi(void)
|
|
{
|
|
return readl_relaxed(((u32 *)clint_time_val) + 1);
|
|
}
|
|
#define get_cycles_hi get_cycles_hi
|
|
#endif /* CONFIG_64BIT */
|
|
|
|
#else /* CONFIG_RISCV_M_MODE */
|
|
|
|
static inline cycles_t get_cycles(void)
|
|
{
|
|
return csr_read(CSR_TIME);
|
|
}
|
|
#define get_cycles get_cycles
|
|
|
|
static inline u32 get_cycles_hi(void)
|
|
{
|
|
return csr_read(CSR_TIMEH);
|
|
}
|
|
#define get_cycles_hi get_cycles_hi
|
|
|
|
#ifdef CONFIG_64BIT
|
|
static inline u64 get_cycles64(void)
|
|
{
|
|
return get_cycles();
|
|
}
|
|
#else /* CONFIG_64BIT */
|
|
static inline u64 get_cycles64(void)
|
|
{
|
|
u32 hi, lo;
|
|
|
|
do {
|
|
hi = get_cycles_hi();
|
|
lo = get_cycles();
|
|
} while (hi != get_cycles_hi());
|
|
|
|
return ((u64)hi << 32) | lo;
|
|
}
|
|
#endif /* CONFIG_64BIT */
|
|
|
|
#endif /* !CONFIG_RISCV_M_MODE */
|
|
|
|
#define ARCH_HAS_READ_CURRENT_TIMER
|
|
static inline int read_current_timer(unsigned long *timer_val)
|
|
{
|
|
*timer_val = get_cycles();
|
|
return 0;
|
|
}
|
|
|
|
#endif /* _ASM_RISCV_TIMEX_H */
|