1/* 2 * Copyright (c) 2017-2022, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7#include <arch.h> 8#include <asm_macros.S> 9#include <cpuamu.h> 10#include <cpu_macros.S> 11#include <neoverse_n1.h> 12#include "wa_cve_2022_23960_bhb_vector.S" 13 14/* Hardware handled coherency */ 15#if HW_ASSISTED_COHERENCY == 0 16#error "Neoverse N1 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-N1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 22#endif 23 24 .global neoverse_n1_errata_ic_trap_handler 25 26#if WORKAROUND_CVE_2022_23960 27 wa_cve_2022_23960_bhb_vector_table NEOVERSE_N1_BHB_LOOP_COUNT, neoverse_n1 28#endif /* WORKAROUND_CVE_2022_23960 */ 29 30/* -------------------------------------------------- 31 * Errata Workaround for Neoverse N1 Erratum 1043202. 32 * This applies to revision r0p0 and r1p0 of Neoverse N1. 33 * Inputs: 34 * x0: variant[4:7] and revision[0:3] of current cpu. 35 * Shall clobber: x0-x17 36 * -------------------------------------------------- 37 */ 38func errata_n1_1043202_wa 39 /* Compare x0 against revision r1p0 */ 40 mov x17, x30 41 bl check_errata_1043202 42 cbz x0, 1f 43 44 /* Apply instruction patching sequence */ 45 ldr x0, =0x0 46 msr CPUPSELR_EL3, x0 47 ldr x0, =0xF3BF8F2F 48 msr CPUPOR_EL3, x0 49 ldr x0, =0xFFFFFFFF 50 msr CPUPMR_EL3, x0 51 ldr x0, =0x800200071 52 msr CPUPCR_EL3, x0 53 isb 541: 55 ret x17 56endfunc errata_n1_1043202_wa 57 58func check_errata_1043202 59 /* Applies to r0p0 and r1p0 */ 60 mov x1, #0x10 61 b cpu_rev_var_ls 62endfunc check_errata_1043202 63 64/* -------------------------------------------------- 65 * Disable speculative loads if Neoverse N1 supports 66 * SSBS. 67 * 68 * Shall clobber: x0. 69 * -------------------------------------------------- 70 */ 71func neoverse_n1_disable_speculative_loads 72 /* Check if the PE implements SSBS */ 73 mrs x0, id_aa64pfr1_el1 74 tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 75 b.eq 1f 76 77 /* Disable speculative loads */ 78 msr SSBS, xzr 79 801: 81 ret 82endfunc neoverse_n1_disable_speculative_loads 83 84/* -------------------------------------------------- 85 * Errata Workaround for Neoverse N1 Errata #1073348 86 * This applies to revision r0p0 and r1p0 of Neoverse N1. 87 * Inputs: 88 * x0: variant[4:7] and revision[0:3] of current cpu. 89 * Shall clobber: x0-x17 90 * -------------------------------------------------- 91 */ 92func errata_n1_1073348_wa 93 /* Compare x0 against revision r1p0 */ 94 mov x17, x30 95 bl check_errata_1073348 96 cbz x0, 1f 97 mrs x1, NEOVERSE_N1_CPUACTLR_EL1 98 orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_6 99 msr NEOVERSE_N1_CPUACTLR_EL1, x1 1001: 101 ret x17 102endfunc errata_n1_1073348_wa 103 104func check_errata_1073348 105 /* Applies to r0p0 and r1p0 */ 106 mov x1, #0x10 107 b cpu_rev_var_ls 108endfunc check_errata_1073348 109 110/* -------------------------------------------------- 111 * Errata Workaround for Neoverse N1 Errata #1130799 112 * This applies to revision <=r2p0 of Neoverse N1. 113 * Inputs: 114 * x0: variant[4:7] and revision[0:3] of current cpu. 115 * Shall clobber: x0-x17 116 * -------------------------------------------------- 117 */ 118func errata_n1_1130799_wa 119 /* Compare x0 against revision r2p0 */ 120 mov x17, x30 121 bl check_errata_1130799 122 cbz x0, 1f 123 mrs x1, NEOVERSE_N1_CPUACTLR2_EL1 124 orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_59 125 msr NEOVERSE_N1_CPUACTLR2_EL1, x1 1261: 127 ret x17 128endfunc errata_n1_1130799_wa 129 130func check_errata_1130799 131 /* Applies to <=r2p0 */ 132 mov x1, #0x20 133 b cpu_rev_var_ls 134endfunc check_errata_1130799 135 136/* -------------------------------------------------- 137 * Errata Workaround for Neoverse N1 Errata #1165347 138 * This applies to revision <=r2p0 of Neoverse N1. 139 * Inputs: 140 * x0: variant[4:7] and revision[0:3] of current cpu. 141 * Shall clobber: x0-x17 142 * -------------------------------------------------- 143 */ 144func errata_n1_1165347_wa 145 /* Compare x0 against revision r2p0 */ 146 mov x17, x30 147 bl check_errata_1165347 148 cbz x0, 1f 149 mrs x1, NEOVERSE_N1_CPUACTLR2_EL1 150 orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_0 151 orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_15 152 msr NEOVERSE_N1_CPUACTLR2_EL1, x1 1531: 154 ret x17 155endfunc errata_n1_1165347_wa 156 157func check_errata_1165347 158 /* Applies to <=r2p0 */ 159 mov x1, #0x20 160 b cpu_rev_var_ls 161endfunc check_errata_1165347 162 163/* -------------------------------------------------- 164 * Errata Workaround for Neoverse N1 Errata #1207823 165 * This applies to revision <=r2p0 of Neoverse N1. 166 * Inputs: 167 * x0: variant[4:7] and revision[0:3] of current cpu. 168 * Shall clobber: x0-x17 169 * -------------------------------------------------- 170 */ 171func errata_n1_1207823_wa 172 /* Compare x0 against revision r2p0 */ 173 mov x17, x30 174 bl check_errata_1207823 175 cbz x0, 1f 176 mrs x1, NEOVERSE_N1_CPUACTLR2_EL1 177 orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_11 178 msr NEOVERSE_N1_CPUACTLR2_EL1, x1 1791: 180 ret x17 181endfunc errata_n1_1207823_wa 182 183func check_errata_1207823 184 /* Applies to <=r2p0 */ 185 mov x1, #0x20 186 b cpu_rev_var_ls 187endfunc check_errata_1207823 188 189/* -------------------------------------------------- 190 * Errata Workaround for Neoverse N1 Errata #1220197 191 * This applies to revision <=r2p0 of Neoverse N1. 192 * Inputs: 193 * x0: variant[4:7] and revision[0:3] of current cpu. 194 * Shall clobber: x0-x17 195 * -------------------------------------------------- 196 */ 197func errata_n1_1220197_wa 198 /* Compare x0 against revision r2p0 */ 199 mov x17, x30 200 bl check_errata_1220197 201 cbz x0, 1f 202 mrs x1, NEOVERSE_N1_CPUECTLR_EL1 203 orr x1, x1, NEOVERSE_N1_WS_THR_L2_MASK 204 msr NEOVERSE_N1_CPUECTLR_EL1, x1 2051: 206 ret x17 207endfunc errata_n1_1220197_wa 208 209func check_errata_1220197 210 /* Applies to <=r2p0 */ 211 mov x1, #0x20 212 b cpu_rev_var_ls 213endfunc check_errata_1220197 214 215/* -------------------------------------------------- 216 * Errata Workaround for Neoverse N1 Errata #1257314 217 * This applies to revision <=r3p0 of Neoverse N1. 218 * Inputs: 219 * x0: variant[4:7] and revision[0:3] of current cpu. 220 * Shall clobber: x0-x17 221 * -------------------------------------------------- 222 */ 223func errata_n1_1257314_wa 224 /* Compare x0 against revision r3p0 */ 225 mov x17, x30 226 bl check_errata_1257314 227 cbz x0, 1f 228 mrs x1, NEOVERSE_N1_CPUACTLR3_EL1 229 orr x1, x1, NEOVERSE_N1_CPUACTLR3_EL1_BIT_10 230 msr NEOVERSE_N1_CPUACTLR3_EL1, x1 2311: 232 ret x17 233endfunc errata_n1_1257314_wa 234 235func check_errata_1257314 236 /* Applies to <=r3p0 */ 237 mov x1, #0x30 238 b cpu_rev_var_ls 239endfunc check_errata_1257314 240 241/* -------------------------------------------------- 242 * Errata Workaround for Neoverse N1 Errata #1262606 243 * This applies to revision <=r3p0 of Neoverse N1. 244 * Inputs: 245 * x0: variant[4:7] and revision[0:3] of current cpu. 246 * Shall clobber: x0-x17 247 * -------------------------------------------------- 248 */ 249func errata_n1_1262606_wa 250 /* Compare x0 against revision r3p0 */ 251 mov x17, x30 252 bl check_errata_1262606 253 cbz x0, 1f 254 mrs x1, NEOVERSE_N1_CPUACTLR_EL1 255 orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13 256 msr NEOVERSE_N1_CPUACTLR_EL1, x1 2571: 258 ret x17 259endfunc errata_n1_1262606_wa 260 261func check_errata_1262606 262 /* Applies to <=r3p0 */ 263 mov x1, #0x30 264 b cpu_rev_var_ls 265endfunc check_errata_1262606 266 267/* -------------------------------------------------- 268 * Errata Workaround for Neoverse N1 Errata #1262888 269 * This applies to revision <=r3p0 of Neoverse N1. 270 * Inputs: 271 * x0: variant[4:7] and revision[0:3] of current cpu. 272 * Shall clobber: x0-x17 273 * -------------------------------------------------- 274 */ 275func errata_n1_1262888_wa 276 /* Compare x0 against revision r3p0 */ 277 mov x17, x30 278 bl check_errata_1262888 279 cbz x0, 1f 280 mrs x1, NEOVERSE_N1_CPUECTLR_EL1 281 orr x1, x1, NEOVERSE_N1_CPUECTLR_EL1_MM_TLBPF_DIS_BIT 282 msr NEOVERSE_N1_CPUECTLR_EL1, x1 2831: 284 ret x17 285endfunc errata_n1_1262888_wa 286 287func check_errata_1262888 288 /* Applies to <=r3p0 */ 289 mov x1, #0x30 290 b cpu_rev_var_ls 291endfunc check_errata_1262888 292 293/* -------------------------------------------------- 294 * Errata Workaround for Neoverse N1 Errata #1275112 295 * This applies to revision <=r3p0 of Neoverse N1. 296 * Inputs: 297 * x0: variant[4:7] and revision[0:3] of current cpu. 298 * Shall clobber: x0-x17 299 * -------------------------------------------------- 300 */ 301func errata_n1_1275112_wa 302 /* Compare x0 against revision r3p0 */ 303 mov x17, x30 304 bl check_errata_1275112 305 cbz x0, 1f 306 mrs x1, NEOVERSE_N1_CPUACTLR_EL1 307 orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13 308 msr NEOVERSE_N1_CPUACTLR_EL1, x1 3091: 310 ret x17 311endfunc errata_n1_1275112_wa 312 313func check_errata_1275112 314 /* Applies to <=r3p0 */ 315 mov x1, #0x30 316 b cpu_rev_var_ls 317endfunc check_errata_1275112 318 319/* -------------------------------------------------- 320 * Errata Workaround for Neoverse N1 Erratum 1315703. 321 * This applies to revision <= r3p0 of Neoverse N1. 322 * Inputs: 323 * x0: variant[4:7] and revision[0:3] of current cpu. 324 * Shall clobber: x0-x17 325 * -------------------------------------------------- 326 */ 327func errata_n1_1315703_wa 328 /* Compare x0 against revision r3p1 */ 329 mov x17, x30 330 bl check_errata_1315703 331 cbz x0, 1f 332 333 mrs x0, NEOVERSE_N1_CPUACTLR2_EL1 334 orr x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_16 335 msr NEOVERSE_N1_CPUACTLR2_EL1, x0 336 3371: 338 ret x17 339endfunc errata_n1_1315703_wa 340 341func check_errata_1315703 342 /* Applies to everything <= r3p0. */ 343 mov x1, #0x30 344 b cpu_rev_var_ls 345endfunc check_errata_1315703 346 347/* -------------------------------------------------- 348 * Errata Workaround for Neoverse N1 Erratum 1542419. 349 * This applies to revisions r3p0 - r4p0 of Neoverse N1 350 * Inputs: 351 * x0: variant[4:7] and revision[0:3] of current cpu. 352 * Shall clobber: x0-x17 353 * -------------------------------------------------- 354 */ 355func errata_n1_1542419_wa 356 /* Compare x0 against revision r3p0 and r4p0 */ 357 mov x17, x30 358 bl check_errata_1542419 359 cbz x0, 1f 360 361 /* Apply instruction patching sequence */ 362 ldr x0, =0x0 363 msr CPUPSELR_EL3, x0 364 ldr x0, =0xEE670D35 365 msr CPUPOR_EL3, x0 366 ldr x0, =0xFFFF0FFF 367 msr CPUPMR_EL3, x0 368 ldr x0, =0x08000020007D 369 msr CPUPCR_EL3, x0 370 isb 3711: 372 ret x17 373endfunc errata_n1_1542419_wa 374 375func check_errata_1542419 376 /* Applies to everything r3p0 - r4p0. */ 377 mov x1, #0x30 378 mov x2, #0x40 379 b cpu_rev_var_range 380endfunc check_errata_1542419 381 382 /* -------------------------------------------------- 383 * Errata Workaround for Neoverse N1 Errata #1868343. 384 * This applies to revision <= r4p0 of Neoverse N1. 385 * This workaround is the same as the workaround for 386 * errata 1262606 and 1275112 but applies to a wider 387 * revision range. 388 * Inputs: 389 * x0: variant[4:7] and revision[0:3] of current cpu. 390 * Shall clobber: x0-x17 391 * -------------------------------------------------- 392 */ 393func errata_n1_1868343_wa 394 /* 395 * Compare x0 against revision r4p0 396 */ 397 mov x17, x30 398 bl check_errata_1868343 399 cbz x0, 1f 400 mrs x1, NEOVERSE_N1_CPUACTLR_EL1 401 orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13 402 msr NEOVERSE_N1_CPUACTLR_EL1, x1 403 isb 4041: 405 ret x17 406endfunc errata_n1_1868343_wa 407 408func check_errata_1868343 409 /* Applies to everything <= r4p0 */ 410 mov x1, #0x40 411 b cpu_rev_var_ls 412endfunc check_errata_1868343 413 414 /* -------------------------------------------------- 415 * Errata Workaround for Neoverse N1 Errata #1946160. 416 * This applies to revisions r3p0, r3p1, r4p0, and 417 * r4p1 of Neoverse N1. It also exists in r0p0, r1p0, 418 * and r2p0 but there is no fix in these revisions. 419 * Inputs: 420 * x0: variant[4:7] and revision[0:3] of current cpu. 421 * Shall clobber: x0-x17 422 * -------------------------------------------------- 423 */ 424func errata_n1_1946160_wa 425 /* 426 * Compare x0 against r3p0 - r4p1 427 */ 428 mov x17, x30 429 bl check_errata_1946160 430 cbz x0, 1f 431 432 mov x0, #3 433 msr S3_6_C15_C8_0, x0 434 ldr x0, =0x10E3900002 435 msr S3_6_C15_C8_2, x0 436 ldr x0, =0x10FFF00083 437 msr S3_6_C15_C8_3, x0 438 ldr x0, =0x2001003FF 439 msr S3_6_C15_C8_1, x0 440 441 mov x0, #4 442 msr S3_6_C15_C8_0, x0 443 ldr x0, =0x10E3800082 444 msr S3_6_C15_C8_2, x0 445 ldr x0, =0x10FFF00083 446 msr S3_6_C15_C8_3, x0 447 ldr x0, =0x2001003FF 448 msr S3_6_C15_C8_1, x0 449 450 mov x0, #5 451 msr S3_6_C15_C8_0, x0 452 ldr x0, =0x10E3800200 453 msr S3_6_C15_C8_2, x0 454 ldr x0, =0x10FFF003E0 455 msr S3_6_C15_C8_3, x0 456 ldr x0, =0x2001003FF 457 msr S3_6_C15_C8_1, x0 458 459 isb 4601: 461 ret x17 462endfunc errata_n1_1946160_wa 463 464func check_errata_1946160 465 /* Applies to r3p0 - r4p1. */ 466 mov x1, #0x30 467 mov x2, #0x41 468 b cpu_rev_var_range 469endfunc check_errata_1946160 470 471 /* ---------------------------------------------------- 472 * Errata Workaround for Neoverse N1 Errata #2743102 473 * This applies to revisions <= r4p1 and is still open. 474 * x0: variant[4:7] and revision[0:3] of current cpu. 475 * Shall clobber: x0-x17 476 * ---------------------------------------------------- 477 */ 478func errata_n1_2743102_wa 479 mov x17, x30 480 bl check_errata_2743102 481 cbz x0, 1f 482 483 /* dsb before isb of power down sequence */ 484 dsb sy 4851: 486 ret x17 487endfunc errata_n1_2743102_wa 488 489func check_errata_2743102 490 /* Applies to all revisions <= r4p1 */ 491 mov x1, #0x41 492 b cpu_rev_var_ls 493endfunc check_errata_2743102 494 495func check_errata_cve_2022_23960 496#if WORKAROUND_CVE_2022_23960 497 mov x0, #ERRATA_APPLIES 498#else 499 mov x0, #ERRATA_MISSING 500#endif 501 ret 502endfunc check_errata_cve_2022_23960 503 504func neoverse_n1_reset_func 505 mov x19, x30 506 507 bl neoverse_n1_disable_speculative_loads 508 509 /* Forces all cacheable atomic instructions to be near */ 510 mrs x0, NEOVERSE_N1_CPUACTLR2_EL1 511 orr x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2 512 msr NEOVERSE_N1_CPUACTLR2_EL1, x0 513 isb 514 515 bl cpu_get_rev_var 516 mov x18, x0 517 518#if ERRATA_N1_1043202 519 mov x0, x18 520 bl errata_n1_1043202_wa 521#endif 522 523#if ERRATA_N1_1073348 524 mov x0, x18 525 bl errata_n1_1073348_wa 526#endif 527 528#if ERRATA_N1_1130799 529 mov x0, x18 530 bl errata_n1_1130799_wa 531#endif 532 533#if ERRATA_N1_1165347 534 mov x0, x18 535 bl errata_n1_1165347_wa 536#endif 537 538#if ERRATA_N1_1207823 539 mov x0, x18 540 bl errata_n1_1207823_wa 541#endif 542 543#if ERRATA_N1_1220197 544 mov x0, x18 545 bl errata_n1_1220197_wa 546#endif 547 548#if ERRATA_N1_1257314 549 mov x0, x18 550 bl errata_n1_1257314_wa 551#endif 552 553#if ERRATA_N1_1262606 554 mov x0, x18 555 bl errata_n1_1262606_wa 556#endif 557 558#if ERRATA_N1_1262888 559 mov x0, x18 560 bl errata_n1_1262888_wa 561#endif 562 563#if ERRATA_N1_1275112 564 mov x0, x18 565 bl errata_n1_1275112_wa 566#endif 567 568#if ERRATA_N1_1315703 569 mov x0, x18 570 bl errata_n1_1315703_wa 571#endif 572 573#if ERRATA_N1_1542419 574 mov x0, x18 575 bl errata_n1_1542419_wa 576#endif 577 578#if ERRATA_N1_1868343 579 mov x0, x18 580 bl errata_n1_1868343_wa 581#endif 582 583#if ERRATA_N1_1946160 584 mov x0, x18 585 bl errata_n1_1946160_wa 586#endif 587 588#if ENABLE_AMU 589 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 590 mrs x0, actlr_el3 591 orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT 592 msr actlr_el3, x0 593 594 /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 595 mrs x0, actlr_el2 596 orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT 597 msr actlr_el2, x0 598 599 /* Enable group0 counters */ 600 mov x0, #NEOVERSE_N1_AMU_GROUP0_MASK 601 msr CPUAMCNTENSET_EL0, x0 602#endif 603 604#if NEOVERSE_Nx_EXTERNAL_LLC 605 /* Some system may have External LLC, core needs to be made aware */ 606 mrs x0, NEOVERSE_N1_CPUECTLR_EL1 607 orr x0, x0, NEOVERSE_N1_CPUECTLR_EL1_EXTLLC_BIT 608 msr NEOVERSE_N1_CPUECTLR_EL1, x0 609#endif 610 611#if ERRATA_DSU_936184 612 bl errata_dsu_936184_wa 613#endif 614 615#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 616 /* 617 * The Neoverse-N1 generic vectors are overridden to apply errata 618 * mitigation on exception entry from lower ELs. 619 */ 620 adr x0, wa_cve_vbar_neoverse_n1 621 msr vbar_el3, x0 622#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 623 624 isb 625 ret x19 626endfunc neoverse_n1_reset_func 627 628 /* --------------------------------------------- 629 * HW will do the cache maintenance while powering down 630 * --------------------------------------------- 631 */ 632func neoverse_n1_core_pwr_dwn 633 /* --------------------------------------------- 634 * Enable CPU power down bit in power control register 635 * --------------------------------------------- 636 */ 637 mrs x0, NEOVERSE_N1_CPUPWRCTLR_EL1 638 orr x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK 639 msr NEOVERSE_N1_CPUPWRCTLR_EL1, x0 640#if ERRATA_N1_2743102 641 mov x15, x30 642 bl cpu_get_rev_var 643 bl errata_n1_2743102_wa 644 mov x30, x15 645#endif /* ERRATA_N1_2743102 */ 646 isb 647 ret 648endfunc neoverse_n1_core_pwr_dwn 649 650#if REPORT_ERRATA 651/* 652 * Errata printing function for Neoverse N1. Must follow AAPCS. 653 */ 654func neoverse_n1_errata_report 655 stp x8, x30, [sp, #-16]! 656 657 bl cpu_get_rev_var 658 mov x8, x0 659 660 /* 661 * Report all errata. The revision-variant information is passed to 662 * checking functions of each errata. 663 */ 664 report_errata ERRATA_N1_1043202, neoverse_n1, 1043202 665 report_errata ERRATA_N1_1073348, neoverse_n1, 1073348 666 report_errata ERRATA_N1_1130799, neoverse_n1, 1130799 667 report_errata ERRATA_N1_1165347, neoverse_n1, 1165347 668 report_errata ERRATA_N1_1207823, neoverse_n1, 1207823 669 report_errata ERRATA_N1_1220197, neoverse_n1, 1220197 670 report_errata ERRATA_N1_1257314, neoverse_n1, 1257314 671 report_errata ERRATA_N1_1262606, neoverse_n1, 1262606 672 report_errata ERRATA_N1_1262888, neoverse_n1, 1262888 673 report_errata ERRATA_N1_1275112, neoverse_n1, 1275112 674 report_errata ERRATA_N1_1315703, neoverse_n1, 1315703 675 report_errata ERRATA_N1_1542419, neoverse_n1, 1542419 676 report_errata ERRATA_N1_1868343, neoverse_n1, 1868343 677 report_errata ERRATA_N1_1946160, neoverse_n1, 1946160 678 report_errata ERRATA_N1_2743102, neoverse_n1, 2743102 679 report_errata ERRATA_DSU_936184, neoverse_n1, dsu_936184 680 report_errata WORKAROUND_CVE_2022_23960, neoverse_n1, cve_2022_23960 681 682 ldp x8, x30, [sp], #16 683 ret 684endfunc neoverse_n1_errata_report 685#endif 686 687/* 688 * Handle trap of EL0 IC IVAU instructions to EL3 by executing a TLB 689 * inner-shareable invalidation to an arbitrary address followed by a DSB. 690 * 691 * x1: Exception Syndrome 692 */ 693func neoverse_n1_errata_ic_trap_handler 694 cmp x1, #NEOVERSE_N1_EC_IC_TRAP 695 b.ne 1f 696 tlbi vae3is, xzr 697 dsb sy 698 699 # Skip the IC instruction itself 700 mrs x3, elr_el3 701 add x3, x3, #4 702 msr elr_el3, x3 703 704 ldp x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0] 705 ldp x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2] 706 ldp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] 707 ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 708 709#if IMAGE_BL31 && RAS_EXTENSION 710 /* 711 * Issue Error Synchronization Barrier to synchronize SErrors before 712 * exiting EL3. We're running with EAs unmasked, so any synchronized 713 * errors would be taken immediately; therefore no need to inspect 714 * DISR_EL1 register. 715 */ 716 esb 717#endif 718 exception_return 7191: 720 ret 721endfunc neoverse_n1_errata_ic_trap_handler 722 723 /* --------------------------------------------- 724 * This function provides neoverse_n1 specific 725 * register information for crash reporting. 726 * It needs to return with x6 pointing to 727 * a list of register names in ascii and 728 * x8 - x15 having values of registers to be 729 * reported. 730 * --------------------------------------------- 731 */ 732.section .rodata.neoverse_n1_regs, "aS" 733neoverse_n1_regs: /* The ascii list of register names to be reported */ 734 .asciz "cpuectlr_el1", "" 735 736func neoverse_n1_cpu_reg_dump 737 adr x6, neoverse_n1_regs 738 mrs x8, NEOVERSE_N1_CPUECTLR_EL1 739 ret 740endfunc neoverse_n1_cpu_reg_dump 741 742declare_cpu_ops_eh neoverse_n1, NEOVERSE_N1_MIDR, \ 743 neoverse_n1_reset_func, \ 744 neoverse_n1_errata_ic_trap_handler, \ 745 neoverse_n1_core_pwr_dwn 746