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