1 /* SPDX-License-Identifier: GPL-2.0 */
2 
3 #ifndef __ASM_CSKY_ENTRY_H
4 #define __ASM_CSKY_ENTRY_H
5 
6 #include <asm/setup.h>
7 #include <abi/regdef.h>
8 
9 #define LSAVE_PC	8
10 #define LSAVE_PSR	12
11 #define LSAVE_A0	24
12 #define LSAVE_A1	28
13 #define LSAVE_A2	32
14 #define LSAVE_A3	36
15 #define LSAVE_A4	40
16 #define LSAVE_A5	44
17 
18 #define KSPTOUSP
19 #define USPTOKSP
20 
21 #define usp cr<14, 1>
22 
23 .macro SAVE_ALL epc_inc
24 	subi    sp, 152
25 	stw	tls, (sp, 0)
26 	stw	lr, (sp, 4)
27 
28 	RD_MEH	lr
29 	WR_MEH	lr
30 
31 	mfcr	lr, epc
32 	movi	tls, \epc_inc
33 	add	lr, tls
34 	stw	lr, (sp, 8)
35 
36 	mfcr	lr, epsr
37 	stw	lr, (sp, 12)
38 	btsti   lr, 31
39 	bf      1f
40 	addi    lr, sp, 152
41 	br	2f
42 1:
43 	mfcr	lr, usp
44 2:
45 	stw	lr, (sp, 16)
46 
47 	stw     a0, (sp, 20)
48 	stw     a0, (sp, 24)
49 	stw     a1, (sp, 28)
50 	stw     a2, (sp, 32)
51 	stw     a3, (sp, 36)
52 
53 	addi	sp, 40
54 	stm	r4-r13, (sp)
55 
56 	addi    sp, 40
57 	stm     r16-r30, (sp)
58 #ifdef CONFIG_CPU_HAS_HILO
59 	mfhi	lr
60 	stw	lr, (sp, 60)
61 	mflo	lr
62 	stw	lr, (sp, 64)
63 	mfcr	lr, cr14
64 	stw	lr, (sp, 68)
65 #endif
66 	subi	sp, 80
67 .endm
68 
69 .macro	RESTORE_ALL
70 	ldw	tls, (sp, 0)
71 	ldw	lr, (sp, 4)
72 	ldw	a0, (sp, 8)
73 	mtcr	a0, epc
74 	ldw	a0, (sp, 12)
75 	mtcr	a0, epsr
76 	btsti   a0, 31
77 	ldw	a0, (sp, 16)
78 	mtcr	a0, usp
79 	mtcr	a0, ss0
80 
81 #ifdef CONFIG_CPU_HAS_HILO
82 	ldw	a0, (sp, 140)
83 	mthi	a0
84 	ldw	a0, (sp, 144)
85 	mtlo	a0
86 	ldw	a0, (sp, 148)
87 	mtcr	a0, cr14
88 #endif
89 
90 	ldw     a0, (sp, 24)
91 	ldw     a1, (sp, 28)
92 	ldw     a2, (sp, 32)
93 	ldw     a3, (sp, 36)
94 
95 	addi	sp, 40
96 	ldm	r4-r13, (sp)
97 	addi    sp, 40
98 	ldm     r16-r30, (sp)
99 	addi    sp, 72
100 	bf	1f
101 	mfcr	sp, ss0
102 1:
103 	rte
104 .endm
105 
106 .macro SAVE_REGS_FTRACE
107 	subi    sp, 152
108 	stw	tls, (sp, 0)
109 	stw	lr, (sp, 4)
110 
111 	mfcr	lr, psr
112 	stw	lr, (sp, 12)
113 
114 	addi    lr, sp, 152
115 	stw	lr, (sp, 16)
116 
117 	stw     a0, (sp, 20)
118 	stw     a0, (sp, 24)
119 	stw     a1, (sp, 28)
120 	stw     a2, (sp, 32)
121 	stw     a3, (sp, 36)
122 
123 	addi	sp, 40
124 	stm	r4-r13, (sp)
125 
126 	addi    sp, 40
127 	stm     r16-r30, (sp)
128 #ifdef CONFIG_CPU_HAS_HILO
129 	mfhi	lr
130 	stw	lr, (sp, 60)
131 	mflo	lr
132 	stw	lr, (sp, 64)
133 	mfcr	lr, cr14
134 	stw	lr, (sp, 68)
135 #endif
136 	subi	sp, 80
137 .endm
138 
139 .macro	RESTORE_REGS_FTRACE
140 	ldw	tls, (sp, 0)
141 
142 #ifdef CONFIG_CPU_HAS_HILO
143 	ldw	a0, (sp, 140)
144 	mthi	a0
145 	ldw	a0, (sp, 144)
146 	mtlo	a0
147 	ldw	a0, (sp, 148)
148 	mtcr	a0, cr14
149 #endif
150 
151 	ldw     a0, (sp, 24)
152 	ldw     a1, (sp, 28)
153 	ldw     a2, (sp, 32)
154 	ldw     a3, (sp, 36)
155 
156 	addi	sp, 40
157 	ldm	r4-r13, (sp)
158 	addi    sp, 40
159 	ldm     r16-r30, (sp)
160 	addi    sp, 72
161 .endm
162 
163 .macro SAVE_SWITCH_STACK
164 	subi    sp, 64
165 	stm	r4-r11, (sp)
166 	stw	lr,  (sp, 32)
167 	stw	r16, (sp, 36)
168 	stw	r17, (sp, 40)
169 	stw	r26, (sp, 44)
170 	stw	r27, (sp, 48)
171 	stw	r28, (sp, 52)
172 	stw	r29, (sp, 56)
173 	stw	r30, (sp, 60)
174 #ifdef CONFIG_CPU_HAS_HILO
175 	subi	sp, 16
176 	mfhi	lr
177 	stw	lr, (sp, 0)
178 	mflo	lr
179 	stw	lr, (sp, 4)
180 	mfcr	lr, cr14
181 	stw	lr, (sp, 8)
182 #endif
183 .endm
184 
185 .macro RESTORE_SWITCH_STACK
186 #ifdef CONFIG_CPU_HAS_HILO
187 	ldw	lr, (sp, 0)
188 	mthi	lr
189 	ldw	lr, (sp, 4)
190 	mtlo	lr
191 	ldw	lr, (sp, 8)
192 	mtcr	lr, cr14
193 	addi	sp, 16
194 #endif
195 	ldm	r4-r11, (sp)
196 	ldw	lr,  (sp, 32)
197 	ldw	r16, (sp, 36)
198 	ldw	r17, (sp, 40)
199 	ldw	r26, (sp, 44)
200 	ldw	r27, (sp, 48)
201 	ldw	r28, (sp, 52)
202 	ldw	r29, (sp, 56)
203 	ldw	r30, (sp, 60)
204 	addi	sp, 64
205 .endm
206 
207 /* MMU registers operators. */
208 .macro RD_MIR rx
209 	mfcr	\rx, cr<0, 15>
210 .endm
211 
212 .macro RD_MEH rx
213 	mfcr	\rx, cr<4, 15>
214 .endm
215 
216 .macro RD_MCIR rx
217 	mfcr	\rx, cr<8, 15>
218 .endm
219 
220 .macro RD_PGDR rx
221 	mfcr	\rx, cr<29, 15>
222 .endm
223 
224 .macro RD_PGDR_K rx
225 	mfcr	\rx, cr<28, 15>
226 .endm
227 
228 .macro WR_MEH rx
229 	mtcr	\rx, cr<4, 15>
230 .endm
231 
232 .macro WR_MCIR rx
233 	mtcr	\rx, cr<8, 15>
234 .endm
235 
236 #ifdef CONFIG_PAGE_OFFSET_80000000
237 #define MSA_SET cr<30, 15>
238 #define MSA_CLR cr<31, 15>
239 #endif
240 
241 #ifdef CONFIG_PAGE_OFFSET_A0000000
242 #define MSA_SET cr<31, 15>
243 #define MSA_CLR cr<30, 15>
244 #endif
245 
246 .macro SETUP_MMU
247 	/* Init psr and enable ee */
248 	lrw	r6, DEFAULT_PSR_VALUE
249 	mtcr    r6, psr
250 	psrset  ee
251 
252 	/* Invalid I/Dcache BTB BHT */
253 	movi	r6, 7
254 	lsli	r6, 16
255 	addi	r6, (1<<4) | 3
256 	mtcr	r6, cr17
257 
258 	/* Invalid all TLB */
259 	bgeni   r6, 26
260 	mtcr	r6, cr<8, 15> /* Set MCIR */
261 
262 	/* Check MMU on/off */
263 	mfcr	r6, cr18
264 	btsti	r6, 0
265 	bt	1f
266 
267 	/* MMU off: setup mapping tlb entry */
268 	movi	r6, 0
269 	mtcr	r6, cr<6, 15> /* Set MPR with 4K page size */
270 
271 	grs	r6, 1f /* Get current pa by PC */
272 	bmaski  r7, (PAGE_SHIFT + 1) /* r7 = 0x1fff */
273 	andn    r6, r7
274 	mtcr	r6, cr<4, 15> /* Set MEH */
275 
276 	mov	r8, r6
277 	movi    r7, 0x00000006
278 	or      r8, r7
279 	mtcr	r8, cr<2, 15> /* Set MEL0 */
280 	movi    r7, 0x00001006
281 	or      r8, r7
282 	mtcr	r8, cr<3, 15> /* Set MEL1 */
283 
284 	bgeni   r8, 28
285 	mtcr	r8, cr<8, 15> /* Set MCIR to write TLB */
286 
287 	br	2f
288 1:
289 	/*
290 	 * MMU on: use origin MSA value from bootloader
291 	 *
292 	 * cr<30/31, 15> MSA register format:
293 	 * 31 - 29 | 28 - 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
294 	 *   BA     Reserved  SH  WA  B   SO SEC  C   D   V
295 	 */
296 	mfcr	r6, MSA_SET /* Get MSA */
297 2:
298 	lsri	r6, 29
299 	lsli	r6, 29
300 	addi	r6, 0x1ce
301 	mtcr	r6, MSA_SET /* Set MSA */
302 
303 	movi    r6, 0
304 	mtcr	r6, MSA_CLR /* Clr MSA */
305 
306 	/* enable MMU */
307 	mfcr    r6, cr18
308 	bseti	r6, 0
309 	mtcr    r6, cr18
310 
311 	jmpi	3f /* jump to va */
312 3:
313 .endm
314 #endif /* __ASM_CSKY_ENTRY_H */
315