Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
fork
Configure Feed
Select the types of activity you want to include in your feed.
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
11typedef unsigned long cycles_t;
12
13#ifdef CONFIG_RISCV_M_MODE
14
15#include <asm/clint.h>
16
17#ifdef CONFIG_64BIT
18static inline cycles_t get_cycles(void)
19{
20 return readq_relaxed(clint_time_val);
21}
22#else /* !CONFIG_64BIT */
23static inline u32 get_cycles(void)
24{
25 return readl_relaxed(((u32 *)clint_time_val));
26}
27#define get_cycles get_cycles
28
29static 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 */
41static inline unsigned long random_get_entropy(void)
42{
43 if (unlikely(clint_time_val == NULL))
44 return 0;
45 return get_cycles();
46}
47#define random_get_entropy() random_get_entropy()
48
49#else /* CONFIG_RISCV_M_MODE */
50
51static inline cycles_t get_cycles(void)
52{
53 return csr_read(CSR_TIME);
54}
55#define get_cycles get_cycles
56
57static inline u32 get_cycles_hi(void)
58{
59 return csr_read(CSR_TIMEH);
60}
61#define get_cycles_hi get_cycles_hi
62
63#ifdef CONFIG_64BIT
64static inline u64 get_cycles64(void)
65{
66 return get_cycles();
67}
68#else /* CONFIG_64BIT */
69static inline u64 get_cycles64(void)
70{
71 u32 hi, lo;
72
73 do {
74 hi = get_cycles_hi();
75 lo = get_cycles();
76 } while (hi != get_cycles_hi());
77
78 return ((u64)hi << 32) | lo;
79}
80#endif /* CONFIG_64BIT */
81
82#endif /* !CONFIG_RISCV_M_MODE */
83
84#define ARCH_HAS_READ_CURRENT_TIMER
85static inline int read_current_timer(unsigned long *timer_val)
86{
87 *timer_val = get_cycles();
88 return 0;
89}
90
91#endif /* _ASM_RISCV_TIMEX_H */