/src/barebox/include/asm-generic/atomic.h
Line | Count | Source |
1 | | // SPDX-License-Identifier: GPL-2.0-only |
2 | | /* |
3 | | * based on linux/include/asm-arm/atomic.h |
4 | | * |
5 | | * Copyright (c) 1996 Russell King. |
6 | | */ |
7 | | |
8 | | #ifndef __ASM_GENERIC_ATOMIC_H |
9 | | #define __ASM_GENERIC_ATOMIC_H |
10 | | |
11 | | #include <linux/types.h> |
12 | | |
13 | | #ifdef CONFIG_SMP |
14 | | #error SMP not supported |
15 | | #endif |
16 | | #define ATOMIC_INIT(i) { (i) } |
17 | | |
18 | | typedef struct { s64 counter; } atomic64_t; |
19 | | |
20 | | #define atomic64_read(v) ((v)->counter) |
21 | | #define atomic64_set(v, i) (((v)->counter) = (i)) |
22 | | |
23 | | static inline void atomic64_add(s64 i, volatile atomic64_t *v) |
24 | 0 | { |
25 | 0 | v->counter += i; |
26 | 0 | } Unexecuted instantiation: bootm.c:atomic64_add Unexecuted instantiation: image-fit.c:atomic64_add Unexecuted instantiation: bootm-fit.c:atomic64_add Unexecuted instantiation: overlay.c:atomic64_add Unexecuted instantiation: bfetch.c:atomic64_add Unexecuted instantiation: refcount.c:atomic64_add |
27 | | |
28 | | static inline void atomic64_sub(s64 i, volatile atomic64_t *v) |
29 | 0 | { |
30 | 0 | v->counter -= i; |
31 | 0 | } Unexecuted instantiation: bootm.c:atomic64_sub Unexecuted instantiation: image-fit.c:atomic64_sub Unexecuted instantiation: bootm-fit.c:atomic64_sub Unexecuted instantiation: overlay.c:atomic64_sub Unexecuted instantiation: bfetch.c:atomic64_sub Unexecuted instantiation: refcount.c:atomic64_sub |
32 | | |
33 | | static inline void atomic64_inc(volatile atomic64_t *v) |
34 | 0 | { |
35 | 0 | v->counter += 1; |
36 | 0 | } Unexecuted instantiation: bootm.c:atomic64_inc Unexecuted instantiation: image-fit.c:atomic64_inc Unexecuted instantiation: bootm-fit.c:atomic64_inc Unexecuted instantiation: overlay.c:atomic64_inc Unexecuted instantiation: bfetch.c:atomic64_inc Unexecuted instantiation: refcount.c:atomic64_inc |
37 | | |
38 | | static inline void atomic64_dec(volatile atomic64_t *v) |
39 | 0 | { |
40 | 0 | v->counter -= 1; |
41 | 0 | } Unexecuted instantiation: bootm.c:atomic64_dec Unexecuted instantiation: image-fit.c:atomic64_dec Unexecuted instantiation: bootm-fit.c:atomic64_dec Unexecuted instantiation: overlay.c:atomic64_dec Unexecuted instantiation: bfetch.c:atomic64_dec Unexecuted instantiation: refcount.c:atomic64_dec |
42 | | |
43 | | static inline int atomic64_dec_and_test(volatile atomic64_t *v) |
44 | 0 | { |
45 | 0 | s64 val; |
46 | 0 |
|
47 | 0 | val = v->counter; |
48 | 0 | v->counter = val -= 1; |
49 | 0 |
|
50 | 0 | return val == 0; |
51 | 0 | } Unexecuted instantiation: bootm.c:atomic64_dec_and_test Unexecuted instantiation: image-fit.c:atomic64_dec_and_test Unexecuted instantiation: bootm-fit.c:atomic64_dec_and_test Unexecuted instantiation: overlay.c:atomic64_dec_and_test Unexecuted instantiation: bfetch.c:atomic64_dec_and_test Unexecuted instantiation: refcount.c:atomic64_dec_and_test |
52 | | |
53 | | static inline int atomic64_add_negative(s64 i, volatile atomic64_t *v) |
54 | 0 | { |
55 | 0 | s64 val; |
56 | 0 |
|
57 | 0 | val = v->counter; |
58 | 0 | v->counter = val += i; |
59 | 0 |
|
60 | 0 | return val < 0; |
61 | 0 | } Unexecuted instantiation: bootm.c:atomic64_add_negative Unexecuted instantiation: image-fit.c:atomic64_add_negative Unexecuted instantiation: bootm-fit.c:atomic64_add_negative Unexecuted instantiation: overlay.c:atomic64_add_negative Unexecuted instantiation: bfetch.c:atomic64_add_negative Unexecuted instantiation: refcount.c:atomic64_add_negative |
62 | | |
63 | | |
64 | | typedef struct { volatile int counter; } atomic_t; |
65 | | |
66 | | #define ATOMIC_INIT(i) { (i) } |
67 | | |
68 | | #define atomic_read(v) ((v)->counter) |
69 | 6.05k | #define atomic_set(v,i) (((v)->counter) = (i)) |
70 | | |
71 | | static inline void atomic_add(int i, volatile atomic_t *v) |
72 | 0 | { |
73 | 0 | v->counter += i; |
74 | 0 | } Unexecuted instantiation: bootm.c:atomic_add Unexecuted instantiation: image-fit.c:atomic_add Unexecuted instantiation: bootm-fit.c:atomic_add Unexecuted instantiation: overlay.c:atomic_add Unexecuted instantiation: bfetch.c:atomic_add Unexecuted instantiation: refcount.c:atomic_add |
75 | | |
76 | | static inline void atomic_sub(int i, volatile atomic_t *v) |
77 | 0 | { |
78 | 0 | v->counter -= i; |
79 | 0 | } Unexecuted instantiation: bootm.c:atomic_sub Unexecuted instantiation: image-fit.c:atomic_sub Unexecuted instantiation: bootm-fit.c:atomic_sub Unexecuted instantiation: overlay.c:atomic_sub Unexecuted instantiation: bfetch.c:atomic_sub Unexecuted instantiation: refcount.c:atomic_sub |
80 | | |
81 | | static inline int atomic_inc_return(volatile atomic_t *v) |
82 | 0 | { |
83 | 0 | return ++v->counter; |
84 | 0 | } Unexecuted instantiation: bootm.c:atomic_inc_return Unexecuted instantiation: image-fit.c:atomic_inc_return Unexecuted instantiation: bootm-fit.c:atomic_inc_return Unexecuted instantiation: overlay.c:atomic_inc_return Unexecuted instantiation: bfetch.c:atomic_inc_return Unexecuted instantiation: refcount.c:atomic_inc_return |
85 | | |
86 | | static inline int atomic_dec_return(volatile atomic_t *v) |
87 | 0 | { |
88 | 0 | return --v->counter; |
89 | 0 | } Unexecuted instantiation: bootm.c:atomic_dec_return Unexecuted instantiation: image-fit.c:atomic_dec_return Unexecuted instantiation: bootm-fit.c:atomic_dec_return Unexecuted instantiation: overlay.c:atomic_dec_return Unexecuted instantiation: bfetch.c:atomic_dec_return Unexecuted instantiation: refcount.c:atomic_dec_return |
90 | | |
91 | | #define atomic_inc(v) ((void)atomic_inc_return(v)) |
92 | | #define atomic_dec(v) ((void)atomic_dec_return(v)) |
93 | | |
94 | | static inline int atomic_dec_and_test(volatile atomic_t *v) |
95 | 0 | { |
96 | 0 | int val; |
97 | 0 |
|
98 | 0 | val = v->counter; |
99 | 0 | v->counter = val -= 1; |
100 | 0 |
|
101 | 0 | return val == 0; |
102 | 0 | } Unexecuted instantiation: bootm.c:atomic_dec_and_test Unexecuted instantiation: image-fit.c:atomic_dec_and_test Unexecuted instantiation: bootm-fit.c:atomic_dec_and_test Unexecuted instantiation: overlay.c:atomic_dec_and_test Unexecuted instantiation: bfetch.c:atomic_dec_and_test Unexecuted instantiation: refcount.c:atomic_dec_and_test |
103 | | |
104 | | static inline int atomic_add_negative(int i, volatile atomic_t *v) |
105 | 0 | { |
106 | 0 | int val; |
107 | 0 |
|
108 | 0 | val = v->counter; |
109 | 0 | v->counter = val += i; |
110 | 0 |
|
111 | 0 | return val < 0; |
112 | 0 | } Unexecuted instantiation: bootm.c:atomic_add_negative Unexecuted instantiation: image-fit.c:atomic_add_negative Unexecuted instantiation: bootm-fit.c:atomic_add_negative Unexecuted instantiation: overlay.c:atomic_add_negative Unexecuted instantiation: bfetch.c:atomic_add_negative Unexecuted instantiation: refcount.c:atomic_add_negative |
113 | | |
114 | | static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) |
115 | 0 | { |
116 | 0 | *addr &= ~mask; |
117 | 0 | } Unexecuted instantiation: bootm.c:atomic_clear_mask Unexecuted instantiation: image-fit.c:atomic_clear_mask Unexecuted instantiation: bootm-fit.c:atomic_clear_mask Unexecuted instantiation: overlay.c:atomic_clear_mask Unexecuted instantiation: bfetch.c:atomic_clear_mask Unexecuted instantiation: refcount.c:atomic_clear_mask |
118 | | |
119 | | #define atomic_cmpxchg(v, o, n) cmpxchg(&((v)->counter), o, n) |
120 | | |
121 | | /* Atomic operations are already serializing on ARM */ |
122 | | #define smp_mb__before_atomic_dec() barrier() |
123 | | #define smp_mb__after_atomic_dec() barrier() |
124 | | #define smp_mb__before_atomic_inc() barrier() |
125 | | #define smp_mb__after_atomic_inc() barrier() |
126 | | |
127 | | #endif |