xref: /openbmc/linux/arch/alpha/include/asm/cmpxchg.h (revision 812f77b749a8ae11f58dacf0d3ed65e7ede47458)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ALPHA_CMPXCHG_H
3 #define _ALPHA_CMPXCHG_H
4 
5 /*
6  * Atomic exchange routines.
7  */
8 
9 #define __ASM__MB
10 #define ____xchg(type, args...)		__xchg ## type ## _local(args)
11 #define ____cmpxchg(type, args...)	__cmpxchg ## type ## _local(args)
12 #include <asm/xchg.h>
13 
14 #define xchg_local(ptr, x)						\
15 ({									\
16 	__typeof__(*(ptr)) _x_ = (x);					\
17 	(__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,	\
18 				       sizeof(*(ptr)));			\
19 })
20 
21 #define cmpxchg_local(ptr, o, n)					\
22 ({									\
23 	__typeof__(*(ptr)) _o_ = (o);					\
24 	__typeof__(*(ptr)) _n_ = (n);					\
25 	(__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,	\
26 					  (unsigned long)_n_,		\
27 					  sizeof(*(ptr)));		\
28 })
29 
30 #define cmpxchg64_local(ptr, o, n)					\
31 ({									\
32 	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\
33 	cmpxchg_local((ptr), (o), (n));					\
34 })
35 
36 #ifdef CONFIG_SMP
37 #undef __ASM__MB
38 #define __ASM__MB	"\tmb\n"
39 #endif
40 #undef ____xchg
41 #undef ____cmpxchg
42 #define ____xchg(type, args...)		__xchg ##type(args)
43 #define ____cmpxchg(type, args...)	__cmpxchg ##type(args)
44 #include <asm/xchg.h>
45 
46 #define xchg(ptr, x)							\
47 ({									\
48 	__typeof__(*(ptr)) _x_ = (x);					\
49 	(__typeof__(*(ptr))) __xchg((ptr), (unsigned long)_x_,		\
50 				 sizeof(*(ptr)));			\
51 })
52 
53 #define cmpxchg(ptr, o, n)						\
54 ({									\
55 	__typeof__(*(ptr)) _o_ = (o);					\
56 	__typeof__(*(ptr)) _n_ = (n);					\
57 	(__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,	\
58 				    (unsigned long)_n_,	sizeof(*(ptr)));\
59 })
60 
61 #define cmpxchg64(ptr, o, n)						\
62 ({									\
63 	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\
64 	cmpxchg((ptr), (o), (n));					\
65 })
66 
67 #undef __ASM__MB
68 #undef ____cmpxchg
69 
70 #endif /* _ALPHA_CMPXCHG_H */
71