xref: /linux/include/asm-generic/atomic64.h (revision 2874c5fd284268364ece81a7bd936f3c8168e567)
1*2874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
209d4e0edSPaul Mackerras /*
309d4e0edSPaul Mackerras  * Generic implementation of 64-bit atomics using spinlocks,
409d4e0edSPaul Mackerras  * useful on processors that don't have 64-bit atomic instructions.
509d4e0edSPaul Mackerras  *
609d4e0edSPaul Mackerras  * Copyright © 2009 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
709d4e0edSPaul Mackerras  */
809d4e0edSPaul Mackerras #ifndef _ASM_GENERIC_ATOMIC64_H
909d4e0edSPaul Mackerras #define _ASM_GENERIC_ATOMIC64_H
10ade5ef92SMark Rutland #include <linux/types.h>
1109d4e0edSPaul Mackerras 
1209d4e0edSPaul Mackerras typedef struct {
1309d4e0edSPaul Mackerras 	long long counter;
1409d4e0edSPaul Mackerras } atomic64_t;
1509d4e0edSPaul Mackerras 
1609d4e0edSPaul Mackerras #define ATOMIC64_INIT(i)	{ (i) }
1709d4e0edSPaul Mackerras 
1809d4e0edSPaul Mackerras extern long long atomic64_read(const atomic64_t *v);
1909d4e0edSPaul Mackerras extern void	 atomic64_set(atomic64_t *v, long long i);
20560cb12aSPeter Zijlstra 
219d664c0aSPeter Zijlstra #define atomic64_set_release(v, i)	atomic64_set((v), (i))
229d664c0aSPeter Zijlstra 
23560cb12aSPeter Zijlstra #define ATOMIC64_OP(op)							\
24560cb12aSPeter Zijlstra extern void	 atomic64_##op(long long a, atomic64_t *v);
25560cb12aSPeter Zijlstra 
26560cb12aSPeter Zijlstra #define ATOMIC64_OP_RETURN(op)						\
27560cb12aSPeter Zijlstra extern long long atomic64_##op##_return(long long a, atomic64_t *v);
28560cb12aSPeter Zijlstra 
2928aa2bdaSPeter Zijlstra #define ATOMIC64_FETCH_OP(op)						\
3028aa2bdaSPeter Zijlstra extern long long atomic64_fetch_##op(long long a, atomic64_t *v);
3128aa2bdaSPeter Zijlstra 
3228aa2bdaSPeter Zijlstra #define ATOMIC64_OPS(op)	ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op) ATOMIC64_FETCH_OP(op)
33560cb12aSPeter Zijlstra 
34560cb12aSPeter Zijlstra ATOMIC64_OPS(add)
35560cb12aSPeter Zijlstra ATOMIC64_OPS(sub)
36560cb12aSPeter Zijlstra 
3728aa2bdaSPeter Zijlstra #undef ATOMIC64_OPS
3828aa2bdaSPeter Zijlstra #define ATOMIC64_OPS(op)	ATOMIC64_OP(op) ATOMIC64_FETCH_OP(op)
3928aa2bdaSPeter Zijlstra 
4028aa2bdaSPeter Zijlstra ATOMIC64_OPS(and)
4128aa2bdaSPeter Zijlstra ATOMIC64_OPS(or)
4228aa2bdaSPeter Zijlstra ATOMIC64_OPS(xor)
43e6942b7dSPeter Zijlstra 
44560cb12aSPeter Zijlstra #undef ATOMIC64_OPS
4528aa2bdaSPeter Zijlstra #undef ATOMIC64_FETCH_OP
46560cb12aSPeter Zijlstra #undef ATOMIC64_OP_RETURN
47560cb12aSPeter Zijlstra #undef ATOMIC64_OP
48560cb12aSPeter Zijlstra 
4909d4e0edSPaul Mackerras extern long long atomic64_dec_if_positive(atomic64_t *v);
50b3a2a05fSMark Rutland #define atomic64_dec_if_positive atomic64_dec_if_positive
5109d4e0edSPaul Mackerras extern long long atomic64_cmpxchg(atomic64_t *v, long long o, long long n);
5209d4e0edSPaul Mackerras extern long long atomic64_xchg(atomic64_t *v, long long new);
5300b808abSMark Rutland extern long long atomic64_fetch_add_unless(atomic64_t *v, long long a, long long u);
5400b808abSMark Rutland #define atomic64_fetch_add_unless atomic64_fetch_add_unless
5509d4e0edSPaul Mackerras 
5609d4e0edSPaul Mackerras #endif  /*  _ASM_GENERIC_ATOMIC64_H  */
57