Merge branch 'etnaviv/next' of https://git.pengutronix.de/git/lst/linux into drm...
[linux-2.6-microblaze.git] / arch / csky / kernel / atomic.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3
4 #include <linux/linkage.h>
5 #include <abi/entry.h>
6
7 .text
8
9 /*
10  * int csky_cmpxchg(int oldval, int newval, int *ptr)
11  *
12  * If *ptr != oldval && return 1,
13  * else *ptr = newval return 0.
14  */
15 #ifdef CONFIG_CPU_HAS_LDSTEX
16 ENTRY(csky_cmpxchg)
17         USPTOKSP
18         mfcr    a3, epc
19         INCTRAP a3
20
21         subi    sp, 8
22         stw     a3, (sp, 0)
23         mfcr    a3, epsr
24         stw     a3, (sp, 4)
25
26         psrset  ee
27 1:
28         ldex    a3, (a2)
29         cmpne   a0, a3
30         bt16    2f
31         mov     a3, a1
32         stex    a3, (a2)
33         bez     a3, 1b
34 2:
35         sync.is
36         mvc     a0
37         ldw     a3, (sp, 0)
38         mtcr    a3, epc
39         ldw     a3, (sp, 4)
40         mtcr    a3, epsr
41         addi    sp, 8
42         KSPTOUSP
43         rte
44 END(csky_cmpxchg)
45 #else
46 ENTRY(csky_cmpxchg)
47         USPTOKSP
48         mfcr    a3, epc
49         INCTRAP a3
50
51         subi    sp, 8
52         stw     a3, (sp, 0)
53         mfcr    a3, epsr
54         stw     a3, (sp, 4)
55
56         psrset  ee
57 1:
58         ldw     a3, (a2)
59         cmpne   a0, a3
60         bt16    3f
61 2:
62         stw     a1, (a2)
63 3:
64         mvc     a0
65         ldw     a3, (sp, 0)
66         mtcr    a3, epc
67         ldw     a3, (sp, 4)
68         mtcr    a3, epsr
69         addi    sp, 8
70         KSPTOUSP
71         rte
72 END(csky_cmpxchg)
73
74 /*
75  * Called from tlbmodified exception
76  */
77 ENTRY(csky_cmpxchg_fixup)
78         mfcr    a0, epc
79         lrw     a1, 2b
80         cmpne   a1, a0
81         bt      1f
82         subi    a1, (2b - 1b)
83         stw     a1, (sp, LSAVE_PC)
84 1:
85         rts
86 END(csky_cmpxchg_fixup)
87 #endif