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