Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Generic implementation of 64-bit atomics using spinlocks,
0004  * useful on processors that don't have 64-bit atomic instructions.
0005  *
0006  * Copyright © 2009 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
0007  */
0008 #ifndef _ASM_GENERIC_ATOMIC64_H
0009 #define _ASM_GENERIC_ATOMIC64_H
0010 #include <linux/types.h>
0011 
0012 typedef struct {
0013     s64 counter;
0014 } atomic64_t;
0015 
0016 #define ATOMIC64_INIT(i)    { (i) }
0017 
0018 extern s64 generic_atomic64_read(const atomic64_t *v);
0019 extern void generic_atomic64_set(atomic64_t *v, s64 i);
0020 
0021 #define ATOMIC64_OP(op)                         \
0022 extern void generic_atomic64_##op(s64 a, atomic64_t *v);
0023 
0024 #define ATOMIC64_OP_RETURN(op)                      \
0025 extern s64 generic_atomic64_##op##_return(s64 a, atomic64_t *v);
0026 
0027 #define ATOMIC64_FETCH_OP(op)                       \
0028 extern s64 generic_atomic64_fetch_##op(s64 a, atomic64_t *v);
0029 
0030 #define ATOMIC64_OPS(op)    ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op) ATOMIC64_FETCH_OP(op)
0031 
0032 ATOMIC64_OPS(add)
0033 ATOMIC64_OPS(sub)
0034 
0035 #undef ATOMIC64_OPS
0036 #define ATOMIC64_OPS(op)    ATOMIC64_OP(op) ATOMIC64_FETCH_OP(op)
0037 
0038 ATOMIC64_OPS(and)
0039 ATOMIC64_OPS(or)
0040 ATOMIC64_OPS(xor)
0041 
0042 #undef ATOMIC64_OPS
0043 #undef ATOMIC64_FETCH_OP
0044 #undef ATOMIC64_OP_RETURN
0045 #undef ATOMIC64_OP
0046 
0047 extern s64 generic_atomic64_dec_if_positive(atomic64_t *v);
0048 extern s64 generic_atomic64_cmpxchg(atomic64_t *v, s64 o, s64 n);
0049 extern s64 generic_atomic64_xchg(atomic64_t *v, s64 new);
0050 extern s64 generic_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u);
0051 
0052 #define arch_atomic64_read      generic_atomic64_read
0053 #define arch_atomic64_set       generic_atomic64_set
0054 #define arch_atomic64_set_release   generic_atomic64_set
0055 
0056 #define arch_atomic64_add       generic_atomic64_add
0057 #define arch_atomic64_add_return    generic_atomic64_add_return
0058 #define arch_atomic64_fetch_add     generic_atomic64_fetch_add
0059 #define arch_atomic64_sub       generic_atomic64_sub
0060 #define arch_atomic64_sub_return    generic_atomic64_sub_return
0061 #define arch_atomic64_fetch_sub     generic_atomic64_fetch_sub
0062 
0063 #define arch_atomic64_and       generic_atomic64_and
0064 #define arch_atomic64_fetch_and     generic_atomic64_fetch_and
0065 #define arch_atomic64_or        generic_atomic64_or
0066 #define arch_atomic64_fetch_or      generic_atomic64_fetch_or
0067 #define arch_atomic64_xor       generic_atomic64_xor
0068 #define arch_atomic64_fetch_xor     generic_atomic64_fetch_xor
0069 
0070 #define arch_atomic64_dec_if_positive   generic_atomic64_dec_if_positive
0071 #define arch_atomic64_cmpxchg       generic_atomic64_cmpxchg
0072 #define arch_atomic64_xchg      generic_atomic64_xchg
0073 #define arch_atomic64_fetch_add_unless  generic_atomic64_fetch_add_unless
0074 
0075 #endif  /*  _ASM_GENERIC_ATOMIC64_H  */