blob: 8cafe4a06912ae22cfcb15962e7b5e52bb081ab8 [file] [log] [blame]
Balint Dobszaycc942642019-07-03 13:02:56 +02001/*
Bipin Ravi86499742022-01-18 01:59:06 -06002 * Copyright (c) 2018-2022, ARM Limited and Contributors. All rights reserved.
Balint Dobszaycc942642019-07-03 13:02:56 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <common/bl_common.h>
10#include <cortex_a77.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
Bipin Ravi86499742022-01-18 01:59:06 -060013#include "wa_cve_2022_23960_bhb_vector.S"
Balint Dobszaycc942642019-07-03 13:02:56 +020014
15/* Hardware handled coherency */
16#if HW_ASSISTED_COHERENCY == 0
17#error "Cortex-A77 must be compiled with HW_ASSISTED_COHERENCY enabled"
18#endif
19
20/* 64-bit only core */
21#if CTX_INCLUDE_AARCH32_REGS == 1
22#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
23#endif
24
Bipin Ravi86499742022-01-18 01:59:06 -060025#if WORKAROUND_CVE_2022_23960
26 wa_cve_2022_23960_bhb_vector_table CORTEX_A77_BHB_LOOP_COUNT, cortex_a77
27#endif /* WORKAROUND_CVE_2022_23960 */
28
johpow0168aedc72020-06-03 15:23:31 -050029 /* --------------------------------------------------
laurenw-arm99ad9762020-07-14 14:18:34 -050030 * Errata Workaround for Cortex A77 Errata #1508412.
31 * This applies only to revision <= r1p0 of Cortex A77.
32 * Inputs:
33 * x0: variant[4:7] and revision[0:3] of current cpu.
34 * Shall clobber: x0-x17
35 * --------------------------------------------------
36 */
37func errata_a77_1508412_wa
38 /*
39 * Compare x0 against revision r1p0
40 */
41 mov x17, x30
42 bl check_errata_1508412
43 cbz x0, 3f
44 /*
45 * Compare x0 against revision r0p0
46 */
47 bl check_errata_1508412_0
48 cbz x0, 1f
49 ldr x0, =0x0
50 msr CORTEX_A77_CPUPSELR_EL3, x0
51 ldr x0, =0x00E8400000
52 msr CORTEX_A77_CPUPOR_EL3, x0
53 ldr x0, =0x00FFE00000
54 msr CORTEX_A77_CPUPMR_EL3, x0
55 ldr x0, =0x4004003FF
56 msr CORTEX_A77_CPUPCR_EL3, x0
57 ldr x0, =0x1
58 msr CORTEX_A77_CPUPSELR_EL3, x0
59 ldr x0, =0x00E8C00040
60 msr CORTEX_A77_CPUPOR_EL3, x0
61 ldr x0, =0x00FFE00040
62 msr CORTEX_A77_CPUPMR_EL3, x0
63 b 2f
641:
65 ldr x0, =0x0
66 msr CORTEX_A77_CPUPSELR_EL3, x0
67 ldr x0, =0x00E8400000
68 msr CORTEX_A77_CPUPOR_EL3, x0
69 ldr x0, =0x00FF600000
70 msr CORTEX_A77_CPUPMR_EL3, x0
71 ldr x0, =0x00E8E00080
72 msr CORTEX_A77_CPUPOR2_EL3, x0
73 ldr x0, =0x00FFE000C0
74 msr CORTEX_A77_CPUPMR2_EL3, x0
752:
76 ldr x0, =0x04004003FF
77 msr CORTEX_A77_CPUPCR_EL3, x0
78 isb
793:
80 ret x17
81endfunc errata_a77_1508412_wa
82
83func check_errata_1508412
84 mov x1, #0x10
85 b cpu_rev_var_ls
86endfunc check_errata_1508412
87
88func check_errata_1508412_0
89 mov x1, #0x0
90 b cpu_rev_var_ls
91endfunc check_errata_1508412_0
92
93 /* --------------------------------------------------
johpow01a2fa12c2020-09-10 13:39:26 -050094 * Errata Workaround for Cortex A77 Errata #1925769.
95 * This applies to revision <= r1p1 of Cortex A77.
96 * Inputs:
97 * x0: variant[4:7] and revision[0:3] of current cpu.
98 * Shall clobber: x0-x17
99 * --------------------------------------------------
100 */
101func errata_a77_1925769_wa
102 /* Compare x0 against revision <= r1p1 */
103 mov x17, x30
104 bl check_errata_1925769
105 cbz x0, 1f
106
107 /* Set bit 8 in ECTLR_EL1 */
108 mrs x1, CORTEX_A77_CPUECTLR_EL1
109 orr x1, x1, #CORTEX_A77_CPUECTLR_EL1_BIT_8
110 msr CORTEX_A77_CPUECTLR_EL1, x1
111 isb
1121:
113 ret x17
114endfunc errata_a77_1925769_wa
115
116func check_errata_1925769
117 /* Applies to everything <= r1p1 */
118 mov x1, #0x11
119 b cpu_rev_var_ls
120endfunc check_errata_1925769
121
laurenw-armf5dbbef2021-03-23 13:09:35 -0500122 /* --------------------------------------------------
123 * Errata Workaround for Cortex A77 Errata #1946167.
124 * This applies to revision <= r1p1 of Cortex A77.
125 * Inputs:
126 * x0: variant[4:7] and revision[0:3] of current cpu.
127 * Shall clobber: x0-x17
128 * --------------------------------------------------
129 */
130func errata_a77_1946167_wa
131 /* Compare x0 against revision <= r1p1 */
132 mov x17, x30
133 bl check_errata_1946167
134 cbz x0, 1f
135
136 ldr x0,=0x4
137 msr CORTEX_A77_CPUPSELR_EL3,x0
138 ldr x0,=0x10E3900002
139 msr CORTEX_A77_CPUPOR_EL3,x0
140 ldr x0,=0x10FFF00083
141 msr CORTEX_A77_CPUPMR_EL3,x0
142 ldr x0,=0x2001003FF
143 msr CORTEX_A77_CPUPCR_EL3,x0
144
145 ldr x0,=0x5
146 msr CORTEX_A77_CPUPSELR_EL3,x0
147 ldr x0,=0x10E3800082
148 msr CORTEX_A77_CPUPOR_EL3,x0
149 ldr x0,=0x10FFF00083
150 msr CORTEX_A77_CPUPMR_EL3,x0
151 ldr x0,=0x2001003FF
152 msr CORTEX_A77_CPUPCR_EL3,x0
153
154 ldr x0,=0x6
155 msr CORTEX_A77_CPUPSELR_EL3,x0
156 ldr x0,=0x10E3800200
157 msr CORTEX_A77_CPUPOR_EL3,x0
158 ldr x0,=0x10FFF003E0
159 msr CORTEX_A77_CPUPMR_EL3,x0
160 ldr x0,=0x2001003FF
161 msr CORTEX_A77_CPUPCR_EL3,x0
162
163 isb
1641:
165 ret x17
166endfunc errata_a77_1946167_wa
167
168func check_errata_1946167
169 /* Applies to everything <= r1p1 */
170 mov x1, #0x11
171 b cpu_rev_var_ls
172endfunc check_errata_1946167
173
johpow01eb146102021-05-03 13:37:13 -0500174 /* --------------------------------------------------
175 * Errata Workaround for Cortex A77 Errata #1791578.
176 * This applies to revisions r0p0, r1p0, and r1p1 and is still open.
177 * x0: variant[4:7] and revision[0:3] of current cpu.
178 * Shall clobber: x0-x17
179 * --------------------------------------------------
180 */
181func errata_a77_1791578_wa
182 /* Check workaround compatibility. */
183 mov x17, x30
184 bl check_errata_1791578
185 cbz x0, 1f
186
187 /* Set bit 2 in ACTLR2_EL1 */
188 mrs x1, CORTEX_A77_ACTLR2_EL1
189 orr x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_2
190 msr CORTEX_A77_ACTLR2_EL1, x1
191 isb
1921:
193 ret x17
194endfunc errata_a77_1791578_wa
195
196func check_errata_1791578
197 /* Applies to r0p0, r1p0, and r1p1 right now */
198 mov x1, #0x11
199 b cpu_rev_var_ls
200endfunc check_errata_1791578
201
Bipin Ravi8e916622022-06-08 15:27:00 -0500202 /* --------------------------------------------------
203 * Errata Workaround for Cortex A77 Errata #2356587.
204 * This applies to revisions r0p0, r1p0, and r1p1 and is still open.
205 * x0: variant[4:7] and revision[0:3] of current cpu.
206 * Shall clobber: x0-x17
207 * --------------------------------------------------
208 */
209func errata_a77_2356587_wa
210 /* Check workaround compatibility. */
211 mov x17, x30
212 bl check_errata_2356587
213 cbz x0, 1f
214
215 /* Set bit 0 in ACTLR2_EL1 */
216 mrs x1, CORTEX_A77_ACTLR2_EL1
217 orr x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_0
218 msr CORTEX_A77_ACTLR2_EL1, x1
219 isb
2201:
221 ret x17
222endfunc errata_a77_2356587_wa
223
224func check_errata_2356587
225 /* Applies to r0p0, r1p0, and r1p1 right now */
226 mov x1, #0x11
227 b cpu_rev_var_ls
228endfunc check_errata_2356587
229
Bipin Ravi86499742022-01-18 01:59:06 -0600230func check_errata_cve_2022_23960
231#if WORKAROUND_CVE_2022_23960
232 mov x0, #ERRATA_APPLIES
233#else
234 mov x0, #ERRATA_MISSING
235#endif
236 ret
237endfunc check_errata_cve_2022_23960
238
Boyan Karatoteve5cf16b2022-09-27 10:37:54 +0100239 /* --------------------------------------------------
240 * Errata Workaround for Cortex A77 Errata #1800714.
241 * This applies to revision <= r1p1 of Cortex A77.
242 * Inputs:
243 * x0: variant[4:7] and revision[0:3] of current cpu.
244 * Shall clobber: x0-x17
245 * --------------------------------------------------
246 */
247func errata_a77_1800714_wa
248 /* Compare x0 against revision <= r1p1 */
249 mov x17, x30
250 bl check_errata_1800714
251 cbz x0, 1f
252
253 /* Disable allocation of splintered pages in the L2 TLB */
254 mrs x1, CORTEX_A77_CPUECTLR_EL1
255 orr x1, x1, CORTEX_A77_CPUECTLR_EL1_BIT_53
256 msr CORTEX_A77_CPUECTLR_EL1, x1
257 isb
2581:
259 ret x17
260endfunc errata_a77_1800714_wa
261
262func check_errata_1800714
263 /* Applies to everything <= r1p1 */
264 mov x1, #0x11
265 b cpu_rev_var_ls
266endfunc check_errata_1800714
267
johpow0168aedc72020-06-03 15:23:31 -0500268 /* -------------------------------------------------
269 * The CPU Ops reset function for Cortex-A77.
270 * Shall clobber: x0-x19
271 * -------------------------------------------------
272 */
273func cortex_a77_reset_func
274 mov x19, x30
275 bl cpu_get_rev_var
276 mov x18, x0
277
laurenw-arm99ad9762020-07-14 14:18:34 -0500278#if ERRATA_A77_1508412
279 mov x0, x18
280 bl errata_a77_1508412_wa
281#endif
282
johpow01a2fa12c2020-09-10 13:39:26 -0500283#if ERRATA_A77_1925769
284 mov x0, x18
285 bl errata_a77_1925769_wa
286#endif
287
laurenw-armf5dbbef2021-03-23 13:09:35 -0500288#if ERRATA_A77_1946167
289 mov x0, x18
290 bl errata_a77_1946167_wa
291#endif
292
johpow01eb146102021-05-03 13:37:13 -0500293#if ERRATA_A77_1791578
294 mov x0, x18
295 bl errata_a77_1791578_wa
296#endif
297
Bipin Ravi8e916622022-06-08 15:27:00 -0500298#if ERRATA_A77_2356587
299 mov x0, x18
300 bl errata_a77_2356587_wa
301#endif
302
Bipin Ravi86499742022-01-18 01:59:06 -0600303#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
304 /*
305 * The Cortex-A77 generic vectors are overridden to apply errata
306 * mitigation on exception entry from lower ELs.
307 */
308 adr x0, wa_cve_vbar_cortex_a77
309 msr vbar_el3, x0
310#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
311
Boyan Karatoteve5cf16b2022-09-27 10:37:54 +0100312#if ERRATA_A77_1800714
313 mov x0, x18
314 bl errata_a77_1800714_wa
315#endif
316
Bipin Ravi86499742022-01-18 01:59:06 -0600317 isb
johpow0168aedc72020-06-03 15:23:31 -0500318 ret x19
319endfunc cortex_a77_reset_func
320
Balint Dobszaycc942642019-07-03 13:02:56 +0200321 /* ---------------------------------------------
322 * HW will do the cache maintenance while powering down
323 * ---------------------------------------------
324 */
325func cortex_a77_core_pwr_dwn
326 /* ---------------------------------------------
327 * Enable CPU power down bit in power control register
328 * ---------------------------------------------
329 */
330 mrs x0, CORTEX_A77_CPUPWRCTLR_EL1
331 orr x0, x0, #CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
332 msr CORTEX_A77_CPUPWRCTLR_EL1, x0
333 isb
334 ret
335endfunc cortex_a77_core_pwr_dwn
336
337#if REPORT_ERRATA
338/*
339 * Errata printing function for Cortex-A77. Must follow AAPCS.
340 */
341func cortex_a77_errata_report
johpow0168aedc72020-06-03 15:23:31 -0500342 stp x8, x30, [sp, #-16]!
343
344 bl cpu_get_rev_var
345 mov x8, x0
346
347 /*
348 * Report all errata. The revision-variant information is passed to
349 * checking functions of each errata.
350 */
laurenw-arm99ad9762020-07-14 14:18:34 -0500351 report_errata ERRATA_A77_1508412, cortex_a77, 1508412
Boyan Karatoteve5cf16b2022-09-27 10:37:54 +0100352 report_errata ERRATA_A77_1791578, cortex_a77, 1791578
353 report_errata ERRATA_A77_1800714, cortex_a77, 1800714
johpow01a2fa12c2020-09-10 13:39:26 -0500354 report_errata ERRATA_A77_1925769, cortex_a77, 1925769
laurenw-armf5dbbef2021-03-23 13:09:35 -0500355 report_errata ERRATA_A77_1946167, cortex_a77, 1946167
Bipin Ravi8e916622022-06-08 15:27:00 -0500356 report_errata ERRATA_A77_2356587, cortex_a77, 2356587
Bipin Ravi86499742022-01-18 01:59:06 -0600357 report_errata WORKAROUND_CVE_2022_23960, cortex_a77, cve_2022_23960
johpow0168aedc72020-06-03 15:23:31 -0500358
359 ldp x8, x30, [sp], #16
Balint Dobszaycc942642019-07-03 13:02:56 +0200360 ret
361endfunc cortex_a77_errata_report
362#endif
363
364
365 /* ---------------------------------------------
366 * This function provides Cortex-A77 specific
367 * register information for crash reporting.
368 * It needs to return with x6 pointing to
369 * a list of register names in ascii and
370 * x8 - x15 having values of registers to be
371 * reported.
372 * ---------------------------------------------
373 */
374.section .rodata.cortex_a77_regs, "aS"
375cortex_a77_regs: /* The ascii list of register names to be reported */
376 .asciz "cpuectlr_el1", ""
377
378func cortex_a77_cpu_reg_dump
379 adr x6, cortex_a77_regs
380 mrs x8, CORTEX_A77_CPUECTLR_EL1
381 ret
382endfunc cortex_a77_cpu_reg_dump
383
384declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \
johpow0168aedc72020-06-03 15:23:31 -0500385 cortex_a77_reset_func, \
Balint Dobszaycc942642019-07-03 13:02:56 +0200386 cortex_a77_core_pwr_dwn