/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_METAG_CMPXCHG_LNKGET_H
#define __ASM_METAG_CMPXCHG_LNKGET_H

static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
{
	int temp, old;

	smp_mb();

	asm volatile (
		      "1:	LNKGETD %1, [%2]\n"
		      "	LNKSETD	[%2], %3\n"
		      "	DEFR	%0, TXSTAT\n"
		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
		      "	CMPT	%0, #HI(0x02000000)\n"
		      "	BNZ	1b\n"
#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
		      "	DCACHE	[%2], %0\n"
#endif
		      : "=&d" (temp), "=&d" (old)
		      : "da" (m), "da" (val)
		      : "cc"
		      );

	smp_mb();

	return old;
}

static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
{
	int temp, old;

	smp_mb();

	asm volatile (
		      "1:	LNKGETD %1, [%2]\n"
		      "	LNKSETD	[%2], %3\n"
		      "	DEFR	%0, TXSTAT\n"
		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
		      "	CMPT	%0, #HI(0x02000000)\n"
		      "	BNZ	1b\n"
#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
		      "	DCACHE	[%2], %0\n"
#endif
		      : "=&d" (temp), "=&d" (old)
		      : "da" (m), "da" (val & 0xff)
		      : "cc"
		      );

	smp_mb();

	return old;
}

static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
					  unsigned long new)
{
	__u32 retval, temp;

	smp_mb();

	asm volatile (
		      "1:	LNKGETD	%1, [%2]\n"
		      "	CMP	%1, %3\n"
		      "	LNKSETDEQ [%2], %4\n"
		      "	BNE	2f\n"
		      "	DEFR	%0, TXSTAT\n"
		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
		      "	CMPT	%0, #HI(0x02000000)\n"
		      "	BNZ	1b\n"
#ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
		      "	DCACHE	[%2], %0\n"
#endif
		      "2:\n"
		      : "=&d" (temp), "=&d" (retval)
		      : "da" (m), "bd" (old), "da" (new)
		      : "cc"
		      );

	smp_mb();

	return retval;
}

#endif /* __ASM_METAG_CMPXCHG_LNKGET_H */
