162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Based on arch/arm/include/asm/atomic.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1996 Russell King. 662306a36Sopenharmony_ci * Copyright (C) 2002 Deep Blue Solutions Ltd. 762306a36Sopenharmony_ci * Copyright (C) 2012 ARM Ltd. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#ifndef __ASM_ATOMIC_H 1062306a36Sopenharmony_ci#define __ASM_ATOMIC_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/compiler.h> 1362306a36Sopenharmony_ci#include <linux/types.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <asm/barrier.h> 1662306a36Sopenharmony_ci#include <asm/cmpxchg.h> 1762306a36Sopenharmony_ci#include <asm/lse.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define ATOMIC_OP(op) \ 2062306a36Sopenharmony_cistatic __always_inline void arch_##op(int i, atomic_t *v) \ 2162306a36Sopenharmony_ci{ \ 2262306a36Sopenharmony_ci __lse_ll_sc_body(op, i, v); \ 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciATOMIC_OP(atomic_andnot) 2662306a36Sopenharmony_ciATOMIC_OP(atomic_or) 2762306a36Sopenharmony_ciATOMIC_OP(atomic_xor) 2862306a36Sopenharmony_ciATOMIC_OP(atomic_add) 2962306a36Sopenharmony_ciATOMIC_OP(atomic_and) 3062306a36Sopenharmony_ciATOMIC_OP(atomic_sub) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#undef ATOMIC_OP 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define ATOMIC_FETCH_OP(name, op) \ 3562306a36Sopenharmony_cistatic __always_inline int arch_##op##name(int i, atomic_t *v) \ 3662306a36Sopenharmony_ci{ \ 3762306a36Sopenharmony_ci return __lse_ll_sc_body(op##name, i, v); \ 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define ATOMIC_FETCH_OPS(op) \ 4162306a36Sopenharmony_ci ATOMIC_FETCH_OP(_relaxed, op) \ 4262306a36Sopenharmony_ci ATOMIC_FETCH_OP(_acquire, op) \ 4362306a36Sopenharmony_ci ATOMIC_FETCH_OP(_release, op) \ 4462306a36Sopenharmony_ci ATOMIC_FETCH_OP( , op) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_fetch_andnot) 4762306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_fetch_or) 4862306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_fetch_xor) 4962306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_fetch_add) 5062306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_fetch_and) 5162306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_fetch_sub) 5262306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_add_return) 5362306a36Sopenharmony_ciATOMIC_FETCH_OPS(atomic_sub_return) 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#undef ATOMIC_FETCH_OP 5662306a36Sopenharmony_ci#undef ATOMIC_FETCH_OPS 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define ATOMIC64_OP(op) \ 5962306a36Sopenharmony_cistatic __always_inline void arch_##op(long i, atomic64_t *v) \ 6062306a36Sopenharmony_ci{ \ 6162306a36Sopenharmony_ci __lse_ll_sc_body(op, i, v); \ 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciATOMIC64_OP(atomic64_andnot) 6562306a36Sopenharmony_ciATOMIC64_OP(atomic64_or) 6662306a36Sopenharmony_ciATOMIC64_OP(atomic64_xor) 6762306a36Sopenharmony_ciATOMIC64_OP(atomic64_add) 6862306a36Sopenharmony_ciATOMIC64_OP(atomic64_and) 6962306a36Sopenharmony_ciATOMIC64_OP(atomic64_sub) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#undef ATOMIC64_OP 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define ATOMIC64_FETCH_OP(name, op) \ 7462306a36Sopenharmony_cistatic __always_inline long arch_##op##name(long i, atomic64_t *v) \ 7562306a36Sopenharmony_ci{ \ 7662306a36Sopenharmony_ci return __lse_ll_sc_body(op##name, i, v); \ 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define ATOMIC64_FETCH_OPS(op) \ 8062306a36Sopenharmony_ci ATOMIC64_FETCH_OP(_relaxed, op) \ 8162306a36Sopenharmony_ci ATOMIC64_FETCH_OP(_acquire, op) \ 8262306a36Sopenharmony_ci ATOMIC64_FETCH_OP(_release, op) \ 8362306a36Sopenharmony_ci ATOMIC64_FETCH_OP( , op) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_fetch_andnot) 8662306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_fetch_or) 8762306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_fetch_xor) 8862306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_fetch_add) 8962306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_fetch_and) 9062306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_fetch_sub) 9162306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_add_return) 9262306a36Sopenharmony_ciATOMIC64_FETCH_OPS(atomic64_sub_return) 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#undef ATOMIC64_FETCH_OP 9562306a36Sopenharmony_ci#undef ATOMIC64_FETCH_OPS 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic __always_inline long arch_atomic64_dec_if_positive(atomic64_t *v) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci return __lse_ll_sc_body(atomic64_dec_if_positive, v); 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#define arch_atomic_read(v) __READ_ONCE((v)->counter) 10362306a36Sopenharmony_ci#define arch_atomic_set(v, i) __WRITE_ONCE(((v)->counter), (i)) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define arch_atomic_add_return_relaxed arch_atomic_add_return_relaxed 10662306a36Sopenharmony_ci#define arch_atomic_add_return_acquire arch_atomic_add_return_acquire 10762306a36Sopenharmony_ci#define arch_atomic_add_return_release arch_atomic_add_return_release 10862306a36Sopenharmony_ci#define arch_atomic_add_return arch_atomic_add_return 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define arch_atomic_sub_return_relaxed arch_atomic_sub_return_relaxed 11162306a36Sopenharmony_ci#define arch_atomic_sub_return_acquire arch_atomic_sub_return_acquire 11262306a36Sopenharmony_ci#define arch_atomic_sub_return_release arch_atomic_sub_return_release 11362306a36Sopenharmony_ci#define arch_atomic_sub_return arch_atomic_sub_return 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define arch_atomic_fetch_add_relaxed arch_atomic_fetch_add_relaxed 11662306a36Sopenharmony_ci#define arch_atomic_fetch_add_acquire arch_atomic_fetch_add_acquire 11762306a36Sopenharmony_ci#define arch_atomic_fetch_add_release arch_atomic_fetch_add_release 11862306a36Sopenharmony_ci#define arch_atomic_fetch_add arch_atomic_fetch_add 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci#define arch_atomic_fetch_sub_relaxed arch_atomic_fetch_sub_relaxed 12162306a36Sopenharmony_ci#define arch_atomic_fetch_sub_acquire arch_atomic_fetch_sub_acquire 12262306a36Sopenharmony_ci#define arch_atomic_fetch_sub_release arch_atomic_fetch_sub_release 12362306a36Sopenharmony_ci#define arch_atomic_fetch_sub arch_atomic_fetch_sub 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci#define arch_atomic_fetch_and_relaxed arch_atomic_fetch_and_relaxed 12662306a36Sopenharmony_ci#define arch_atomic_fetch_and_acquire arch_atomic_fetch_and_acquire 12762306a36Sopenharmony_ci#define arch_atomic_fetch_and_release arch_atomic_fetch_and_release 12862306a36Sopenharmony_ci#define arch_atomic_fetch_and arch_atomic_fetch_and 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot_relaxed 13162306a36Sopenharmony_ci#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot_acquire 13262306a36Sopenharmony_ci#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot_release 13362306a36Sopenharmony_ci#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define arch_atomic_fetch_or_relaxed arch_atomic_fetch_or_relaxed 13662306a36Sopenharmony_ci#define arch_atomic_fetch_or_acquire arch_atomic_fetch_or_acquire 13762306a36Sopenharmony_ci#define arch_atomic_fetch_or_release arch_atomic_fetch_or_release 13862306a36Sopenharmony_ci#define arch_atomic_fetch_or arch_atomic_fetch_or 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci#define arch_atomic_fetch_xor_relaxed arch_atomic_fetch_xor_relaxed 14162306a36Sopenharmony_ci#define arch_atomic_fetch_xor_acquire arch_atomic_fetch_xor_acquire 14262306a36Sopenharmony_ci#define arch_atomic_fetch_xor_release arch_atomic_fetch_xor_release 14362306a36Sopenharmony_ci#define arch_atomic_fetch_xor arch_atomic_fetch_xor 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define arch_atomic_andnot arch_atomic_andnot 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* 14862306a36Sopenharmony_ci * 64-bit arch_atomic operations. 14962306a36Sopenharmony_ci */ 15062306a36Sopenharmony_ci#define ATOMIC64_INIT ATOMIC_INIT 15162306a36Sopenharmony_ci#define arch_atomic64_read arch_atomic_read 15262306a36Sopenharmony_ci#define arch_atomic64_set arch_atomic_set 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#define arch_atomic64_add_return_relaxed arch_atomic64_add_return_relaxed 15562306a36Sopenharmony_ci#define arch_atomic64_add_return_acquire arch_atomic64_add_return_acquire 15662306a36Sopenharmony_ci#define arch_atomic64_add_return_release arch_atomic64_add_return_release 15762306a36Sopenharmony_ci#define arch_atomic64_add_return arch_atomic64_add_return 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return_relaxed 16062306a36Sopenharmony_ci#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return_acquire 16162306a36Sopenharmony_ci#define arch_atomic64_sub_return_release arch_atomic64_sub_return_release 16262306a36Sopenharmony_ci#define arch_atomic64_sub_return arch_atomic64_sub_return 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add_relaxed 16562306a36Sopenharmony_ci#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add_acquire 16662306a36Sopenharmony_ci#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add_release 16762306a36Sopenharmony_ci#define arch_atomic64_fetch_add arch_atomic64_fetch_add 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub_relaxed 17062306a36Sopenharmony_ci#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub_acquire 17162306a36Sopenharmony_ci#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub_release 17262306a36Sopenharmony_ci#define arch_atomic64_fetch_sub arch_atomic64_fetch_sub 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and_relaxed 17562306a36Sopenharmony_ci#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and_acquire 17662306a36Sopenharmony_ci#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and_release 17762306a36Sopenharmony_ci#define arch_atomic64_fetch_and arch_atomic64_fetch_and 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed 18062306a36Sopenharmony_ci#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire 18162306a36Sopenharmony_ci#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release 18262306a36Sopenharmony_ci#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or_relaxed 18562306a36Sopenharmony_ci#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or_acquire 18662306a36Sopenharmony_ci#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or_release 18762306a36Sopenharmony_ci#define arch_atomic64_fetch_or arch_atomic64_fetch_or 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor_relaxed 19062306a36Sopenharmony_ci#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor_acquire 19162306a36Sopenharmony_ci#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor_release 19262306a36Sopenharmony_ci#define arch_atomic64_fetch_xor arch_atomic64_fetch_xor 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci#define arch_atomic64_andnot arch_atomic64_andnot 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#endif /* __ASM_ATOMIC_H */ 199