xref: /linux/arch/riscv/include/asm/timex.h (revision 96ac6d435100450f0565708d9b885ea2a7400e0a)
1 /*
2  * 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.
12  */
13 
14 #ifndef _ASM_RISCV_TIMEX_H
15 #define _ASM_RISCV_TIMEX_H
16 
17 #include <asm/param.h>
18 
19 typedef unsigned long cycles_t;
20 
21 static inline cycles_t get_cycles_inline(void)
22 {
23 	cycles_t n;
24 
25 	__asm__ __volatile__ (
26 		"rdtime %0"
27 		: "=r" (n));
28 	return n;
29 }
30 #define get_cycles get_cycles_inline
31 
32 #ifdef CONFIG_64BIT
33 static inline uint64_t get_cycles64(void)
34 {
35         return get_cycles();
36 }
37 #else
38 static inline uint64_t get_cycles64(void)
39 {
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));
48 	return ((u64)hi << 32) | lo;
49 }
50 #endif
51 
52 #define ARCH_HAS_READ_CURRENT_TIMER
53 
54 static inline int read_current_timer(unsigned long *timer_val)
55 {
56 	*timer_val = get_cycles();
57 	return 0;
58 }
59 
60 #endif /* _ASM_RISCV_TIMEX_H */
61