1 #include <rthw.h>
2 #include <rtdevice.h>
3 #include <rtthread.h>
4 
5 #include <board.h>
6 
7 /* Use Cycle counter of Data Watchpoint and Trace Register for CPU time */
8 
riscv_cputime_getres(void)9 static uint64_t riscv_cputime_getres(void)
10 {
11     uint64_t ret = 1000UL * 1000 * 1000;
12 
13     ret = (ret * (1000UL * 1000)) / CPUTIME_TIMER_FREQ;
14     return ret;
15 }
16 
riscv_cputime_gettime(void)17 static uint64_t riscv_cputime_gettime(void)
18 {
19     uint64_t time_elapsed;
20     __asm__ __volatile__(
21         "rdtime %0"
22         : "=r"(time_elapsed));
23     return time_elapsed;
24 }
25 
26 const static struct rt_clock_cputime_ops _riscv_ops =
27 {
28     riscv_cputime_getres,
29     riscv_cputime_gettime
30 };
31 
riscv_cputime_init(void)32 int riscv_cputime_init(void)
33 {
34     clock_cpu_setops(&_riscv_ops);
35     return 0;
36 }
37 INIT_BOARD_EXPORT(riscv_cputime_init);
38