hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/arch/riscv/include/asm/timex.h
....@@ -1,56 +1,87 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * Copyright (C) 2012 Regents of the University of California
3
- *
4
- * This program is free software; you can redistribute it and/or
5
- * modify it under the terms of the GNU General Public License
6
- * as published by the Free Software Foundation, version 2.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
124 */
135
146 #ifndef _ASM_RISCV_TIMEX_H
157 #define _ASM_RISCV_TIMEX_H
168
17
-#include <asm/param.h>
9
+#include <asm/csr.h>
1810
1911 typedef unsigned long cycles_t;
2012
21
-static inline cycles_t get_cycles_inline(void)
22
-{
23
- cycles_t n;
13
+#ifdef CONFIG_RISCV_M_MODE
2414
25
- __asm__ __volatile__ (
26
- "rdtime %0"
27
- : "=r" (n));
28
- return n;
29
-}
30
-#define get_cycles get_cycles_inline
15
+#include <asm/clint.h>
3116
3217 #ifdef CONFIG_64BIT
33
-static inline uint64_t get_cycles64(void)
18
+static inline cycles_t get_cycles(void)
3419 {
35
- return get_cycles();
20
+ return readq_relaxed(clint_time_val);
3621 }
37
-#else
38
-static inline uint64_t get_cycles64(void)
22
+#else /* !CONFIG_64BIT */
23
+static inline u32 get_cycles(void)
3924 {
40
- u32 lo, hi, tmp;
41
- __asm__ __volatile__ (
42
- "1:\n"
43
- "rdtimeh %0\n"
44
- "rdtime %1\n"
45
- "rdtimeh %2\n"
46
- "bne %0, %2, 1b"
47
- : "=&r" (hi), "=&r" (lo), "=&r" (tmp));
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
+/*
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.
40
+ */
41
+static inline unsigned long random_get_entropy(void)
42
+{
43
+ if (unlikely(clint_time_val == NULL))
44
+ return random_get_entropy_fallback();
45
+ return get_cycles();
46
+}
47
+#define random_get_entropy() random_get_entropy()
48
+
49
+#else /* CONFIG_RISCV_M_MODE */
50
+
51
+static inline cycles_t get_cycles(void)
52
+{
53
+ return csr_read(CSR_TIME);
54
+}
55
+#define get_cycles get_cycles
56
+
57
+static inline u32 get_cycles_hi(void)
58
+{
59
+ return csr_read(CSR_TIMEH);
60
+}
61
+#define get_cycles_hi get_cycles_hi
62
+
63
+#endif /* !CONFIG_RISCV_M_MODE */
64
+
65
+#ifdef CONFIG_64BIT
66
+static inline u64 get_cycles64(void)
67
+{
68
+ return get_cycles();
69
+}
70
+#else /* CONFIG_64BIT */
71
+static inline u64 get_cycles64(void)
72
+{
73
+ u32 hi, lo;
74
+
75
+ do {
76
+ hi = get_cycles_hi();
77
+ lo = get_cycles();
78
+ } while (hi != get_cycles_hi());
79
+
4880 return ((u64)hi << 32) | lo;
4981 }
50
-#endif
82
+#endif /* CONFIG_64BIT */
5183
5284 #define ARCH_HAS_READ_CURRENT_TIMER
53
-
5485 static inline int read_current_timer(unsigned long *timer_val)
5586 {
5687 *timer_val = get_cycles();