cortex_a53.S 10.4 KB
Newer Older
1
/*
2
 * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */
#include <arch.h>
7
#include <asm_macros.S>
8
9
#include <common/bl_common.h>
#include <common/debug.h>
10
#include <cortex_a53.h>
11
#include <cpu_macros.S>
12
#include <lib/cpus/errata_report.h>
13
#include <plat_macros.S>
14

15
16
17
18
19
#if A53_DISABLE_NON_TEMPORAL_HINT
#undef ERRATA_A53_836870
#define ERRATA_A53_836870	1
#endif

20
21
22
23
24
25
26
27
28
29
	/* ---------------------------------------------
	 * Disable L1 data cache and unified L2 cache
	 * ---------------------------------------------
	 */
func cortex_a53_disable_dcache
	mrs	x1, sctlr_el3
	bic	x1, x1, #SCTLR_C_BIT
	msr	sctlr_el3, x1
	isb
	ret
30
endfunc cortex_a53_disable_dcache
31
32
33
34
35
36

	/* ---------------------------------------------
	 * Disable intra-cluster coherency
	 * ---------------------------------------------
	 */
func cortex_a53_disable_smp
37
38
39
	mrs	x0, CORTEX_A53_ECTLR_EL1
	bic	x0, x0, #CORTEX_A53_ECTLR_SMP_BIT
	msr	CORTEX_A53_ECTLR_EL1, x0
40
41
42
	isb
	dsb	sy
	ret
43
endfunc cortex_a53_disable_smp
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
	/* ---------------------------------------------------
	 * Errata Workaround for Cortex A53 Errata #819472.
	 * This applies only to revision <= r0p1 of Cortex A53.
	 * ---------------------------------------------------
	 */
func check_errata_819472
	/*
	 * Even though this is only needed for revision <= r0p1, it
	 * is always applied due to limitations of the current
	 * errata framework.
	 */
	mov	x0, #ERRATA_APPLIES
	ret
endfunc check_errata_819472

	/* ---------------------------------------------------
	 * Errata Workaround for Cortex A53 Errata #824069.
	 * This applies only to revision <= r0p2 of Cortex A53.
	 * ---------------------------------------------------
	 */
func check_errata_824069
	/*
	 * Even though this is only needed for revision <= r0p2, it
	 * is always applied due to limitations of the current
	 * errata framework.
	 */
	mov	x0, #ERRATA_APPLIES
	ret
endfunc check_errata_824069

75
76
77
78
79
	/* --------------------------------------------------
	 * Errata Workaround for Cortex A53 Errata #826319.
	 * This applies only to revision <= r0p2 of Cortex A53.
	 * Inputs:
	 * x0: variant[4:7] and revision[0:3] of current cpu.
80
	 * Shall clobber: x0-x17
81
82
83
84
85
86
	 * --------------------------------------------------
	 */
func errata_a53_826319_wa
	/*
	 * Compare x0 against revision r0p2
	 */
87
88
89
	mov	x17, x30
	bl	check_errata_826319
	cbz	x0, 1f
90
91
92
93
	mrs	x1, CORTEX_A53_L2ACTLR_EL1
	bic	x1, x1, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN
	orr	x1, x1, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH
	msr	CORTEX_A53_L2ACTLR_EL1, x1
94
95
1:
	ret	x17
96
97
endfunc errata_a53_826319_wa

98
99
100
101
102
func check_errata_826319
	mov	x1, #0x02
	b	cpu_rev_var_ls
endfunc check_errata_826319

103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
	/* ---------------------------------------------------
	 * Errata Workaround for Cortex A53 Errata #827319.
	 * This applies only to revision <= r0p2 of Cortex A53.
	 * ---------------------------------------------------
	 */
func check_errata_827319
	/*
	 * Even though this is only needed for revision <= r0p2, it
	 * is always applied due to limitations of the current
	 * errata framework.
	 */
	mov	x0, #ERRATA_APPLIES
	ret
endfunc check_errata_827319

118
119
120
121
122
123
124
125
126
127
128
129
	/* ---------------------------------------------------------------------
	 * Disable the cache non-temporal hint.
	 *
	 * This ignores the Transient allocation hint in the MAIR and treats
	 * allocations the same as non-transient allocation types. As a result,
	 * the LDNP and STNP instructions in AArch64 behave the same as the
	 * equivalent LDP and STP instructions.
	 *
	 * This is relevant only for revisions <= r0p3 of Cortex-A53.
	 * From r0p4 and onwards, the bit to disable the hint is enabled by
	 * default at reset.
	 *
130
131
	 * Inputs:
	 * x0: variant[4:7] and revision[0:3] of current cpu.
132
	 * Shall clobber: x0-x17
133
	 * ---------------------------------------------------------------------
134
	 */
