1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (C) 2012 Regents of the University of California
6 #ifndef _ASM_RISCV_TIMEX_H
7 #define _ASM_RISCV_TIMEX_H
11 typedef unsigned long cycles_t
;
13 #ifdef CONFIG_RISCV_M_MODE
15 #include <asm/clint.h>
18 static inline cycles_t
get_cycles(void)
20 return readq_relaxed(clint_time_val
);
22 #else /* !CONFIG_64BIT */
23 static inline u32
get_cycles(void)
25 return readl_relaxed(((u32
*)clint_time_val
));
27 #define get_cycles get_cycles
29 static inline u32
get_cycles_hi(void)
31 return readl_relaxed(((u32
*)clint_time_val
) + 1);
33 #define get_cycles_hi get_cycles_hi
34 #endif /* CONFIG_64BIT */
37 * Much like MIPS, we may not have a viable counter to use at an early point
38 * in the boot process. Unfortunately we don't have a fallback, so instead
41 static inline unsigned long random_get_entropy(void)
43 if (unlikely(clint_time_val
== NULL
))
47 #define random_get_entropy() random_get_entropy()
49 #else /* CONFIG_RISCV_M_MODE */
51 static inline cycles_t
get_cycles(void)
53 return csr_read(CSR_TIME
);
55 #define get_cycles get_cycles
57 static inline u32
get_cycles_hi(void)
59 return csr_read(CSR_TIMEH
);
61 #define get_cycles_hi get_cycles_hi
63 #endif /* !CONFIG_RISCV_M_MODE */
66 static inline u64
get_cycles64(void)
70 #else /* CONFIG_64BIT */
71 static inline u64
get_cycles64(void)
78 } while (hi
!= get_cycles_hi());
80 return ((u64
)hi
<< 32) | lo
;
82 #endif /* CONFIG_64BIT */
84 #define ARCH_HAS_READ_CURRENT_TIMER
85 static inline int read_current_timer(unsigned long *timer_val
)
87 *timer_val
= get_cycles();
91 #endif /* _ASM_RISCV_TIMEX_H */