xref: /OK3568_Linux_fs/u-boot/arch/arm/include/asm/arm32_macros.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun	/* Please keep them sorted based on the CRn register */
8*4882a593Smuzhiyun	.macro read_midr reg
9*4882a593Smuzhiyun	mrc     p15, 0, \reg, c0, c0, 0
10*4882a593Smuzhiyun	.endm
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun	.macro read_ctr reg
13*4882a593Smuzhiyun	mrc	p15, 0, \reg, c0, c0, 1
14*4882a593Smuzhiyun	.endm
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun	.macro read_mpidr reg
17*4882a593Smuzhiyun	mrc	p15, 0, \reg, c0, c0, 5
18*4882a593Smuzhiyun	.endm
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun	.macro read_sctlr reg
21*4882a593Smuzhiyun	mrc	p15, 0, \reg, c1, c0, 0
22*4882a593Smuzhiyun	.endm
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun	.macro write_sctlr reg
25*4882a593Smuzhiyun	mcr	p15, 0, \reg, c1, c0, 0
26*4882a593Smuzhiyun	.endm
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun	.macro write_actlr reg
29*4882a593Smuzhiyun	mcr	p15, 0, \reg, c1, c0, 1
30*4882a593Smuzhiyun	.endm
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	.macro read_actlr reg
33*4882a593Smuzhiyun	mrc	p15, 0, \reg, c1, c0, 1
34*4882a593Smuzhiyun	.endm
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun	.macro write_cpacr reg
37*4882a593Smuzhiyun	mcr	p15, 0, \reg, c1, c0, 2
38*4882a593Smuzhiyun	.endm
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun	.macro read_cpacr reg
41*4882a593Smuzhiyun	mrc	p15, 0, \reg, c1, c0, 2
42*4882a593Smuzhiyun	.endm
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	.macro read_scr reg
45*4882a593Smuzhiyun	mrc	p15, 0, \reg, c1, c1, 0
46*4882a593Smuzhiyun	.endm
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun	.macro write_scr reg
49*4882a593Smuzhiyun	mcr	p15, 0, \reg, c1, c1, 0
50*4882a593Smuzhiyun	.endm
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun	.macro write_nsacr reg
53*4882a593Smuzhiyun	mcr	p15, 0, \reg, c1, c1, 2
54*4882a593Smuzhiyun	.endm
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun	.macro read_nsacr reg
57*4882a593Smuzhiyun	mrc	p15, 0, \reg, c1, c1, 2
58*4882a593Smuzhiyun	.endm
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun	.macro write_ttbr0 reg
61*4882a593Smuzhiyun	mcr	p15, 0, \reg, c2, c0, 0
62*4882a593Smuzhiyun	.endm
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun	.macro read_ttbr0 reg
65*4882a593Smuzhiyun	mrc	p15, 0, \reg, c2, c0, 0
66*4882a593Smuzhiyun	.endm
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun	.macro write_ttbr1 reg
69*4882a593Smuzhiyun	mcr	p15, 0, \reg, c2, c0, 1
70*4882a593Smuzhiyun	.endm
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun	.macro read_ttbr1 reg
73*4882a593Smuzhiyun	mrc	p15, 0, \reg, c2, c0, 1
74*4882a593Smuzhiyun	.endm
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun	.macro write_ttbcr reg
77*4882a593Smuzhiyun	mcr	p15, 0, \reg, c2, c0, 2
78*4882a593Smuzhiyun	.endm
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	.macro read_ttbcr reg
81*4882a593Smuzhiyun	mrc	p15, 0, \reg, c2, c0, 2
82*4882a593Smuzhiyun	.endm
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	.macro write_dacr reg
86*4882a593Smuzhiyun	mcr	p15, 0, \reg, c3, c0, 0
87*4882a593Smuzhiyun	.endm
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	.macro read_dacr reg
90*4882a593Smuzhiyun	mrc	p15, 0, \reg, c3, c0, 0
91*4882a593Smuzhiyun	.endm
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun	.macro read_dfsr reg
94*4882a593Smuzhiyun	mrc	p15, 0, \reg, c5, c0, 0
95*4882a593Smuzhiyun	.endm
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun	.macro write_icialluis
98*4882a593Smuzhiyun	/*
99*4882a593Smuzhiyun	 * Invalidate all instruction caches to PoU, Inner Shareable
100*4882a593Smuzhiyun	 * (register ignored)
101*4882a593Smuzhiyun	 */
102*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c1, 0
103*4882a593Smuzhiyun	.endm
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun	.macro write_bpiallis
106*4882a593Smuzhiyun	/*
107*4882a593Smuzhiyun	 * Invalidate entire branch predictor array, Inner Shareable
108*4882a593Smuzhiyun	 * (register ignored)
109*4882a593Smuzhiyun	 */
110*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c1, 6
111*4882a593Smuzhiyun	.endm
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun	.macro write_iciallu
114*4882a593Smuzhiyun	/* Invalidate all instruction caches to PoU (register ignored) */
115*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c5, 0
116*4882a593Smuzhiyun	.endm
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun	.macro write_icimvau reg
119*4882a593Smuzhiyun	/* Instruction cache invalidate by MVA */
120*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c5, 1
121*4882a593Smuzhiyun	.endm
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun	.macro write_bpiall
124*4882a593Smuzhiyun	/* Invalidate entire branch predictor array (register ignored) */
125*4882a593Smuzhiyun	mcr	p15, 0, r0, c7, c5, 6
126*4882a593Smuzhiyun	.endm
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	.macro write_dcimvac reg
129*4882a593Smuzhiyun	/* Data cache invalidate by MVA */
130*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c6, 1
131*4882a593Smuzhiyun	.endm
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun	.macro write_dcisw reg
134*4882a593Smuzhiyun	/* Data cache invalidate by set/way */
135*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c6, 2
136*4882a593Smuzhiyun	.endm
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun	.macro write_dccmvac reg
139*4882a593Smuzhiyun	/* Data cache clean by MVA */
140*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c10, 1
141*4882a593Smuzhiyun	.endm
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun	.macro write_dccsw reg
144*4882a593Smuzhiyun	/* Data cache clean by set/way */
145*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c10, 2
146*4882a593Smuzhiyun	.endm
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun	.macro write_dccimvac reg
149*4882a593Smuzhiyun	/* Data cache invalidate by MVA */
150*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c14, 1
151*4882a593Smuzhiyun	.endm
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun	.macro write_dccisw reg
154*4882a593Smuzhiyun	/* Data cache clean and invalidate by set/way */
155*4882a593Smuzhiyun	mcr	p15, 0, \reg, c7, c14, 2
156*4882a593Smuzhiyun	.endm
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun	.macro write_tlbiall
159*4882a593Smuzhiyun	/* Invalidate entire unified TLB (register ignored) */
160*4882a593Smuzhiyun	mcr	p15, 0, r0, c8, c7, 0
161*4882a593Smuzhiyun	.endm
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun	.macro write_tlbiallis
164*4882a593Smuzhiyun	/* Invalidate entire unified TLB Inner Sharable (register ignored) */
165*4882a593Smuzhiyun	mcr	p15, 0, r0, c8, c3, 0
166*4882a593Smuzhiyun	.endm
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun	.macro write_tlbiasidis reg
169*4882a593Smuzhiyun	/* Invalidate unified TLB by ASID Inner Sharable */
170*4882a593Smuzhiyun	mcr	p15, 0, \reg, c8, c3, 2
171*4882a593Smuzhiyun	.endm
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun	.macro write_tlbimvaais reg
174*4882a593Smuzhiyun	/* Invalidate unified TLB by MVA all ASID Inner Sharable */
175*4882a593Smuzhiyun	mcr	p15, 0, \reg, c8, c3, 3
176*4882a593Smuzhiyun	.endm
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun	.macro write_prrr reg
179*4882a593Smuzhiyun	mcr	p15, 0, \reg, c10, c2, 0
180*4882a593Smuzhiyun	.endm
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun	.macro read_prrr reg
183*4882a593Smuzhiyun	mrc	p15, 0, \reg, c10, c2, 0
184*4882a593Smuzhiyun	.endm
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun	.macro write_nmrr reg
187*4882a593Smuzhiyun	mcr	p15, 0, \reg, c10, c2, 1
188*4882a593Smuzhiyun	.endm
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun	.macro read_nmrr reg
191*4882a593Smuzhiyun	mrc	p15, 0, \reg, c10, c2, 1
192*4882a593Smuzhiyun	.endm
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun	.macro read_vbar reg
195*4882a593Smuzhiyun	mrc	p15, 0, \reg, c12, c0, 0
196*4882a593Smuzhiyun	.endm
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun	.macro write_vbar reg
199*4882a593Smuzhiyun	mcr	p15, 0, \reg, c12, c0, 0
200*4882a593Smuzhiyun	.endm
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun	.macro write_mvbar reg
203*4882a593Smuzhiyun	mcr	p15, 0, \reg, c12, c0, 1
204*4882a593Smuzhiyun	.endm
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun	.macro read_mvbar reg
207*4882a593Smuzhiyun	mrc	p15, 0, \reg, c12, c0, 1
208*4882a593Smuzhiyun	.endm
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun	.macro write_fcseidr reg
211*4882a593Smuzhiyun	mcr	p15, 0, \reg, c13, c0, 0
212*4882a593Smuzhiyun	.endm
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun	.macro read_fcseidr reg
215*4882a593Smuzhiyun	mrc	p15, 0, \reg, c13, c0, 0
216*4882a593Smuzhiyun	.endm
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun	.macro write_contextidr reg
219*4882a593Smuzhiyun	mcr	p15, 0, \reg, c13, c0, 1
220*4882a593Smuzhiyun	.endm
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun	.macro read_contextidr reg
223*4882a593Smuzhiyun	mrc	p15, 0, \reg, c13, c0, 1
224*4882a593Smuzhiyun	.endm
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun	.macro write_tpidruro reg
227*4882a593Smuzhiyun	mcr	p15, 0, \reg, c13, c0, 3
228*4882a593Smuzhiyun	.endm
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun	.macro read_tpidruro reg
231*4882a593Smuzhiyun	mrc	p15, 0, \reg, c13, c0, 3
232*4882a593Smuzhiyun	.endm
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun	.macro read_clidr reg
235*4882a593Smuzhiyun	/* Cache Level ID Register */
236*4882a593Smuzhiyun	mrc	p15, 1, \reg, c0, c0, 1
237*4882a593Smuzhiyun	.endm
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun	.macro read_ccsidr reg
240*4882a593Smuzhiyun	/* Cache Size ID Registers */
241*4882a593Smuzhiyun	mrc	p15, 1, \reg, c0, c0, 0
242*4882a593Smuzhiyun	.endm
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun	.macro write_csselr reg
245*4882a593Smuzhiyun	/* Cache Size Selection Register */
246*4882a593Smuzhiyun	mcr	p15, 2, \reg, c0, c0, 0
247*4882a593Smuzhiyun	.endm
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun	/* Cortex A9: pcr, diag registers */
250*4882a593Smuzhiyun	.macro write_pcr reg
251*4882a593Smuzhiyun	mcr  p15, 0, \reg, c15, c0, 0
252*4882a593Smuzhiyun	.endm
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun	.macro read_pcr reg
255*4882a593Smuzhiyun	mrc  p15, 0, \reg, c15, c0, 0
256*4882a593Smuzhiyun	.endm
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun	.macro write_diag reg
259*4882a593Smuzhiyun	mcr  p15, 0, \reg, c15, c0, 1
260*4882a593Smuzhiyun	.endm
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun	.macro read_diag reg
263*4882a593Smuzhiyun	mrc  p15, 0, \reg, c15, c0, 1
264*4882a593Smuzhiyun	.endm
265