xref: /openbmc/linux/arch/sh/include/asm/cmpxchg-llsc.h (revision 4c7c9978)
1ee43a844SPaul Mundt #ifndef __ASM_SH_CMPXCHG_LLSC_H
2ee43a844SPaul Mundt #define __ASM_SH_CMPXCHG_LLSC_H
3ee43a844SPaul Mundt 
4ee43a844SPaul Mundt static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
5ee43a844SPaul Mundt {
6ee43a844SPaul Mundt 	unsigned long retval;
7ee43a844SPaul Mundt 	unsigned long tmp;
8ee43a844SPaul Mundt 
9ee43a844SPaul Mundt 	__asm__ __volatile__ (
10ee43a844SPaul Mundt 		"1:					\n\t"
1142990701SMatt Fleming 		"movli.l	@%2, %0	! xchg_u32	\n\t"
1242990701SMatt Fleming 		"mov		%0, %1			\n\t"
1342990701SMatt Fleming 		"mov		%3, %0			\n\t"
1442990701SMatt Fleming 		"movco.l	%0, @%2			\n\t"
15ee43a844SPaul Mundt 		"bf		1b			\n\t"
16ee43a844SPaul Mundt 		"synco					\n\t"
1742990701SMatt Fleming 		: "=&z"(tmp), "=&r" (retval)
1842990701SMatt Fleming 		: "r" (m), "r" (val)
19ee43a844SPaul Mundt 		: "t", "memory"
20ee43a844SPaul Mundt 	);
21ee43a844SPaul Mundt 
22ee43a844SPaul Mundt 	return retval;
23ee43a844SPaul Mundt }
24ee43a844SPaul Mundt 
25ee43a844SPaul Mundt static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
26ee43a844SPaul Mundt {
27ee43a844SPaul Mundt 	unsigned long retval;
28ee43a844SPaul Mundt 	unsigned long tmp;
29ee43a844SPaul Mundt 
30ee43a844SPaul Mundt 	__asm__ __volatile__ (
31ee43a844SPaul Mundt 		"1:					\n\t"
3242990701SMatt Fleming 		"movli.l	@%2, %0	! xchg_u8	\n\t"
3342990701SMatt Fleming 		"mov		%0, %1			\n\t"
3442990701SMatt Fleming 		"mov		%3, %0			\n\t"
3542990701SMatt Fleming 		"movco.l	%0, @%2			\n\t"
36ee43a844SPaul Mundt 		"bf		1b			\n\t"
37ee43a844SPaul Mundt 		"synco					\n\t"
3842990701SMatt Fleming 		: "=&z"(tmp), "=&r" (retval)
3942990701SMatt Fleming 		: "r" (m), "r" (val & 0xff)
40ee43a844SPaul Mundt 		: "t", "memory"
41ee43a844SPaul Mundt 	);
42ee43a844SPaul Mundt 
43ee43a844SPaul Mundt 	return retval;
44ee43a844SPaul Mundt }
45ee43a844SPaul Mundt 
46ee43a844SPaul Mundt static inline unsigned long
47ee43a844SPaul Mundt __cmpxchg_u32(volatile int *m, unsigned long old, unsigned long new)
48ee43a844SPaul Mundt {
49ee43a844SPaul Mundt 	unsigned long retval;
50ee43a844SPaul Mundt 	unsigned long tmp;
51ee43a844SPaul Mundt 
52ee43a844SPaul Mundt 	__asm__ __volatile__ (
53ee43a844SPaul Mundt 		"1:						\n\t"
5442990701SMatt Fleming 		"movli.l	@%2, %0	! __cmpxchg_u32		\n\t"
5542990701SMatt Fleming 		"mov		%0, %1				\n\t"
5642990701SMatt Fleming 		"cmp/eq		%1, %3				\n\t"
57ee43a844SPaul Mundt 		"bf		2f				\n\t"
584c7c9978SAoi Shinkai 		"mov		%4, %0				\n\t"
59ee43a844SPaul Mundt 		"2:						\n\t"
6042990701SMatt Fleming 		"movco.l	%0, @%2				\n\t"
61ee43a844SPaul Mundt 		"bf		1b				\n\t"
62ee43a844SPaul Mundt 		"synco						\n\t"
6342990701SMatt Fleming 		: "=&z" (tmp), "=&r" (retval)
6442990701SMatt Fleming 		: "r" (m), "r" (old), "r" (new)
65ee43a844SPaul Mundt 		: "t", "memory"
66ee43a844SPaul Mundt 	);
67ee43a844SPaul Mundt 
68ee43a844SPaul Mundt 	return retval;
69ee43a844SPaul Mundt }
70ee43a844SPaul Mundt 
71ee43a844SPaul Mundt #endif /* __ASM_SH_CMPXCHG_LLSC_H */
72