1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (c) 2019, Linaro Limited
4  */
5 #ifndef ARM64_USER_SYSREG_H
6 #define ARM64_USER_SYSREG_H
7 
8 #include <compiler.h>
9 #include <stdint.h>
10 
11 /*
12  * Templates for register read/write functions based on mrs/msr
13  */
14 
15 #define DEFINE_REG_READ_FUNC_(reg, type, asmreg)		\
16 static inline __noprof type read_##reg(void)			\
17 {								\
18 	uint64_t val64 = 0;					\
19 								\
20 	asm volatile("mrs %0, " #asmreg : "=r" (val64));	\
21 	return val64;						\
22 }
23 
24 #define DEFINE_REG_WRITE_FUNC_(reg, type, asmreg)		\
25 static inline __noprof void write_##reg(type val)		\
26 {								\
27 	uint64_t val64 = val;					\
28 								\
29 	asm volatile("msr " #asmreg ", %0" : : "r" (val64));	\
30 }
31 
32 /* ARM Generic timer functions */
33 DEFINE_REG_READ_FUNC_(cntfrq, uint32_t, cntfrq_el0)
34 DEFINE_REG_READ_FUNC_(cntpct, uint64_t, cntpct_el0)
35 DEFINE_REG_READ_FUNC_(cntvct, uint64_t, cntvct_el0)
36 DEFINE_REG_READ_FUNC_(tpidr_el0, uint64_t, tpidr_el0)
37 DEFINE_REG_WRITE_FUNC_(tpidr_el0, uint64_t, tpidr_el0)
38 
39 #endif /*ARM64_USER_SYSREG_H*/
40