xref: /kvm-unit-tests/lib/riscv/asm/csr.h (revision 22f287f4024419702c8024174139d1b46d12f2be)
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