[U-Boot] [PATCH 0/4] Rationalise atomic.h implementations

This series applies on top of https://patchwork.ozlabs.org/patch/958286/
The intention is to rationalise most of the current implementations of atomic.h. x86 remains as having an arch specific implementation which I don't intend to touch.
Chris Packham (4): Add include/asm-generic/atomic.h ARM: use asm-generic/atomic.h mips: use asm-generic/atomic.h xtensa: use asm-generic/atomic.h
arch/arm/include/asm/atomic.h | 147 +----------------------------- arch/mips/include/asm/atomic.h | 44 +-------- arch/xtensa/include/asm/atomic.h | 44 +-------- include/asm-generic/atomic.h | 150 +++++++++++++++++++++++++++++++ 4 files changed, 153 insertions(+), 232 deletions(-) create mode 100644 include/asm-generic/atomic.h

The arm, xtensa and mips version of atomic.h were already very similar (the mips one was a copy of xtensa). Combine these implementations together to produce a generic atomic.h that can be included by these architectures (and any others that need it in future).
Signed-off-by: Chris Packham judge.packham@gmail.com ---
include/asm-generic/atomic.h | 150 +++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 include/asm-generic/atomic.h
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h new file mode 100644 index 000000000000..94d0747194af --- /dev/null +++ b/include/asm-generic/atomic.h @@ -0,0 +1,150 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef _ASM_GENERIC_ATOMIC_H +#define _ASM_GENERIC_ATOMIC_H + +typedef struct { volatile int counter; } atomic_t; +#if BITS_PER_LONG == 32 +typedef struct { volatile long long counter; } atomic64_t; +#else /* BIT_PER_LONG == 32 */ +typedef struct { volatile long counter; } atomic64_t; +#endif + +#define ATOMIC_INIT(i) { (i) } + +#define atomic_read(v) ((v)->counter) +#define atomic_set(v, i) ((v)->counter = (i)) +#define atomic64_read(v) atomic_read(v) +#define atomic64_set(v, i) atomic_set(v, i) + +static inline void atomic_add(int i, atomic_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter += i; + local_irq_restore(flags); +} + +static inline void atomic_sub(int i, atomic_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter -= i; + local_irq_restore(flags); +} + +static inline void atomic_inc(atomic_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + ++v->counter; + local_irq_restore(flags); +} + +static inline void atomic_dec(atomic_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + --v->counter; + local_irq_restore(flags); +} + +static inline int atomic_dec_and_test(volatile atomic_t *v) +{ + unsigned long flags = 0; + int val; + + local_irq_save(flags); + val = v->counter; + v->counter = val -= 1; + local_irq_restore(flags); + + return val == 0; +} + +static inline int atomic_add_negative(int i, volatile atomic_t *v) +{ + unsigned long flags = 0; + int val; + + local_irq_save(flags); + val = v->counter; + v->counter = val += i; + local_irq_restore(flags); + + return val < 0; +} + +static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) +{ + unsigned long flags = 0; + + local_irq_save(flags); + *addr &= ~mask; + local_irq_restore(flags); +} + +#if BITS_PER_LONG == 32 + +static inline void atomic64_add(long long i, volatile atomic64_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter += i; + local_irq_restore(flags); +} + +static inline void atomic64_sub(long long i, volatile atomic64_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter -= i; + local_irq_restore(flags); +} + +#else /* BIT_PER_LONG == 32 */ + +static inline void atomic64_add(long i, volatile atomic64_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter += i; + local_irq_restore(flags); +} + +static inline void atomic64_sub(long i, volatile atomic64_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter -= i; + local_irq_restore(flags); +} +#endif + +static inline void atomic64_inc(volatile atomic64_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter += 1; + local_irq_restore(flags); +} + +static inline void atomic64_dec(volatile atomic64_t *v) +{ + unsigned long flags = 0; + + local_irq_save(flags); + v->counter -= 1; + local_irq_restore(flags); +} + +#endif

On Sat, Sep 08, 2018 at 09:39:04PM +1200, Chris Packham wrote:
The arm, xtensa and mips version of atomic.h were already very similar (the mips one was a copy of xtensa). Combine these implementations together to produce a generic atomic.h that can be included by these architectures (and any others that need it in future).
Signed-off-by: Chris Packham judge.packham@gmail.com
Reviewed-by: Tom Rini trini@konsulko.com

