blob: 6fd3c53fdda91b718c23febed3ac1d69530f0c3c [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +00002 * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Achin Gupta4f6ad662013-10-25 09:08:21 +01005 */
Achin Gupta4f6ad662013-10-25 09:08:21 +01006#include <arch.h>
Andrew Thoelke38bde412014-03-18 13:46:55 +00007#include <asm_macros.S>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008#include <common/bl_common.h>
9#include <common/debug.h>
Soby Mathew8e2f2872014-08-14 12:49:05 +010010#include <cortex_a53.h>
Soby Mathewc704cbc2014-08-14 11:33:56 +010011#include <cpu_macros.S>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000012#include <lib/cpus/errata_report.h>
Soby Mathewc704cbc2014-08-14 11:33:56 +010013#include <plat_macros.S>
Achin Gupta4f6ad662013-10-25 09:08:21 +010014
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +000015#if A53_DISABLE_NON_TEMPORAL_HINT
16#undef ERRATA_A53_836870
17#define ERRATA_A53_836870 1
18#endif
19
Soby Mathew8e2f2872014-08-14 12:49:05 +010020 /* ---------------------------------------------
21 * Disable L1 data cache and unified L2 cache
22 * ---------------------------------------------
23 */
24func cortex_a53_disable_dcache
25 mrs x1, sctlr_el3
26 bic x1, x1, #SCTLR_C_BIT
27 msr sctlr_el3, x1
28 isb
29 ret
Kévin Petita877c252015-03-24 14:03:57 +000030endfunc cortex_a53_disable_dcache
Soby Mathew8e2f2872014-08-14 12:49:05 +010031
32 /* ---------------------------------------------
33 * Disable intra-cluster coherency
34 * ---------------------------------------------
35 */
36func cortex_a53_disable_smp
Varun Wadekar1384a162017-06-05 14:54:46 -070037 mrs x0, CORTEX_A53_ECTLR_EL1
38 bic x0, x0, #CORTEX_A53_ECTLR_SMP_BIT
39 msr CORTEX_A53_ECTLR_EL1, x0
Soby Mathew8e2f2872014-08-14 12:49:05 +010040 isb
41 dsb sy
42 ret
Kévin Petita877c252015-03-24 14:03:57 +000043endfunc cortex_a53_disable_smp
Achin Gupta4f6ad662013-10-25 09:08:21 +010044
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000045 /* ---------------------------------------------------
46 * Errata Workaround for Cortex A53 Errata #819472.
47 * This applies only to revision <= r0p1 of Cortex A53.
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -040048 * Due to the nature of the errata it is applied unconditionally
49 * when built in, report it as applicable in this case
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000050 * ---------------------------------------------------
51 */
52func check_errata_819472
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -040053#if ERRATA_A53_819472
54 mov x0, #ERRATA_APPLIES
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000055 ret
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -040056#else
57 mov x1, #0x01
58 b cpu_rev_var_ls
59#endif
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000060endfunc check_errata_819472
61
62 /* ---------------------------------------------------
63 * Errata Workaround for Cortex A53 Errata #824069.
64 * This applies only to revision <= r0p2 of Cortex A53.
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -040065 * Due to the nature of the errata it is applied unconditionally
66 * when built in, report it as applicable in this case
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000067 * ---------------------------------------------------
68 */
69func check_errata_824069
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -040070#if ERRATA_A53_824069
71 mov x0, #ERRATA_APPLIES
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000072 ret
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -040073#else
74 mov x1, #0x02
75 b cpu_rev_var_ls
76#endif
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +000077endfunc check_errata_824069
78
developer4fceaca2015-07-29 20:55:31 +080079 /* --------------------------------------------------
80 * Errata Workaround for Cortex A53 Errata #826319.
81 * This applies only to revision <= r0p2 of Cortex A53.
82 * Inputs:
83 * x0: variant[4:7] and revision[0:3] of current cpu.
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +000084 * Shall clobber: x0-x17
developer4fceaca2015-07-29 20:55:31 +080085 * --------------------------------------------------
86 */
87func errata_a53_826319_wa
88 /*
89 * Compare x0 against revision r0p2
90 */
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +000091 mov x17, x30
92 bl check_errata_826319
93 cbz x0, 1f
Varun Wadekar1384a162017-06-05 14:54:46 -070094 mrs x1, CORTEX_A53_L2ACTLR_EL1
95 bic x1, x1, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN
96 orr x1, x1, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH
97 msr CORTEX_A53_L2ACTLR_EL1, x1
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000981:
99 ret x17
developer4fceaca2015-07-29 20:55:31 +0800100endfunc errata_a53_826319_wa
101
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000102func check_errata_826319
103 mov x1, #0x02
104 b cpu_rev_var_ls
105endfunc check_errata_826319
106
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +0000107 /* ---------------------------------------------------
108 * Errata Workaround for Cortex A53 Errata #827319.
109 * This applies only to revision <= r0p2 of Cortex A53.
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -0400110 * Due to the nature of the errata it is applied unconditionally
111 * when built in, report it as applicable in this case
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +0000112 * ---------------------------------------------------
113 */
114func check_errata_827319
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -0400115#if ERRATA_A53_827319
116 mov x0, #ERRATA_APPLIES
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +0000117 ret
Andrew F. Davis3e2ef2e2019-04-24 16:11:03 -0400118#else
119 mov x1, #0x02
120 b cpu_rev_var_ls
121#endif
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +0000122endfunc check_errata_827319
123
Sandrine Bailleuxd4817592016-01-13 14:57:38 +0000124 /* ---------------------------------------------------------------------
125 * Disable the cache non-temporal hint.
126 *
127 * This ignores the Transient allocation hint in the MAIR and treats
128 * allocations the same as non-transient allocation types. As a result,
129 * the LDNP and STNP instructions in AArch64 behave the same as the
130 * equivalent LDP and STP instructions.
131 *
132 * This is relevant only for revisions <= r0p3 of Cortex-A53.
133 * From r0p4 and onwards, the bit to disable the hint is enabled by
134 * default at reset.
135 *
developer4fceaca2015-07-29 20:55:31 +0800136 * Inputs:
137 * x0: variant[4:7] and revision[0:3] of current cpu.
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000138 * Shall clobber: x0-x17
Sandrine Bailleuxd4817592016-01-13 14:57:38 +0000139 * ---------------------------------------------------------------------
developer4fceaca2015-07-29 20:55:31 +0800140 */
Sandrine Bailleuxd4817592016-01-13 14:57:38 +0000141func a53_disable_non_temporal_hint
developer4fceaca2015-07-29 20:55:31 +0800142 /*
143 * Compare x0 against revision r0p3
144 */
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000145 mov x17, x30
146 bl check_errata_disable_non_temporal_hint
147 cbz x0, 1f
Eleanor Bonnici41b61be2017-08-09 16:42:40 +0100148 mrs x1, CORTEX_A53_CPUACTLR_EL1
149 orr x1, x1, #CORTEX_A53_CPUACTLR_EL1_DTAH
150 msr CORTEX_A53_CPUACTLR_EL1, x1
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +00001511:
152 ret x17
Sandrine Bailleuxd4817592016-01-13 14:57:38 +0000153endfunc a53_disable_non_temporal_hint
developer4fceaca2015-07-29 20:55:31 +0800154
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000155func check_errata_disable_non_temporal_hint
156 mov x1, #0x03
157 b cpu_rev_var_ls
158endfunc check_errata_disable_non_temporal_hint
159
Andre Przywara00eefd92016-10-06 16:54:53 +0100160 /* --------------------------------------------------
161 * Errata Workaround for Cortex A53 Errata #855873.
162 *
163 * This applies only to revisions >= r0p3 of Cortex A53.
164 * Earlier revisions of the core are affected as well, but don't
165 * have the chicken bit in the CPUACTLR register. It is expected that
166 * the rich OS takes care of that, especially as the workaround is
167 * shared with other erratas in those revisions of the CPU.
168 * Inputs:
169 * x0: variant[4:7] and revision[0:3] of current cpu.
170 * Shall clobber: x0-x17
171 * --------------------------------------------------
172 */
173func errata_a53_855873_wa
174 /*
175 * Compare x0 against revision r0p3 and higher
176 */
177 mov x17, x30
178 bl check_errata_855873
179 cbz x0, 1f
180
Eleanor Bonnici41b61be2017-08-09 16:42:40 +0100181 mrs x1, CORTEX_A53_CPUACTLR_EL1
182 orr x1, x1, #CORTEX_A53_CPUACTLR_EL1_ENDCCASCI
183 msr CORTEX_A53_CPUACTLR_EL1, x1
Andre Przywara00eefd92016-10-06 16:54:53 +01001841:
185 ret x17
186endfunc errata_a53_855873_wa
187
188func check_errata_855873
189 mov x1, #0x03
190 b cpu_rev_var_hs
191endfunc check_errata_855873
192
Douglas Raillardd56fb042017-06-19 15:38:02 +0100193/*
194 * Errata workaround for Cortex A53 Errata #835769.
195 * This applies to revisions <= r0p4 of Cortex A53.
196 * This workaround is statically enabled at build time.
197 */
198func check_errata_835769
Jonathan Wright6e1796e2018-03-28 16:55:54 +0100199 cmp x0, #0x04
200 b.hi errata_not_applies
201 /*
202 * Fix potentially available for revisions r0p2, r0p3 and r0p4.
203 * If r0p2, r0p3 or r0p4; check for fix in REVIDR, else exit.
204 */
205 cmp x0, #0x01
206 mov x0, #ERRATA_APPLIES
207 b.ls exit_check_errata_835769
208 /* Load REVIDR. */
209 mrs x1, revidr_el1
210 /* If REVIDR[7] is set (fix exists) set ERRATA_NOT_APPLIES, else exit. */
211 tbz x1, #7, exit_check_errata_835769
212errata_not_applies:
213 mov x0, #ERRATA_NOT_APPLIES
214exit_check_errata_835769:
215 ret
Douglas Raillardd56fb042017-06-19 15:38:02 +0100216endfunc check_errata_835769
217
218/*
219 * Errata workaround for Cortex A53 Errata #843419.
220 * This applies to revisions <= r0p4 of Cortex A53.
221 * This workaround is statically enabled at build time.
222 */
223func check_errata_843419
Jonathan Wrightefb1f332018-03-28 15:52:03 +0100224 mov x1, #ERRATA_APPLIES
225 mov x2, #ERRATA_NOT_APPLIES
226 cmp x0, #0x04
227 csel x0, x1, x2, ls
228 /*
229 * Fix potentially available for revision r0p4.
230 * If r0p4 check for fix in REVIDR, else exit.
231 */
232 b.ne exit_check_errata_843419
233 /* Load REVIDR. */
234 mrs x3, revidr_el1
235 /* If REVIDR[8] is set (fix exists) set ERRATA_NOT_APPLIES, else exit. */
236 tbz x3, #8, exit_check_errata_843419
237 mov x0, x2
238exit_check_errata_843419:
239 ret
Douglas Raillardd56fb042017-06-19 15:38:02 +0100240endfunc check_errata_843419
241
developer4fceaca2015-07-29 20:55:31 +0800242 /* -------------------------------------------------
243 * The CPU Ops reset function for Cortex-A53.
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000244 * Shall clobber: x0-x19
developer4fceaca2015-07-29 20:55:31 +0800245 * -------------------------------------------------
246 */
Soby Mathewc704cbc2014-08-14 11:33:56 +0100247func cortex_a53_reset_func
developer4fceaca2015-07-29 20:55:31 +0800248 mov x19, x30
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000249 bl cpu_get_rev_var
250 mov x18, x0
developer4fceaca2015-07-29 20:55:31 +0800251
developer4fceaca2015-07-29 20:55:31 +0800252
253#if ERRATA_A53_826319
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000254 mov x0, x18
developer4fceaca2015-07-29 20:55:31 +0800255 bl errata_a53_826319_wa
256#endif
257
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000258#if ERRATA_A53_836870
259 mov x0, x18
Sandrine Bailleuxd4817592016-01-13 14:57:38 +0000260 bl a53_disable_non_temporal_hint
developer4fceaca2015-07-29 20:55:31 +0800261#endif
262
Andre Przywara00eefd92016-10-06 16:54:53 +0100263#if ERRATA_A53_855873
264 mov x0, x18
265 bl errata_a53_855873_wa
266#endif
267
Achin Gupta4f6ad662013-10-25 09:08:21 +0100268 /* ---------------------------------------------
Sandrine Bailleuxf12a31d2016-01-29 14:37:58 +0000269 * Enable the SMP bit.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100270 * ---------------------------------------------
271 */
Varun Wadekar1384a162017-06-05 14:54:46 -0700272 mrs x0, CORTEX_A53_ECTLR_EL1
273 orr x0, x0, #CORTEX_A53_ECTLR_SMP_BIT
274 msr CORTEX_A53_ECTLR_EL1, x0
developer4fceaca2015-07-29 20:55:31 +0800275 isb
276 ret x19
Kévin Petita877c252015-03-24 14:03:57 +0000277endfunc cortex_a53_reset_func
Soby Mathewc704cbc2014-08-14 11:33:56 +0100278
Soby Mathew8e2f2872014-08-14 12:49:05 +0100279func cortex_a53_core_pwr_dwn
280 mov x18, x30
281
Andrew F. Davis7c461d72018-10-12 15:37:04 -0500282#if !TI_AM65X_WORKAROUND
Soby Mathew8e2f2872014-08-14 12:49:05 +0100283 /* ---------------------------------------------
284 * Turn off caches.
285 * ---------------------------------------------
286 */
287 bl cortex_a53_disable_dcache
Andrew F. Davis7c461d72018-10-12 15:37:04 -0500288#endif
Soby Mathew8e2f2872014-08-14 12:49:05 +0100289
290 /* ---------------------------------------------
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100291 * Flush L1 caches.
Soby Mathew8e2f2872014-08-14 12:49:05 +0100292 * ---------------------------------------------
293 */
294 mov x0, #DCCISW
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100295 bl dcsw_op_level1
Soby Mathew8e2f2872014-08-14 12:49:05 +0100296
297 /* ---------------------------------------------
298 * Come out of intra cluster coherency
299 * ---------------------------------------------
300 */
301 mov x30, x18
302 b cortex_a53_disable_smp
Kévin Petita877c252015-03-24 14:03:57 +0000303endfunc cortex_a53_core_pwr_dwn
Soby Mathew8e2f2872014-08-14 12:49:05 +0100304
305func cortex_a53_cluster_pwr_dwn
306 mov x18, x30
307
Andrew F. Davis7c461d72018-10-12 15:37:04 -0500308#if !TI_AM65X_WORKAROUND
Soby Mathew8e2f2872014-08-14 12:49:05 +0100309 /* ---------------------------------------------
310 * Turn off caches.
311 * ---------------------------------------------
312 */
313 bl cortex_a53_disable_dcache
Andrew F. Davis7c461d72018-10-12 15:37:04 -0500314#endif
Soby Mathew8e2f2872014-08-14 12:49:05 +0100315
316 /* ---------------------------------------------
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100317 * Flush L1 caches.
318 * ---------------------------------------------
319 */
320 mov x0, #DCCISW
321 bl dcsw_op_level1
322
323 /* ---------------------------------------------
Soby Mathew8e2f2872014-08-14 12:49:05 +0100324 * Disable the optional ACP.
325 * ---------------------------------------------
326 */
327 bl plat_disable_acp
328
329 /* ---------------------------------------------
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100330 * Flush L2 caches.
Soby Mathew8e2f2872014-08-14 12:49:05 +0100331 * ---------------------------------------------
332 */
333 mov x0, #DCCISW
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100334 bl dcsw_op_level2
Soby Mathew8e2f2872014-08-14 12:49:05 +0100335
336 /* ---------------------------------------------
337 * Come out of intra cluster coherency
338 * ---------------------------------------------
339 */
340 mov x30, x18
341 b cortex_a53_disable_smp
Kévin Petita877c252015-03-24 14:03:57 +0000342endfunc cortex_a53_cluster_pwr_dwn
Soby Mathew8e2f2872014-08-14 12:49:05 +0100343
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000344#if REPORT_ERRATA
345/*
346 * Errata printing function for Cortex A53. Must follow AAPCS.
347 */
348func cortex_a53_errata_report
349 stp x8, x30, [sp, #-16]!
350
351 bl cpu_get_rev_var
352 mov x8, x0
353
354 /*
355 * Report all errata. The revision-variant information is passed to
356 * checking functions of each errata.
357 */
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +0000358 report_errata ERRATA_A53_819472, cortex_a53, 819472
359 report_errata ERRATA_A53_824069, cortex_a53, 824069
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000360 report_errata ERRATA_A53_826319, cortex_a53, 826319
Ambroise Vincentf5fdfbc2019-02-21 14:16:24 +0000361 report_errata ERRATA_A53_827319, cortex_a53, 827319
Douglas Raillardd56fb042017-06-19 15:38:02 +0100362 report_errata ERRATA_A53_835769, cortex_a53, 835769
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000363 report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint
Douglas Raillardd56fb042017-06-19 15:38:02 +0100364 report_errata ERRATA_A53_843419, cortex_a53, 843419
Andre Przywara00eefd92016-10-06 16:54:53 +0100365 report_errata ERRATA_A53_855873, cortex_a53, 855873
Jeenu Viswambharand5ec3672017-01-03 11:01:51 +0000366
367 ldp x8, x30, [sp], #16
368 ret
369endfunc cortex_a53_errata_report
370#endif
371
Soby Mathew38b4bc92014-08-14 13:36:41 +0100372 /* ---------------------------------------------
373 * This function provides cortex_a53 specific
374 * register information for crash reporting.
375 * It needs to return with x6 pointing to
376 * a list of register names in ascii and
377 * x8 - x15 having values of registers to be
378 * reported.
379 * ---------------------------------------------
380 */
381.section .rodata.cortex_a53_regs, "aS"
382cortex_a53_regs: /* The ascii list of register names to be reported */
Andre Przywara00eefd92016-10-06 16:54:53 +0100383 .asciz "cpuectlr_el1", "cpumerrsr_el1", "l2merrsr_el1", \
384 "cpuactlr_el1", ""
Soby Mathew38b4bc92014-08-14 13:36:41 +0100385
386func cortex_a53_cpu_reg_dump
387 adr x6, cortex_a53_regs
Varun Wadekar1384a162017-06-05 14:54:46 -0700388 mrs x8, CORTEX_A53_ECTLR_EL1
389 mrs x9, CORTEX_A53_MERRSR_EL1
390 mrs x10, CORTEX_A53_L2MERRSR_EL1
Eleanor Bonnici41b61be2017-08-09 16:42:40 +0100391 mrs x11, CORTEX_A53_CPUACTLR_EL1
Soby Mathew38b4bc92014-08-14 13:36:41 +0100392 ret
Kévin Petita877c252015-03-24 14:03:57 +0000393endfunc cortex_a53_cpu_reg_dump
Soby Mathew38b4bc92014-08-14 13:36:41 +0100394
Jeenu Viswambharanee5eb802016-11-18 12:58:28 +0000395declare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \
396 cortex_a53_reset_func, \
397 cortex_a53_core_pwr_dwn, \
398 cortex_a53_cluster_pwr_dwn