xref: /openbmc/linux/arch/riscv/include/asm/timex.h (revision d5be89a8)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2012 Regents of the University of California
4  */
5 
6 #ifndef _ASM_RISCV_TIMEX_H
7 #define _ASM_RISCV_TIMEX_H
8 
9 #include <asm/csr.h>
10 
11 typedef unsigned long cycles_t;
12 
13 #ifdef CONFIG_RISCV_M_MODE
14 
15 #include <asm/clint.h>
16 
17 #ifdef CONFIG_64BIT
18 static inline cycles_t get_cycles(void)
19 {
20 	return readq_relaxed(clint_time_val);
21 }
22 #else /* !CONFIG_64BIT */
23 static inline u32 get_cycles(void)
24 {
25 	return readl_relaxed(((u32 *)clint_time_val));
26 }
27 #define get_cycles get_cycles
28 
29 static inline u32 get_cycles_hi(void)
30 {
31 	return readl_relaxed(((u32 *)clint_time_val) + 1);
32 }
33 #define get_cycles_hi get_cycles_hi
34 #endif /* CONFIG_64BIT */
35 
36 #else /* CONFIG_RISCV_M_MODE */
37 
38 static inline cycles_t get_cycles(void)
39 {
40 	return csr_read(CSR_TIME);
41 }
42 #define get_cycles get_cycles
43 
44 static inline u32 get_cycles_hi(void)
45 {
46 	return csr_read(CSR_TIMEH);
47 }
48 #define get_cycles_hi get_cycles_hi
49 
50 #ifdef CONFIG_64BIT
51 static inline u64 get_cycles64(void)
52 {
53 	return get_cycles();
54 }
55 #else /* CONFIG_64BIT */
56 static inline u64 get_cycles64(void)
57 {
58 	u32 hi, lo;
59 
60 	do {
61 		hi = get_cycles_hi();
62 		lo = get_cycles();
63 	} while (hi != get_cycles_hi());
64 
65 	return ((u64)hi << 32) | lo;
66 }
67 #endif /* CONFIG_64BIT */
68 
69 #endif /* !CONFIG_RISCV_M_MODE */
70 
71 #define ARCH_HAS_READ_CURRENT_TIMER
72 static inline int read_current_timer(unsigned long *timer_val)
73 {
74 	*timer_val = get_cycles();
75 	return 0;
76 }
77 
78 #endif /* _ASM_RISCV_TIMEX_H */
79