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 * Errata Workaround for Neoverse V1 Errata #2139242. 229 * This applies to revisions r0p0, r1p0, and r1p1, it 230 * is still open. 231 * x0: variant[4:7] and revision[0:3] of current cpu. 232 * Shall clobber: x0-x17 233 * -------------------------------------------------- 234 */ 235func errata_neoverse_v1_2139242_wa 236 /* Check workaround compatibility. */ 237 mov x17, x30 238 bl check_errata_2139242 239 cbz x0, 1f 240 241 /* Apply the workaround. */ 242 mov x0, #0x3 243 msr S3_6_C15_C8_0, x0 244 ldr x0, =0xEE720F14 245 msr S3_6_C15_C8_2, x0 246 ldr x0, =0xFFFF0FDF 247 msr S3_6_C15_C8_3, x0 248 ldr x0, =0x40000005003FF 249 msr S3_6_C15_C8_1, x0 250 isb 251 2521: 253 ret x17 254endfunc errata_neoverse_v1_2139242_wa 255 256func check_errata_2139242 257 /* Applies to r0p0, r1p0, r1p1 */ 258 mov x1, #0x11 259 b cpu_rev_var_ls 260endfunc check_errata_2139242 261 262 /* -------------------------------------------------- 263 * Errata Workaround for Neoverse V1 Errata #2108267. 264 * This applies to revisions r0p0, r1p0, and r1p1, it 265 * is still open. 266 * x0: variant[4:7] and revision[0:3] of current cpu. 267 * Shall clobber: x0-x1, x17 268 * -------------------------------------------------- 269 */ 270func errata_neoverse_v1_2108267_wa 271 /* Check workaround compatibility. */ 272 mov x17, x30 273 bl check_errata_2108267 274 cbz x0, 1f 275 276 /* Apply the workaround. */ 277 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 278 mov x0, #NEOVERSE_V1_CPUECTLR_EL1_PF_MODE_CNSRV 279 bfi x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH 280 msr NEOVERSE_V1_CPUECTLR_EL1, x1 2811: 282 ret x17 283endfunc errata_neoverse_v1_2108267_wa 284 285func check_errata_2108267 286 /* Applies to r0p0, r1p0, r1p1 */ 287 mov x1, #0x11 288 b cpu_rev_var_ls 289endfunc check_errata_2108267 290 291 /* --------------------------------------------- 292 * HW will do the cache maintenance while powering down 293 * --------------------------------------------- 294 */ 295func neoverse_v1_core_pwr_dwn 296 /* --------------------------------------------- 297 * Enable CPU power down bit in power control register 298 * --------------------------------------------- 299 */ 300 mrs x0, NEOVERSE_V1_CPUPWRCTLR_EL1 301 orr x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 302 msr NEOVERSE_V1_CPUPWRCTLR_EL1, x0 303 isb 304 ret 305endfunc neoverse_v1_core_pwr_dwn 306 307 /* 308 * Errata printing function for Neoverse V1. Must follow AAPCS. 309 */ 310#if REPORT_ERRATA 311func neoverse_v1_errata_report 312 stp x8, x30, [sp, #-16]! 313 314 bl cpu_get_rev_var 315 mov x8, x0 316 317 /* 318 * Report all errata. The revision-variant information is passed to 319 * checking functions of each errata. 320 */ 321 report_errata ERRATA_V1_1774420, neoverse_v1, 1774420 322 report_errata ERRATA_V1_1791573, neoverse_v1, 1791573 323 report_errata ERRATA_V1_1852267, neoverse_v1, 1852267 324 report_errata ERRATA_V1_1925756, neoverse_v1, 1925756 325 report_errata ERRATA_V1_1940577, neoverse_v1, 1940577 326 report_errata ERRATA_V1_1966096, neoverse_v1, 1966096 327 report_errata ERRATA_V1_2139242, neoverse_v1, 2139242 328 report_errata ERRATA_V1_2108267, neoverse_v1, 2108267 329 330 ldp x8, x30, [sp], #16 331 ret 332endfunc neoverse_v1_errata_report 333#endif 334 335func neoverse_v1_reset_func 336 mov x19, x30 337 338 /* Disable speculative loads */ 339 msr SSBS, xzr 340 isb 341 342#if ERRATA_V1_1774420 343 mov x0, x18 344 bl errata_neoverse_v1_1774420_wa 345#endif 346 347#if ERRATA_V1_1791573 348 mov x0, x18 349 bl errata_neoverse_v1_1791573_wa 350#endif 351 352#if ERRATA_V1_1852267 353 mov x0, x18 354 bl errata_neoverse_v1_1852267_wa 355#endif 356 357#if ERRATA_V1_1925756 358 mov x0, x18 359 bl errata_neoverse_v1_1925756_wa 360#endif 361 362#if ERRATA_V1_1940577 363 mov x0, x18 364 bl errata_neoverse_v1_1940577_wa 365#endif 366 367#if ERRATA_V1_1966096 368 mov x0, x18 369 bl errata_neoverse_v1_1966096_wa 370#endif 371 372#if ERRATA_V1_2139242 373 mov x0, x18 374 bl errata_neoverse_v1_2139242_wa 375#endif 376 377#if ERRATA_V1_2108267 378 mov x0, x18 379 bl errata_neoverse_v1_2108267_wa 380#endif 381 382 ret x19 383endfunc neoverse_v1_reset_func 384 385 /* --------------------------------------------- 386 * This function provides Neoverse-V1 specific 387 * register information for crash reporting. 388 * It needs to return with x6 pointing to 389 * a list of register names in ascii and 390 * x8 - x15 having values of registers to be 391 * reported. 392 * --------------------------------------------- 393 */ 394.section .rodata.neoverse_v1_regs, "aS" 395neoverse_v1_regs: /* The ascii list of register names to be reported */ 396 .asciz "cpuectlr_el1", "" 397 398func neoverse_v1_cpu_reg_dump 399 adr x6, neoverse_v1_regs 400 mrs x8, NEOVERSE_V1_CPUECTLR_EL1 401 ret 402endfunc neoverse_v1_cpu_reg_dump 403 404declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \ 405 neoverse_v1_reset_func, \ 406 neoverse_v1_core_pwr_dwn 407