135
func a53_disable_non_temporal_hint
136
137
138
	/*
	 * Compare x0 against revision r0p3
	 */
139
140
141
	mov	x17, x30
	bl	check_errata_disable_non_temporal_hint
	cbz	x0, 1f
142
143
144
	mrs	x1, CORTEX_A53_CPUACTLR_EL1
	orr	x1, x1, #CORTEX_A53_CPUACTLR_EL1_DTAH
	msr	CORTEX_A53_CPUACTLR_EL1, x1
145
146
1:
	ret	x17
147
endfunc a53_disable_non_temporal_hint
148

149
150
151
152
153
func check_errata_disable_non_temporal_hint
	mov	x1, #0x03
	b	cpu_rev_var_ls
endfunc check_errata_disable_non_temporal_hint

154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
	/* --------------------------------------------------
	 * Errata Workaround for Cortex A53 Errata #855873.
	 *
	 * This applies only to revisions >= r0p3 of Cortex A53.
	 * Earlier revisions of the core are affected as well, but don't
	 * have the chicken bit in the CPUACTLR register. It is expected that
	 * the rich OS takes care of that, especially as the workaround is
	 * shared with other erratas in those revisions of the CPU.
	 * Inputs:
	 * x0: variant[4:7] and revision[0:3] of current cpu.
	 * Shall clobber: x0-x17
	 * --------------------------------------------------
	 */
func errata_a53_855873_wa
	/*
	 * Compare x0 against revision r0p3 and higher
	 */
        mov     x17, x30
        bl      check_errata_855873
        cbz     x0, 1f

175
176
177
	mrs	x1, CORTEX_A53_CPUACTLR_EL1
	orr	x1, x1, #CORTEX_A53_CPUACTLR_EL1_ENDCCASCI
	msr	CORTEX_A53_CPUACTLR_EL1, x1
178
179
180
181
182
183
184
185
186
1:
	ret	x17
endfunc errata_a53_855873_wa

func check_errata_855873
	mov	x1, #0x03
	b	cpu_rev_var_hs
endfunc check_errata_855873

187
188
189
190
191
192
/*
 * Errata workaround for Cortex A53 Errata #835769.
 * This applies to revisions <= r0p4 of Cortex A53.
 * This workaround is statically enabled at build time.
 */
func check_errata_835769
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
	cmp	x0, #0x04
	b.hi	errata_not_applies
	/*
	 * Fix potentially available for revisions r0p2, r0p3 and r0p4.
	 * If r0p2, r0p3 or r0p4; check for fix in REVIDR, else exit.
	 */
	cmp	x0, #0x01
	mov	x0, #ERRATA_APPLIES
	b.ls	exit_check_errata_835769
	/* Load REVIDR. */
	mrs	x1, revidr_el1
	/* If REVIDR[7] is set (fix exists) set ERRATA_NOT_APPLIES, else exit. */
	tbz	x1, #7, exit_check_errata_835769
errata_not_applies:
	mov	x0, #ERRATA_NOT_APPLIES
exit_check_errata_835769:
	ret
210
211
212
213
214
215
216
217
endfunc check_errata_835769

/*
 * Errata workaround for Cortex A53 Errata #843419.
 * This applies to revisions <= r0p4 of Cortex A53.
 * This workaround is statically enabled at build time.
 */
func check_errata_843419
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
	mov	x1, #ERRATA_APPLIES
	mov	x2, #ERRATA_NOT_APPLIES
	cmp	x0, #0x04
	csel	x0, x1, x2, ls
	/*
	 * Fix potentially available for revision r0p4.
	 * If r0p4 check for fix in REVIDR, else exit.
	 */
	b.ne	exit_check_errata_843419
	/* Load REVIDR. */
	mrs	x3, revidr_el1
	/* If REVIDR[8] is set (fix exists) set ERRATA_NOT_APPLIES, else exit. */
	tbz	x3, #8, exit_check_errata_843419
	mov	x0, x2
exit_check_errata_843419:
	ret
234
235
endfunc check_errata_843419

236
237
	/* -------------------------------------------------
	 * The CPU Ops reset function for Cortex-A53.
238
	 * Shall clobber: x0-x19
239
240
	 * -------------------------------------------------
	 */
241
func cortex_a53_reset_func
242
	mov	x19, x30
243
244
	bl	cpu_get_rev_var
	mov	x18, x0
245
246
247


#if ERRATA_A53_826319
248
	mov	x0, x18
249
250
251
	bl	errata_a53_826319_wa
#endif

252
253
#if ERRATA_A53_836870
	mov	x0, x18
254
	bl	a53_disable_non_temporal_hint
255
256
#endif

257
258
259
260
261
#if ERRATA_A53_855873
	mov	x0, x18
	bl	errata_a53_855873_wa
#endif

262
	/* ---------------------------------------------
263
	 * Enable the SMP bit.
264
265
	 * ---------------------------------------------
	 */
