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