1/* 2 * Copyright (c) 2019-2021, Arm Limited. All rights reserved. 3 * 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 24 /* -------------------------------------------------- 25 * 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 /* -------------------------------------------------- 53 * 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 */ 66 mrs x1, NEOVERSE_V1_ACTLR2_EL1 67 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2 68 msr NEOVERSE_V1_ACTLR2_EL1, x1 69 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 80 /* -------------------------------------------------- 81 * Errata Workaround for Neoverse V1 Errata #1852267. 82 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 83 * x0: variant[4:7] and revision[0:3] of current cpu. 84 * Shall clobber: x0-x17 85 * -------------------------------------------------- 86 */ 87func errata_neoverse_v1_1852267_wa 88 /* Check workaround compatibility. */ 89 mov x17, x30 90 bl check_errata_1852267 91 cbz x0, 1f 92 93 /* Set bit 28 in ACTLR2_EL1 */ 94 mrs x1, NEOVERSE_V1_ACTLR2_EL1 95 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28 96 msr NEOVERSE_V1_ACTLR2_EL1, x1 97 isb 981: 99 ret x17 100endfunc errata_neoverse_v1_1852267_wa 101 102func check_errata_1852267 103 /* Applies to r0p0 and r1p0. */ 104 mov x1, #0x10 105 b cpu_rev_var_ls 106endfunc check_errata_1852267 107 108 /* -------------------------------------------------- 109 * Errata Workaround for Neoverse V1 Errata #1925756. 110 * This applies to revisions <= r1p1. 111 * x0: variant[4:7] and revision[0:3] of current cpu. 112 * Shall clobber: x0-x17 113 * -------------------------------------------------- 114 */ 115func errata_neoverse_v1_1925756_wa 116 /* Check workaround compatibility. */ 117 mov x17, x30 118 bl check_errata_1925756 119 cbz x0, 1f 120 121 /* Set bit 8 in CPUECTLR_EL1 */ 122 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 123 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8 124 msr NEOVERSE_V1_CPUECTLR_EL1, x1 125 isb 1261: 127 ret x17 128endfunc errata_neoverse_v1_1925756_wa 129 130func check_errata_1925756 131 /* Applies to <= r1p1. */ 132 mov x1, #0x11 133 b cpu_rev_var_ls 134endfunc check_errata_1925756 135 136 /* -------------------------------------------------- 137 * Errata Workaround for Neoverse V1 Erratum #1940577 138 * This applies to revisions r1p0 - r1p1 and is open. 139 * It also exists in r0p0 but there is no fix in that 140 * revision. 141 * Inputs: 142 * x0: variant[4:7] and revision[0:3] of current cpu. 143 * Shall clobber: x0-x17 144 * -------------------------------------------------- 145 */ 146func errata_neoverse_v1_1940577_wa 147 /* Compare x0 against revisions r1p0 - r1p1 */ 148 mov x17, x30 149 bl check_errata_1940577 150 cbz x0, 1f 151 152 mov x0, #0 153 msr S3_6_C15_C8_0, x0 154 ldr x0, =0x10E3900002 155 msr S3_6_C15_C8_2, x0 156 ldr x0, =0x10FFF00083 157 msr S3_6_C15_C8_3, x0 158 ldr x0, =0x2001003FF 159 msr S3_6_C15_C8_1, x0 160 161 mov x0, #1 162 msr S3_6_C15_C8_0, x0 163 ldr x0, =0x10E3800082 164 msr S3_6_C15_C8_2, x0 165 ldr x0, =0x10FFF00083 166 msr S3_6_C15_C8_3, x0 167 ldr x0, =0x2001003FF 168 msr S3_6_C15_C8_1, x0 169 170 mov x0, #2 171 msr S3_6_C15_C8_0, x0 172 ldr x0, =0x10E3800200 173 msr S3_6_C15_C8_2, x0 174 ldr x0, =0x10FFF003E0 175 msr S3_6_C15_C8_3, x0 176 ldr x0, =0x2001003FF 177 msr S3_6_C15_C8_1, x0 178 179 isb 1801: 181 ret x17 182endfunc errata_neoverse_v1_1940577_wa 183 184func check_errata_1940577 185 /* Applies to revisions r1p0 - r1p1. */ 186 mov x1, #0x10 187 mov x2, #0x11 188 b cpu_rev_var_range 189endfunc check_errata_1940577 190 191 /* -------------------------------------------------- 192 * Errata Workaround for Neoverse V1 Errata #1966096 193 * This applies to revisions r1p0 - r1p1 and is open. 194 * It also exists in r0p0 but there is no workaround 195 * for that revision. 196 * x0: variant[4:7] and revision[0:3] of current cpu. 197 * Shall clobber: x0-x17 198 * -------------------------------------------------- 199 */ 200func errata_neoverse_v1_1966096_wa 201 /* Check workaround compatibility. */ 202 mov x17, x30 203 bl check_errata_1966096 204 cbz x0, 1f 205 206 /* Apply the workaround. */ 207 mov x0, #0x3 208 msr S3_6_C15_C8_0, x0 209 ldr x0, =0xEE010F12 210 msr S3_6_C15_C8_2, x0 211 ldr x0, =0xFFFF0FFF 212 msr S3_6_C15_C8_3, x0 213 ldr x0, =0x80000000003FF 214 msr S3_6_C15_C8_1, x0 215 isb 216 2171: 218 ret x17 219endfunc errata_neoverse_v1_1966096_wa 220 221func check_errata_1966096 222 mov x1, #0x10 223 mov x2, #0x11 224 b cpu_rev_var_range 225endfunc check_errata_1966096 226 227 /* --------------------------------------------- 228 * HW will do the cache maintenance while powering down 229 * --------------------------------------------- 230 */ 231func neoverse_v1_core_pwr_dwn 232 /* --------------------------------------------- 233 * Enable CPU power down bit in power control register 234 * --------------------------------------------- 235 */ 236 mrs x0, NEOVERSE_V1_CPUPWRCTLR_EL1 237 orr x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 238 msr NEOVERSE_V1_CPUPWRCTLR_EL1, x0 239 isb 240 ret 241endfunc neoverse_v1_core_pwr_dwn 242 243 /* 244 * Errata printing function for Neoverse V1. Must follow AAPCS. 245 */ 246#if REPORT_ERRATA 247func neoverse_v1_errata_report 248 stp x8, x30, [sp, #-16]! 249 250 bl cpu_get_rev_var 251 mov x8, x0 252 253 /* 254 * Report all errata. The revision-variant information is passed to 255 * checking functions of each errata. 256 */ 257 report_errata ERRATA_V1_1774420, neoverse_v1, 1774420 258 report_errata ERRATA_V1_1791573, neoverse_v1, 1791573 259 report_errata ERRATA_V1_1852267, neoverse_v1, 1852267 260 report_errata ERRATA_V1_1925756, neoverse_v1, 1925756 261 report_errata ERRATA_V1_1940577, neoverse_v1, 1940577 262 report_errata ERRATA_V1_1966096, neoverse_v1, 1966096 263 264 ldp x8, x30, [sp], #16 265 ret 266endfunc neoverse_v1_errata_report 267#endif 268 269func neoverse_v1_reset_func 270 mov x19, x30 271 272 /* Disable speculative loads */ 273 msr SSBS, xzr 274 isb 275 276#if ERRATA_V1_1774420 277 mov x0, x18 278 bl errata_neoverse_v1_1774420_wa 279#endif 280 281#if ERRATA_V1_1791573 282 mov x0, x18 283 bl errata_neoverse_v1_1791573_wa 284#endif 285 286#if ERRATA_V1_1852267 287 mov x0, x18 288 bl errata_neoverse_v1_1852267_wa 289#endif 290 291#if ERRATA_V1_1925756 292 mov x0, x18 293 bl errata_neoverse_v1_1925756_wa 294#endif 295 296#if ERRATA_V1_1940577 297 mov x0, x18 298 bl errata_neoverse_v1_1940577_wa 299#endif 300 301#if ERRATA_V1_1966096 302 mov x0, x18 303 bl errata_neoverse_v1_1966096_wa 304#endif 305 306 ret x19 307endfunc neoverse_v1_reset_func 308 309 /* --------------------------------------------- 310 * This function provides Neoverse-V1 specific 311 * register information for crash reporting. 312 * It needs to return with x6 pointing to 313 * a list of register names in ascii and 314 * x8 - x15 having values of registers to be 315 * reported. 316 * --------------------------------------------- 317 */ 318.section .rodata.neoverse_v1_regs, "aS" 319neoverse_v1_regs: /* The ascii list of register names to be reported */ 320 .asciz "cpuectlr_el1", "" 321 322func neoverse_v1_cpu_reg_dump 323 adr x6, neoverse_v1_regs 324 mrs x8, NEOVERSE_V1_CPUECTLR_EL1 325 ret 326endfunc neoverse_v1_cpu_reg_dump 327 328declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \ 329 neoverse_v1_reset_func, \ 330 neoverse_v1_core_pwr_dwn 331