266
267
268
	mrs	x0, CORTEX_A53_ECTLR_EL1
	orr	x0, x0, #CORTEX_A53_ECTLR_SMP_BIT
	msr	CORTEX_A53_ECTLR_EL1, x0
269
270
	isb
	ret	x19
271
endfunc cortex_a53_reset_func
272

273
274
275
func cortex_a53_core_pwr_dwn
	mov	x18, x30

276
#if !TI_AM65X_WORKAROUND
277
278
279
280
281
	/* ---------------------------------------------
	 * Turn off caches.
	 * ---------------------------------------------
	 */
	bl	cortex_a53_disable_dcache
282
#endif
283
284

	/* ---------------------------------------------
285
	 * Flush L1 caches.
286
287
288
	 * ---------------------------------------------
	 */
	mov	x0, #DCCISW
289
	bl	dcsw_op_level1
290
291
292
293
294
295
296

	/* ---------------------------------------------
	 * Come out of intra cluster coherency
	 * ---------------------------------------------
	 */
	mov	x30, x18
	b	cortex_a53_disable_smp
297
endfunc cortex_a53_core_pwr_dwn
298
299
300
301

func cortex_a53_cluster_pwr_dwn
	mov	x18, x30

302
#if !TI_AM65X_WORKAROUND
303
304
305
306
307
	/* ---------------------------------------------
	 * Turn off caches.
	 * ---------------------------------------------
	 */
	bl	cortex_a53_disable_dcache
308
#endif
309

310
311
312
313
314
315
316
	/* ---------------------------------------------
	 * Flush L1 caches.
	 * ---------------------------------------------
	 */
	mov	x0, #DCCISW
	bl	dcsw_op_level1

317
318
319
320
321
322
323
	/* ---------------------------------------------
	 * Disable the optional ACP.
	 * ---------------------------------------------
	 */
	bl	plat_disable_acp

	/* ---------------------------------------------
324
	 * Flush L2 caches.
325
326
327
	 * ---------------------------------------------
	 */
	mov	x0, #DCCISW
328
	bl	dcsw_op_level2
329
330
331
332
333
334
335

	/* ---------------------------------------------
	 * Come out of intra cluster coherency
	 * ---------------------------------------------
	 */
	mov	x30, x18
	b	cortex_a53_disable_smp
336
endfunc cortex_a53_cluster_pwr_dwn
337

338
339
340
341
342
343
344
345
346
347
348
349
350
351
#if REPORT_ERRATA
/*
 * Errata printing function for Cortex A53. Must follow AAPCS.
 */
func cortex_a53_errata_report
	stp	x8, x30, [sp, #-16]!

	bl	cpu_get_rev_var
	mov	x8, x0

	/*
	 * Report all errata. The revision-variant information is passed to
	 * checking functions of each errata.
	 */
352
353
	report_errata ERRATA_A53_819472, cortex_a53, 819472
	report_errata ERRATA_A53_824069, cortex_a53, 824069
354
	report_errata ERRATA_A53_826319, cortex_a53, 826319
355
	report_errata ERRATA_A53_827319, cortex_a53, 827319
356
	report_errata ERRATA_A53_835769, cortex_a53, 835769
357
	report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint
358
	report_errata ERRATA_A53_843419, cortex_a53, 843419
359
	report_errata ERRATA_A53_855873, cortex_a53, 855873
360
361
362
363
364
365

	ldp	x8, x30, [sp], #16
	ret
endfunc cortex_a53_errata_report
#endif

366
367
368
369
370
371
372
373
374
375
376
	/* ---------------------------------------------
	 * This function provides cortex_a53 specific
	 * register information for crash reporting.
	 * It needs to return with x6 pointing to
	 * a list of register names in ascii and
	 * x8 - x15 having values of registers to be
	 * reported.
	 * ---------------------------------------------
	 */
.section .rodata.cortex_a53_regs, "aS"
cortex_a53_regs:  /* The ascii list of register names to be reported */
377
378
	.asciz	"cpuectlr_el1", "cpumerrsr_el1", "l2merrsr_el1", \
		"cpuactlr_el1", ""
379
380
381

func cortex_a53_cpu_reg_dump
	adr	x6, cortex_a53_regs
382
383
384
	mrs	x8, CORTEX_A53_ECTLR_EL1
	mrs	x9, CORTEX_A53_MERRSR_EL1
	mrs	x10, CORTEX_A53_L2MERRSR_EL1
385
	mrs	x11, CORTEX_A53_CPUACTLR_EL1
386
	ret
387
endfunc cortex_a53_cpu_reg_dump
388

389
390
391
392
declare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \
	cortex_a53_reset_func, \
	cortex_a53_core_pwr_dwn, \
	cortex_a53_cluster_pwr_dwn