• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_METAG_CMPXCHG_LNKGET_H
3 #define __ASM_METAG_CMPXCHG_LNKGET_H
4 
xchg_u32(volatile u32 * m,unsigned long val)5 static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
6 {
7 	int temp, old;
8 
9 	smp_mb();
10 
11 	asm volatile (
12 		      "1:	LNKGETD %1, [%2]\n"
13 		      "	LNKSETD	[%2], %3\n"
14 		      "	DEFR	%0, TXSTAT\n"
15 		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
16 		      "	CMPT	%0, #HI(0x02000000)\n"
17 		      "	BNZ	1b\n"
18 #ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
19 		      "	DCACHE	[%2], %0\n"
20 #endif
21 		      : "=&d" (temp), "=&d" (old)
22 		      : "da" (m), "da" (val)
23 		      : "cc"
24 		      );
25 
26 	smp_mb();
27 
28 	return old;
29 }
30 
xchg_u8(volatile u8 * m,unsigned long val)31 static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
32 {
33 	int temp, old;
34 
35 	smp_mb();
36 
37 	asm volatile (
38 		      "1:	LNKGETD %1, [%2]\n"
39 		      "	LNKSETD	[%2], %3\n"
40 		      "	DEFR	%0, TXSTAT\n"
41 		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
42 		      "	CMPT	%0, #HI(0x02000000)\n"
43 		      "	BNZ	1b\n"
44 #ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
45 		      "	DCACHE	[%2], %0\n"
46 #endif
47 		      : "=&d" (temp), "=&d" (old)
48 		      : "da" (m), "da" (val & 0xff)
49 		      : "cc"
50 		      );
51 
52 	smp_mb();
53 
54 	return old;
55 }
56 
__cmpxchg_u32(volatile int * m,unsigned long old,unsigned long new)57 static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
58 					  unsigned long new)
59 {
60 	__u32 retval, temp;
61 
62 	smp_mb();
63 
64 	asm volatile (
65 		      "1:	LNKGETD	%1, [%2]\n"
66 		      "	CMP	%1, %3\n"
67 		      "	LNKSETDEQ [%2], %4\n"
68 		      "	BNE	2f\n"
69 		      "	DEFR	%0, TXSTAT\n"
70 		      "	ANDT	%0, %0, #HI(0x3f000000)\n"
71 		      "	CMPT	%0, #HI(0x02000000)\n"
72 		      "	BNZ	1b\n"
73 #ifdef CONFIG_METAG_LNKGET_AROUND_CACHE
74 		      "	DCACHE	[%2], %0\n"
75 #endif
76 		      "2:\n"
77 		      : "=&d" (temp), "=&d" (retval)
78 		      : "da" (m), "bd" (old), "da" (new)
79 		      : "cc"
80 		      );
81 
82 	smp_mb();
83 
84 	return retval;
85 }
86 
87 #endif /* __ASM_METAG_CMPXCHG_LNKGET_H */
88