GNU Linux-libre 4.14.251-gnu1
[releases.git] / arch / metag / include / asm / cmpxchg_lnkget.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __ASM_METAG_CMPXCHG_LNKGET_H
3 #define __ASM_METAG_CMPXCHG_LNKGET_H
4
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
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
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 */