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 11 typedef unsigned long cycles_t; 12 13 #ifdef CONFIG_RISCV_M_MODE 14 15 #include <asm/clint.h> 16 17 #ifdef CONFIG_64BIT 18 static inline cycles_t get_cycles(void) 19 { 20 return readq_relaxed(clint_time_val); 21 } 22 #else /* !CONFIG_64BIT */ 23 static inline u32 get_cycles(void) 24 { 25 return readl_relaxed(((u32 *)clint_time_val)); 26 } 27 #define get_cycles get_cycles 28 29 static 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 #else /* CONFIG_RISCV_M_MODE */ 37 38 static inline cycles_t get_cycles(void) 39 { 40 return csr_read(CSR_TIME); 41 } 42 #define get_cycles get_cycles 43 44 static inline u32 get_cycles_hi(void) 45 { 46 return csr_read(CSR_TIMEH); 47 } 48 #define get_cycles_hi get_cycles_hi 49 50 #ifdef CONFIG_64BIT 51 static inline u64 get_cycles64(void) 52 { 53 return get_cycles(); 54 } 55 #else /* CONFIG_64BIT */ 56 static inline u64 get_cycles64(void) 57 { 58 u32 hi, lo; 59 60 do { 61 hi = get_cycles_hi(); 62 lo = get_cycles(); 63 } while (hi != get_cycles_hi()); 64 65 return ((u64)hi << 32) | lo; 66 } 67 #endif /* CONFIG_64BIT */ 68 69 #endif /* !CONFIG_RISCV_M_MODE */ 70 71 #define ARCH_HAS_READ_CURRENT_TIMER 72 static inline int read_current_timer(unsigned long *timer_val) 73 { 74 *timer_val = get_cycles(); 75 return 0; 76 } 77 78 #endif /* _ASM_RISCV_TIMEX_H */ 79