xref: /haiku/src/add-ons/kernel/drivers/disk/nvme/compat/nvme_atomic.h (revision 21258e2674226d6aa732321b6f8494841895af5f)
1 /*
2  * Copyright 2019, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Augustin Cavalier <waddlesplash>
7  */
8 #ifndef __NVME_ATOMIC_H__
9 #define __NVME_ATOMIC_H__
10 
11 #include <OS.h>
12 
13 
14 /* 32-bit atomics */
15 typedef int32 nvme_atomic_t;
16 
17 #define NVME_ATOMIC_INIT(val)	(val)
18 
19 static inline void
20 nvme_atomic_init(nvme_atomic_t* v)
21 {
22 	*v = 0;
23 }
24 
25 static inline void
26 nvme_atomic_clear(nvme_atomic_t* v)
27 {
28 	*v = 0;
29 }
30 
31 
32 static inline int32
33 nvme_atomic_read(const nvme_atomic_t* v)
34 {
35 	return atomic_get(v);
36 }
37 
38 
39 static inline void
40 nvme_atomic_set(nvme_atomic_t* v, int32 new_value)
41 {
42 	atomic_set(v, new_value);
43 }
44 
45 
46 static inline void
47 nvme_atomic_add(nvme_atomic_t* v, int32 inc)
48 {
49 	atomic_add(v, inc);
50 }
51 
52 
53 static inline void
54 nvme_atomic_sub(nvme_atomic_t* v, int32 dec)
55 {
56 	atomic_add(v, -dec);
57 }
58 
59 
60 static inline void
61 nvme_atomic_inc(nvme_atomic_t* v)
62 {
63 	nvme_atomic_add(v, 1);
64 }
65 
66 
67 static inline void
68 nvme_atomic_dec(nvme_atomic_t* v)
69 {
70 	nvme_atomic_sub(v, 1);
71 }
72 
73 
74 static inline int32
75 nvme_atomic_add_return(nvme_atomic_t* v, int32 inc)
76 {
77 	return atomic_add(v, inc);
78 }
79 
80 
81 static inline int32
82 nvme_atomic_sub_return(nvme_atomic_t* v, int32 dec)
83 {
84 	return atomic_add(v, -dec);
85 }
86 
87 
88 static inline int
89 nvme_atomic_inc_and_test(nvme_atomic_t *v)
90 {
91 	return nvme_atomic_add_return(v, 1) == 0;
92 }
93 
94 
95 static inline int
96 nvme_atomic_dec_and_test(nvme_atomic64_t *v)
97 {
98 	return nvme_atomic_sub_return(v, 1) == 0;
99 }
100 
101 
102 static inline int
103 nvme_atomic_test_and_set(nvme_atomic_t* v)
104 {
105 	return atomic_test_and_set(v, 1, 0);
106 }
107 
108 
109 /* 64-bit atomics */
110 typedef int64 nvme_atomic64_t;
111 
112 #define NVME_ATOMIC64_INIT(val) (val)
113 
114 static inline void
115 nvme_atomic64_init(nvme_atomic64_t *v)
116 {
117 	atomic_set64(v, 0);
118 }
119 
120 static inline void
121 nvme_atomic64_clear(nvme_atomic64_t *v)
122 {
123 	atomic_set64(v, 0);
124 }
125 
126 
127 static inline int64
128 nvme_atomic64_read(nvme_atomic64_t *v)
129 {
130 	return atomic_get64(v);
131 }
132 
133 
134 static inline void
135 nvme_atomic64_set(nvme_atomic64_t *v, int64_t new_value)
136 {
137 	atomic_set64(v, new_value);
138 }
139 
140 
141 static inline void
142 nvme_atomic64_add(nvme_atomic64_t *v, int64_t inc)
143 {
144 	atomic_add64(v, inc);
145 }
146 
147 
148 static inline void
149 nvme_atomic64_sub(nvme_atomic64_t *v, int64_t dec)
150 {
151 	nvme_atomic64_add(v, -dec);
152 }
153 
154 
155 static inline void
156 nvme_atomic64_inc(nvme_atomic64_t *v)
157 {
158 	nvme_atomic64_add(v, 1);
159 }
160 
161 
162 static inline void
163 nvme_atomic64_dec(nvme_atomic64_t *v)
164 {
165 	nvme_atomic64_add(v, -1);
166 }
167 
168 
169 static inline int64
170 nvme_atomic64_add_return(nvme_atomic64_t *v, int64_t inc)
171 {
172 	return atomic_add64(v, inc);
173 }
174 
175 
176 static inline int64_t
177 nvme_atomic64_sub_return(nvme_atomic64_t *v, int64_t dec)
178 {
179 	return nvme_atomic64_add_return(v, -dec);
180 }
181 
182 
183 static inline int
184 nvme_atomic64_inc_and_test(nvme_atomic64_t *v)
185 {
186 	return nvme_atomic64_add_return(v, 1) == 0;
187 }
188 
189 
190 static inline int
191 nvme_atomic64_dec_and_test(nvme_atomic64_t *v)
192 {
193 	return nvme_atomic64_sub_return(v, 1) == 0;
194 }
195 
196 
197 static inline int
198 nvme_atomic64_test_and_set(nvme_atomic64_t *v)
199 {
200 	return atomic_test_and_set64(v, 1, 0);
201 }
202 
203 
204 #endif
205