blob: 62b92b2c3eb940f56eaab61ce6a92f16f0fdd5c8 [file] [log] [blame]
Jimmy Brisson958a0b12020-09-30 15:28:03 -05001/*
laurenw-arm3c86d832021-08-02 13:22:32 -05002 * Copyright (c) 2019-2021, ARM Limited. All rights reserved.
Jimmy Brisson958a0b12020-09-30 15:28:03 -05003 *
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 <neoverse_v1.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
13
14/* Hardware handled coherency */
15#if HW_ASSISTED_COHERENCY == 0
16#error "Neoverse V1 must be compiled with HW_ASSISTED_COHERENCY enabled"
17#endif
18
19/* 64-bit only core */
20#if CTX_INCLUDE_AARCH32_REGS == 1
21#error "Neoverse-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
22#endif
23
johpow01c73b03c2021-05-03 15:33:39 -050024 /* --------------------------------------------------
laurenw-arm3c86d832021-08-02 13:22:32 -050025 * Errata Workaround for Neoverse V1 Errata #1774420.
26 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
27 * x0: variant[4:7] and revision[0:3] of current cpu.
28 * Shall clobber: x0-x17
29 * --------------------------------------------------
30 */
31func errata_neoverse_v1_1774420_wa
32 /* Check workaround compatibility. */
33 mov x17, x30
34 bl check_errata_1774420
35 cbz x0, 1f
36
37 /* Set bit 53 in CPUECTLR_EL1 */
38 mrs x1, NEOVERSE_V1_CPUECTLR_EL1
39 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53
40 msr NEOVERSE_V1_CPUECTLR_EL1, x1
41 isb
421:
43 ret x17
44endfunc errata_neoverse_v1_1774420_wa
45
46func check_errata_1774420
47 /* Applies to r0p0 and r1p0. */
48 mov x1, #0x10
49 b cpu_rev_var_ls
50endfunc check_errata_1774420
51
52 /* --------------------------------------------------
johpow01c73b03c2021-05-03 15:33:39 -050053 * Errata Workaround for Neoverse V1 Errata #1791573.
54 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
55 * x0: variant[4:7] and revision[0:3] of current cpu.
56 * Shall clobber: x0-x17
57 * --------------------------------------------------
58 */
59func errata_neoverse_v1_1791573_wa
60 /* Check workaround compatibility. */
61 mov x17, x30
62 bl check_errata_1791573
63 cbz x0, 1f
64
65 /* Set bit 2 in ACTLR2_EL1 */
laurenw-arm3c86d832021-08-02 13:22:32 -050066 mrs x1, NEOVERSE_V1_ACTLR2_EL1
johpow01c73b03c2021-05-03 15:33:39 -050067 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2
laurenw-arm3c86d832021-08-02 13:22:32 -050068 msr NEOVERSE_V1_ACTLR2_EL1, x1
johpow01c73b03c2021-05-03 15:33:39 -050069 isb
701:
71 ret x17
72endfunc errata_neoverse_v1_1791573_wa
73
74func check_errata_1791573
75 /* Applies to r0p0 and r1p0. */
76 mov x1, #0x10
77 b cpu_rev_var_ls
78endfunc check_errata_1791573
79
johpow0107acb4f2020-10-07 16:38:37 -050080 /* --------------------------------------------------
81 * Errata Workaround for Neoverse V1 Erratum #1940577
82 * This applies to revisions r1p0 - r1p1 and is open.
83 * It also exists in r0p0 but there is no fix in that
84 * revision.
85 * Inputs:
86 * x0: variant[4:7] and revision[0:3] of current cpu.
87 * Shall clobber: x0-x17
88 * --------------------------------------------------
89 */
90func errata_neoverse_v1_1940577_wa
91 /* Compare x0 against revisions r1p0 - r1p1 */
92 mov x17, x30
93 bl check_errata_1940577
94 cbz x0, 1f
95
96 mov x0, #0
97 msr S3_6_C15_C8_0, x0
98 ldr x0, =0x10E3900002
99 msr S3_6_C15_C8_2, x0
100 ldr x0, =0x10FFF00083
101 msr S3_6_C15_C8_3, x0
102 ldr x0, =0x2001003FF
103 msr S3_6_C15_C8_1, x0
104
105 mov x0, #1
106 msr S3_6_C15_C8_0, x0
107 ldr x0, =0x10E3800082
108 msr S3_6_C15_C8_2, x0
109 ldr x0, =0x10FFF00083
110 msr S3_6_C15_C8_3, x0
111 ldr x0, =0x2001003FF
112 msr S3_6_C15_C8_1, x0
113
114 mov x0, #2
115 msr S3_6_C15_C8_0, x0
116 ldr x0, =0x10E3800200
117 msr S3_6_C15_C8_2, x0
118 ldr x0, =0x10FFF003E0
119 msr S3_6_C15_C8_3, x0
120 ldr x0, =0x2001003FF
121 msr S3_6_C15_C8_1, x0
122
123 isb
1241:
125 ret x17
126endfunc errata_neoverse_v1_1940577_wa
127
128func check_errata_1940577
129 /* Applies to revisions r1p0 - r1p1. */
130 mov x1, #0x10
131 mov x2, #0x11
132 b cpu_rev_var_range
133endfunc check_errata_1940577
134
Jimmy Brisson958a0b12020-09-30 15:28:03 -0500135 /* ---------------------------------------------
136 * HW will do the cache maintenance while powering down
137 * ---------------------------------------------
138 */
139func neoverse_v1_core_pwr_dwn
140 /* ---------------------------------------------
141 * Enable CPU power down bit in power control register
142 * ---------------------------------------------
143 */
144 mrs x0, NEOVERSE_V1_CPUPWRCTLR_EL1
145 orr x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
146 msr NEOVERSE_V1_CPUPWRCTLR_EL1, x0
147 isb
148 ret
149endfunc neoverse_v1_core_pwr_dwn
150
151 /*
152 * Errata printing function for Neoverse V1. Must follow AAPCS.
153 */
154#if REPORT_ERRATA
155func neoverse_v1_errata_report
johpow01c73b03c2021-05-03 15:33:39 -0500156 stp x8, x30, [sp, #-16]!
157
158 bl cpu_get_rev_var
159 mov x8, x0
160
161 /*
162 * Report all errata. The revision-variant information is passed to
163 * checking functions of each errata.
164 */
laurenw-arm3c86d832021-08-02 13:22:32 -0500165 report_errata ERRATA_V1_1774420, neoverse_v1, 1774420
johpow01c73b03c2021-05-03 15:33:39 -0500166 report_errata ERRATA_V1_1791573, neoverse_v1, 1791573
johpow0107acb4f2020-10-07 16:38:37 -0500167 report_errata ERRATA_V1_1940577, neoverse_v1, 1940577
johpow01c73b03c2021-05-03 15:33:39 -0500168
169 ldp x8, x30, [sp], #16
Jimmy Brisson958a0b12020-09-30 15:28:03 -0500170 ret
171endfunc neoverse_v1_errata_report
172#endif
173
174func neoverse_v1_reset_func
175 mov x19, x30
176
177 /* Disable speculative loads */
178 msr SSBS, xzr
Jimmy Brisson958a0b12020-09-30 15:28:03 -0500179 isb
johpow01c73b03c2021-05-03 15:33:39 -0500180
laurenw-arm3c86d832021-08-02 13:22:32 -0500181#if ERRATA_V1_1774420
182 mov x0, x18
183 bl errata_neoverse_v1_1774420_wa
184#endif
185
johpow01c73b03c2021-05-03 15:33:39 -0500186#if ERRATA_V1_1791573
187 mov x0, x18
188 bl errata_neoverse_v1_1791573_wa
189#endif
190
johpow0107acb4f2020-10-07 16:38:37 -0500191#if ERRATA_V1_1940577
192 mov x0, x18
193 bl errata_neoverse_v1_1940577_wa
194#endif
195
Jimmy Brisson958a0b12020-09-30 15:28:03 -0500196 ret x19
197endfunc neoverse_v1_reset_func
198
199 /* ---------------------------------------------
200 * This function provides Neoverse-V1 specific
201 * register information for crash reporting.
202 * It needs to return with x6 pointing to
203 * a list of register names in ascii and
204 * x8 - x15 having values of registers to be
205 * reported.
206 * ---------------------------------------------
207 */
208.section .rodata.neoverse_v1_regs, "aS"
209neoverse_v1_regs: /* The ascii list of register names to be reported */
210 .asciz "cpuectlr_el1", ""
211
212func neoverse_v1_cpu_reg_dump
213 adr x6, neoverse_v1_regs
214 mrs x8, NEOVERSE_V1_CPUECTLR_EL1
215 ret
216endfunc neoverse_v1_cpu_reg_dump
217
218declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \
219 neoverse_v1_reset_func, \
220 neoverse_v1_core_pwr_dwn