Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm64/include/asm/atomic.h
26481 views
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) \
20
static __always_inline void arch_##op(int i, atomic_t *v) \
21
{ \
22
__lse_ll_sc_body(op, i, v); \
23
}
24
25
ATOMIC_OP(atomic_andnot)
26
ATOMIC_OP(atomic_or)
27
ATOMIC_OP(atomic_xor)
28
ATOMIC_OP(atomic_add)
29
ATOMIC_OP(atomic_and)
30
ATOMIC_OP(atomic_sub)
31
32
#undef ATOMIC_OP
33
34
#define ATOMIC_FETCH_OP(name, op) \
35
static __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
46
ATOMIC_FETCH_OPS(atomic_fetch_andnot)
47
ATOMIC_FETCH_OPS(atomic_fetch_or)
48
ATOMIC_FETCH_OPS(atomic_fetch_xor)
49
ATOMIC_FETCH_OPS(atomic_fetch_add)
50
ATOMIC_FETCH_OPS(atomic_fetch_and)
51
ATOMIC_FETCH_OPS(atomic_fetch_sub)
52
ATOMIC_FETCH_OPS(atomic_add_return)
53
ATOMIC_FETCH_OPS(atomic_sub_return)
54
55
#undef ATOMIC_FETCH_OP
56
#undef ATOMIC_FETCH_OPS
57
58
#define ATOMIC64_OP(op) \
59
static __always_inline void arch_##op(long i, atomic64_t *v) \
60
{ \
61
__lse_ll_sc_body(op, i, v); \
62
}
63
64
ATOMIC64_OP(atomic64_andnot)
65
ATOMIC64_OP(atomic64_or)
66
ATOMIC64_OP(atomic64_xor)
67
ATOMIC64_OP(atomic64_add)
68
ATOMIC64_OP(atomic64_and)
69
ATOMIC64_OP(atomic64_sub)
70
71
#undef ATOMIC64_OP
72
73
#define ATOMIC64_FETCH_OP(name, op) \
74
static __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
85
ATOMIC64_FETCH_OPS(atomic64_fetch_andnot)
86
ATOMIC64_FETCH_OPS(atomic64_fetch_or)
87
ATOMIC64_FETCH_OPS(atomic64_fetch_xor)
88
ATOMIC64_FETCH_OPS(atomic64_fetch_add)
89
ATOMIC64_FETCH_OPS(atomic64_fetch_and)
90
ATOMIC64_FETCH_OPS(atomic64_fetch_sub)
91
ATOMIC64_FETCH_OPS(atomic64_add_return)
92
ATOMIC64_FETCH_OPS(atomic64_sub_return)
93
94
#undef ATOMIC64_FETCH_OP
95
#undef ATOMIC64_FETCH_OPS
96
97
static __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_andnot arch_atomic_andnot
146
147
/*
148
* 64-bit arch_atomic operations.
149
*/
150
#define ATOMIC64_INIT ATOMIC_INIT
151
#define arch_atomic64_read arch_atomic_read
152
#define arch_atomic64_set arch_atomic_set
153
154
#define arch_atomic64_add_return_relaxed arch_atomic64_add_return_relaxed
155
#define arch_atomic64_add_return_acquire arch_atomic64_add_return_acquire
156
#define arch_atomic64_add_return_release arch_atomic64_add_return_release
157
#define arch_atomic64_add_return arch_atomic64_add_return
158
159
#define arch_atomic64_sub_return_relaxed arch_atomic64_sub_return_relaxed
160
#define arch_atomic64_sub_return_acquire arch_atomic64_sub_return_acquire
161
#define arch_atomic64_sub_return_release arch_atomic64_sub_return_release
162
#define arch_atomic64_sub_return arch_atomic64_sub_return
163
164
#define arch_atomic64_fetch_add_relaxed arch_atomic64_fetch_add_relaxed
165
#define arch_atomic64_fetch_add_acquire arch_atomic64_fetch_add_acquire
166
#define arch_atomic64_fetch_add_release arch_atomic64_fetch_add_release
167
#define arch_atomic64_fetch_add arch_atomic64_fetch_add
168
169
#define arch_atomic64_fetch_sub_relaxed arch_atomic64_fetch_sub_relaxed
170
#define arch_atomic64_fetch_sub_acquire arch_atomic64_fetch_sub_acquire
171
#define arch_atomic64_fetch_sub_release arch_atomic64_fetch_sub_release
172
#define arch_atomic64_fetch_sub arch_atomic64_fetch_sub
173
174
#define arch_atomic64_fetch_and_relaxed arch_atomic64_fetch_and_relaxed
175
#define arch_atomic64_fetch_and_acquire arch_atomic64_fetch_and_acquire
176
#define arch_atomic64_fetch_and_release arch_atomic64_fetch_and_release
177
#define arch_atomic64_fetch_and arch_atomic64_fetch_and
178
179
#define arch_atomic64_fetch_andnot_relaxed arch_atomic64_fetch_andnot_relaxed
180
#define arch_atomic64_fetch_andnot_acquire arch_atomic64_fetch_andnot_acquire
181
#define arch_atomic64_fetch_andnot_release arch_atomic64_fetch_andnot_release
182
#define arch_atomic64_fetch_andnot arch_atomic64_fetch_andnot
183
184
#define arch_atomic64_fetch_or_relaxed arch_atomic64_fetch_or_relaxed
185
#define arch_atomic64_fetch_or_acquire arch_atomic64_fetch_or_acquire
186
#define arch_atomic64_fetch_or_release arch_atomic64_fetch_or_release
187
#define arch_atomic64_fetch_or arch_atomic64_fetch_or
188
189
#define arch_atomic64_fetch_xor_relaxed arch_atomic64_fetch_xor_relaxed
190
#define arch_atomic64_fetch_xor_acquire arch_atomic64_fetch_xor_acquire
191
#define arch_atomic64_fetch_xor_release arch_atomic64_fetch_xor_release
192
#define arch_atomic64_fetch_xor arch_atomic64_fetch_xor
193
194
#define arch_atomic64_andnot arch_atomic64_andnot
195
196
#define arch_atomic64_dec_if_positive arch_atomic64_dec_if_positive
197
198
#endif /* __ASM_ATOMIC_H */
199
200