1/* 2 * Copyright (c) 2019-2022, 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#include "wa_cve_2022_23960_bhb_vector.S" 14 15/* Hardware handled coherency */ 16#if HW_ASSISTED_COHERENCY == 0 17#error "Neoverse V1 must be compiled with HW_ASSISTED_COHERENCY enabled" 18#endif 19 20/* 64-bit only core */ 21#if CTX_INCLUDE_AARCH32_REGS == 1 22#error "Neoverse-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 23#endif 24 25#if WORKAROUND_CVE_2022_23960 26 wa_cve_2022_23960_bhb_vector_table NEOVERSE_V1_BHB_LOOP_COUNT, neoverse_v1 27#endif /* WORKAROUND_CVE_2022_23960 */ 28 29 /* -------------------------------------------------- 30 * Errata Workaround for Neoverse V1 Errata #1774420. 31 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 32 * x0: variant[4:7] and revision[0:3] of current cpu. 33 * Shall clobber: x0-x17 34 * -------------------------------------------------- 35 */ 36func errata_neoverse_v1_1774420_wa 37 /* Check workaround compatibility. */ 38 mov x17, x30 39 bl check_errata_1774420 40 cbz x0, 1f 41 42 /* Set bit 53 in CPUECTLR_EL1 */ 43 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 44 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53 45 msr NEOVERSE_V1_CPUECTLR_EL1, x1 46 isb 471: 48 ret x17 49endfunc errata_neoverse_v1_1774420_wa 50 51func check_errata_1774420 52 /* Applies to r0p0 and r1p0. */ 53 mov x1, #0x10 54 b cpu_rev_var_ls 55endfunc check_errata_1774420 56 57 /* -------------------------------------------------- 58 * Errata Workaround for Neoverse V1 Errata #1791573. 59 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 60 * x0: variant[4:7] and revision[0:3] of current cpu. 61 * Shall clobber: x0-x17 62 * -------------------------------------------------- 63 */ 64func errata_neoverse_v1_1791573_wa 65 /* Check workaround compatibility. */ 66 mov x17, x30 67 bl check_errata_1791573 68 cbz x0, 1f 69 70 /* Set bit 2 in ACTLR2_EL1 */ 71 mrs x1, NEOVERSE_V1_ACTLR2_EL1 72 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2 73 msr NEOVERSE_V1_ACTLR2_EL1, x1 74 isb 751: 76 ret x17 77endfunc errata_neoverse_v1_1791573_wa 78 79func check_errata_1791573 80 /* Applies to r0p0 and r1p0. */ 81 mov x1, #0x10 82 b cpu_rev_var_ls 83endfunc check_errata_1791573 84 85 /* -------------------------------------------------- 86 * Errata Workaround for Neoverse V1 Errata #1852267. 87 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 88 * x0: variant[4:7] and revision[0:3] of current cpu. 89 * Shall clobber: x0-x17 90 * -------------------------------------------------- 91 */ 92func errata_neoverse_v1_1852267_wa 93 /* Check workaround compatibility. */ 94 mov x17, x30 95 bl check_errata_1852267 96 cbz x0, 1f 97 98 /* Set bit 28 in ACTLR2_EL1 */ 99 mrs x1, NEOVERSE_V1_ACTLR2_EL1 100 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28 101 msr NEOVERSE_V1_ACTLR2_EL1, x1 102 isb 1031: 104 ret x17 105endfunc errata_neoverse_v1_1852267_wa 106 107func check_errata_1852267 108 /* Applies to r0p0 and r1p0. */ 109 mov x1, #0x10 110 b cpu_rev_var_ls 111endfunc check_errata_1852267 112 113 /* -------------------------------------------------- 114 * Errata Workaround for Neoverse V1 Errata #1925756. 115 * This applies to revisions <= r1p1. 116 * x0: variant[4:7] and revision[0:3] of current cpu. 117 * Shall clobber: x0-x17 118 * -------------------------------------------------- 119 */ 120func errata_neoverse_v1_1925756_wa 121 /* Check workaround compatibility. */ 122 mov x17, x30 123 bl check_errata_1925756 124 cbz x0, 1f 125 126 /* Set bit 8 in CPUECTLR_EL1 */ 127 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 128 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8 129 msr NEOVERSE_V1_CPUECTLR_EL1, x1 130 isb 1311: 132 ret x17 133endfunc errata_neoverse_v1_1925756_wa 134 135func check_errata_1925756 136 /* Applies to <= r1p1. */ 137 mov x1, #0x11 138 b cpu_rev_var_ls 139endfunc check_errata_1925756 140 141 /* -------------------------------------------------- 142 * Errata Workaround for Neoverse V1 Erratum #1940577 143 * This applies to revisions r1p0 - r1p1 and is open. 144 * It also exists in r0p0 but there is no fix in that 145 * revision. 146 * Inputs: 147 * x0: variant[4:7] and revision[0:3] of current cpu. 148 * Shall clobber: x0-x17 149 * -------------------------------------------------- 150 */ 151func errata_neoverse_v1_1940577_wa 152 /* Compare x0 against revisions r1p0 - r1p1 */ 153 mov x17, x30 154 bl check_errata_1940577 155 cbz x0, 1f 156 157 mov x0, #0 158 msr S3_6_C15_C8_0, x0 159 ldr x0, =0x10E3900002 160 msr S3_6_C15_C8_2, x0 161 ldr x0, =0x10FFF00083 162 msr S3_6_C15_C8_3, x0 163 ldr x0, =0x2001003FF 164 msr S3_6_C15_C8_1, x0 165 166 mov x0, #1 167 msr S3_6_C15_C8_0, x0 168 ldr x0, =0x10E3800082 169 msr S3_6_C15_C8_2, x0 170 ldr x0, =0x10FFF00083 171 msr S3_6_C15_C8_3, x0 172 ldr x0, =0x2001003FF 173 msr S3_6_C15_C8_1, x0 174 175 mov x0, #2 176 msr S3_6_C15_C8_0, x0 177 ldr x0, =0x10E3800200 178 msr S3_6_C15_C8_2, x0 179 ldr x0, =0x10FFF003E0 180 msr S3_6_C15_C8_3, x0 181 ldr x0, =0x2001003FF 182 msr S3_6_C15_C8_1, x0 183 184 isb 1851: 186 ret x17 187endfunc errata_neoverse_v1_1940577_wa 188 189func check_errata_1940577 190 /* Applies to revisions r1p0 - r1p1. */ 191 mov x1, #0x10 192 mov x2, #0x11 193 b cpu_rev_var_range 194endfunc check_errata_1940577 195 196 /* -------------------------------------------------- 197 * Errata Workaround for Neoverse V1 Errata #1966096 198 * This applies to revisions r1p0 - r1p1 and is open. 199 * It also exists in r0p0 but there is no workaround 200 * for that revision. 201 * x0: variant[4:7] and revision[0:3] of current cpu. 202 * Shall clobber: x0-x17 203 * -------------------------------------------------- 204 */ 205func errata_neoverse_v1_1966096_wa 206 /* Check workaround compatibility. */ 207 mov x17, x30 208 bl check_errata_1966096 209 cbz x0, 1f 210 211 /* Apply the workaround. */ 212 mov x0, #0x3 213 msr S3_6_C15_C8_0, x0 214 ldr x0, =0xEE010F12 215 msr S3_6_C15_C8_2, x0 216 ldr x0, =0xFFFF0FFF 217 msr S3_6_C15_C8_3, x0 218 ldr x0, =0x80000000003FF 219 msr S3_6_C15_C8_1, x0 220 isb 221 2221: 223 ret x17 224endfunc errata_neoverse_v1_1966096_wa 225 226func check_errata_1966096 227 mov x1, #0x10 228 mov x2, #0x11 229 b cpu_rev_var_range 230endfunc check_errata_1966096 231 232 /* -------------------------------------------------- 233 * Errata Workaround for Neoverse V1 Errata #2139242. 234 * This applies to revisions r0p0, r1p0, and r1p1, it 235 * is still open. 236 * x0: variant[4:7] and revision[0:3] of current cpu. 237 * Shall clobber: x0-x17 238 * -------------------------------------------------- 239 */ 240func errata_neoverse_v1_2139242_wa 241 /* Check workaround compatibility. */ 242 mov x17, x30 243 bl check_errata_2139242 244 cbz x0, 1f 245 246 /* Apply the workaround. */ 247 mov x0, #0x3 248 msr S3_6_C15_C8_0, x0 249 ldr x0, =0xEE720F14 250 msr S3_6_C15_C8_2, x0 251 ldr x0, =0xFFFF0FDF 252 msr S3_6_C15_C8_3, x0 253 ldr x0, =0x40000005003FF 254 msr S3_6_C15_C8_1, x0 255 isb 256 2571: 258 ret x17 259endfunc errata_neoverse_v1_2139242_wa 260 261func check_errata_2139242 262 /* Applies to r0p0, r1p0, r1p1 */ 263 mov x1, #0x11 264 b cpu_rev_var_ls 265endfunc check_errata_2139242 266 267 /* -------------------------------------------------- 268 * Errata Workaround for Neoverse V1 Errata #2108267. 269 * This applies to revisions r0p0, r1p0, and r1p1, it 270 * is still open. 271 * x0: variant[4:7] and revision[0:3] of current cpu. 272 * Shall clobber: x0-x1, x17 273 * -------------------------------------------------- 274 */ 275func errata_neoverse_v1_2108267_wa 276 /* Check workaround compatibility. */ 277 mov x17, x30 278 bl check_errata_2108267 279 cbz x0, 1f 280 281 /* Apply the workaround. */ 282 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 283 mov x0, #NEOVERSE_V1_CPUECTLR_EL1_PF_MODE_CNSRV 284 bfi x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH 285 msr NEOVERSE_V1_CPUECTLR_EL1, x1 2861: 287 ret x17 288endfunc errata_neoverse_v1_2108267_wa 289 290func check_errata_2108267 291 /* Applies to r0p0, r1p0, r1p1 */ 292 mov x1, #0x11 293 b cpu_rev_var_ls 294endfunc check_errata_2108267 295 296 /* -------------------------------------------------- 297 * Errata Workaround for Neoverse V1 Errata #2216392. 298 * This applies to revisions r1p0 and r1p1 and is 299 * still open. 300 * This issue is also present in r0p0 but there is no 301 * workaround in that revision. 302 * x0: variant[4:7] and revision[0:3] of current cpu. 303 * Shall clobber: x0-x17 304 * -------------------------------------------------- 305 */ 306func errata_neoverse_v1_2216392_wa 307 /* Check workaround compatibility. */ 308 mov x17, x30 309 bl check_errata_2216392 310 cbz x0, 1f 311 312 ldr x0, =0x5 313 msr S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */ 314 ldr x0, =0x10F600E000 315 msr S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */ 316 ldr x0, =0x10FF80E000 317 msr S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */ 318 ldr x0, =0x80000000003FF 319 msr S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */ 320 321 isb 3221: 323 ret x17 324endfunc errata_neoverse_v1_2216392_wa 325 326func check_errata_2216392 327 /* Applies to revisions r1p0 and r1p1. */ 328 mov x1, #CPU_REV(1, 0) 329 mov x2, #CPU_REV(1, 1) 330 b cpu_rev_var_range 331endfunc check_errata_2216392 332 333 /* ----------------------------------------------------------------- 334 * Errata Workaround for Neoverse V1 Errata #2294912. 335 * This applies to revisions r0p0, r1p0, and r1p1 and is still open. 336 * x0: variant[4:7] and revision[0:3] of current cpu. 337 * Shall clobber: x0-x17 338 * ----------------------------------------------------------------- 339 */ 340func errata_neoverse_v1_2294912_wa 341 /* Check workaround compatibility. */ 342 mov x17, x30 343 bl check_errata_2294912 344 cbz x0, 1f 345 346 /* Set bit 0 in ACTLR2_EL1 */ 347 mrs x1, NEOVERSE_V1_ACTLR2_EL1 348 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_0 349 msr NEOVERSE_V1_ACTLR2_EL1, x1 350 isb 3511: 352 ret x17 353endfunc errata_neoverse_v1_2294912_wa 354 355func check_errata_2294912 356 /* Applies to r0p0, r1p0, and r1p1 right now */ 357 mov x1, #0x11 358 b cpu_rev_var_ls 359endfunc check_errata_2294912 360 361 /* --------------------------------------------------- 362 * Errata Workaround for Neoverse V1 Errata #2372203. 363 * This applies to revisions <= r1p1 and is still open. 364 * x0: variant[4:7] and revision[0:3] of current cpu. 365 * Shall clobber: x0-x17 366 * ---------------------------------------------------- 367 */ 368func errata_neoverse_v1_2372203_wa 369 /* Check workaround compatibility. */ 370 mov x17, x30 371 bl check_errata_2372203 372 cbz x0, 1f 373 374 /* Set bit 40 in ACTLR2_EL1 */ 375 mrs x1, NEOVERSE_V1_ACTLR2_EL1 376 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_40 377 msr NEOVERSE_V1_ACTLR2_EL1, x1 378 isb 3791: 380 ret x17 381endfunc errata_neoverse_v1_2372203_wa 382 383func check_errata_2372203 384 /* Applies to <= r1p1. */ 385 mov x1, #0x11 386 b cpu_rev_var_ls 387endfunc check_errata_2372203 388 389func check_errata_cve_2022_23960 390#if WORKAROUND_CVE_2022_23960 391 mov x0, #ERRATA_APPLIES 392#else 393 mov x0, #ERRATA_MISSING 394#endif 395 ret 396endfunc check_errata_cve_2022_23960 397 398 /* --------------------------------------------- 399 * HW will do the cache maintenance while powering down 400 * --------------------------------------------- 401 */ 402func neoverse_v1_core_pwr_dwn 403 /* --------------------------------------------- 404 * Enable CPU power down bit in power control register 405 * --------------------------------------------- 406 */ 407 mrs x0, NEOVERSE_V1_CPUPWRCTLR_EL1 408 orr x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 409 msr NEOVERSE_V1_CPUPWRCTLR_EL1, x0 410 isb 411 ret 412endfunc neoverse_v1_core_pwr_dwn 413 414 /* 415 * Errata printing function for Neoverse V1. Must follow AAPCS. 416 */ 417#if REPORT_ERRATA 418func neoverse_v1_errata_report 419 stp x8, x30, [sp, #-16]! 420 421 bl cpu_get_rev_var 422 mov x8, x0 423 424 /* 425 * Report all errata. The revision-variant information is passed to 426 * checking functions of each errata. 427 */ 428 report_errata ERRATA_V1_1774420, neoverse_v1, 1774420 429 report_errata ERRATA_V1_1791573, neoverse_v1, 1791573 430 report_errata ERRATA_V1_1852267, neoverse_v1, 1852267 431 report_errata ERRATA_V1_1925756, neoverse_v1, 1925756 432 report_errata ERRATA_V1_1940577, neoverse_v1, 1940577 433 report_errata ERRATA_V1_1966096, neoverse_v1, 1966096 434 report_errata ERRATA_V1_2139242, neoverse_v1, 2139242 435 report_errata ERRATA_V1_2108267, neoverse_v1, 2108267 436 report_errata ERRATA_V1_2216392, neoverse_v1, 2216392 437 report_errata ERRATA_V1_2294912, neoverse_v1, 2294912 438 report_errata ERRATA_V1_2372203, neoverse_v1, 2372203 439 report_errata WORKAROUND_CVE_2022_23960, neoverse_v1, cve_2022_23960 440 441 ldp x8, x30, [sp], #16 442 ret 443endfunc neoverse_v1_errata_report 444#endif 445 446func neoverse_v1_reset_func 447 mov x19, x30 448 449 /* Disable speculative loads */ 450 msr SSBS, xzr 451 isb 452 453#if ERRATA_V1_1774420 454 mov x0, x18 455 bl errata_neoverse_v1_1774420_wa 456#endif 457 458#if ERRATA_V1_1791573 459 mov x0, x18 460 bl errata_neoverse_v1_1791573_wa 461#endif 462 463#if ERRATA_V1_1852267 464 mov x0, x18 465 bl errata_neoverse_v1_1852267_wa 466#endif 467 468#if ERRATA_V1_1925756 469 mov x0, x18 470 bl errata_neoverse_v1_1925756_wa 471#endif 472 473#if ERRATA_V1_1940577 474 mov x0, x18 475 bl errata_neoverse_v1_1940577_wa 476#endif 477 478#if ERRATA_V1_1966096 479 mov x0, x18 480 bl errata_neoverse_v1_1966096_wa 481#endif 482 483#if ERRATA_V1_2139242 484 mov x0, x18 485 bl errata_neoverse_v1_2139242_wa 486#endif 487 488#if ERRATA_V1_2108267 489 mov x0, x18 490 bl errata_neoverse_v1_2108267_wa 491#endif 492 493#if ERRATA_V1_2216392 494 mov x0, x18 495 bl errata_neoverse_v1_2216392_wa 496#endif 497 498#if ERRATA_V1_2294912 499 mov x0, x18 500 bl errata_neoverse_v1_2294912_wa 501#endif 502 503#if ERRATA_V1_2372203 504 mov x0, x18 505 bl errata_neoverse_v1_2372203_wa 506#endif 507 508#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 509 /* 510 * The Neoverse-V1 generic vectors are overridden to apply errata 511 * mitigation on exception entry from lower ELs. 512 */ 513 adr x0, wa_cve_vbar_neoverse_v1 514 msr vbar_el3, x0 515#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 516 517 isb 518 ret x19 519endfunc neoverse_v1_reset_func 520 521 /* --------------------------------------------- 522 * This function provides Neoverse-V1 specific 523 * register information for crash reporting. 524 * It needs to return with x6 pointing to 525 * a list of register names in ascii and 526 * x8 - x15 having values of registers to be 527 * reported. 528 * --------------------------------------------- 529 */ 530.section .rodata.neoverse_v1_regs, "aS" 531neoverse_v1_regs: /* The ascii list of register names to be reported */ 532 .asciz "cpuectlr_el1", "" 533 534func neoverse_v1_cpu_reg_dump 535 adr x6, neoverse_v1_regs 536 mrs x8, NEOVERSE_V1_CPUECTLR_EL1 537 ret 538endfunc neoverse_v1_cpu_reg_dump 539 540declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \ 541 neoverse_v1_reset_func, \ 542 neoverse_v1_core_pwr_dwn 543