WIP FPC-III support
[linux/fpc-iii.git] / arch / riscv / include / asm / timex.h
blob81de51e6aa32b3e6690bad5bb7ed6ebe206029cd
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (C) 2012 Regents of the University of California
4 */
6 #ifndef _ASM_RISCV_TIMEX_H
7 #define _ASM_RISCV_TIMEX_H
9 #include <asm/csr.h>
11 typedef unsigned long cycles_t;
13 #ifdef CONFIG_RISCV_M_MODE
15 #include <asm/clint.h>
17 #ifdef CONFIG_64BIT
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
39 * we just return 0.
41 static inline unsigned long random_get_entropy(void)
43 if (unlikely(clint_time_val == NULL))
44 return 0;
45 return get_cycles();
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 */
65 #ifdef CONFIG_64BIT
66 static inline u64 get_cycles64(void)
68 return get_cycles();
70 #else /* CONFIG_64BIT */
71 static inline u64 get_cycles64(void)
73 u32 hi, lo;
75 do {
76 hi = get_cycles_hi();
77 lo = get_cycles();
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();
88 return 0;
91 #endif /* _ASM_RISCV_TIMEX_H */