1/* 2 * Copyright (c) 2020-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 <cpu_macros.S> 10#include <neoverse_n2.h> 11#include "wa_cve_2022_23960_bhb_vector.S" 12 13/* Hardware handled coherency */ 14#if HW_ASSISTED_COHERENCY == 0 15#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled" 16#endif 17 18/* 64-bit only core */ 19#if CTX_INCLUDE_AARCH32_REGS == 1 20#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 21#endif 22 23#if WORKAROUND_CVE_2022_23960 24 wa_cve_2022_23960_bhb_vector_table NEOVERSE_N2_BHB_LOOP_COUNT, neoverse_n2 25#endif /* WORKAROUND_CVE_2022_23960 */ 26 27/* -------------------------------------------------- 28 * Errata Workaround for Neoverse N2 Erratum 2002655. 29 * This applies to revision r0p0 of Neoverse N2. it is still open. 30 * Inputs: 31 * x0: variant[4:7] and revision[0:3] of current cpu. 32 * Shall clobber: x0-x17 33 * -------------------------------------------------- 34 */ 35func errata_n2_2002655_wa 36 /* Check revision. */ 37 mov x17, x30 38 bl check_errata_2002655 39 cbz x0, 1f 40 41 /* Apply instruction patching sequence */ 42 ldr x0,=0x6 43 msr S3_6_c15_c8_0,x0 44 ldr x0,=0xF3A08002 45 msr S3_6_c15_c8_2,x0 46 ldr x0,=0xFFF0F7FE 47 msr S3_6_c15_c8_3,x0 48 ldr x0,=0x40000001003ff 49 msr S3_6_c15_c8_1,x0 50 ldr x0,=0x7 51 msr S3_6_c15_c8_0,x0 52 ldr x0,=0xBF200000 53 msr S3_6_c15_c8_2,x0 54 ldr x0,=0xFFEF0000 55 msr S3_6_c15_c8_3,x0 56 ldr x0,=0x40000001003f3 57 msr S3_6_c15_c8_1,x0 58 isb 591: 60 ret x17 61endfunc errata_n2_2002655_wa 62 63func check_errata_2002655 64 /* Applies to r0p0 */ 65 mov x1, #0x00 66 b cpu_rev_var_ls 67endfunc check_errata_2002655 68 69/* --------------------------------------------------------------- 70 * Errata Workaround for Neoverse N2 Erratum 2067956. 71 * This applies to revision r0p0 of Neoverse N2 and is still open. 72 * Inputs: 73 * x0: variant[4:7] and revision[0:3] of current cpu. 74 * Shall clobber: x0-x17 75 * --------------------------------------------------------------- 76 */ 77func errata_n2_2067956_wa 78 /* Compare x0 against revision r0p0 */ 79 mov x17, x30 80 bl check_errata_2067956 81 cbz x0, 1f 82 mrs x1, NEOVERSE_N2_CPUACTLR_EL1 83 orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46 84 msr NEOVERSE_N2_CPUACTLR_EL1, x1 851: 86 ret x17 87endfunc errata_n2_2067956_wa 88 89func check_errata_2067956 90 /* Applies to r0p0 */ 91 mov x1, #0x00 92 b cpu_rev_var_ls 93endfunc check_errata_2067956 94 95/* --------------------------------------------------------------- 96 * Errata Workaround for Neoverse N2 Erratum 2025414. 97 * This applies to revision r0p0 of Neoverse N2 and is still open. 98 * Inputs: 99 * x0: variant[4:7] and revision[0:3] of current cpu. 100 * Shall clobber: x0-x17 101 * --------------------------------------------------------------- 102 */ 103func errata_n2_2025414_wa 104 /* Compare x0 against revision r0p0 */ 105 mov x17, x30 106 bl check_errata_2025414 107 cbz x0, 1f 108 mrs x1, NEOVERSE_N2_CPUECTLR_EL1 109 orr x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT 110 msr NEOVERSE_N2_CPUECTLR_EL1, x1 111 1121: 113 ret x17 114endfunc errata_n2_2025414_wa 115 116func check_errata_2025414 117 /* Applies to r0p0 */ 118 mov x1, #0x00 119 b cpu_rev_var_ls 120endfunc check_errata_2025414 121 122/* --------------------------------------------------------------- 123 * Errata Workaround for Neoverse N2 Erratum 2189731. 124 * This applies to revision r0p0 of Neoverse N2 and is still open. 125 * Inputs: 126 * x0: variant[4:7] and revision[0:3] of current cpu. 127 * Shall clobber: x0-x17 128 * --------------------------------------------------------------- 129 */ 130func errata_n2_2189731_wa 131 /* Compare x0 against revision r0p0 */ 132 mov x17, x30 133 bl check_errata_2189731 134 cbz x0, 1f 135 mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 136 orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44 137 msr NEOVERSE_N2_CPUACTLR5_EL1, x1 138 1391: 140 ret x17 141endfunc errata_n2_2189731_wa 142 143func check_errata_2189731 144 /* Applies to r0p0 */ 145 mov x1, #0x00 146 b cpu_rev_var_ls 147endfunc check_errata_2189731 148 149/* -------------------------------------------------- 150 * Errata Workaround for Neoverse N2 Erratum 2138956. 151 * This applies to revision r0p0 of Neoverse N2. it is still open. 152 * Inputs: 153 * x0: variant[4:7] and revision[0:3] of current cpu. 154 * Shall clobber: x0-x17 155 * -------------------------------------------------- 156 */ 157func errata_n2_2138956_wa 158 /* Check revision. */ 159 mov x17, x30 160 bl check_errata_2138956 161 cbz x0, 1f 162 163 /* Apply instruction patching sequence */ 164 ldr x0,=0x3 165 msr S3_6_c15_c8_0,x0 166 ldr x0,=0xF3A08002 167 msr S3_6_c15_c8_2,x0 168 ldr x0,=0xFFF0F7FE 169 msr S3_6_c15_c8_3,x0 170 ldr x0,=0x10002001003FF 171 msr S3_6_c15_c8_1,x0 172 ldr x0,=0x4 173 msr S3_6_c15_c8_0,x0 174 ldr x0,=0xBF200000 175 msr S3_6_c15_c8_2,x0 176 ldr x0,=0xFFEF0000 177 msr S3_6_c15_c8_3,x0 178 ldr x0,=0x10002001003F3 179 msr S3_6_c15_c8_1,x0 180 isb 1811: 182 ret x17 183endfunc errata_n2_2138956_wa 184 185func check_errata_2138956 186 /* Applies to r0p0 */ 187 mov x1, #0x00 188 b cpu_rev_var_ls 189endfunc check_errata_2138956 190 191/* -------------------------------------------------- 192 * Errata Workaround for Neoverse N2 Erratum 2242415. 193 * This applies to revision r0p0 of Neoverse N2. it is still open. 194 * Inputs: 195 * x0: variant[4:7] and revision[0:3] of current cpu. 196 * Shall clobber: x0-x1, x17 197 * -------------------------------------------------- 198 */ 199func errata_n2_2242415_wa 200 /* Check revision. */ 201 mov x17, x30 202 bl check_errata_2242415 203 cbz x0, 1f 204 205 /* Apply instruction patching sequence */ 206 mrs x1, NEOVERSE_N2_CPUACTLR_EL1 207 orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22 208 msr NEOVERSE_N2_CPUACTLR_EL1, x1 2091: 210 ret x17 211endfunc errata_n2_2242415_wa 212 213func check_errata_2242415 214 /* Applies to r0p0 */ 215 mov x1, #0x00 216 b cpu_rev_var_ls 217endfunc check_errata_2242415 218 219/* -------------------------------------------------- 220 * Errata Workaround for Neoverse N2 Erratum 2138953. 221 * This applies to revision r0p0 of Neoverse N2. it is still open. 222 * Inputs: 223 * x0: variant[4:7] and revision[0:3] of current cpu. 224 * Shall clobber: x0-x1, x17 225 * -------------------------------------------------- 226 */ 227func errata_n2_2138953_wa 228 /* Check revision. */ 229 mov x17, x30 230 bl check_errata_2138953 231 cbz x0, 1f 232 233 /* Apply instruction patching sequence */ 234 mrs x1, NEOVERSE_N2_CPUECTLR2_EL1 235 mov x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV 236 bfi x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH 237 msr NEOVERSE_N2_CPUECTLR2_EL1, x1 2381: 239 ret x17 240endfunc errata_n2_2138953_wa 241 242func check_errata_2138953 243 /* Applies to r0p0 */ 244 mov x1, #0x00 245 b cpu_rev_var_ls 246endfunc check_errata_2138953 247 248/* -------------------------------------------------- 249 * Errata Workaround for Neoverse N2 Erratum 2138958. 250 * This applies to revision r0p0 of Neoverse N2. it is still open. 251 * Inputs: 252 * x0: variant[4:7] and revision[0:3] of current cpu. 253 * Shall clobber: x0-x1, x17 254 * -------------------------------------------------- 255 */ 256func errata_n2_2138958_wa 257 /* Check revision. */ 258 mov x17, x30 259 bl check_errata_2138958 260 cbz x0, 1f 261 262 /* Apply instruction patching sequence */ 263 mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 264 orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13 265 msr NEOVERSE_N2_CPUACTLR5_EL1, x1 2661: 267 ret x17 268endfunc errata_n2_2138958_wa 269 270func check_errata_2138958 271 /* Applies to r0p0 */ 272 mov x1, #0x00 273 b cpu_rev_var_ls 274endfunc check_errata_2138958 275 276/* -------------------------------------------------- 277 * Errata Workaround for Neoverse N2 Erratum 2242400. 278 * This applies to revision r0p0 of Neoverse N2. it is still open. 279 * Inputs: 280 * x0: variant[4:7] and revision[0:3] of current cpu. 281 * Shall clobber: x0-x1, x17 282 * -------------------------------------------------- 283 */ 284func errata_n2_2242400_wa 285 /* Check revision. */ 286 mov x17, x30 287 bl check_errata_2242400 288 cbz x0, 1f 289 290 /* Apply instruction patching sequence */ 291 mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 292 orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17 293 msr NEOVERSE_N2_CPUACTLR5_EL1, x1 294 ldr x0, =0x2 295 msr S3_6_c15_c8_0, x0 296 ldr x0, =0x10F600E000 297 msr S3_6_c15_c8_2, x0 298 ldr x0, =0x10FF80E000 299 msr S3_6_c15_c8_3, x0 300 ldr x0, =0x80000000003FF 301 msr S3_6_c15_c8_1, x0 302 isb 3031: 304 ret x17 305endfunc errata_n2_2242400_wa 306 307func check_errata_2242400 308 /* Applies to r0p0 */ 309 mov x1, #0x00 310 b cpu_rev_var_ls 311endfunc check_errata_2242400 312 313/* -------------------------------------------------- 314 * Errata Workaround for Neoverse N2 Erratum 2280757. 315 * This applies to revision r0p0 of Neoverse N2. it is still open. 316 * Inputs: 317 * x0: variant[4:7] and revision[0:3] of current cpu. 318 * Shall clobber: x0-x1, x17 319 * -------------------------------------------------- 320 */ 321func errata_n2_2280757_wa 322 /* Check revision. */ 323 mov x17, x30 324 bl check_errata_2280757 325 cbz x0, 1f 326 327 /* Apply instruction patching sequence */ 328 mrs x1, NEOVERSE_N2_CPUACTLR_EL1 329 orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22 330 msr NEOVERSE_N2_CPUACTLR_EL1, x1 3311: 332 ret x17 333endfunc errata_n2_2280757_wa 334 335func check_errata_2280757 336 /* Applies to r0p0 */ 337 mov x1, #0x00 338 b cpu_rev_var_ls 339endfunc check_errata_2280757 340 341/* -------------------------------------------------- 342 * Errata Workaround for Neoverse N2 Erratum 2326639. 343 * This applies to revision r0p0 of Neoverse N2, 344 * fixed in r0p1. 345 * Inputs: 346 * x0: variant[4:7] and revision[0:3] of current cpu. 347 * Shall clobber: x0-x1, x17 348 * -------------------------------------------------- 349 */ 350func errata_n2_2326639_wa 351 /* Check revision. */ 352 mov x17, x30 353 bl check_errata_2326639 354 cbz x0, 1f 355 356 /* Set bit 36 in ACTLR2_EL1 */ 357 mrs x1, NEOVERSE_N2_CPUACTLR2_EL1 358 orr x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_36 359 msr NEOVERSE_N2_CPUACTLR2_EL1, x1 3601: 361 ret x17 362endfunc errata_n2_2326639_wa 363 364func check_errata_2326639 365 /* Applies to r0p0, fixed in r0p1 */ 366 mov x1, #0x00 367 b cpu_rev_var_ls 368endfunc check_errata_2326639 369 370/* -------------------------------------------------- 371 * Errata Workaround for Neoverse N2 Erratum 2376738. 372 * This applies to revision r0p0 of Neoverse N2, 373 * fixed in r0p1. 374 * Inputs: 375 * x0: variant[4:7] and revision[0:3] of current CPU. 376 * Shall clobber: x0-x1, x17 377 * -------------------------------------------------- 378 */ 379func errata_n2_2376738_wa 380 mov x17, x30 381 bl check_errata_2376738 382 cbz x0, 1f 383 384 /* Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM 385 * ST to behave like PLD/PFRM LD and not cause 386 * invalidations to other PE caches. 387 */ 388 mrs x1, NEOVERSE_N2_CPUACTLR2_EL1 389 orr x1, x1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_0 390 msr NEOVERSE_N2_CPUACTLR2_EL1, x1 3911: 392 ret x17 393endfunc errata_n2_2376738_wa 394 395func check_errata_2376738 396 /* Applies to r0p0, fixed in r0p1 */ 397 mov x1, 0x00 398 b cpu_rev_var_ls 399endfunc check_errata_2376738 400 401/* -------------------------------------------------- 402 * Errata Workaround for Neoverse N2 Erratum 2388450. 403 * This applies to revision r0p0 of Neoverse N2, 404 * fixed in r0p1. 405 * Inputs: 406 * x0: variant[4:7] and revision[0:3] of current cpu. 407 * Shall clobber: x0-x1, x17 408 * -------------------------------------------------- 409 */ 410func errata_n2_2388450_wa 411 /* Check revision. */ 412 mov x17, x30 413 bl check_errata_2388450 414 cbz x0, 1f 415 416 /*Set bit 40 in ACTLR2_EL1 */ 417 mrs x1, NEOVERSE_N2_CPUACTLR2_EL1 418 orr x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_40 419 msr NEOVERSE_N2_CPUACTLR2_EL1, x1 420 isb 4211: 422 ret x17 423endfunc errata_n2_2388450_wa 424 425func check_errata_2388450 426 /* Applies to r0p0, fixed in r0p1 */ 427 mov x1, #0x00 428 b cpu_rev_var_ls 429endfunc check_errata_2388450 430 431func check_errata_cve_2022_23960 432#if WORKAROUND_CVE_2022_23960 433 mov x0, #ERRATA_APPLIES 434#else 435 mov x0, #ERRATA_MISSING 436#endif 437 ret 438endfunc check_errata_cve_2022_23960 439 440 /* ------------------------------------------- 441 * The CPU Ops reset function for Neoverse N2. 442 * ------------------------------------------- 443 */ 444func neoverse_n2_reset_func 445 mov x19, x30 446 447 /* Check if the PE implements SSBS */ 448 mrs x0, id_aa64pfr1_el1 449 tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 450 b.eq 1f 451 452 /* Disable speculative loads */ 453 msr SSBS, xzr 4541: 455 /* Force all cacheable atomic instructions to be near */ 456 mrs x0, NEOVERSE_N2_CPUACTLR2_EL1 457 orr x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2 458 msr NEOVERSE_N2_CPUACTLR2_EL1, x0 459 460 /* Get the CPU revision and stash it in x18. */ 461 bl cpu_get_rev_var 462 mov x18, x0 463 464#if ERRATA_DSU_2313941 465 bl errata_dsu_2313941_wa 466#endif 467 468#if ERRATA_N2_2067956 469 mov x0, x18 470 bl errata_n2_2067956_wa 471#endif 472 473#if ERRATA_N2_2025414 474 mov x0, x18 475 bl errata_n2_2025414_wa 476#endif 477 478#if ERRATA_N2_2189731 479 mov x0, x18 480 bl errata_n2_2189731_wa 481#endif 482 483 484#if ERRATA_N2_2138956 485 mov x0, x18 486 bl errata_n2_2138956_wa 487#endif 488 489#if ERRATA_N2_2138953 490 mov x0, x18 491 bl errata_n2_2138953_wa 492#endif 493 494#if ERRATA_N2_2242415 495 mov x0, x18 496 bl errata_n2_2242415_wa 497#endif 498 499#if ERRATA_N2_2138958 500 mov x0, x18 501 bl errata_n2_2138958_wa 502#endif 503 504#if ERRATA_N2_2242400 505 mov x0, x18 506 bl errata_n2_2242400_wa 507#endif 508 509#if ERRATA_N2_2280757 510 mov x0, x18 511 bl errata_n2_2280757_wa 512#endif 513 514#if ERRATA_N2_2376738 515 mov x0, x18 516 bl errata_n2_2376738_wa 517#endif 518 519#if ERRATA_N2_2388450 520 mov x0, x18 521 bl errata_n2_2388450_wa 522#endif 523 524#if ENABLE_AMU 525 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 526 mrs x0, cptr_el3 527 orr x0, x0, #TAM_BIT 528 msr cptr_el3, x0 529 530 /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 531 mrs x0, cptr_el2 532 orr x0, x0, #TAM_BIT 533 msr cptr_el2, x0 534 535 /* No need to enable the counters as this would be done at el3 exit */ 536#endif 537 538#if NEOVERSE_Nx_EXTERNAL_LLC 539 /* Some systems may have External LLC, core needs to be made aware */ 540 mrs x0, NEOVERSE_N2_CPUECTLR_EL1 541 orr x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT 542 msr NEOVERSE_N2_CPUECTLR_EL1, x0 543#endif 544 545#if ERRATA_N2_2002655 546 mov x0, x18 547 bl errata_n2_2002655_wa 548#endif 549 550#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 551 /* 552 * The Neoverse-N2 generic vectors are overridden to apply errata 553 * mitigation on exception entry from lower ELs. 554 */ 555 adr x0, wa_cve_vbar_neoverse_n2 556 msr vbar_el3, x0 557#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 558 559 isb 560 ret x19 561endfunc neoverse_n2_reset_func 562 563func neoverse_n2_core_pwr_dwn 564#if ERRATA_N2_2326639 565 mov x15, x30 566 bl cpu_get_rev_var 567 bl errata_n2_2326639_wa 568 mov x30, x15 569#endif /* ERRATA_N2_2326639 */ 570 571 /* --------------------------------------------------- 572 * Enable CPU power down bit in power control register 573 * No need to do cache maintenance here. 574 * --------------------------------------------------- 575 */ 576 mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1 577 orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT 578 msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0 579 isb 580 ret 581endfunc neoverse_n2_core_pwr_dwn 582 583#if REPORT_ERRATA 584/* 585 * Errata printing function for Neoverse N2 cores. Must follow AAPCS. 586 */ 587func neoverse_n2_errata_report 588 stp x8, x30, [sp, #-16]! 589 590 bl cpu_get_rev_var 591 mov x8, x0 592 593 /* 594 * Report all errata. The revision-variant information is passed to 595 * checking functions of each errata. 596 */ 597 report_errata ERRATA_N2_2002655, neoverse_n2, 2002655 598 report_errata ERRATA_N2_2067956, neoverse_n2, 2067956 599 report_errata ERRATA_N2_2025414, neoverse_n2, 2025414 600 report_errata ERRATA_N2_2189731, neoverse_n2, 2189731 601 report_errata ERRATA_N2_2138956, neoverse_n2, 2138956 602 report_errata ERRATA_N2_2138953, neoverse_n2, 2138953 603 report_errata ERRATA_N2_2242415, neoverse_n2, 2242415 604 report_errata ERRATA_N2_2138958, neoverse_n2, 2138958 605 report_errata ERRATA_N2_2242400, neoverse_n2, 2242400 606 report_errata ERRATA_N2_2280757, neoverse_n2, 2280757 607 report_errata ERRATA_N2_2326639, neoverse_n2, 2326639 608 report_errata ERRATA_N2_2376738, neoverse_n2, 2376738 609 report_errata ERRATA_N2_2388450, neoverse_n2, 2388450 610 report_errata WORKAROUND_CVE_2022_23960, neoverse_n2, cve_2022_23960 611 report_errata ERRATA_DSU_2313941, neoverse_n2, dsu_2313941 612 613 ldp x8, x30, [sp], #16 614 ret 615endfunc neoverse_n2_errata_report 616#endif 617 618 /* --------------------------------------------- 619 * This function provides Neoverse N2 specific 620 * register information for crash reporting. 621 * It needs to return with x6 pointing to 622 * a list of register names in ASCII and 623 * x8 - x15 having values of registers to be 624 * reported. 625 * --------------------------------------------- 626 */ 627.section .rodata.neoverse_n2_regs, "aS" 628neoverse_n2_regs: /* The ASCII list of register names to be reported */ 629 .asciz "cpupwrctlr_el1", "" 630 631func neoverse_n2_cpu_reg_dump 632 adr x6, neoverse_n2_regs 633 mrs x8, NEOVERSE_N2_CPUPWRCTLR_EL1 634 ret 635endfunc neoverse_n2_cpu_reg_dump 636 637declare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \ 638 neoverse_n2_reset_func, \ 639 neoverse_n2_core_pwr_dwn 640