linux/arch/arm64/include/asm/atomic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Based on arch/arm/include/asm/atomic.h
   4 *
   5 * Copyright (C) 1996 Russell King.
   6 * Copyright (C) 2002 Deep Blue Solutions Ltd.
   7 * Copyright (C) 2012 ARM Ltd.
   8 */
   9#ifndef __ASM_ATOMIC_H
  10#define __ASM_ATOMIC_H
  11
  12#include <linux/compiler.h>
  13#include <linux/types.h>
  14
  15#include <asm/barrier.h>
  16#include <asm/cmpxchg.h>
  17#include <asm/lse.h>
  18
  19#define ATOMIC_OP(op)                                                   \
  20static __always_inline void arch_##op(int i, atomic_t *v)               \
  21{                                                                       \
  22        __lse_ll_sc_body(op, i, v);                                     \
  23}
  24
  25ATOMIC_OP(atomic_andnot)
  26ATOMIC_OP(atomic_or)
  27ATOMIC_OP(atomic_xor)
  28ATOMIC_OP(atomic_add)
  29ATOMIC_OP(atomic_and)
  30ATOMIC_OP(atomic_sub)
  31
  32#undef ATOMIC_OP
  33
  34#define ATOMIC_FETCH_OP(name, op)                                       \
  35static __always_inline int arch_##op##name(int i, atomic_t *v)          \
  36{                                                                       \
  37        return __lse_ll_sc_body(op##name, i, v);                        \
  38}
  39
  40#define ATOMIC_FETCH_OPS(op)                                            \
  41        ATOMIC_FETCH_OP(_relaxed, op)                                   \
  42        ATOMIC_FETCH_OP(_acquire, op)                                   \
  43        ATOMIC_FETCH_OP(_release, op)                                   \
  44        ATOMIC_FETCH_OP(        , op)
  45
  46ATOMIC_FETCH_OPS(atomic_fetch_andnot)
  47ATOMIC_FETCH_OPS(atomic_fetch_or)
  48ATOMIC_FETCH_OPS(atomic_fetch_xor)
  49ATOMIC_FETCH_OPS(atomic_fetch_add)
  50ATOMIC_FETCH_OPS(atomic_fetch_and)
  51ATOMIC_FETCH_OPS(atomic_fetch_sub)
  52ATOMIC_FETCH_OPS(atomic_add_return)
  53ATOMIC_FETCH_OPS(atomic_sub_return)
  54
  55#undef ATOMIC_FETCH_OP
  56#undef ATOMIC_FETCH_OPS
  57
  58#define ATOMIC64_OP(op)                                                 \
  59static __always_inline void arch_##op(long i, atomic64_t *v)            \
  60{                                                                       \
  61        __lse_ll_sc_body(op, i, v);                                     \
  62}
  63
  64ATOMIC64_OP(atomic64_andnot)
  65ATOMIC64_OP(atomic64_or)
  66ATOMIC64_OP(atomic64_xor)
  67ATOMIC64_OP(atomic64_add)
  68ATOMIC64_OP(atomic64_and)
  69ATOMIC64_OP(atomic64_sub)
  70
  71#undef ATOMIC64_OP
  72
  73#define ATOMIC64_FETCH_OP(name, op)                                     \
  74static __always_inline long arch_##op##name(long i, atomic64_t *v)      \
  75{                                                                       \
  76        return __lse_ll_sc_body(op##name, i, v);                        \
  77}
  78
  79#define ATOMIC64_FETCH_OPS(op)                                          \
  80        ATOMIC64_FETCH_OP(_relaxed, op)                                 \
  81        ATOMIC64_FETCH_OP(_acquire, op)                                 \
  82        ATOMIC64_FETCH_OP(_release, op)                                 \
  83        ATOMIC64_FETCH_OP(        , op)
  84
  85ATOMIC64_FETCH_OPS(atomic64_fetch_andnot)
  86ATOMIC64_FETCH_OPS(atomic64_fetch_or)
  87ATOMIC64_FETCH_OPS(atomic64_fetch_xor)
  88ATOMIC64_FETCH_OPS(atomic64_fetch_add)
  89ATOMIC64_FETCH_OPS(atomic64_fetch_and)
  90ATOMIC64_FETCH_OPS(atomic64_fetch_sub)
  91ATOMIC64_FETCH_OPS(atomic64_add_return)
  92ATOMIC64_FETCH_OPS(atomic64_sub_return)
  93
  94#undef ATOMIC64_FETCH_OP
  95#undef ATOMIC64_FETCH_OPS
  96
  97static __always_inline long arch_atomic64_dec_if_positive(atomic64_t *v)
  98{
  99        return __lse_ll_sc_body(atomic64_dec_if_positive, v);
 100}
 101
 102#define arch_atomic_read(v)                     __READ_ONCE((v)->counter)
 103#define arch_atomic_set(v, i)                   __WRITE_ONCE(((v)->counter), (i))
 104
 105#define arch_atomic_add_return_relaxed          arch_atomic_add_return_relaxed
 106#define arch_atomic_add_return_acquire          arch_atomic_add_return_acquire
 107#define arch_atomic_add_return_release          arch_atomic_add_return_release
 108#define arch_atomic_add_return                  arch_atomic_add_return
 109
 110#define arch_atomic_sub_return_relaxed          arch_atomic_sub_return_relaxed
 111#define arch_atomic_sub_return_acquire          arch_atomic_sub_return_acquire
 112#define arch_atomic_sub_return_release          arch_atomic_sub_return_release
 113#define arch_atomic_sub_return                  arch_atomic_sub_return
 114
 115#define arch_atomic_fetch_add_relaxed           arch_atomic_fetch_add_relaxed
 116#define arch_atomic_fetch_add_acquire           arch_atomic_fetch_add_acquire
 117#define arch_atomic_fetch_add_release           arch_atomic_fetch_add_release
 118#define arch_atomic_fetch_add                   arch_atomic_fetch_add
 119
 120#define arch_atomic_fetch_sub_relaxed           arch_atomic_fetch_sub_relaxed
 121#define arch_atomic_fetch_sub_acquire           arch_atomic_fetch_sub_acquire
 122#define arch_atomic_fetch_sub_release           arch_atomic_fetch_sub_release
 123#define arch_atomic_fetch_sub                   arch_atomic_fetch_sub
 124
 125#define arch_atomic_fetch_and_relaxed           arch_atomic_fetch_and_relaxed
 126#define arch_atomic_fetch_and_acquire           arch_atomic_fetch_and_acquire
 127#define arch_atomic_fetch_and_release           arch_atomic_fetch_and_release
 128#define arch_atomic_fetch_and                   arch_atomic_fetch_and
 129
 130#define arch_atomic_fetch_andnot_relaxed        arch_atomic_fetch_andnot_relaxed
 131#define arch_atomic_fetch_andnot_acquire        arch_atomic_fetch_andnot_acquire
 132#define arch_atomic_fetch_andnot_release        arch_atomic_fetch_andnot_release
 133#define arch_atomic_fetch_andnot                arch_atomic_fetch_andnot
 134
 135#define arch_atomic_fetch_or_relaxed            arch_atomic_fetch_or_relaxed
 136#define arch_atomic_fetch_or_acquire            arch_atomic_fetch_or_acquire
 137#define arch_atomic_fetch_or_release            arch_atomic_fetch_or_release
 138#define arch_atomic_fetch_or                    arch_atomic_fetch_or
 139
 140#define arch_atomic_fetch_xor_relaxed           arch_atomic_fetch_xor_relaxed
 141#define arch_atomic_fetch_xor_acquire           arch_atomic_fetch_xor_acquire
 142#define arch_atomic_fetch_xor_release           arch_atomic_fetch_xor_release
 143#define arch_atomic_fetch_xor                   arch_atomic_fetch_xor
 144
 145#define arch_atomic_xchg_relaxed(v, new) \
 146        arch_xchg_relaxed(&((v)->counter), (new))
 147#define arch_atomic_xchg_acquire(v, new) \
 148        arch_xchg_acquire(&((v)->counter), (new))
 149#define arch_atomic_xchg_release(v, new) \
 150        arch_xchg_release(&((v)->counter), (new))
 151#define arch_atomic_xchg(v, new) \
 152        arch_xchg(&((v)->counter), (new))
 153
 154#define arch_atomic_cmpxchg_relaxed(v, old, new) \
 155        arch_cmpxchg_relaxed(&((v)->counter), (old), (new))
 156#define arch_atomic_cmpxchg_acquire(v, old, new) \
 157        arch_cmpxchg_acquire(&((v)->counter), (old), (new))
 158#define arch_atomic_cmpxchg_release(v, old, new) \
 159        arch_cmpxchg_release(&((v)->counter), (old), (new))
 160#define arch_atomic_cmpxchg(v, old, new) \
 161        arch_cmpxchg(&((v)->counter), (old), (new))
 162
 163#define arch_atomic_andnot                      arch_atomic_andnot
 164
 165/*
 166 * 64-bit arch_atomic operations.
 167 */
 168#define ATOMIC64_INIT                           ATOMIC_INIT
 169#define arch_atomic64_read                      arch_atomic_read
 170#define arch_atomic64_set                       arch_atomic_set
 171
 172#define arch_atomic64_add_return_relaxed        arch_atomic64_add_return_relaxed
 173#define arch_atomic64_add_return_acquire        arch_atomic64_add_return_acquire
 174#define arch_atomic64_add_return_release        arch_atomic64_add_return_release
 175#define arch_atomic64_add_return                arch_atomic64_add_return
 176
 177#define arch_atomic64_sub_return_relaxed        arch_atomic64_sub_return_relaxed
 178#define arch_atomic64_sub_return_acquire        arch_atomic64_sub_return_acquire
 179#define arch_atomic64_sub_return_release        arch_atomic64_sub_return_release
 180#define arch_atomic64_sub_return                arch_atomic64_sub_return
 181
 182#define arch_atomic64_fetch_add_relaxed         arch_atomic64_fetch_add_relaxed
 183#define arch_atomic64_fetch_add_acquire         arch_atomic64_fetch_add_acquire
 184#define arch_atomic64_fetch_add_release         arch_atomic64_fetch_add_release
 185#define arch_atomic64_fetch_add                 arch_atomic64_fetch_add
 186
 187#define arch_atomic64_fetch_sub_relaxed         arch_atomic64_fetch_sub_relaxed
 188#define arch_atomic64_fetch_sub_acquire         arch_atomic64_fetch_sub_acquire
 189#define arch_atomic64_fetch_sub_release         arch_atomic64_fetch_sub_release
 190#define arch_atomic64_fetch_sub                 arch_atomic64_fetch_sub
 191
 192#define arch_atomic64_fetch_and_relaxed         arch_atomic64_fetch_and_relaxed
 193#define arch_atomic64_fetch_and_acquire         arch_atomic64_fetch_and_acquire
 194#define arch_atomic64_fetch_and_release         arch_atomic64_fetch_and_release
 195#define arch_atomic64_fetch_and                 arch_atomic64_fetch_and
 196
 197#define arch_atomic64_fetch_andnot_relaxed      arch_atomic64_fetch_andnot_relaxed
 198#define arch_atomic64_fetch_andnot_acquire      arch_atomic64_fetch_andnot_acquire
 199#define arch_atomic64_fetch_andnot_release      arch_atomic64_fetch_andnot_release
 200#define arch_atomic64_fetch_andnot              arch_atomic64_fetch_andnot
 201
 202#define arch_atomic64_fetch_or_relaxed          arch_atomic64_fetch_or_relaxed
 203#define arch_atomic64_fetch_or_acquire          arch_atomic64_fetch_or_acquire
 204#define arch_atomic64_fetch_or_release          arch_atomic64_fetch_or_release
 205#define arch_atomic64_fetch_or                  arch_atomic64_fetch_or
 206
 207#define arch_atomic64_fetch_xor_relaxed         arch_atomic64_fetch_xor_relaxed
 208#define arch_atomic64_fetch_xor_acquire         arch_atomic64_fetch_xor_acquire
 209#define arch_atomic64_fetch_xor_release         arch_atomic64_fetch_xor_release
 210#define arch_atomic64_fetch_xor                 arch_atomic64_fetch_xor
 211
 212#define arch_atomic64_xchg_relaxed              arch_atomic_xchg_relaxed
 213#define arch_atomic64_xchg_acquire              arch_atomic_xchg_acquire
 214#define arch_atomic64_xchg_release              arch_atomic_xchg_release
 215#define arch_atomic64_xchg                      arch_atomic_xchg
 216
 217#define arch_atomic64_cmpxchg_relaxed           arch_atomic_cmpxchg_relaxed
 218#define arch_atomic64_cmpxchg_acquire           arch_atomic_cmpxchg_acquire
 219#define arch_atomic64_cmpxchg_release           arch_atomic_cmpxchg_release
 220#define arch_atomic64_cmpxchg                   arch_atomic_cmpxchg
 221
 222#define arch_atomic64_andnot                    arch_atomic64_andnot
 223
 224#define arch_atomic64_dec_if_positive           arch_atomic64_dec_if_positive
 225
 226#endif /* __ASM_ATOMIC_H */
 227