xref: /openbmc/linux/arch/sh/include/asm/cmpxchg-llsc.h (revision b2441318)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2ee43a844SPaul Mundt #ifndef __ASM_SH_CMPXCHG_LLSC_H
3ee43a844SPaul Mundt #define __ASM_SH_CMPXCHG_LLSC_H
4ee43a844SPaul Mundt 
xchg_u32(volatile u32 * m,unsigned long val)5ee43a844SPaul Mundt static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
6ee43a844SPaul Mundt {
7ee43a844SPaul Mundt 	unsigned long retval;
8ee43a844SPaul Mundt 	unsigned long tmp;
9ee43a844SPaul Mundt 
10ee43a844SPaul Mundt 	__asm__ __volatile__ (
11ee43a844SPaul Mundt 		"1:					\n\t"
1242990701SMatt Fleming 		"movli.l	@%2, %0	! xchg_u32	\n\t"
1342990701SMatt Fleming 		"mov		%0, %1			\n\t"
1442990701SMatt Fleming 		"mov		%3, %0			\n\t"
1542990701SMatt Fleming 		"movco.l	%0, @%2			\n\t"
16ee43a844SPaul Mundt 		"bf		1b			\n\t"
17ee43a844SPaul Mundt 		"synco					\n\t"
1842990701SMatt Fleming 		: "=&z"(tmp), "=&r" (retval)
1942990701SMatt Fleming 		: "r" (m), "r" (val)
20ee43a844SPaul Mundt 		: "t", "memory"
21ee43a844SPaul Mundt 	);
22ee43a844SPaul Mundt 
23ee43a844SPaul Mundt 	return retval;
24ee43a844SPaul Mundt }
25ee43a844SPaul Mundt 
26ee43a844SPaul Mundt static inline unsigned long
__cmpxchg_u32(volatile u32 * m,unsigned long old,unsigned long new)273226aad8SMichael S. Tsirkin __cmpxchg_u32(volatile u32 *m, unsigned long old, unsigned long new)
28ee43a844SPaul Mundt {
29ee43a844SPaul Mundt 	unsigned long retval;
30ee43a844SPaul Mundt 	unsigned long tmp;
31ee43a844SPaul Mundt 
32ee43a844SPaul Mundt 	__asm__ __volatile__ (
33ee43a844SPaul Mundt 		"1:						\n\t"
3442990701SMatt Fleming 		"movli.l	@%2, %0	! __cmpxchg_u32		\n\t"
3542990701SMatt Fleming 		"mov		%0, %1				\n\t"
3642990701SMatt Fleming 		"cmp/eq		%1, %3				\n\t"
37ee43a844SPaul Mundt 		"bf		2f				\n\t"
384c7c9978SAoi Shinkai 		"mov		%4, %0				\n\t"
39ee43a844SPaul Mundt 		"2:						\n\t"
4042990701SMatt Fleming 		"movco.l	%0, @%2				\n\t"
41ee43a844SPaul Mundt 		"bf		1b				\n\t"
42ee43a844SPaul Mundt 		"synco						\n\t"
4342990701SMatt Fleming 		: "=&z" (tmp), "=&r" (retval)
4442990701SMatt Fleming 		: "r" (m), "r" (old), "r" (new)
45ee43a844SPaul Mundt 		: "t", "memory"
46ee43a844SPaul Mundt 	);
47ee43a844SPaul Mundt 
48ee43a844SPaul Mundt 	return retval;
49ee43a844SPaul Mundt }
50ee43a844SPaul Mundt 
519e3f84ceSMichael S. Tsirkin #include <asm/cmpxchg-xchg.h>
523226aad8SMichael S. Tsirkin 
53ee43a844SPaul Mundt #endif /* __ASM_SH_CMPXCHG_LLSC_H */
54