162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __ASM_CSKY_ENTRY_H
462306a36Sopenharmony_ci#define __ASM_CSKY_ENTRY_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <asm/setup.h>
762306a36Sopenharmony_ci#include <abi/regdef.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define LSAVE_PC	8
1062306a36Sopenharmony_ci#define LSAVE_PSR	12
1162306a36Sopenharmony_ci#define LSAVE_A0	24
1262306a36Sopenharmony_ci#define LSAVE_A1	28
1362306a36Sopenharmony_ci#define LSAVE_A2	32
1462306a36Sopenharmony_ci#define LSAVE_A3	36
1562306a36Sopenharmony_ci#define LSAVE_A4	40
1662306a36Sopenharmony_ci#define LSAVE_A5	44
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define usp ss1
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci.macro USPTOKSP
2162306a36Sopenharmony_ci	mtcr	sp, usp
2262306a36Sopenharmony_ci	mfcr	sp, ss0
2362306a36Sopenharmony_ci.endm
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci.macro KSPTOUSP
2662306a36Sopenharmony_ci	mtcr	sp, ss0
2762306a36Sopenharmony_ci	mfcr	sp, usp
2862306a36Sopenharmony_ci.endm
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci.macro	SAVE_ALL epc_inc
3162306a36Sopenharmony_ci	mtcr    r13, ss2
3262306a36Sopenharmony_ci	mfcr    r13, epsr
3362306a36Sopenharmony_ci	btsti   r13, 31
3462306a36Sopenharmony_ci	bt      1f
3562306a36Sopenharmony_ci	USPTOKSP
3662306a36Sopenharmony_ci1:
3762306a36Sopenharmony_ci	subi    sp, 32
3862306a36Sopenharmony_ci	subi    sp, 32
3962306a36Sopenharmony_ci	subi    sp, 16
4062306a36Sopenharmony_ci	stw     r13, (sp, 12)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	stw     lr, (sp, 4)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	mfcr	lr, epc
4562306a36Sopenharmony_ci	movi	r13, \epc_inc
4662306a36Sopenharmony_ci	add	lr, r13
4762306a36Sopenharmony_ci	stw     lr, (sp, 8)
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	mov	lr, sp
5062306a36Sopenharmony_ci	addi	lr, 32
5162306a36Sopenharmony_ci	addi	lr, 32
5262306a36Sopenharmony_ci	addi	lr, 16
5362306a36Sopenharmony_ci	bt	2f
5462306a36Sopenharmony_ci	mfcr	lr, ss1
5562306a36Sopenharmony_ci2:
5662306a36Sopenharmony_ci	stw     lr, (sp, 16)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	stw     a0, (sp, 20)
5962306a36Sopenharmony_ci	stw     a0, (sp, 24)
6062306a36Sopenharmony_ci	stw     a1, (sp, 28)
6162306a36Sopenharmony_ci	stw     a2, (sp, 32)
6262306a36Sopenharmony_ci	stw     a3, (sp, 36)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	addi	sp, 32
6562306a36Sopenharmony_ci	addi	sp, 8
6662306a36Sopenharmony_ci	mfcr    r13, ss2
6762306a36Sopenharmony_ci	stw	r6, (sp)
6862306a36Sopenharmony_ci	stw	r7, (sp, 4)
6962306a36Sopenharmony_ci	stw	r8, (sp, 8)
7062306a36Sopenharmony_ci	stw	r9, (sp, 12)
7162306a36Sopenharmony_ci	stw	r10, (sp, 16)
7262306a36Sopenharmony_ci	stw	r11, (sp, 20)
7362306a36Sopenharmony_ci	stw	r12, (sp, 24)
7462306a36Sopenharmony_ci	stw	r13, (sp, 28)
7562306a36Sopenharmony_ci	stw	r14, (sp, 32)
7662306a36Sopenharmony_ci	stw	r1, (sp, 36)
7762306a36Sopenharmony_ci	subi	sp, 32
7862306a36Sopenharmony_ci	subi	sp, 8
7962306a36Sopenharmony_ci.endm
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci.macro	RESTORE_ALL
8262306a36Sopenharmony_ci	ldw	lr, (sp, 4)
8362306a36Sopenharmony_ci	ldw     a0, (sp, 8)
8462306a36Sopenharmony_ci	mtcr    a0, epc
8562306a36Sopenharmony_ci	ldw     a0, (sp, 12)
8662306a36Sopenharmony_ci	mtcr    a0, epsr
8762306a36Sopenharmony_ci	btsti   a0, 31
8862306a36Sopenharmony_ci	bt      1f
8962306a36Sopenharmony_ci	ldw     a0, (sp, 16)
9062306a36Sopenharmony_ci	mtcr	a0, ss1
9162306a36Sopenharmony_ci1:
9262306a36Sopenharmony_ci	ldw     a0, (sp, 24)
9362306a36Sopenharmony_ci	ldw     a1, (sp, 28)
9462306a36Sopenharmony_ci	ldw     a2, (sp, 32)
9562306a36Sopenharmony_ci	ldw     a3, (sp, 36)
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	addi	sp, 32
9862306a36Sopenharmony_ci	addi	sp, 8
9962306a36Sopenharmony_ci	ldw	r6, (sp)
10062306a36Sopenharmony_ci	ldw	r7, (sp, 4)
10162306a36Sopenharmony_ci	ldw	r8, (sp, 8)
10262306a36Sopenharmony_ci	ldw	r9, (sp, 12)
10362306a36Sopenharmony_ci	ldw	r10, (sp, 16)
10462306a36Sopenharmony_ci	ldw	r11, (sp, 20)
10562306a36Sopenharmony_ci	ldw	r12, (sp, 24)
10662306a36Sopenharmony_ci	ldw	r13, (sp, 28)
10762306a36Sopenharmony_ci	ldw	r14, (sp, 32)
10862306a36Sopenharmony_ci	ldw	r1, (sp, 36)
10962306a36Sopenharmony_ci	addi	sp, 32
11062306a36Sopenharmony_ci	addi	sp, 8
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	bt      2f
11362306a36Sopenharmony_ci	KSPTOUSP
11462306a36Sopenharmony_ci2:
11562306a36Sopenharmony_ci	rte
11662306a36Sopenharmony_ci.endm
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci.macro SAVE_SWITCH_STACK
11962306a36Sopenharmony_ci	subi    sp, 32
12062306a36Sopenharmony_ci	stm     r8-r15, (sp)
12162306a36Sopenharmony_ci.endm
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci.macro RESTORE_SWITCH_STACK
12462306a36Sopenharmony_ci	ldm     r8-r15, (sp)
12562306a36Sopenharmony_ci	addi    sp, 32
12662306a36Sopenharmony_ci.endm
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/* MMU registers operators. */
12962306a36Sopenharmony_ci.macro RD_MIR	rx
13062306a36Sopenharmony_ci	cprcr   \rx, cpcr0
13162306a36Sopenharmony_ci.endm
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci.macro RD_MEH	rx
13462306a36Sopenharmony_ci	cprcr   \rx, cpcr4
13562306a36Sopenharmony_ci.endm
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci.macro RD_MCIR	rx
13862306a36Sopenharmony_ci	cprcr   \rx, cpcr8
13962306a36Sopenharmony_ci.endm
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci.macro RD_PGDR  rx
14262306a36Sopenharmony_ci	cprcr   \rx, cpcr29
14362306a36Sopenharmony_ci.endm
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci.macro WR_MEH	rx
14662306a36Sopenharmony_ci	cpwcr   \rx, cpcr4
14762306a36Sopenharmony_ci.endm
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci.macro WR_MCIR	rx
15062306a36Sopenharmony_ci	cpwcr   \rx, cpcr8
15162306a36Sopenharmony_ci.endm
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci.macro SETUP_MMU
15462306a36Sopenharmony_ci	/* Init psr and enable ee */
15562306a36Sopenharmony_ci	lrw	r6, DEFAULT_PSR_VALUE
15662306a36Sopenharmony_ci	mtcr    r6, psr
15762306a36Sopenharmony_ci	psrset  ee
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	/* Select MMU as co-processor */
16062306a36Sopenharmony_ci	cpseti	cp15
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/*
16362306a36Sopenharmony_ci	 * cpcr30 format:
16462306a36Sopenharmony_ci	 * 31 - 29 | 28 - 4 | 3 | 2 | 1 | 0
16562306a36Sopenharmony_ci	 *   BA     Reserved  C   D   V
16662306a36Sopenharmony_ci	 */
16762306a36Sopenharmony_ci	cprcr	r6, cpcr30
16862306a36Sopenharmony_ci	lsri	r6, 29
16962306a36Sopenharmony_ci	lsli	r6, 29
17062306a36Sopenharmony_ci	addi	r6, 0xe
17162306a36Sopenharmony_ci	cpwcr	r6, cpcr30
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	movi	r6, 0
17462306a36Sopenharmony_ci	cpwcr	r6, cpcr31
17562306a36Sopenharmony_ci.endm
17662306a36Sopenharmony_ci#endif /* __ASM_CSKY_ENTRY_H */
177