| From | "Paul E. McKenney" <> | Subject | [PATCH RFC cmpxchg 2/8] sparc: Emulate one-byte and two-byte cmpxchg | Date | Mon, 1 Apr 2024 14:39:44 -0700 |
| |
Use the new cmpxchg_emu_u8() and cmpxchg_emu_u16() to emulate one-byte and two-byte cmpxchg() on 32-bit sparc.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Andreas Larsson <andreas@gaisler.com> Cc: Palmer Dabbelt <palmer@rivosinc.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Marco Elver <elver@google.com> --- arch/sparc/Kconfig | 1 + arch/sparc/include/asm/cmpxchg_32.h | 6 ++++++ 2 files changed, 7 insertions(+)
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 11bf9d312318c..e6d1bbc4fedd0 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -55,6 +55,7 @@ config SPARC32 select ARCH_32BIT_OFF_T select ARCH_HAS_CPU_FINALIZE_INIT if !SMP select ARCH_HAS_SYNC_DMA_FOR_CPU + select ARCH_NEED_CMPXCHG_1_2_EMU select CLZ_TAB select DMA_DIRECT_REMAP select GENERIC_ATOMIC64 diff --git a/arch/sparc/include/asm/cmpxchg_32.h b/arch/sparc/include/asm/cmpxchg_32.h index d0af82c240b73..8eb483b5887a1 100644 --- a/arch/sparc/include/asm/cmpxchg_32.h +++ b/arch/sparc/include/asm/cmpxchg_32.h @@ -41,11 +41,17 @@ void __cmpxchg_called_with_bad_pointer(void); /* we only need to support cmpxchg of a u32 on sparc */ unsigned long __cmpxchg_u32(volatile u32 *m, u32 old, u32 new_); +#include <linux/cmpxchg-emu.h> + /* don't worry...optimizer will get rid of most of this */ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size) { switch (size) { + case 1: + return cmpxchg_emu_u8((volatile u8 *)ptr, old, new_); + case 2: + return cmpxchg_emu_u16((volatile u16 *)ptr, old, new_); case 4: return __cmpxchg_u32((u32 *)ptr, (u32)old, (u32)new_); default: -- 2.40.1
|