blob: 3334e688c4bc87eb3cd74c52ccf6951e13df6cb6 [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Soby Mathewc704cbc2014-08-14 11:33:56 +01002 * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
Achin Gupta4f6ad662013-10-25 09:08:21 +010030#include <arch.h>
Andrew Thoelke38bde412014-03-18 13:46:55 +000031#include <asm_macros.S>
Soby Mathew802f8652014-08-14 16:19:29 +010032#include <assert_macros.S>
Yatharth Kochar36433d12014-11-20 18:09:41 +000033#include <bl_common.h>
Soby Mathew8e2f2872014-08-14 12:49:05 +010034#include <cortex_a57.h>
Soby Mathewc704cbc2014-08-14 11:33:56 +010035#include <cpu_macros.S>
36#include <plat_macros.S>
Achin Gupta4f6ad662013-10-25 09:08:21 +010037
Soby Mathew8e2f2872014-08-14 12:49:05 +010038 /* ---------------------------------------------
39 * Disable L1 data cache and unified L2 cache
40 * ---------------------------------------------
41 */
42func cortex_a57_disable_dcache
43 mrs x1, sctlr_el3
44 bic x1, x1, #SCTLR_C_BIT
45 msr sctlr_el3, x1
46 isb
47 ret
48
49 /* ---------------------------------------------
50 * Disable all types of L2 prefetches.
51 * ---------------------------------------------
52 */
53func cortex_a57_disable_l2_prefetch
54 mrs x0, CPUECTLR_EL1
55 orr x0, x0, #CPUECTLR_DIS_TWD_ACC_PFTCH_BIT
56 mov x1, #CPUECTLR_L2_IPFTCH_DIST_MASK
57 orr x1, x1, #CPUECTLR_L2_DPFTCH_DIST_MASK
58 bic x0, x0, x1
59 msr CPUECTLR_EL1, x0
60 isb
Soby Mathew1604fa02014-09-22 12:15:26 +010061 dsb ish
Soby Mathew8e2f2872014-08-14 12:49:05 +010062 ret
63
64 /* ---------------------------------------------
65 * Disable intra-cluster coherency
66 * ---------------------------------------------
67 */
68func cortex_a57_disable_smp
69 mrs x0, CPUECTLR_EL1
70 bic x0, x0, #CPUECTLR_SMP_BIT
71 msr CPUECTLR_EL1, x0
72 ret
73
74 /* ---------------------------------------------
75 * Disable debug interfaces
76 * ---------------------------------------------
77 */
78func cortex_a57_disable_ext_debug
79 mov x0, #1
80 msr osdlr_el1, x0
81 isb
82 dsb sy
83 ret
Achin Gupta4f6ad662013-10-25 09:08:21 +010084
Soby Mathewc0884332014-09-22 12:11:36 +010085 /* --------------------------------------------------
86 * Errata Workaround for Cortex A57 Errata #806969.
87 * This applies only to revision r0p0 of Cortex A57.
88 * Inputs:
89 * x0: variant[4:7] and revision[0:3] of current cpu.
90 * --------------------------------------------------
Soby Mathew802f8652014-08-14 16:19:29 +010091 */
Soby Mathewc0884332014-09-22 12:11:36 +010092func errata_a57_806969_wa
93 /*
94 * Compare x0 against revision r0p0
95 */
96 cbz x0, apply_806969
97#if DEBUG
98 b print_revision_warning
99#else
100 ret
Soby Mathew802f8652014-08-14 16:19:29 +0100101#endif
Soby Mathewc0884332014-09-22 12:11:36 +0100102apply_806969:
Yatharth Kochar36433d12014-11-20 18:09:41 +0000103 /*
104 * Test if errata has already been applied in an earlier
105 * invocation of the reset handler and does not need to
106 * be applied again.
107 */
Soby Mathewc0884332014-09-22 12:11:36 +0100108 mrs x1, CPUACTLR_EL1
Yatharth Kochar36433d12014-11-20 18:09:41 +0000109 tst x1, #CPUACTLR_NO_ALLOC_WBWA
110 b.ne skip_806969
Soby Mathew802f8652014-08-14 16:19:29 +0100111 orr x1, x1, #CPUACTLR_NO_ALLOC_WBWA
Soby Mathewc0884332014-09-22 12:11:36 +0100112 msr CPUACTLR_EL1, x1
Yatharth Kochar36433d12014-11-20 18:09:41 +0000113skip_806969:
Soby Mathewc0884332014-09-22 12:11:36 +0100114 ret
115
116
117 /* ---------------------------------------------------
118 * Errata Workaround for Cortex A57 Errata #813420.
119 * This applies only to revision r0p0 of Cortex A57.
120 * Inputs:
121 * x0: variant[4:7] and revision[0:3] of current cpu.
122 * ---------------------------------------------------
123 */
124func errata_a57_813420_wa
125 /*
126 * Compare x0 against revision r0p0
127 */
128 cbz x0, apply_813420
129#if DEBUG
130 b print_revision_warning
131#else
132 ret
Soby Mathew802f8652014-08-14 16:19:29 +0100133#endif
Soby Mathewc0884332014-09-22 12:11:36 +0100134apply_813420:
Yatharth Kochar36433d12014-11-20 18:09:41 +0000135 /*
136 * Test if errata has already been applied in an earlier
137 * invocation of the reset handler and does not need to
138 * be applied again.
139 */
Soby Mathewc0884332014-09-22 12:11:36 +0100140 mrs x1, CPUACTLR_EL1
Yatharth Kochar36433d12014-11-20 18:09:41 +0000141 tst x1, #CPUACTLR_DCC_AS_DCCI
142 b.ne skip_813420
Soby Mathew802f8652014-08-14 16:19:29 +0100143 orr x1, x1, #CPUACTLR_DCC_AS_DCCI
Soby Mathewc0884332014-09-22 12:11:36 +0100144 msr CPUACTLR_EL1, x1
Yatharth Kochar36433d12014-11-20 18:09:41 +0000145skip_813420:
Soby Mathewc0884332014-09-22 12:11:36 +0100146 ret
147
148 /* -------------------------------------------------
149 * The CPU Ops reset function for Cortex-A57.
150 * -------------------------------------------------
151 */
152func cortex_a57_reset_func
153 mov x19, x30
154 mrs x0, midr_el1
155
156 /*
157 * Extract the variant[20:23] and revision[0:3] from x0
158 * and pack it in x20[0:7] as variant[4:7] and revision[0:3].
159 * First extract x0[16:23] to x20[0:7] and zero fill the rest.
160 * Then extract x0[0:3] into x20[0:3] retaining other bits.
161 */
162 ubfx x20, x0, #(MIDR_VAR_SHIFT - MIDR_REV_BITS), #(MIDR_REV_BITS + MIDR_VAR_BITS)
163 bfxil x20, x0, #MIDR_REV_SHIFT, #MIDR_REV_BITS
164
165#if ERRATA_A57_806969
166 mov x0, x20
167 bl errata_a57_806969_wa
Soby Mathew802f8652014-08-14 16:19:29 +0100168#endif
169
Soby Mathewc0884332014-09-22 12:11:36 +0100170#if ERRATA_A57_813420
171 mov x0, x20
172 bl errata_a57_813420_wa
173#endif
Yatharth Kochar36433d12014-11-20 18:09:41 +0000174
Achin Gupta4f6ad662013-10-25 09:08:21 +0100175 /* ---------------------------------------------
Yatharth Kochar36433d12014-11-20 18:09:41 +0000176 * As a bare minimum enable the SMP bit if it is
177 * not already set.
Achin Gupta4f6ad662013-10-25 09:08:21 +0100178 * ---------------------------------------------
179 */
Andrew Thoelkef977ed82014-04-28 12:32:02 +0100180 mrs x0, CPUECTLR_EL1
Yatharth Kochar36433d12014-11-20 18:09:41 +0000181 tst x0, #CPUECTLR_SMP_BIT
182 b.ne skip_smp_setup
Achin Gupta4f6ad662013-10-25 09:08:21 +0100183 orr x0, x0, #CPUECTLR_SMP_BIT
Andrew Thoelkef977ed82014-04-28 12:32:02 +0100184 msr CPUECTLR_EL1, x0
Yatharth Kochar36433d12014-11-20 18:09:41 +0000185skip_smp_setup:
Andrew Thoelke42e75a72014-04-28 12:28:39 +0100186 isb
Soby Mathewc0884332014-09-22 12:11:36 +0100187 ret x19
Soby Mathewc704cbc2014-08-14 11:33:56 +0100188
Soby Mathewc0884332014-09-22 12:11:36 +0100189 /* ----------------------------------------------------
190 * The CPU Ops core power down function for Cortex-A57.
191 * ----------------------------------------------------
192 */
Soby Mathew8e2f2872014-08-14 12:49:05 +0100193func cortex_a57_core_pwr_dwn
194 mov x18, x30
195
196 /* ---------------------------------------------
197 * Turn off caches.
198 * ---------------------------------------------
199 */
200 bl cortex_a57_disable_dcache
201
202 /* ---------------------------------------------
203 * Disable the L2 prefetches.
204 * ---------------------------------------------
205 */
206 bl cortex_a57_disable_l2_prefetch
207
208 /* ---------------------------------------------
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100209 * Flush L1 caches.
Soby Mathew8e2f2872014-08-14 12:49:05 +0100210 * ---------------------------------------------
211 */
212 mov x0, #DCCISW
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100213 bl dcsw_op_level1
Soby Mathew8e2f2872014-08-14 12:49:05 +0100214
215 /* ---------------------------------------------
216 * Come out of intra cluster coherency
217 * ---------------------------------------------
218 */
219 bl cortex_a57_disable_smp
220
221 /* ---------------------------------------------
222 * Force the debug interfaces to be quiescent
223 * ---------------------------------------------
224 */
225 mov x30, x18
226 b cortex_a57_disable_ext_debug
227
Soby Mathewc0884332014-09-22 12:11:36 +0100228 /* -------------------------------------------------------
229 * The CPU Ops cluster power down function for Cortex-A57.
230 * -------------------------------------------------------
231 */
Soby Mathew8e2f2872014-08-14 12:49:05 +0100232func cortex_a57_cluster_pwr_dwn
233 mov x18, x30
234
235 /* ---------------------------------------------
236 * Turn off caches.
237 * ---------------------------------------------
238 */
239 bl cortex_a57_disable_dcache
240
241 /* ---------------------------------------------
242 * Disable the L2 prefetches.
243 * ---------------------------------------------
244 */
245 bl cortex_a57_disable_l2_prefetch
246
Soby Mathew937488b2014-09-22 14:13:34 +0100247#if !SKIP_A57_L1_FLUSH_PWR_DWN
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100248 /* -------------------------------------------------
249 * Flush the L1 caches.
250 * -------------------------------------------------
251 */
252 mov x0, #DCCISW
253 bl dcsw_op_level1
Soby Mathew937488b2014-09-22 14:13:34 +0100254#endif
Soby Mathew8e2f2872014-08-14 12:49:05 +0100255 /* ---------------------------------------------
256 * Disable the optional ACP.
257 * ---------------------------------------------
258 */
259 bl plat_disable_acp
260
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100261 /* -------------------------------------------------
262 * Flush the L2 caches.
263 * -------------------------------------------------
Soby Mathew8e2f2872014-08-14 12:49:05 +0100264 */
265 mov x0, #DCCISW
Soby Mathew42aa5eb2014-09-02 10:47:33 +0100266 bl dcsw_op_level2
Soby Mathew8e2f2872014-08-14 12:49:05 +0100267
268 /* ---------------------------------------------
269 * Come out of intra cluster coherency
270 * ---------------------------------------------
271 */
272 bl cortex_a57_disable_smp
273
274 /* ---------------------------------------------
275 * Force the debug interfaces to be quiescent
276 * ---------------------------------------------
277 */
278 mov x30, x18
279 b cortex_a57_disable_ext_debug
280
Soby Mathew38b4bc92014-08-14 13:36:41 +0100281 /* ---------------------------------------------
282 * This function provides cortex_a57 specific
283 * register information for crash reporting.
284 * It needs to return with x6 pointing to
285 * a list of register names in ascii and
286 * x8 - x15 having values of registers to be
287 * reported.
288 * ---------------------------------------------
289 */
290.section .rodata.cortex_a57_regs, "aS"
291cortex_a57_regs: /* The ascii list of register names to be reported */
292 .asciz "cpuectlr_el1", ""
293
294func cortex_a57_cpu_reg_dump
295 adr x6, cortex_a57_regs
296 mrs x8, CPUECTLR_EL1
297 ret
298
299
Soby Mathewc704cbc2014-08-14 11:33:56 +0100300declare_cpu_ops cortex_a57, CORTEX_A57_MIDR