1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ALPHA_CMPXCHG_H 3*4882a593Smuzhiyun #define _ALPHA_CMPXCHG_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * Atomic exchange routines. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define ____xchg(type, args...) __xchg ## type ## _local(args) 10*4882a593Smuzhiyun #define ____cmpxchg(type, args...) __cmpxchg ## type ## _local(args) 11*4882a593Smuzhiyun #include <asm/xchg.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define xchg_local(ptr, x) \ 14*4882a593Smuzhiyun ({ \ 15*4882a593Smuzhiyun __typeof__(*(ptr)) _x_ = (x); \ 16*4882a593Smuzhiyun (__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_, \ 17*4882a593Smuzhiyun sizeof(*(ptr))); \ 18*4882a593Smuzhiyun }) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define cmpxchg_local(ptr, o, n) \ 21*4882a593Smuzhiyun ({ \ 22*4882a593Smuzhiyun __typeof__(*(ptr)) _o_ = (o); \ 23*4882a593Smuzhiyun __typeof__(*(ptr)) _n_ = (n); \ 24*4882a593Smuzhiyun (__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_, \ 25*4882a593Smuzhiyun (unsigned long)_n_, \ 26*4882a593Smuzhiyun sizeof(*(ptr))); \ 27*4882a593Smuzhiyun }) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define cmpxchg64_local(ptr, o, n) \ 30*4882a593Smuzhiyun ({ \ 31*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 32*4882a593Smuzhiyun cmpxchg_local((ptr), (o), (n)); \ 33*4882a593Smuzhiyun }) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #undef ____xchg 36*4882a593Smuzhiyun #undef ____cmpxchg 37*4882a593Smuzhiyun #define ____xchg(type, args...) __xchg ##type(args) 38*4882a593Smuzhiyun #define ____cmpxchg(type, args...) __cmpxchg ##type(args) 39*4882a593Smuzhiyun #include <asm/xchg.h> 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* 42*4882a593Smuzhiyun * The leading and the trailing memory barriers guarantee that these 43*4882a593Smuzhiyun * operations are fully ordered. 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun #define xchg(ptr, x) \ 46*4882a593Smuzhiyun ({ \ 47*4882a593Smuzhiyun __typeof__(*(ptr)) __ret; \ 48*4882a593Smuzhiyun __typeof__(*(ptr)) _x_ = (x); \ 49*4882a593Smuzhiyun smp_mb(); \ 50*4882a593Smuzhiyun __ret = (__typeof__(*(ptr))) \ 51*4882a593Smuzhiyun __xchg((ptr), (unsigned long)_x_, sizeof(*(ptr))); \ 52*4882a593Smuzhiyun smp_mb(); \ 53*4882a593Smuzhiyun __ret; \ 54*4882a593Smuzhiyun }) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define cmpxchg(ptr, o, n) \ 57*4882a593Smuzhiyun ({ \ 58*4882a593Smuzhiyun __typeof__(*(ptr)) __ret; \ 59*4882a593Smuzhiyun __typeof__(*(ptr)) _o_ = (o); \ 60*4882a593Smuzhiyun __typeof__(*(ptr)) _n_ = (n); \ 61*4882a593Smuzhiyun smp_mb(); \ 62*4882a593Smuzhiyun __ret = (__typeof__(*(ptr))) __cmpxchg((ptr), \ 63*4882a593Smuzhiyun (unsigned long)_o_, (unsigned long)_n_, sizeof(*(ptr)));\ 64*4882a593Smuzhiyun smp_mb(); \ 65*4882a593Smuzhiyun __ret; \ 66*4882a593Smuzhiyun }) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define cmpxchg64(ptr, o, n) \ 69*4882a593Smuzhiyun ({ \ 70*4882a593Smuzhiyun BUILD_BUG_ON(sizeof(*(ptr)) != 8); \ 71*4882a593Smuzhiyun cmpxchg((ptr), (o), (n)); \ 72*4882a593Smuzhiyun }) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #undef ____cmpxchg 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #endif /* _ALPHA_CMPXCHG_H */ 77