162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Generic implementation of 64-bit atomics using spinlocks,
462306a36Sopenharmony_ci * useful on processors that don't have 64-bit atomic instructions.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright © 2009 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef _ASM_GENERIC_ATOMIC64_H
962306a36Sopenharmony_ci#define _ASM_GENERIC_ATOMIC64_H
1062306a36Sopenharmony_ci#include <linux/types.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_citypedef struct {
1362306a36Sopenharmony_ci	s64 counter;
1462306a36Sopenharmony_ci} atomic64_t;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define ATOMIC64_INIT(i)	{ (i) }
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciextern s64 generic_atomic64_read(const atomic64_t *v);
1962306a36Sopenharmony_ciextern void generic_atomic64_set(atomic64_t *v, s64 i);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define ATOMIC64_OP(op)							\
2262306a36Sopenharmony_ciextern void generic_atomic64_##op(s64 a, atomic64_t *v);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define ATOMIC64_OP_RETURN(op)						\
2562306a36Sopenharmony_ciextern s64 generic_atomic64_##op##_return(s64 a, atomic64_t *v);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define ATOMIC64_FETCH_OP(op)						\
2862306a36Sopenharmony_ciextern s64 generic_atomic64_fetch_##op(s64 a, atomic64_t *v);
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define ATOMIC64_OPS(op)	ATOMIC64_OP(op) ATOMIC64_OP_RETURN(op) ATOMIC64_FETCH_OP(op)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciATOMIC64_OPS(add)
3362306a36Sopenharmony_ciATOMIC64_OPS(sub)
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#undef ATOMIC64_OPS
3662306a36Sopenharmony_ci#define ATOMIC64_OPS(op)	ATOMIC64_OP(op) ATOMIC64_FETCH_OP(op)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciATOMIC64_OPS(and)
3962306a36Sopenharmony_ciATOMIC64_OPS(or)
4062306a36Sopenharmony_ciATOMIC64_OPS(xor)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#undef ATOMIC64_OPS
4362306a36Sopenharmony_ci#undef ATOMIC64_FETCH_OP
4462306a36Sopenharmony_ci#undef ATOMIC64_OP_RETURN
4562306a36Sopenharmony_ci#undef ATOMIC64_OP
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciextern s64 generic_atomic64_dec_if_positive(atomic64_t *v);
4862306a36Sopenharmony_ciextern s64 generic_atomic64_cmpxchg(atomic64_t *v, s64 o, s64 n);
4962306a36Sopenharmony_ciextern s64 generic_atomic64_xchg(atomic64_t *v, s64 new);
5062306a36Sopenharmony_ciextern s64 generic_atomic64_fetch_add_unless(atomic64_t *v, s64 a, s64 u);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define arch_atomic64_read		generic_atomic64_read
5362306a36Sopenharmony_ci#define arch_atomic64_set		generic_atomic64_set
5462306a36Sopenharmony_ci#define arch_atomic64_set_release	generic_atomic64_set
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define arch_atomic64_add		generic_atomic64_add
5762306a36Sopenharmony_ci#define arch_atomic64_add_return	generic_atomic64_add_return
5862306a36Sopenharmony_ci#define arch_atomic64_fetch_add		generic_atomic64_fetch_add
5962306a36Sopenharmony_ci#define arch_atomic64_sub		generic_atomic64_sub
6062306a36Sopenharmony_ci#define arch_atomic64_sub_return	generic_atomic64_sub_return
6162306a36Sopenharmony_ci#define arch_atomic64_fetch_sub		generic_atomic64_fetch_sub
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define arch_atomic64_and		generic_atomic64_and
6462306a36Sopenharmony_ci#define arch_atomic64_fetch_and		generic_atomic64_fetch_and
6562306a36Sopenharmony_ci#define arch_atomic64_or		generic_atomic64_or
6662306a36Sopenharmony_ci#define arch_atomic64_fetch_or		generic_atomic64_fetch_or
6762306a36Sopenharmony_ci#define arch_atomic64_xor		generic_atomic64_xor
6862306a36Sopenharmony_ci#define arch_atomic64_fetch_xor		generic_atomic64_fetch_xor
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define arch_atomic64_dec_if_positive	generic_atomic64_dec_if_positive
7162306a36Sopenharmony_ci#define arch_atomic64_cmpxchg		generic_atomic64_cmpxchg
7262306a36Sopenharmony_ci#define arch_atomic64_xchg		generic_atomic64_xchg
7362306a36Sopenharmony_ci#define arch_atomic64_fetch_add_unless	generic_atomic64_fetch_add_unless
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#endif  /*  _ASM_GENERIC_ATOMIC64_H  */
76