linux/arch/arm64/include/asm/atomic.h
<<
>>
Prefs
   1/*
   2 * Based on arch/arm/include/asm/atomic.h
   3 *
   4 * Copyright (C) 1996 Russell King.
   5 * Copyright (C) 2002 Deep Blue Solutions Ltd.
   6 * Copyright (C) 2012 ARM Ltd.
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19 */
  20#ifndef __ASM_ATOMIC_H
  21#define __ASM_ATOMIC_H
  22
  23#include <linux/compiler.h>
  24#include <linux/types.h>
  25
  26#include <asm/barrier.h>
  27#include <asm/lse.h>
  28
  29#ifdef __KERNEL__
  30
  31#define __ARM64_IN_ATOMIC_IMPL
  32
  33#if defined(CONFIG_ARM64_LSE_ATOMICS) && defined(CONFIG_AS_LSE)
  34#include <asm/atomic_lse.h>
  35#else
  36#include <asm/atomic_ll_sc.h>
  37#endif
  38
  39#undef __ARM64_IN_ATOMIC_IMPL
  40
  41#include <asm/cmpxchg.h>
  42
  43#define ATOMIC_INIT(i)  { (i) }
  44
  45#define atomic_read(v)                  READ_ONCE((v)->counter)
  46#define atomic_set(v, i)                WRITE_ONCE(((v)->counter), (i))
  47
  48#define atomic_add_return_relaxed       atomic_add_return_relaxed
  49#define atomic_add_return_acquire       atomic_add_return_acquire
  50#define atomic_add_return_release       atomic_add_return_release
  51#define atomic_add_return               atomic_add_return
  52
  53#define atomic_sub_return_relaxed       atomic_sub_return_relaxed
  54#define atomic_sub_return_acquire       atomic_sub_return_acquire
  55#define atomic_sub_return_release       atomic_sub_return_release
  56#define atomic_sub_return               atomic_sub_return
  57
  58#define atomic_fetch_add_relaxed        atomic_fetch_add_relaxed
  59#define atomic_fetch_add_acquire        atomic_fetch_add_acquire
  60#define atomic_fetch_add_release        atomic_fetch_add_release
  61#define atomic_fetch_add                atomic_fetch_add
  62
  63#define atomic_fetch_sub_relaxed        atomic_fetch_sub_relaxed
  64#define atomic_fetch_sub_acquire        atomic_fetch_sub_acquire
  65#define atomic_fetch_sub_release        atomic_fetch_sub_release
  66#define atomic_fetch_sub                atomic_fetch_sub
  67
  68#define atomic_fetch_and_relaxed        atomic_fetch_and_relaxed
  69#define atomic_fetch_and_acquire        atomic_fetch_and_acquire
  70#define atomic_fetch_and_release        atomic_fetch_and_release
  71#define atomic_fetch_and                atomic_fetch_and
  72
  73#define atomic_fetch_andnot_relaxed     atomic_fetch_andnot_relaxed
  74#define atomic_fetch_andnot_acquire     atomic_fetch_andnot_acquire
  75#define atomic_fetch_andnot_release     atomic_fetch_andnot_release
  76#define atomic_fetch_andnot             atomic_fetch_andnot
  77
  78#define atomic_fetch_or_relaxed         atomic_fetch_or_relaxed
  79#define atomic_fetch_or_acquire         atomic_fetch_or_acquire
  80#define atomic_fetch_or_release         atomic_fetch_or_release
  81#define atomic_fetch_or                 atomic_fetch_or
  82
  83#define atomic_fetch_xor_relaxed        atomic_fetch_xor_relaxed
  84#define atomic_fetch_xor_acquire        atomic_fetch_xor_acquire
  85#define atomic_fetch_xor_release        atomic_fetch_xor_release
  86#define atomic_fetch_xor                atomic_fetch_xor
  87
  88#define atomic_xchg_relaxed(v, new)     xchg_relaxed(&((v)->counter), (new))
  89#define atomic_xchg_acquire(v, new)     xchg_acquire(&((v)->counter), (new))
  90#define atomic_xchg_release(v, new)     xchg_release(&((v)->counter), (new))
  91#define atomic_xchg(v, new)             xchg(&((v)->counter), (new))
  92
  93#define atomic_cmpxchg_relaxed(v, old, new)                             \
  94        cmpxchg_relaxed(&((v)->counter), (old), (new))
  95#define atomic_cmpxchg_acquire(v, old, new)                             \
  96        cmpxchg_acquire(&((v)->counter), (old), (new))
  97#define atomic_cmpxchg_release(v, old, new)                             \
  98        cmpxchg_release(&((v)->counter), (old), (new))
  99#define atomic_cmpxchg(v, old, new)     cmpxchg(&((v)->counter), (old), (new))
 100
 101#define atomic_andnot                   atomic_andnot
 102
 103/*
 104 * 64-bit atomic operations.
 105 */
 106#define ATOMIC64_INIT                   ATOMIC_INIT
 107#define atomic64_read                   atomic_read
 108#define atomic64_set                    atomic_set
 109
 110#define atomic64_add_return_relaxed     atomic64_add_return_relaxed
 111#define atomic64_add_return_acquire     atomic64_add_return_acquire
 112#define atomic64_add_return_release     atomic64_add_return_release
 113#define atomic64_add_return             atomic64_add_return
 114
 115#define atomic64_sub_return_relaxed     atomic64_sub_return_relaxed
 116#define atomic64_sub_return_acquire     atomic64_sub_return_acquire
 117#define atomic64_sub_return_release     atomic64_sub_return_release
 118#define atomic64_sub_return             atomic64_sub_return
 119
 120#define atomic64_fetch_add_relaxed      atomic64_fetch_add_relaxed
 121#define atomic64_fetch_add_acquire      atomic64_fetch_add_acquire
 122#define atomic64_fetch_add_release      atomic64_fetch_add_release
 123#define atomic64_fetch_add              atomic64_fetch_add
 124
 125#define atomic64_fetch_sub_relaxed      atomic64_fetch_sub_relaxed
 126#define atomic64_fetch_sub_acquire      atomic64_fetch_sub_acquire
 127#define atomic64_fetch_sub_release      atomic64_fetch_sub_release
 128#define atomic64_fetch_sub              atomic64_fetch_sub
 129
 130#define atomic64_fetch_and_relaxed      atomic64_fetch_and_relaxed
 131#define atomic64_fetch_and_acquire      atomic64_fetch_and_acquire
 132#define atomic64_fetch_and_release      atomic64_fetch_and_release
 133#define atomic64_fetch_and              atomic64_fetch_and
 134
 135#define atomic64_fetch_andnot_relaxed   atomic64_fetch_andnot_relaxed
 136#define atomic64_fetch_andnot_acquire   atomic64_fetch_andnot_acquire
 137#define atomic64_fetch_andnot_release   atomic64_fetch_andnot_release
 138#define atomic64_fetch_andnot           atomic64_fetch_andnot
 139
 140#define atomic64_fetch_or_relaxed       atomic64_fetch_or_relaxed
 141#define atomic64_fetch_or_acquire       atomic64_fetch_or_acquire
 142#define atomic64_fetch_or_release       atomic64_fetch_or_release
 143#define atomic64_fetch_or               atomic64_fetch_or
 144
 145#define atomic64_fetch_xor_relaxed      atomic64_fetch_xor_relaxed
 146#define atomic64_fetch_xor_acquire      atomic64_fetch_xor_acquire
 147#define atomic64_fetch_xor_release      atomic64_fetch_xor_release
 148#define atomic64_fetch_xor              atomic64_fetch_xor
 149
 150#define atomic64_xchg_relaxed           atomic_xchg_relaxed
 151#define atomic64_xchg_acquire           atomic_xchg_acquire
 152#define atomic64_xchg_release           atomic_xchg_release
 153#define atomic64_xchg                   atomic_xchg
 154
 155#define atomic64_cmpxchg_relaxed        atomic_cmpxchg_relaxed
 156#define atomic64_cmpxchg_acquire        atomic_cmpxchg_acquire
 157#define atomic64_cmpxchg_release        atomic_cmpxchg_release
 158#define atomic64_cmpxchg                atomic_cmpxchg
 159
 160#define atomic64_andnot                 atomic64_andnot
 161
 162#define atomic64_dec_if_positive        atomic64_dec_if_positive
 163
 164#endif
 165#endif
 166