Merge tag 'drm-fixes-for-v4.14-rc8' of git://people.freedesktop.org/~airlied/linux
[sfrench/cifs-2.6.git] / arch / alpha / include / asm / cmpxchg.h
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 */