blob: 2f26989cb864bedaa1eb0bd53456ae33fcdcaabe [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001/*
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
19typedef unsigned long cycles_t;
20
21static 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
33static inline uint64_t get_cycles64(void)
34{
35 return get_cycles();
36}
37#else
38static 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
54static 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 */