Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / metag / include / asm / cmpxchg_lnkget.h
1 #ifndef __ASM_METAG_CMPXCHG_LNKGET_H
2 #define __ASM_METAG_CMPXCHG_LNKGET_H
3
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
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
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), "=&da" (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 */