net: stmmac: Tx coe sw fallback
[platform/kernel/linux-starfive.git] / include / linux / spinlock.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __LINUX_SPINLOCK_H
3 #define __LINUX_SPINLOCK_H
4 #define __LINUX_INSIDE_SPINLOCK_H
5
6 /*
7  * include/linux/spinlock.h - generic spinlock/rwlock declarations
8  *
9  * here's the role of the various spinlock/rwlock related include files:
10  *
11  * on SMP builds:
12  *
13  *  asm/spinlock_types.h: contains the arch_spinlock_t/arch_rwlock_t and the
14  *                        initializers
15  *
16  *  linux/spinlock_types_raw:
17  *                        The raw types and initializers
18  *  linux/spinlock_types.h:
19  *                        defines the generic type and initializers
20  *
21  *  asm/spinlock.h:       contains the arch_spin_*()/etc. lowlevel
22  *                        implementations, mostly inline assembly code
23  *
24  *   (also included on UP-debug builds:)
25  *
26  *  linux/spinlock_api_smp.h:
27  *                        contains the prototypes for the _spin_*() APIs.
28  *
29  *  linux/spinlock.h:     builds the final spin_*() APIs.
30  *
31  * on UP builds:
32  *
33  *  linux/spinlock_type_up.h:
34  *                        contains the generic, simplified UP spinlock type.
35  *                        (which is an empty structure on non-debug builds)
36  *
37  *  linux/spinlock_types_raw:
38  *                        The raw RT types and initializers
39  *  linux/spinlock_types.h:
40  *                        defines the generic type and initializers
41  *
42  *  linux/spinlock_up.h:
43  *                        contains the arch_spin_*()/etc. version of UP
44  *                        builds. (which are NOPs on non-debug, non-preempt
45  *                        builds)
46  *
47  *   (included on UP-non-debug builds:)
48  *
49  *  linux/spinlock_api_up.h:
50  *                        builds the _spin_*() APIs.
51  *
52  *  linux/spinlock.h:     builds the final spin_*() APIs.
53  */
54
55 #include <linux/typecheck.h>
56 #include <linux/preempt.h>
57 #include <linux/linkage.h>
58 #include <linux/compiler.h>
59 #include <linux/irqflags.h>
60 #include <linux/thread_info.h>
61 #include <linux/stringify.h>
62 #include <linux/bottom_half.h>
63 #include <linux/lockdep.h>
64 #include <linux/cleanup.h>
65 #include <asm/barrier.h>
66 #include <asm/mmiowb.h>
67
68
69 /*
70  * Must define these before including other files, inline functions need them
71  */
72 #define LOCK_SECTION_NAME ".text..lock."KBUILD_BASENAME
73
74 #define LOCK_SECTION_START(extra)               \
75         ".subsection 1\n\t"                     \
76         extra                                   \
77         ".ifndef " LOCK_SECTION_NAME "\n\t"     \
78         LOCK_SECTION_NAME ":\n\t"               \
79         ".endif\n"
80
81 #define LOCK_SECTION_END                        \
82         ".previous\n\t"
83
84 #define __lockfunc __section(".spinlock.text")
85
86 /*
87  * Pull the arch_spinlock_t and arch_rwlock_t definitions:
88  */
89 #include <linux/spinlock_types.h>
90
91 /*
92  * Pull the arch_spin*() functions/declarations (UP-nondebug doesn't need them):
93  */
94 #ifdef CONFIG_SMP
95 # include <asm/spinlock.h>
96 #else
97 # include <linux/spinlock_up.h>
98 #endif
99
100 #ifdef CONFIG_DEBUG_SPINLOCK
101   extern void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name,
102                                    struct lock_class_key *key, short inner);
103
104 # define raw_spin_lock_init(lock)                                       \
105 do {                                                                    \
106         static struct lock_class_key __key;                             \
107                                                                         \
108         __raw_spin_lock_init((lock), #lock, &__key, LD_WAIT_SPIN);      \
109 } while (0)
110
111 #else
112 # define raw_spin_lock_init(lock)                               \
113         do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
114 #endif
115
116 #define raw_spin_is_locked(lock)        arch_spin_is_locked(&(lock)->raw_lock)
117
118 #ifdef arch_spin_is_contended
119 #define raw_spin_is_contended(lock)     arch_spin_is_contended(&(lock)->raw_lock)
120 #else
121 #define raw_spin_is_contended(lock)     (((void)(lock), 0))
122 #endif /*arch_spin_is_contended*/
123
124 /*
125  * smp_mb__after_spinlock() provides the equivalent of a full memory barrier
126  * between program-order earlier lock acquisitions and program-order later
127  * memory accesses.
128  *
129  * This guarantees that the following two properties hold:
130  *
131  *   1) Given the snippet:
132  *
133  *        { X = 0;  Y = 0; }
134  *
135  *        CPU0                          CPU1
136  *
137  *        WRITE_ONCE(X, 1);             WRITE_ONCE(Y, 1);
138  *        spin_lock(S);                 smp_mb();
139  *        smp_mb__after_spinlock();     r1 = READ_ONCE(X);
140  *        r0 = READ_ONCE(Y);
141  *        spin_unlock(S);
142  *
143  *      it is forbidden that CPU0 does not observe CPU1's store to Y (r0 = 0)
144  *      and CPU1 does not observe CPU0's store to X (r1 = 0); see the comments
145  *      preceding the call to smp_mb__after_spinlock() in __schedule() and in
146  *      try_to_wake_up().
147  *
148  *   2) Given the snippet:
149  *
150  *  { X = 0;  Y = 0; }
151  *
152  *  CPU0                CPU1                            CPU2
153  *
154  *  spin_lock(S);       spin_lock(S);                   r1 = READ_ONCE(Y);
155  *  WRITE_ONCE(X, 1);   smp_mb__after_spinlock();       smp_rmb();
156  *  spin_unlock(S);     r0 = READ_ONCE(X);              r2 = READ_ONCE(X);
157  *                      WRITE_ONCE(Y, 1);
158  *                      spin_unlock(S);
159  *
160  *      it is forbidden that CPU0's critical section executes before CPU1's
161  *      critical section (r0 = 1), CPU2 observes CPU1's store to Y (r1 = 1)
162  *      and CPU2 does not observe CPU0's store to X (r2 = 0); see the comments
163  *      preceding the calls to smp_rmb() in try_to_wake_up() for similar
164  *      snippets but "projected" onto two CPUs.
165  *
166  * Property (2) upgrades the lock to an RCsc lock.
167  *
168  * Since most load-store architectures implement ACQUIRE with an smp_mb() after
169  * the LL/SC loop, they need no further barriers. Similarly all our TSO
170  * architectures imply an smp_mb() for each atomic instruction and equally don't
171  * need more.
172  *
173  * Architectures that can implement ACQUIRE better need to take care.
174  */
175 #ifndef smp_mb__after_spinlock
176 #define smp_mb__after_spinlock()        kcsan_mb()
177 #endif
178
179 #ifdef CONFIG_DEBUG_SPINLOCK
180  extern void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock);
181  extern int do_raw_spin_trylock(raw_spinlock_t *lock);
182  extern void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock);
183 #else
184 static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock)
185 {
186         __acquire(lock);
187         arch_spin_lock(&lock->raw_lock);
188         mmiowb_spin_lock();
189 }
190
191 static inline int do_raw_spin_trylock(raw_spinlock_t *lock)
192 {
193         int ret = arch_spin_trylock(&(lock)->raw_lock);
194
195         if (ret)
196                 mmiowb_spin_lock();
197
198         return ret;
199 }
200
201 static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock)
202 {
203         mmiowb_spin_unlock();
204         arch_spin_unlock(&lock->raw_lock);
205         __release(lock);
206 }
207 #endif
208
209 /*
210  * Define the various spin_lock methods.  Note we define these
211  * regardless of whether CONFIG_SMP or CONFIG_PREEMPTION are set. The
212  * various methods are defined as nops in the case they are not
213  * required.
214  */
215 #define raw_spin_trylock(lock)  __cond_lock(lock, _raw_spin_trylock(lock))
216
217 #define raw_spin_lock(lock)     _raw_spin_lock(lock)
218
219 #ifdef CONFIG_DEBUG_LOCK_ALLOC
220 # define raw_spin_lock_nested(lock, subclass) \
221         _raw_spin_lock_nested(lock, subclass)
222
223 # define raw_spin_lock_nest_lock(lock, nest_lock)                       \
224          do {                                                           \
225                  typecheck(struct lockdep_map *, &(nest_lock)->dep_map);\
226                  _raw_spin_lock_nest_lock(lock, &(nest_lock)->dep_map); \
227          } while (0)
228 #else
229 /*
230  * Always evaluate the 'subclass' argument to avoid that the compiler
231  * warns about set-but-not-used variables when building with
232  * CONFIG_DEBUG_LOCK_ALLOC=n and with W=1.
233  */
234 # define raw_spin_lock_nested(lock, subclass)           \
235         _raw_spin_lock(((void)(subclass), (lock)))
236 # define raw_spin_lock_nest_lock(lock, nest_lock)       _raw_spin_lock(lock)
237 #endif
238
239 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
240
241 #define raw_spin_lock_irqsave(lock, flags)                      \
242         do {                                            \
243                 typecheck(unsigned long, flags);        \
244                 flags = _raw_spin_lock_irqsave(lock);   \
245         } while (0)
246
247 #ifdef CONFIG_DEBUG_LOCK_ALLOC
248 #define raw_spin_lock_irqsave_nested(lock, flags, subclass)             \
249         do {                                                            \
250                 typecheck(unsigned long, flags);                        \
251                 flags = _raw_spin_lock_irqsave_nested(lock, subclass);  \
252         } while (0)
253 #else
254 #define raw_spin_lock_irqsave_nested(lock, flags, subclass)             \
255         do {                                                            \
256                 typecheck(unsigned long, flags);                        \
257                 flags = _raw_spin_lock_irqsave(lock);                   \
258         } while (0)
259 #endif
260
261 #else
262
263 #define raw_spin_lock_irqsave(lock, flags)              \
264         do {                                            \
265                 typecheck(unsigned long, flags);        \
266                 _raw_spin_lock_irqsave(lock, flags);    \
267         } while (0)
268
269 #define raw_spin_lock_irqsave_nested(lock, flags, subclass)     \
270         raw_spin_lock_irqsave(lock, flags)
271
272 #endif
273
274 #define raw_spin_lock_irq(lock)         _raw_spin_lock_irq(lock)
275 #define raw_spin_lock_bh(lock)          _raw_spin_lock_bh(lock)
276 #define raw_spin_unlock(lock)           _raw_spin_unlock(lock)
277 #define raw_spin_unlock_irq(lock)       _raw_spin_unlock_irq(lock)
278
279 #define raw_spin_unlock_irqrestore(lock, flags)         \
280         do {                                                    \
281                 typecheck(unsigned long, flags);                \
282                 _raw_spin_unlock_irqrestore(lock, flags);       \
283         } while (0)
284 #define raw_spin_unlock_bh(lock)        _raw_spin_unlock_bh(lock)
285
286 #define raw_spin_trylock_bh(lock) \
287         __cond_lock(lock, _raw_spin_trylock_bh(lock))
288
289 #define raw_spin_trylock_irq(lock) \
290 ({ \
291         local_irq_disable(); \
292         raw_spin_trylock(lock) ? \
293         1 : ({ local_irq_enable(); 0;  }); \
294 })
295
296 #define raw_spin_trylock_irqsave(lock, flags) \
297 ({ \
298         local_irq_save(flags); \
299         raw_spin_trylock(lock) ? \
300         1 : ({ local_irq_restore(flags); 0; }); \
301 })
302
303 #ifndef CONFIG_PREEMPT_RT
304 /* Include rwlock functions for !RT */
305 #include <linux/rwlock.h>
306 #endif
307
308 /*
309  * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
310  */
311 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
312 # include <linux/spinlock_api_smp.h>
313 #else
314 # include <linux/spinlock_api_up.h>
315 #endif
316
317 /* Non PREEMPT_RT kernel, map to raw spinlocks: */
318 #ifndef CONFIG_PREEMPT_RT
319
320 /*
321  * Map the spin_lock functions to the raw variants for PREEMPT_RT=n
322  */
323
324 static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
325 {
326         return &lock->rlock;
327 }
328
329 #ifdef CONFIG_DEBUG_SPINLOCK
330
331 # define spin_lock_init(lock)                                   \
332 do {                                                            \
333         static struct lock_class_key __key;                     \
334                                                                 \
335         __raw_spin_lock_init(spinlock_check(lock),              \
336                              #lock, &__key, LD_WAIT_CONFIG);    \
337 } while (0)
338
339 #else
340
341 # define spin_lock_init(_lock)                  \
342 do {                                            \
343         spinlock_check(_lock);                  \
344         *(_lock) = __SPIN_LOCK_UNLOCKED(_lock); \
345 } while (0)
346
347 #endif
348
349 static __always_inline void spin_lock(spinlock_t *lock)
350 {
351         raw_spin_lock(&lock->rlock);
352 }
353
354 static __always_inline void spin_lock_bh(spinlock_t *lock)
355 {
356         raw_spin_lock_bh(&lock->rlock);
357 }
358
359 static __always_inline int spin_trylock(spinlock_t *lock)
360 {
361         return raw_spin_trylock(&lock->rlock);
362 }
363
364 #define spin_lock_nested(lock, subclass)                        \
365 do {                                                            \
366         raw_spin_lock_nested(spinlock_check(lock), subclass);   \
367 } while (0)
368
369 #define spin_lock_nest_lock(lock, nest_lock)                            \
370 do {                                                                    \
371         raw_spin_lock_nest_lock(spinlock_check(lock), nest_lock);       \
372 } while (0)
373
374 static __always_inline void spin_lock_irq(spinlock_t *lock)
375 {
376         raw_spin_lock_irq(&lock->rlock);
377 }
378
379 #define spin_lock_irqsave(lock, flags)                          \
380 do {                                                            \
381         raw_spin_lock_irqsave(spinlock_check(lock), flags);     \
382 } while (0)
383
384 #define spin_lock_irqsave_nested(lock, flags, subclass)                 \
385 do {                                                                    \
386         raw_spin_lock_irqsave_nested(spinlock_check(lock), flags, subclass); \
387 } while (0)
388
389 static __always_inline void spin_unlock(spinlock_t *lock)
390 {
391         raw_spin_unlock(&lock->rlock);
392 }
393
394 static __always_inline void spin_unlock_bh(spinlock_t *lock)
395 {
396         raw_spin_unlock_bh(&lock->rlock);
397 }
398
399 static __always_inline void spin_unlock_irq(spinlock_t *lock)
400 {
401         raw_spin_unlock_irq(&lock->rlock);
402 }
403
404 static __always_inline void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
405 {
406         raw_spin_unlock_irqrestore(&lock->rlock, flags);
407 }
408
409 static __always_inline int spin_trylock_bh(spinlock_t *lock)
410 {
411         return raw_spin_trylock_bh(&lock->rlock);
412 }
413
414 static __always_inline int spin_trylock_irq(spinlock_t *lock)
415 {
416         return raw_spin_trylock_irq(&lock->rlock);
417 }
418
419 #define spin_trylock_irqsave(lock, flags)                       \
420 ({                                                              \
421         raw_spin_trylock_irqsave(spinlock_check(lock), flags); \
422 })
423
424 /**
425  * spin_is_locked() - Check whether a spinlock is locked.
426  * @lock: Pointer to the spinlock.
427  *
428  * This function is NOT required to provide any memory ordering
429  * guarantees; it could be used for debugging purposes or, when
430  * additional synchronization is needed, accompanied with other
431  * constructs (memory barriers) enforcing the synchronization.
432  *
433  * Returns: 1 if @lock is locked, 0 otherwise.
434  *
435  * Note that the function only tells you that the spinlock is
436  * seen to be locked, not that it is locked on your CPU.
437  *
438  * Further, on CONFIG_SMP=n builds with CONFIG_DEBUG_SPINLOCK=n,
439  * the return value is always 0 (see include/linux/spinlock_up.h).
440  * Therefore you should not rely heavily on the return value.
441  */
442 static __always_inline int spin_is_locked(spinlock_t *lock)
443 {
444         return raw_spin_is_locked(&lock->rlock);
445 }
446
447 static __always_inline int spin_is_contended(spinlock_t *lock)
448 {
449         return raw_spin_is_contended(&lock->rlock);
450 }
451
452 #define assert_spin_locked(lock)        assert_raw_spin_locked(&(lock)->rlock)
453
454 #else  /* !CONFIG_PREEMPT_RT */
455 # include <linux/spinlock_rt.h>
456 #endif /* CONFIG_PREEMPT_RT */
457
458 /*
459  * Pull the atomic_t declaration:
460  * (asm-mips/atomic.h needs above definitions)
461  */
462 #include <linux/atomic.h>
463 /**
464  * atomic_dec_and_lock - lock on reaching reference count zero
465  * @atomic: the atomic counter
466  * @lock: the spinlock in question
467  *
468  * Decrements @atomic by 1.  If the result is 0, returns true and locks
469  * @lock.  Returns false for all other cases.
470  */
471 extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
472 #define atomic_dec_and_lock(atomic, lock) \
473                 __cond_lock(lock, _atomic_dec_and_lock(atomic, lock))
474
475 extern int _atomic_dec_and_lock_irqsave(atomic_t *atomic, spinlock_t *lock,
476                                         unsigned long *flags);
477 #define atomic_dec_and_lock_irqsave(atomic, lock, flags) \
478                 __cond_lock(lock, _atomic_dec_and_lock_irqsave(atomic, lock, &(flags)))
479
480 extern int _atomic_dec_and_raw_lock(atomic_t *atomic, raw_spinlock_t *lock);
481 #define atomic_dec_and_raw_lock(atomic, lock) \
482                 __cond_lock(lock, _atomic_dec_and_raw_lock(atomic, lock))
483
484 extern int _atomic_dec_and_raw_lock_irqsave(atomic_t *atomic, raw_spinlock_t *lock,
485                                         unsigned long *flags);
486 #define atomic_dec_and_raw_lock_irqsave(atomic, lock, flags) \
487                 __cond_lock(lock, _atomic_dec_and_raw_lock_irqsave(atomic, lock, &(flags)))
488
489 int __alloc_bucket_spinlocks(spinlock_t **locks, unsigned int *lock_mask,
490                              size_t max_size, unsigned int cpu_mult,
491                              gfp_t gfp, const char *name,
492                              struct lock_class_key *key);
493
494 #define alloc_bucket_spinlocks(locks, lock_mask, max_size, cpu_mult, gfp)    \
495         ({                                                                   \
496                 static struct lock_class_key key;                            \
497                 int ret;                                                     \
498                                                                              \
499                 ret = __alloc_bucket_spinlocks(locks, lock_mask, max_size,   \
500                                                cpu_mult, gfp, #locks, &key); \
501                 ret;                                                         \
502         })
503
504 void free_bucket_spinlocks(spinlock_t *locks);
505
506 DEFINE_LOCK_GUARD_1(raw_spinlock, raw_spinlock_t,
507                     raw_spin_lock(_T->lock),
508                     raw_spin_unlock(_T->lock))
509
510 DEFINE_LOCK_GUARD_1(raw_spinlock_nested, raw_spinlock_t,
511                     raw_spin_lock_nested(_T->lock, SINGLE_DEPTH_NESTING),
512                     raw_spin_unlock(_T->lock))
513
514 DEFINE_LOCK_GUARD_1(raw_spinlock_irq, raw_spinlock_t,
515                     raw_spin_lock_irq(_T->lock),
516                     raw_spin_unlock_irq(_T->lock))
517
518 DEFINE_LOCK_GUARD_1(raw_spinlock_irqsave, raw_spinlock_t,
519                     raw_spin_lock_irqsave(_T->lock, _T->flags),
520                     raw_spin_unlock_irqrestore(_T->lock, _T->flags),
521                     unsigned long flags)
522
523 DEFINE_LOCK_GUARD_1(spinlock, spinlock_t,
524                     spin_lock(_T->lock),
525                     spin_unlock(_T->lock))
526
527 DEFINE_LOCK_GUARD_1(spinlock_irq, spinlock_t,
528                     spin_lock_irq(_T->lock),
529                     spin_unlock_irq(_T->lock))
530
531 DEFINE_LOCK_GUARD_1(spinlock_irqsave, spinlock_t,
532                     spin_lock_irqsave(_T->lock, _T->flags),
533                     spin_unlock_irqrestore(_T->lock, _T->flags),
534                     unsigned long flags)
535
536 #undef __LINUX_INSIDE_SPINLOCK_H
537 #endif /* __LINUX_SPINLOCK_H */