14486d586SSumit Garg /* SPDX-License-Identifier: BSD-2-Clause */ 24486d586SSumit Garg /* 34486d586SSumit Garg * Copyright (c) 2019, Linaro Limited 44486d586SSumit Garg */ 54486d586SSumit Garg #ifndef ARM64_USER_SYSREG_H 64486d586SSumit Garg #define ARM64_USER_SYSREG_H 74486d586SSumit Garg 84486d586SSumit Garg #include <compiler.h> 94486d586SSumit Garg #include <stdint.h> 104486d586SSumit Garg 114486d586SSumit Garg /* 124486d586SSumit Garg * Templates for register read/write functions based on mrs/msr 134486d586SSumit Garg */ 144486d586SSumit Garg 154486d586SSumit Garg #define DEFINE_REG_READ_FUNC_(reg, type, asmreg) \ 164486d586SSumit Garg static inline __noprof type read_##reg(void) \ 174486d586SSumit Garg { \ 18*70ed8fd5SJerome Forissier uint64_t val64 = 0; \ 194486d586SSumit Garg \ 20*70ed8fd5SJerome Forissier asm volatile("mrs %0, " #asmreg : "=r" (val64)); \ 21*70ed8fd5SJerome Forissier return val64; \ 224486d586SSumit Garg } 234486d586SSumit Garg 244486d586SSumit Garg #define DEFINE_REG_WRITE_FUNC_(reg, type, asmreg) \ 254486d586SSumit Garg static inline __noprof void write_##reg(type val) \ 264486d586SSumit Garg { \ 27*70ed8fd5SJerome Forissier uint64_t val64 = val; \ 28*70ed8fd5SJerome Forissier \ 29*70ed8fd5SJerome Forissier asm volatile("msr " #asmreg ", %0" : : "r" (val64)); \ 304486d586SSumit Garg } 314486d586SSumit Garg 324486d586SSumit Garg /* ARM Generic timer functions */ 334486d586SSumit Garg DEFINE_REG_READ_FUNC_(cntfrq, uint32_t, cntfrq_el0) 344486d586SSumit Garg DEFINE_REG_READ_FUNC_(cntpct, uint64_t, cntpct_el0) 354486d586SSumit Garg 364486d586SSumit Garg #endif /*ARM64_USER_SYSREG_H*/ 37