Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v5.3 161 lines 6.7 kB view raw
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/lse.h> 17 18#ifdef __KERNEL__ 19 20#define __ARM64_IN_ATOMIC_IMPL 21 22#if defined(CONFIG_ARM64_LSE_ATOMICS) && defined(CONFIG_AS_LSE) 23#include <asm/atomic_lse.h> 24#else 25#include <asm/atomic_ll_sc.h> 26#endif 27 28#undef __ARM64_IN_ATOMIC_IMPL 29 30#include <asm/cmpxchg.h> 31 32#define ATOMIC_INIT(i) { (i) } 33 34#define arch_atomic_read(v) READ_ONCE((v)->counter) 35#define arch_atomic_set(v, i) WRITE_ONCE(((v)->counter), (i)) 36 37#define arch_atomic_add_return_relaxed arch_atomic_add_return_relaxed 38#define arch_atomic_add_return_acquire arch_atomic_add_return_acquire 39#define arch_atomic_add_return_release arch_atomic_add_return_release 40#define arch_atomic_add_return arch_atomic_add_return 41 42#define arch_atomic_sub_return_relaxed arch_atomic_sub_return_relaxed 43#define arch_atomic_sub_return_acquire arch_atomic_sub_return_acquire 44#define arch_atomic_sub_return_release arch_atomic_sub_return_release 45#define arch_atomic_sub_return arch_atomic_sub_return 46 47#define arch_atomic_fetch_add_relaxed arch_atomic_fetch_add_relaxed 48#define arch_atomic_fetch_add_acquire arch_atomic_fetch_add_acquire 49#define arch_atomic_fetch_add_release arch_atomic_fetch_add_release 50#define arch_atomic_fetch_add arch_atomic_fetch_add 51 52#define arch_atomic_fetch_sub_relaxed arch_atomic_fetch_sub_relaxed 53#define arch_atomic_fetch_sub_acquire arch_atomic_fetch_sub_acquire 54#define arch_atomic_fetch_sub_release arch_atomic_fetch_sub_release 55#define arch_atomic_fetch_sub arch_atomic_fetch_sub 56 57#define arch_atomic_fetch_and_relaxed arch_atomic_fetch_and_relaxed 58#define arch_atomic_fetch_and_acquire arch_atomic_fetch_and_acquire 59#define arch_atomic_fetch_and_release arch_atomic_fetch_and_release 60#define arch_atomic_fetch_and arch_atomic_fetch_and 61 62#define arch_atomic_fetch_andnot_relaxed arch_atomic_fetch_andnot_relaxed 63#define arch_atomic_fetch_andnot_acquire arch_atomic_fetch_andnot_acquire 64#define arch_atomic_fetch_andnot_release arch_atomic_fetch_andnot_release 65#define arch_atomic_fetch_andnot arch_atomic_fetch_andnot 66 67#define arch_atomic_fetch_or_relaxed arch_atomic_fetch_or_relaxed 68#define arch_atomic_fetch_or_acquire arch_atomic_fetch_or_acquire 69#define arch_atomic_fetch_or_release arch_atomic_fetch_or_release 70#define arch_atomic_fetch_or arch_atomic_fetch_or 71 72#define arch_atomic_fetch_xor_relaxed arch_atomic_fetch_xor_relaxed 73#define arch_atomic_fetch_xor_acquire arch_atomic_fetch_xor_acquire 74#define arch_atomic_fetch_xor_release arch_atomic_fetch_xor_release 75#define arch_atomic_fetch_xor arch_atomic_fetch_xor 76 77#define arch_atomic_xchg_relaxed(v, new) \ 78 arch_xchg_relaxed(&((v)->counter), (new)) 79#define arch_atomic_xchg_acquire(v, new) \ 80 arch_xchg_acquire(&((v)->counter), (new)) 81#define arch_atomic_xchg_release(v, new) \ 82 arch_xchg_release(&((v)->counter), (new)) 83#define arch_atomic_xchg(v, new) \ 84 arch_xchg(&((v)->counter), (new)) 85 86#define arch_atomic_cmpxchg_relaxed(v, old, new) \ 87 arch_cmpxchg_relaxed(&((v)->counter), (old), (new)) 88#define arch_atomic_cmpxchg_acquire(v, old, new) \ 89 arch_cmpxchg_acquire(&((v)->counter), (old), (new)) 90#define arch_atomic_cmpxchg_release(v, old, new) \ 91 arch_cmpxchg_release(&((v)->counter), (old), (new)) 92#define arch_atomic_cmpxchg(v, old, new) \ 93 arch_cmpxchg(&((v)->counter), (old), (new)) 94 95#define arch_atomic_andnot arch_atomic_andnot 96 97/* 98 * 64-bit arch_atomic operations. 99 */ 100#define ATOMIC64_INIT ATOMIC_INIT 101#define arch_atomic64_read arch_atomic_read 102#define arch_atomic64_set arch_atomic_set 103 104#define arch_atomic64_add_return_relaxed arch_atomic64_add_return_relaxed 105#define arch_atomic64_add_return_acquire arch_atomic64_add_return_acquire 106#define arch_atomic64_add_return_release arch_atomic64_add_return_release 107#define arch_atomic64_add_return arch_atomic64_add_return 108 109#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return_relaxed 110#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return_acquire 111#define arch_atomic64_sub_return_release arch_atomic64_sub_return_release 112#define arch_atomic64_sub_return arch_atomic64_sub_return 113 114#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add_relaxed 115#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add_acquire 116#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add_release 117#define arch_atomic64_fetch_add arch_atomic64_fetch_add 118 119#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub_relaxed 120#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub_acquire 121#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub_release 122#define arch_atomic64_fetch_sub arch_atomic64_fetch_sub 123 124#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and_relaxed 125#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and_acquire 126#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and_release 127#define arch_atomic64_fetch_and arch_atomic64_fetch_and 128 129#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed 130#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire 131#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release 132#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot 133 134#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or_relaxed 135#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or_acquire 136#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or_release 137#define arch_atomic64_fetch_or arch_atomic64_fetch_or 138 139#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor_relaxed 140#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor_acquire 141#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor_release 142#define arch_atomic64_fetch_xor arch_atomic64_fetch_xor 143 144#define arch_atomic64_xchg_relaxed arch_atomic_xchg_relaxed 145#define arch_atomic64_xchg_acquire arch_atomic_xchg_acquire 146#define arch_atomic64_xchg_release arch_atomic_xchg_release 147#define arch_atomic64_xchg arch_atomic_xchg 148 149#define arch_atomic64_cmpxchg_relaxed arch_atomic_cmpxchg_relaxed 150#define arch_atomic64_cmpxchg_acquire arch_atomic_cmpxchg_acquire 151#define arch_atomic64_cmpxchg_release arch_atomic_cmpxchg_release 152#define arch_atomic64_cmpxchg arch_atomic_cmpxchg 153 154#define arch_atomic64_andnot arch_atomic64_andnot 155 156#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive 157 158#include <asm-generic/atomic-instrumented.h> 159 160#endif 161#endif