On Sat, Sep 08, 2018 at 09:39:04PM +1200, Chris Packham wrote:
The arm, xtensa and mips version of atomic.h were already very similar (the mips one was a copy of xtensa). Combine these implementations together to produce a generic atomic.h that can be included by these architectures (and any others that need it in future).
Signed-off-by: Chris Packham judge.packham@gmail.com Reviewed-by: Tom Rini trini@konsulko.com
Applied to u-boot/master, thanks!

Make use of asm-generic/atomic.h retaining the smp_mb_... definitions.
Signed-off-by: Chris Packham judge.packham@gmail.com ---
arch/arm/include/asm/atomic.h | 147 +--------------------------------- 1 file changed, 1 insertion(+), 146 deletions(-)
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index 171f4d979281..5822b0a52c0e 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h @@ -20,152 +20,8 @@ #error SMP not supported #endif
-typedef struct { volatile int counter; } atomic_t; -#if BITS_PER_LONG == 32 -typedef struct { volatile long long counter; } atomic64_t; -#else /* BIT_PER_LONG == 32 */ -typedef struct { volatile long counter; } atomic64_t; -#endif - -#define ATOMIC_INIT(i) { (i) } - -#ifdef __KERNEL__ #include <asm/proc-armv/system.h> - -#define atomic_read(v) ((v)->counter) -#define atomic_set(v, i) (((v)->counter) = (i)) -#define atomic64_read(v) atomic_read(v) -#define atomic64_set(v, i) atomic_set(v, i) - -static inline void atomic_add(int i, volatile atomic_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter += i; - local_irq_restore(flags); -} - -static inline void atomic_sub(int i, volatile atomic_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter -= i; - local_irq_restore(flags); -} - -static inline void atomic_inc(volatile atomic_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter += 1; - local_irq_restore(flags); -} - -static inline void atomic_dec(volatile atomic_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter -= 1; - local_irq_restore(flags); -} - -static inline int atomic_dec_and_test(volatile atomic_t *v) -{ - unsigned long flags = 0; - int val; - - local_irq_save(flags); - val = v->counter; - v->counter = val -= 1; - local_irq_restore(flags); - - return val == 0; -} - -static inline int atomic_add_negative(int i, volatile atomic_t *v) -{ - unsigned long flags = 0; - int val; - - local_irq_save(flags); - val = v->counter; - v->counter = val += i; - local_irq_restore(flags); - - return val < 0; -} - -static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) -{ - unsigned long flags = 0; - - local_irq_save(flags); - *addr &= ~mask; - local_irq_restore(flags); -} - -#if BITS_PER_LONG == 32 - -static inline void atomic64_add(long long i, volatile atomic64_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter += i; - local_irq_restore(flags); -} - -static inline void atomic64_sub(long long i, volatile atomic64_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter -= i; - local_irq_restore(flags); -} - -#else /* BIT_PER_LONG == 32 */ - -static inline void atomic64_add(long i, volatile atomic64_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter += i; - local_irq_restore(flags); -} - -static inline void atomic64_sub(long i, volatile atomic64_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter -= i; - local_irq_restore(flags); -} -#endif - -static inline void atomic64_inc(volatile atomic64_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter += 1; - local_irq_restore(flags); -} - -static inline void atomic64_dec(volatile atomic64_t *v) -{ - unsigned long flags = 0; - - local_irq_save(flags); - v->counter -= 1; - local_irq_restore(flags); -} +#include <asm-generic/atomic.h>
/* Atomic operations are already serializing on ARM */ #define smp_mb__before_atomic_dec() barrier() @@ -174,4 +30,3 @@ static inline void atomic64_dec(volatile atomic64_t *v) #define smp_mb__after_atomic_inc() barrier()
#endif -#endif

On Sat, Sep 08, 2018 at 09:39:05PM +1200, Chris Packham wrote:
Make use of asm-generic/atomic.h retaining the smp_mb_... definitions.
Signed-off-by: Chris Packham judge.packham@gmail.com
Reviewed-by: Tom Rini trini@konsulko.com

On Sat, Sep 08, 2018 at 09:39:05PM +1200, Chris Packham wrote:
Make use of asm-generic/atomic.h retaining the smp_mb_... definitions.
Signed-off-by: Chris Packham judge.packham@gmail.com Reviewed-by: Tom Rini trini@konsulko.com
Applied to u-boot/master, thanks!

