Commit | Line | Data |
---|---|---|
d3cb4871 CL |
1 | #ifndef _ASM_GENERIC_ATOMIC_H |
2 | #define _ASM_GENERIC_ATOMIC_H | |
3 | /* | |
4 | * Copyright (C) 2005 Silicon Graphics, Inc. | |
cde53535 | 5 | * Christoph Lameter |
d3cb4871 CL |
6 | * |
7 | * Allows to provide arch independent atomic definitions without the need to | |
8 | * edit all arch specific atomic.h files. | |
9 | */ | |
10 | ||
5998bf1d | 11 | #include <asm/types.h> |
d3cb4871 CL |
12 | |
13 | /* | |
14 | * Suppport for atomic_long_t | |
15 | * | |
16 | * Casts for parameters are avoided for existing atomic functions in order to | |
17 | * avoid issues with cast-as-lval under gcc 4.x and other limitations that the | |
18 | * macros of a platform may have. | |
19 | */ | |
20 | ||
21 | #if BITS_PER_LONG == 64 | |
22 | ||
23 | typedef atomic64_t atomic_long_t; | |
24 | ||
25 | #define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i) | |
26 | ||
27 | static inline long atomic_long_read(atomic_long_t *l) | |
28 | { | |
29 | atomic64_t *v = (atomic64_t *)l; | |
30 | ||
31 | return (long)atomic64_read(v); | |
32 | } | |
33 | ||
34 | static inline void atomic_long_set(atomic_long_t *l, long i) | |
35 | { | |
36 | atomic64_t *v = (atomic64_t *)l; | |
37 | ||
6b4977ce | 38 | atomic64_set(v, i); |
d3cb4871 CL |
39 | } |
40 | ||
41 | static inline void atomic_long_inc(atomic_long_t *l) | |
42 | { | |
43 | atomic64_t *v = (atomic64_t *)l; | |
44 | ||
45 | atomic64_inc(v); | |
46 | } | |
47 | ||
48 | static inline void atomic_long_dec(atomic_long_t *l) | |
49 | { | |
50 | atomic64_t *v = (atomic64_t *)l; | |
51 | ||
52 | atomic64_dec(v); | |
53 | } | |
54 | ||
55 | static inline void atomic_long_add(long i, atomic_long_t *l) | |
56 | { | |
57 | atomic64_t *v = (atomic64_t *)l; | |
58 | ||
59 | atomic64_add(i, v); | |
60 | } | |
61 | ||
62 | static inline void atomic_long_sub(long i, atomic_long_t *l) | |
63 | { | |
64 | atomic64_t *v = (atomic64_t *)l; | |
65 | ||
66 | atomic64_sub(i, v); | |
67 | } | |
68 | ||
bb2382c3 MD |
69 | static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) |
70 | { | |
71 | atomic64_t *v = (atomic64_t *)l; | |
72 | ||
73 | return atomic64_sub_and_test(i, v); | |
74 | } | |
75 | ||
76 | static inline int atomic_long_dec_and_test(atomic_long_t *l) | |
77 | { | |
78 | atomic64_t *v = (atomic64_t *)l; | |
79 | ||
80 | return atomic64_dec_and_test(v); | |
81 | } | |
82 | ||
83 | static inline int atomic_long_inc_and_test(atomic_long_t *l) | |
84 | { | |
85 | atomic64_t *v = (atomic64_t *)l; | |
86 | ||
87 | return atomic64_inc_and_test(v); | |
88 | } | |
89 | ||
90 | static inline int atomic_long_add_negative(long i, atomic_long_t *l) | |
91 | { | |
92 | atomic64_t *v = (atomic64_t *)l; | |
93 | ||
94 | return atomic64_add_negative(i, v); | |
95 | } | |
96 | ||
97 | static inline long atomic_long_add_return(long i, atomic_long_t *l) | |
98 | { | |
99 | atomic64_t *v = (atomic64_t *)l; | |
100 | ||
101 | return (long)atomic64_add_return(i, v); | |
102 | } | |
103 | ||
104 | static inline long atomic_long_sub_return(long i, atomic_long_t *l) | |
105 | { | |
106 | atomic64_t *v = (atomic64_t *)l; | |
107 | ||
108 | return (long)atomic64_sub_return(i, v); | |
109 | } | |
110 | ||
111 | static inline long atomic_long_inc_return(atomic_long_t *l) | |
112 | { | |
113 | atomic64_t *v = (atomic64_t *)l; | |
114 | ||
115 | return (long)atomic64_inc_return(v); | |
116 | } | |
117 | ||
118 | static inline long atomic_long_dec_return(atomic_long_t *l) | |
119 | { | |
120 | atomic64_t *v = (atomic64_t *)l; | |
121 | ||
122 | return (long)atomic64_dec_return(v); | |
123 | } | |
124 | ||
2856f5e3 MD |
125 | static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) |
126 | { | |
127 | atomic64_t *v = (atomic64_t *)l; | |
128 | ||
129 | return (long)atomic64_add_unless(v, a, u); | |
130 | } | |
bb2382c3 MD |
131 | |
132 | #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l)) | |
133 | ||
134 | #define atomic_long_cmpxchg(l, old, new) \ | |
135 | (atomic_cmpxchg((atomic64_t *)(l), (old), (new))) | |
136 | #define atomic_long_xchg(v, new) \ | |
137 | (atomic_xchg((atomic64_t *)(l), (new))) | |
138 | ||
4b358e22 | 139 | #else /* BITS_PER_LONG == 64 */ |
d3cb4871 CL |
140 | |
141 | typedef atomic_t atomic_long_t; | |
142 | ||
143 | #define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i) | |
144 | static inline long atomic_long_read(atomic_long_t *l) | |
145 | { | |
146 | atomic_t *v = (atomic_t *)l; | |
147 | ||
148 | return (long)atomic_read(v); | |
149 | } | |
150 | ||
151 | static inline void atomic_long_set(atomic_long_t *l, long i) | |
152 | { | |
153 | atomic_t *v = (atomic_t *)l; | |
154 | ||
155 | atomic_set(v, i); | |
156 | } | |
157 | ||
158 | static inline void atomic_long_inc(atomic_long_t *l) | |
159 | { | |
160 | atomic_t *v = (atomic_t *)l; | |
161 | ||
162 | atomic_inc(v); | |
163 | } | |
164 | ||
165 | static inline void atomic_long_dec(atomic_long_t *l) | |
166 | { | |
167 | atomic_t *v = (atomic_t *)l; | |
168 | ||
169 | atomic_dec(v); | |
170 | } | |
171 | ||
172 | static inline void atomic_long_add(long i, atomic_long_t *l) | |
173 | { | |
174 | atomic_t *v = (atomic_t *)l; | |
175 | ||
176 | atomic_add(i, v); | |
177 | } | |
178 | ||
179 | static inline void atomic_long_sub(long i, atomic_long_t *l) | |
180 | { | |
181 | atomic_t *v = (atomic_t *)l; | |
182 | ||
183 | atomic_sub(i, v); | |
184 | } | |
185 | ||
bb2382c3 MD |
186 | static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) |
187 | { | |
188 | atomic_t *v = (atomic_t *)l; | |
189 | ||
190 | return atomic_sub_and_test(i, v); | |
191 | } | |
192 | ||
193 | static inline int atomic_long_dec_and_test(atomic_long_t *l) | |
194 | { | |
195 | atomic_t *v = (atomic_t *)l; | |
196 | ||
197 | return atomic_dec_and_test(v); | |
198 | } | |
199 | ||
200 | static inline int atomic_long_inc_and_test(atomic_long_t *l) | |
201 | { | |
202 | atomic_t *v = (atomic_t *)l; | |
203 | ||
204 | return atomic_inc_and_test(v); | |
205 | } | |
206 | ||
207 | static inline int atomic_long_add_negative(long i, atomic_long_t *l) | |
208 | { | |
209 | atomic_t *v = (atomic_t *)l; | |
210 | ||
211 | return atomic_add_negative(i, v); | |
212 | } | |
213 | ||
214 | static inline long atomic_long_add_return(long i, atomic_long_t *l) | |
215 | { | |
216 | atomic_t *v = (atomic_t *)l; | |
217 | ||
218 | return (long)atomic_add_return(i, v); | |
219 | } | |
220 | ||
221 | static inline long atomic_long_sub_return(long i, atomic_long_t *l) | |
222 | { | |
223 | atomic_t *v = (atomic_t *)l; | |
224 | ||
225 | return (long)atomic_sub_return(i, v); | |
226 | } | |
227 | ||
228 | static inline long atomic_long_inc_return(atomic_long_t *l) | |
229 | { | |
230 | atomic_t *v = (atomic_t *)l; | |
231 | ||
232 | return (long)atomic_inc_return(v); | |
233 | } | |
234 | ||
235 | static inline long atomic_long_dec_return(atomic_long_t *l) | |
236 | { | |
237 | atomic_t *v = (atomic_t *)l; | |
238 | ||
239 | return (long)atomic_dec_return(v); | |
240 | } | |
241 | ||
2856f5e3 MD |
242 | static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) |
243 | { | |
244 | atomic_t *v = (atomic_t *)l; | |
245 | ||
246 | return (long)atomic_add_unless(v, a, u); | |
247 | } | |
bb2382c3 MD |
248 | |
249 | #define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l)) | |
250 | ||
251 | #define atomic_long_cmpxchg(l, old, new) \ | |
252 | (atomic_cmpxchg((atomic_t *)(l), (old), (new))) | |
253 | #define atomic_long_xchg(v, new) \ | |
aa6f1479 | 254 | (atomic_xchg((atomic_t *)(v), (new))) |
bb2382c3 | 255 | |
4b358e22 AB |
256 | #endif /* BITS_PER_LONG == 64 */ |
257 | ||
258 | #endif /* _ASM_GENERIC_ATOMIC_H */ |