xref: /openbmc/linux/arch/csky/kernel/atomic.S (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
1a0ae6280SGuo Ren/* SPDX-License-Identifier: GPL-2.0 */
2a0ae6280SGuo Ren// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3a0ae6280SGuo Ren
4a0ae6280SGuo Ren#include <linux/linkage.h>
5a0ae6280SGuo Ren#include <abi/entry.h>
6a0ae6280SGuo Ren
7a0ae6280SGuo Ren.text
8a0ae6280SGuo Ren
9a0ae6280SGuo Ren/*
10a0ae6280SGuo Ren * int csky_cmpxchg(int oldval, int newval, int *ptr)
11a0ae6280SGuo Ren *
12a0ae6280SGuo Ren * If *ptr != oldval && return 1,
13a0ae6280SGuo Ren * else *ptr = newval return 0.
14a0ae6280SGuo Ren */
15a0ae6280SGuo RenENTRY(csky_cmpxchg)
16a0ae6280SGuo Ren	USPTOKSP
170c8a32eeSGuo Ren
180c8a32eeSGuo Ren	RD_MEH	a3
190c8a32eeSGuo Ren	WR_MEH	a3
200c8a32eeSGuo Ren
21a0ae6280SGuo Ren	mfcr	a3, epc
22bf241682SGuo Ren	addi	a3, TRAP0_SIZE
23a0ae6280SGuo Ren
24f8e17c17SGuo Ren	subi    sp, 16
25a0ae6280SGuo Ren	stw     a3, (sp, 0)
26a0ae6280SGuo Ren	mfcr    a3, epsr
27a0ae6280SGuo Ren	stw     a3, (sp, 4)
28f8e17c17SGuo Ren	mfcr	a3, usp
29f8e17c17SGuo Ren	stw     a3, (sp, 8)
30a0ae6280SGuo Ren
31a0ae6280SGuo Ren	psrset	ee
32bf241682SGuo Ren#ifdef CONFIG_CPU_HAS_LDSTEX
33a0ae6280SGuo Ren1:
34a0ae6280SGuo Ren	ldex	a3, (a2)
35a0ae6280SGuo Ren	cmpne	a0, a3
36a0ae6280SGuo Ren	bt16	2f
37a0ae6280SGuo Ren	mov	a3, a1
38a0ae6280SGuo Ren	stex	a3, (a2)
39a0ae6280SGuo Ren	bez	a3, 1b
40a0ae6280SGuo Ren2:
41a0ae6280SGuo Ren	sync.is
42a0ae6280SGuo Ren#else
43*b0ae5e26SGuo RenGLOBAL(csky_cmpxchg_ldw)
44a0ae6280SGuo Ren	ldw	a3, (a2)
45a0ae6280SGuo Ren	cmpne	a0, a3
46a0ae6280SGuo Ren	bt16	3f
47*b0ae5e26SGuo RenGLOBAL(csky_cmpxchg_stw)
48a0ae6280SGuo Ren	stw	a1, (a2)
49a0ae6280SGuo Ren3:
50bf241682SGuo Ren#endif
51a0ae6280SGuo Ren	mvc	a0
52a0ae6280SGuo Ren	ldw	a3, (sp, 0)
53a0ae6280SGuo Ren	mtcr	a3, epc
54a0ae6280SGuo Ren	ldw     a3, (sp, 4)
55a0ae6280SGuo Ren	mtcr	a3, epsr
56f8e17c17SGuo Ren	ldw     a3, (sp, 8)
57f8e17c17SGuo Ren	mtcr	a3, usp
58f8e17c17SGuo Ren	addi	sp, 16
59a0ae6280SGuo Ren	KSPTOUSP
60a0ae6280SGuo Ren	rte
61a0ae6280SGuo RenEND(csky_cmpxchg)
62