Make use of asm-generic/atomic.h.
Signed-off-by: Chris Packham judge.packham@gmail.com ---
arch/mips/include/asm/atomic.h | 44 +--------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-)
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h index 7551bf6e6c2c..c4f08b78200e 100644 --- a/arch/mips/include/asm/atomic.h +++ b/arch/mips/include/asm/atomic.h @@ -7,48 +7,6 @@ #define _MIPS_ATOMIC_H
#include <asm/system.h> - -typedef struct { volatile int counter; } atomic_t; - -#define ATOMIC_INIT(i) { (i) } - -#define atomic_read(v) ((v)->counter) -#define atomic_set(v, i) ((v)->counter = (i)) - -static inline void atomic_add(int i, atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - v->counter += i; - local_irq_restore(flags); -} - -static inline void atomic_sub(int i, atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - v->counter -= i; - local_irq_restore(flags); -} - -static inline void atomic_inc(atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - ++v->counter; - local_irq_restore(flags); -} - -static inline void atomic_dec(atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - --v->counter; - local_irq_restore(flags); -} +#include <asm-generic/atomic.h>
#endif

On Sat, Sep 08, 2018 at 09:39:06PM +1200, Chris Packham wrote:
Make use of asm-generic/atomic.h.
Signed-off-by: Chris Packham judge.packham@gmail.com
Applied to u-boot/master, thanks!

Make use of asm-generic/atomic.h.
Signed-off-by: Chris Packham judge.packham@gmail.com ---
arch/xtensa/include/asm/atomic.h | 44 +------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-)
diff --git a/arch/xtensa/include/asm/atomic.h b/arch/xtensa/include/asm/atomic.h index 42b32f5d3d6e..4e3ad5647275 100644 --- a/arch/xtensa/include/asm/atomic.h +++ b/arch/xtensa/include/asm/atomic.h @@ -7,48 +7,6 @@ #define _XTENSA_ATOMIC_H
#include <asm/system.h> - -typedef struct { volatile int counter; } atomic_t; - -#define ATOMIC_INIT(i) { (i) } - -#define atomic_read(v) ((v)->counter) -#define atomic_set(v, i) ((v)->counter = (i)) - -static inline void atomic_add(int i, atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - v->counter += i; - local_irq_restore(flags); -} - -static inline void atomic_sub(int i, atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - v->counter -= i; - local_irq_restore(flags); -} - -static inline void atomic_inc(atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - ++v->counter; - local_irq_restore(flags); -} - -static inline void atomic_dec(atomic_t *v) -{ - unsigned long flags; - - local_irq_save(flags); - --v->counter; - local_irq_restore(flags); -} +#include <asm-generic/atomic.h>
#endif

On Sat, Sep 8, 2018 at 2:39 AM, Chris Packham judge.packham@gmail.com wrote:
Make use of asm-generic/atomic.h.
Signed-off-by: Chris Packham judge.packham@gmail.com
arch/xtensa/include/asm/atomic.h | 44 +------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-)
Acked-by: Max Filippov jcmvbkbc@gmail.com

On Sat, Sep 08, 2018 at 09:39:07PM +1200, Chris Packham wrote:
Make use of asm-generic/atomic.h.
Signed-off-by: Chris Packham judge.packham@gmail.com Acked-by: Max Filippov jcmvbkbc@gmail.com
Applied to u-boot/master, thanks!

On 08.09.2018 11:39, Chris Packham wrote:
This series applies on top of https://patchwork.ozlabs.org/patch/958286/
The intention is to rationalise most of the current implementations of atomic.h. x86 remains as having an arch specific implementation which I don't intend to touch.
Chris Packham (4): Add include/asm-generic/atomic.h ARM: use asm-generic/atomic.h mips: use asm-generic/atomic.h xtensa: use asm-generic/atomic.h
arch/arm/include/asm/atomic.h | 147 +----------------------------- arch/mips/include/asm/atomic.h | 44 +-------- arch/xtensa/include/asm/atomic.h | 44 +-------- include/asm-generic/atomic.h | 150 +++++++++++++++++++++++++++++++ 4 files changed, 153 insertions(+), 232 deletions(-) create mode 100644 include/asm-generic/atomic.h
Thanks Chris for taking care of this. For the whole series:
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
participants (4)
-
Chris Packham
-
Max Filippov
-
Stefan
-
Tom Rini