1bd744d46SAndrew Jones /* SPDX-License-Identifier: GPL-2.0-only */ 2bd744d46SAndrew Jones #ifndef _ASMRISCV_CSR_H_ 3bd744d46SAndrew Jones #define _ASMRISCV_CSR_H_ 4*22f287f4SAndrew Jones #include <linux/const.h> 5bd744d46SAndrew Jones 6bd744d46SAndrew Jones #define CSR_SSCRATCH 0x140 7bd744d46SAndrew Jones 8*22f287f4SAndrew Jones #ifndef __ASSEMBLY__ 9*22f287f4SAndrew Jones 10*22f287f4SAndrew Jones #define csr_swap(csr, val) \ 11*22f287f4SAndrew Jones ({ \ 12*22f287f4SAndrew Jones unsigned long __v = (unsigned long)(val); \ 13*22f287f4SAndrew Jones __asm__ __volatile__ ("csrrw %0, " __ASM_STR(csr) ", %1"\ 14*22f287f4SAndrew Jones : "=r" (__v) : "rK" (__v) \ 15*22f287f4SAndrew Jones : "memory"); \ 16*22f287f4SAndrew Jones __v; \ 17*22f287f4SAndrew Jones }) 18*22f287f4SAndrew Jones 19*22f287f4SAndrew Jones #define csr_read(csr) \ 20*22f287f4SAndrew Jones ({ \ 21*22f287f4SAndrew Jones register unsigned long __v; \ 22*22f287f4SAndrew Jones __asm__ __volatile__ ("csrr %0, " __ASM_STR(csr) \ 23*22f287f4SAndrew Jones : "=r" (__v) : \ 24*22f287f4SAndrew Jones : "memory"); \ 25*22f287f4SAndrew Jones __v; \ 26*22f287f4SAndrew Jones }) 27*22f287f4SAndrew Jones 28*22f287f4SAndrew Jones #define csr_write(csr, val) \ 29*22f287f4SAndrew Jones ({ \ 30*22f287f4SAndrew Jones unsigned long __v = (unsigned long)(val); \ 31*22f287f4SAndrew Jones __asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0" \ 32*22f287f4SAndrew Jones : : "rK" (__v) \ 33*22f287f4SAndrew Jones : "memory"); \ 34*22f287f4SAndrew Jones }) 35*22f287f4SAndrew Jones 36*22f287f4SAndrew Jones #define csr_read_set(csr, val) \ 37*22f287f4SAndrew Jones ({ \ 38*22f287f4SAndrew Jones unsigned long __v = (unsigned long)(val); \ 39*22f287f4SAndrew Jones __asm__ __volatile__ ("csrrs %0, " __ASM_STR(csr) ", %1"\ 40*22f287f4SAndrew Jones : "=r" (__v) : "rK" (__v) \ 41*22f287f4SAndrew Jones : "memory"); \ 42*22f287f4SAndrew Jones __v; \ 43*22f287f4SAndrew Jones }) 44*22f287f4SAndrew Jones 45*22f287f4SAndrew Jones #define csr_set(csr, val) \ 46*22f287f4SAndrew Jones ({ \ 47*22f287f4SAndrew Jones unsigned long __v = (unsigned long)(val); \ 48*22f287f4SAndrew Jones __asm__ __volatile__ ("csrs " __ASM_STR(csr) ", %0" \ 49*22f287f4SAndrew Jones : : "rK" (__v) \ 50*22f287f4SAndrew Jones : "memory"); \ 51*22f287f4SAndrew Jones }) 52*22f287f4SAndrew Jones 53*22f287f4SAndrew Jones #define csr_read_clear(csr, val) \ 54*22f287f4SAndrew Jones ({ \ 55*22f287f4SAndrew Jones unsigned long __v = (unsigned long)(val); \ 56*22f287f4SAndrew Jones __asm__ __volatile__ ("csrrc %0, " __ASM_STR(csr) ", %1"\ 57*22f287f4SAndrew Jones : "=r" (__v) : "rK" (__v) \ 58*22f287f4SAndrew Jones : "memory"); \ 59*22f287f4SAndrew Jones __v; \ 60*22f287f4SAndrew Jones }) 61*22f287f4SAndrew Jones 62*22f287f4SAndrew Jones #define csr_clear(csr, val) \ 63*22f287f4SAndrew Jones ({ \ 64*22f287f4SAndrew Jones unsigned long __v = (unsigned long)(val); \ 65*22f287f4SAndrew Jones __asm__ __volatile__ ("csrc " __ASM_STR(csr) ", %0" \ 66*22f287f4SAndrew Jones : : "rK" (__v) \ 67*22f287f4SAndrew Jones : "memory"); \ 68*22f287f4SAndrew Jones }) 69*22f287f4SAndrew Jones 70*22f287f4SAndrew Jones #endif /* !__ASSEMBLY__ */ 71bd744d46SAndrew Jones #endif /* _ASMRISCV_CSR_H_ */ 72