162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* atomic.h: Thankfully the V9 is at least reasonable for this 362306a36Sopenharmony_ci * stuff. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1996, 1997, 2000, 2012 David S. Miller (davem@redhat.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __ARCH_SPARC64_ATOMIC__ 962306a36Sopenharmony_ci#define __ARCH_SPARC64_ATOMIC__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/types.h> 1262306a36Sopenharmony_ci#include <asm/cmpxchg.h> 1362306a36Sopenharmony_ci#include <asm/barrier.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define ATOMIC64_INIT(i) { (i) } 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define arch_atomic_read(v) READ_ONCE((v)->counter) 1862306a36Sopenharmony_ci#define arch_atomic64_read(v) READ_ONCE((v)->counter) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define arch_atomic_set(v, i) WRITE_ONCE(((v)->counter), (i)) 2162306a36Sopenharmony_ci#define arch_atomic64_set(v, i) WRITE_ONCE(((v)->counter), (i)) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define ATOMIC_OP(op) \ 2462306a36Sopenharmony_civoid arch_atomic_##op(int, atomic_t *); \ 2562306a36Sopenharmony_civoid arch_atomic64_##op(s64, atomic64_t *); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define ATOMIC_OP_RETURN(op) \ 2862306a36Sopenharmony_ciint arch_atomic_##op##_return(int, atomic_t *); \ 2962306a36Sopenharmony_cis64 arch_atomic64_##op##_return(s64, atomic64_t *); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define ATOMIC_FETCH_OP(op) \ 3262306a36Sopenharmony_ciint arch_atomic_fetch_##op(int, atomic_t *); \ 3362306a36Sopenharmony_cis64 arch_atomic64_fetch_##op(s64, atomic64_t *); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define ATOMIC_OPS(op) ATOMIC_OP(op) ATOMIC_OP_RETURN(op) ATOMIC_FETCH_OP(op) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciATOMIC_OPS(add) 3862306a36Sopenharmony_ciATOMIC_OPS(sub) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define arch_atomic_add_return arch_atomic_add_return 4162306a36Sopenharmony_ci#define arch_atomic_sub_return arch_atomic_sub_return 4262306a36Sopenharmony_ci#define arch_atomic_fetch_add arch_atomic_fetch_add 4362306a36Sopenharmony_ci#define arch_atomic_fetch_sub arch_atomic_fetch_sub 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define arch_atomic64_add_return arch_atomic64_add_return 4662306a36Sopenharmony_ci#define arch_atomic64_sub_return arch_atomic64_sub_return 4762306a36Sopenharmony_ci#define arch_atomic64_fetch_add arch_atomic64_fetch_add 4862306a36Sopenharmony_ci#define arch_atomic64_fetch_sub arch_atomic64_fetch_sub 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#undef ATOMIC_OPS 5162306a36Sopenharmony_ci#define ATOMIC_OPS(op) ATOMIC_OP(op) ATOMIC_FETCH_OP(op) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ciATOMIC_OPS(and) 5462306a36Sopenharmony_ciATOMIC_OPS(or) 5562306a36Sopenharmony_ciATOMIC_OPS(xor) 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define arch_atomic_fetch_and arch_atomic_fetch_and 5862306a36Sopenharmony_ci#define arch_atomic_fetch_or arch_atomic_fetch_or 5962306a36Sopenharmony_ci#define arch_atomic_fetch_xor arch_atomic_fetch_xor 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define arch_atomic64_fetch_and arch_atomic64_fetch_and 6262306a36Sopenharmony_ci#define arch_atomic64_fetch_or arch_atomic64_fetch_or 6362306a36Sopenharmony_ci#define arch_atomic64_fetch_xor arch_atomic64_fetch_xor 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#undef ATOMIC_OPS 6662306a36Sopenharmony_ci#undef ATOMIC_FETCH_OP 6762306a36Sopenharmony_ci#undef ATOMIC_OP_RETURN 6862306a36Sopenharmony_ci#undef ATOMIC_OP 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cis64 arch_atomic64_dec_if_positive(atomic64_t *v); 7162306a36Sopenharmony_ci#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#endif /* !(__ARCH_SPARC64_ATOMIC__) */ 74