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