76 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Generic implementation of 64-bit atomics using spinlocks,4 * useful on processors that don't have 64-bit atomic instructions.5 *6 * Copyright © 2009 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>7 */8#ifndef _ASM_GENERIC_ATOMIC64_H9#define _ASM_GENERIC_ATOMIC64_H10#include <linux/types.h>11 12typedef struct {13 s64 counter;14} atomic64_t;15 16#define ATOMIC64_INIT(i) { (i) }17 18extern s64 generic_atomic64_read(const atomic64_t *v);19extern void generic_atomic64_set(atomic64_t *v, s64 i);20 21#define ATOMIC64_OP(op) \22extern void generic_atomic64_##op(s64 a, atomic64_t *v);23 24#define ATOMIC64_OP_RETURN(op) \25extern s64 generic_atomic64_##op##_return(s64 a, atomic64_t *v);26 27#define ATOMIC64_FETCH_OP(op) \28extern s64 generic_atomic64_fetch_##op(s64 a, atomic64_t *v);29 30#define ATOMIC64_OPS(op) ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op) ATOMIC64_FETCH_OP(op)31 32ATOMIC64_OPS(add)33ATOMIC64_OPS(sub)34 35#undef ATOMIC64_OPS36#define ATOMIC64_OPS(op) ATOMIC64_OP(op) ATOMIC64_FETCH_OP(op)37 38ATOMIC64_OPS(and)39ATOMIC64_OPS(or)40ATOMIC64_OPS(xor)41 42#undef ATOMIC64_OPS43#undef ATOMIC64_FETCH_OP44#undef ATOMIC64_OP_RETURN45#undef ATOMIC64_OP46 47extern s64 generic_atomic64_dec_if_positive(atomic64_t *v);48extern s64 generic_atomic64_cmpxchg(atomic64_t *v, s64 o, s64 n);49extern s64 generic_atomic64_xchg(atomic64_t *v, s64 new);50extern s64 generic_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u);51 52#define arch_atomic64_read generic_atomic64_read53#define arch_atomic64_set generic_atomic64_set54#define arch_atomic64_set_release generic_atomic64_set55 56#define arch_atomic64_add generic_atomic64_add57#define arch_atomic64_add_return generic_atomic64_add_return58#define arch_atomic64_fetch_add generic_atomic64_fetch_add59#define arch_atomic64_sub generic_atomic64_sub60#define arch_atomic64_sub_return generic_atomic64_sub_return61#define arch_atomic64_fetch_sub generic_atomic64_fetch_sub62 63#define arch_atomic64_and generic_atomic64_and64#define arch_atomic64_fetch_and generic_atomic64_fetch_and65#define arch_atomic64_or generic_atomic64_or66#define arch_atomic64_fetch_or generic_atomic64_fetch_or67#define arch_atomic64_xor generic_atomic64_xor68#define arch_atomic64_fetch_xor generic_atomic64_fetch_xor69 70#define arch_atomic64_dec_if_positive generic_atomic64_dec_if_positive71#define arch_atomic64_cmpxchg generic_atomic64_cmpxchg72#define arch_atomic64_xchg generic_atomic64_xchg73#define arch_atomic64_fetch_add_unless generic_atomic64_fetch_add_unless74 75#endif /* _ASM_GENERIC_ATOMIC64_H */76