blob: b41676d9434e0f686c99bdb13a90c0d04725963e [file] [log] [blame]
Etienne Carriere4ece7552017-11-05 22:56:10 +01001/*
Sona Mathewd7c07d12023-06-25 19:25:20 -05002 * Copyright (c) 2016-2023, Arm Limited and Contributors. All rights reserved.
Etienne Carriere4ece7552017-11-05 22:56:10 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <assert_macros.S>
10#include <cortex_a15.h>
11#include <cpu_macros.S>
12
13/*
14 * Cortex-A15 support LPAE and Virtualization Extensions.
15 * Don't care if confiugration uses or not LPAE and VE.
16 * Therefore, where we don't check ARCH_IS_ARMV7_WITH_LPAE/VE
17 */
18
19 .macro assert_cache_enabled
20#if ENABLE_ASSERTIONS
21 ldcopr r0, SCTLR
22 tst r0, #SCTLR_C_BIT
23 ASM_ASSERT(eq)
24#endif
25 .endm
26
27func cortex_a15_disable_smp
28 ldcopr r0, ACTLR
29 bic r0, #CORTEX_A15_ACTLR_SMP_BIT
30 stcopr r0, ACTLR
31 isb
Ambroise Vincentd4a51eb2019-03-04 16:56:26 +000032#if ERRATA_A15_816470
33 /*
34 * Invalidate any TLB address
35 */
36 mov r0, #0
37 stcopr r0, TLBIMVA
38#endif
Etienne Carriere4ece7552017-11-05 22:56:10 +010039 dsb sy
40 bx lr
41endfunc cortex_a15_disable_smp
42
43func cortex_a15_enable_smp
44 ldcopr r0, ACTLR
45 orr r0, #CORTEX_A15_ACTLR_SMP_BIT
46 stcopr r0, ACTLR
47 isb
48 bx lr
49endfunc cortex_a15_enable_smp
50
Ambroise Vincentd4a51eb2019-03-04 16:56:26 +000051 /* ----------------------------------------------------
52 * Errata Workaround for Cortex A15 Errata #816470.
53 * This applies only to revision >= r3p0 of Cortex A15.
54 * ----------------------------------------------------
55 */
56func check_errata_816470
57 /*
58 * Even though this is only needed for revision >= r3p0, it is always
59 * applied because of the low cost of the workaround.
60 */
61 mov r0, #ERRATA_APPLIES
62 bx lr
63endfunc check_errata_816470
64
Sona Mathewd7c07d12023-06-25 19:25:20 -050065add_erratum_entry cortex_a15, ERRATUM(816470), ERRATA_A15_816470
Ambroise Vincent68b38122019-03-05 09:54:21 +000066 /* ----------------------------------------------------
67 * Errata Workaround for Cortex A15 Errata #827671.
68 * This applies only to revision >= r3p0 of Cortex A15.
69 * Inputs:
70 * r0: variant[4:7] and revision[0:3] of current cpu.
71 * Shall clobber: r0-r3
72 * ----------------------------------------------------
73 */
74func errata_a15_827671_wa
75 /*
76 * Compare r0 against revision r3p0
77 */
78 mov r2, lr
79 bl check_errata_827671
80 cmp r0, #ERRATA_NOT_APPLIES
81 beq 1f
82 ldcopr r0, CORTEX_A15_ACTLR2
83 orr r0, #CORTEX_A15_ACTLR2_INV_DCC_BIT
84 stcopr r0, CORTEX_A15_ACTLR2
85 isb
861:
87 bx r2
88endfunc errata_a15_827671_wa
89
90func check_errata_827671
91 mov r1, #0x30
92 b cpu_rev_var_hs
93endfunc check_errata_827671
94
Sona Mathewd7c07d12023-06-25 19:25:20 -050095add_erratum_entry cortex_a15, ERRATUM(827671), ERRATA_A15_827671
96
Dimitris Papastamos8ca0af22018-01-03 10:48:59 +000097func check_errata_cve_2017_5715
98#if WORKAROUND_CVE_2017_5715
99 mov r0, #ERRATA_APPLIES
100#else
101 mov r0, #ERRATA_MISSING
102#endif
103 bx lr
104endfunc check_errata_cve_2017_5715
105
Sona Mathewd7c07d12023-06-25 19:25:20 -0500106add_erratum_entry cortex_a15, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
107
John Powell7f7c6fa2022-04-14 19:10:17 -0500108func check_errata_cve_2022_23960
109#if WORKAROUND_CVE_2022_23960
110 mov r0, #ERRATA_APPLIES
111#else
112 mov r0, #ERRATA_MISSING
113#endif
114 bx lr
115endfunc check_errata_cve_2022_23960
116
Sona Mathewd7c07d12023-06-25 19:25:20 -0500117add_erratum_entry cortex_a15, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
Dimitris Papastamos8ca0af22018-01-03 10:48:59 +0000118
Etienne Carriere4ece7552017-11-05 22:56:10 +0100119func cortex_a15_reset_func
Ambroise Vincent68b38122019-03-05 09:54:21 +0000120 mov r5, lr
121 bl cpu_get_rev_var
122
123#if ERRATA_A15_827671
124 bl errata_a15_827671_wa
125#endif
126
John Powell7f7c6fa2022-04-14 19:10:17 -0500127#if IMAGE_BL32 && (WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960)
Dimitris Papastamos8ca0af22018-01-03 10:48:59 +0000128 ldcopr r0, ACTLR
129 orr r0, #CORTEX_A15_ACTLR_INV_BTB_BIT
130 stcopr r0, ACTLR
John Powell7f7c6fa2022-04-14 19:10:17 -0500131 ldr r0, =wa_cve_2017_5715_icache_inv_vbar
Dimitris Papastamos8ca0af22018-01-03 10:48:59 +0000132 stcopr r0, VBAR
133 stcopr r0, MVBAR
134 /* isb will be applied in the course of the reset func */
135#endif
Ambroise Vincent68b38122019-03-05 09:54:21 +0000136
137 mov lr, r5
Etienne Carriere4ece7552017-11-05 22:56:10 +0100138 b cortex_a15_enable_smp
139endfunc cortex_a15_reset_func
140
141func cortex_a15_core_pwr_dwn
142 push {r12, lr}
143
144 assert_cache_enabled
145
146 /* Flush L1 cache */
147 mov r0, #DC_OP_CISW
148 bl dcsw_op_level1
149
150 /* Exit cluster coherency */
151 pop {r12, lr}
152 b cortex_a15_disable_smp
153endfunc cortex_a15_core_pwr_dwn
154
155func cortex_a15_cluster_pwr_dwn
156 push {r12, lr}
157
158 assert_cache_enabled
159
160 /* Flush L1 caches */
161 mov r0, #DC_OP_CISW
162 bl dcsw_op_level1
163
164 bl plat_disable_acp
165
Stephan Gerholded1cc202023-03-19 20:30:58 +0100166 /* Flush L2 caches */
167 mov r0, #DC_OP_CISW
168 bl dcsw_op_level2
169
Etienne Carriere4ece7552017-11-05 22:56:10 +0100170 /* Exit cluster coherency */
171 pop {r12, lr}
172 b cortex_a15_disable_smp
173endfunc cortex_a15_cluster_pwr_dwn
174
Sona Mathewd7c07d12023-06-25 19:25:20 -0500175errata_report_shim cortex_a15
176
Etienne Carriere4ece7552017-11-05 22:56:10 +0100177declare_cpu_ops cortex_a15, CORTEX_A15_MIDR, \
178 cortex_a15_reset_func, \
179 cortex_a15_core_pwr_dwn, \
180 cortex_a15_cluster_pwr_dwn