1/* 2 * Copyright (c) 2021-2023, 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 <cortex_x2.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 "Cortex X2 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 "Cortex X2 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 CORTEX_X2_BHB_LOOP_COUNT, cortex_x2 27#endif /* WORKAROUND_CVE_2022_23960 */ 28 29 /* -------------------------------------------------- 30 * Errata Workaround for Cortex X2 Errata #2002765. 31 * This applies to revisions r0p0, r1p0, and r2p0 and 32 * is open. 33 * x0: variant[4:7] and revision[0:3] of current cpu. 34 * Shall clobber: x0, x1, x17 35 * -------------------------------------------------- 36 */ 37func errata_cortex_x2_2002765_wa 38 /* Check workaround compatibility. */ 39 mov x17, x30 40 bl check_errata_2002765 41 cbz x0, 1f 42 43 ldr x0, =0x6 44 msr S3_6_C15_C8_0, x0 /* CPUPSELR_EL3 */ 45 ldr x0, =0xF3A08002 46 msr S3_6_C15_C8_2, x0 /* CPUPOR_EL3 */ 47 ldr x0, =0xFFF0F7FE 48 msr S3_6_C15_C8_3, x0 /* CPUPMR_EL3 */ 49 ldr x0, =0x40000001003ff 50 msr S3_6_C15_C8_1, x0 /* CPUPCR_EL3 */ 51 isb 52 531: 54 ret x17 55endfunc errata_cortex_x2_2002765_wa 56 57func check_errata_2002765 58 /* Applies to r0p0 - r2p0 */ 59 mov x1, #0x20 60 b cpu_rev_var_ls 61endfunc check_errata_2002765 62 63 /* -------------------------------------------------- 64 * Errata Workaround for Cortex X2 Errata #2058056. 65 * This applies to revisions r0p0, r1p0, and r2p0 and 66 * is open. 67 * x0: variant[4:7] and revision[0:3] of current cpu. 68 * Shall clobber: x0, x1, x17 69 * -------------------------------------------------- 70 */ 71func errata_cortex_x2_2058056_wa 72 /* Check workaround compatibility. */ 73 mov x17, x30 74 bl check_errata_2058056 75 cbz x0, 1f 76 77 mrs x1, CORTEX_X2_CPUECTLR2_EL1 78 mov x0, #CORTEX_X2_CPUECTLR2_EL1_PF_MODE_CNSRV 79 bfi x1, x0, #CORTEX_X2_CPUECTLR2_EL1_PF_MODE_SHIFT, #CORTEX_X2_CPUECTLR2_EL1_PF_MODE_WIDTH 80 msr CORTEX_X2_CPUECTLR2_EL1, x1 81 821: 83 ret x17 84endfunc errata_cortex_x2_2058056_wa 85 86func check_errata_2058056 87 /* Applies to r0p0 - r2p0 */ 88 mov x1, #0x20 89 b cpu_rev_var_ls 90endfunc check_errata_2058056 91 92 /* -------------------------------------------------- 93 * Errata Workaround for Cortex X2 Errata #2083908. 94 * This applies to revision r2p0 and is open. 95 * x0: variant[4:7] and revision[0:3] of current cpu. 96 * Shall clobber: x0-x2, x17 97 * -------------------------------------------------- 98 */ 99func errata_cortex_x2_2083908_wa 100 /* Check workaround compatibility. */ 101 mov x17, x30 102 bl check_errata_2083908 103 cbz x0, 1f 104 105 /* Apply the workaround by setting bit 13 in CPUACTLR5_EL1. */ 106 mrs x1, CORTEX_X2_CPUACTLR5_EL1 107 orr x1, x1, #BIT(13) 108 msr CORTEX_X2_CPUACTLR5_EL1, x1 109 1101: 111 ret x17 112endfunc errata_cortex_x2_2083908_wa 113 114func check_errata_2083908 115 /* Applies to r2p0 */ 116 mov x1, #0x20 117 mov x2, #0x20 118 b cpu_rev_var_range 119endfunc check_errata_2083908 120 121 /* -------------------------------------------------- 122 * Errata Workaround for Cortex-X2 Errata 2017096. 123 * This applies only to revisions r0p0, r1p0 and r2p0 124 * and is fixed in r2p1. 125 * Inputs: 126 * x0: variant[4:7] and revision[0:3] of current cpu. 127 * Shall clobber: x0, x1, x17 128 * -------------------------------------------------- 129 */ 130func errata_x2_2017096_wa 131 /* Compare x0 against revision r0p0 to r2p0 */ 132 mov x17, x30 133 bl check_errata_2017096 134 cbz x0, 1f 135 mrs x1, CORTEX_X2_CPUECTLR_EL1 136 orr x1, x1, CORTEX_X2_CPUECTLR_EL1_PFSTIDIS_BIT 137 msr CORTEX_X2_CPUECTLR_EL1, x1 138 1391: 140 ret x17 141endfunc errata_x2_2017096_wa 142 143func check_errata_2017096 144 /* Applies to r0p0, r1p0, r2p0 */ 145 mov x1, #0x20 146 b cpu_rev_var_ls 147endfunc check_errata_2017096 148 149 /* -------------------------------------------------- 150 * Errata Workaround for Cortex-X2 Errata 2081180. 151 * This applies to revision r0p0, r1p0 and r2p0 152 * and is fixed in r2p1. 153 * Inputs: 154 * x0: variant[4:7] and revision[0:3] of current cpu. 155 * Shall clobber: x0, x1, x17 156 * -------------------------------------------------- 157 */ 158func errata_x2_2081180_wa 159 /* Check revision. */ 160 mov x17, x30 161 bl check_errata_2081180 162 cbz x0, 1f 163 164 /* Apply instruction patching sequence */ 165 ldr x0, =0x3 166 msr CORTEX_X2_IMP_CPUPSELR_EL3, x0 167 ldr x0, =0xF3A08002 168 msr CORTEX_X2_IMP_CPUPOR_EL3, x0 169 ldr x0, =0xFFF0F7FE 170 msr CORTEX_X2_IMP_CPUPMR_EL3, x0 171 ldr x0, =0x10002001003FF 172 msr CORTEX_X2_IMP_CPUPCR_EL3, x0 173 ldr x0, =0x4 174 msr CORTEX_X2_IMP_CPUPSELR_EL3, x0 175 ldr x0, =0xBF200000 176 msr CORTEX_X2_IMP_CPUPOR_EL3, x0 177 ldr x0, =0xFFEF0000 178 msr CORTEX_X2_IMP_CPUPMR_EL3, x0 179 ldr x0, =0x10002001003F3 180 msr CORTEX_X2_IMP_CPUPCR_EL3, x0 181 isb 1821: 183 ret x17 184endfunc errata_x2_2081180_wa 185 186func check_errata_2081180 187 /* Applies to r0p0, r1p0 and r2p0 */ 188 mov x1, #0x20 189 b cpu_rev_var_ls 190endfunc check_errata_2081180 191 192 /* -------------------------------------------------- 193 * Errata Workaround for Cortex X2 Errata 2216384. 194 * This applies to revisions r0p0, r1p0, and r2p0 195 * and is fixed in r2p1. 196 * x0: variant[4:7] and revision[0:3] of current cpu. 197 * Shall clobber: x0, x1, x17 198 * -------------------------------------------------- 199 */ 200func errata_x2_2216384_wa 201 /* Check workaround compatibility. */ 202 mov x17, x30 203 bl check_errata_2216384 204 cbz x0, 1f 205 206 mrs x1, CORTEX_X2_CPUACTLR5_EL1 207 orr x1, x1, CORTEX_X2_CPUACTLR5_EL1_BIT_17 208 msr CORTEX_X2_CPUACTLR5_EL1, x1 209 210 /* Apply instruction patching sequence */ 211 ldr x0, =0x5 212 msr CORTEX_X2_IMP_CPUPSELR_EL3, x0 213 ldr x0, =0x10F600E000 214 msr CORTEX_X2_IMP_CPUPOR_EL3, x0 215 ldr x0, =0x10FF80E000 216 msr CORTEX_X2_IMP_CPUPMR_EL3, x0 217 ldr x0, =0x80000000003FF 218 msr CORTEX_X2_IMP_CPUPCR_EL3, x0 219 isb 220 2211: 222 ret x17 223endfunc errata_x2_2216384_wa 224 225func check_errata_2216384 226 /* Applies to r0p0 - r2p0 */ 227 mov x1, #0x20 228 b cpu_rev_var_ls 229endfunc check_errata_2216384 230 231func check_errata_cve_2022_23960 232#if WORKAROUND_CVE_2022_23960 233 mov x0, #ERRATA_APPLIES 234#else 235 mov x0, #ERRATA_MISSING 236#endif 237 ret 238endfunc check_errata_cve_2022_23960 239 240 /* --------------------------------------------------------- 241 * Errata Workaround for Cortex-X2 Errata 2147715. 242 * This applies only to revisions r2p0 and is fixed in r2p1. 243 * Inputs: 244 * x0: variant[4:7] and revision[0:3] of current cpu. 245 * Shall clobber: x0, x1, x17 246 * --------------------------------------------------------- 247 */ 248func errata_x2_2147715_wa 249 /* Compare x0 against revision r2p0 */ 250 mov x17, x30 251 bl check_errata_2147715 252 cbz x0, 1f 253 254 /* Apply the workaround by setting bit 22 in CPUACTLR_EL1. */ 255 mrs x1, CORTEX_X2_CPUACTLR_EL1 256 orr x1, x1, CORTEX_X2_CPUACTLR_EL1_BIT_22 257 msr CORTEX_X2_CPUACTLR_EL1, x1 258 2591: 260 ret x17 261endfunc errata_x2_2147715_wa 262 263func check_errata_2147715 264 /* Applies to r2p0 */ 265 mov x1, #0x20 266 mov x2, #0x20 267 b cpu_rev_var_range 268endfunc check_errata_2147715 269 270 /* --------------------------------------------------------------- 271 * Errata Workaround for Cortex-X2 Erratum 2282622. 272 * This applies to revision r0p0, r1p0, r2p0 and r2p1. 273 * It is still open. 274 * Inputs: 275 * x0: variant[4:7] and revision[0:3] of current cpu. 276 * Shall clobber: x0, x1, x17 277 * --------------------------------------------------------------- 278 */ 279func errata_x2_2282622_wa 280 /* Compare x0 against revision r2p1 */ 281 mov x17, x30 282 bl check_errata_2282622 283 cbz x0, 1f 284 285 /* Apply the workaround */ 286 mrs x1, CORTEX_X2_CPUACTLR2_EL1 287 orr x1, x1, #BIT(0) 288 msr CORTEX_X2_CPUACTLR2_EL1, x1 289 2901: 291 ret x17 292endfunc errata_x2_2282622_wa 293 294func check_errata_2282622 295 /* Applies to r0p0, r1p0, r2p0 and r2p1 */ 296 mov x1, #0x21 297 b cpu_rev_var_ls 298endfunc check_errata_2282622 299 300 /* ------------------------------------------------------- 301 * Errata Workaround for Cortex-X2 Erratum 2371105. 302 * This applies to revisions <= r2p0 and is fixed in r2p1. 303 * x0: variant[4:7] and revision[0:3] of current cpu. 304 * Shall clobber: x0-x17 305 * ------------------------------------------------------- 306 */ 307func errata_x2_2371105_wa 308 /* Check workaround compatibility. */ 309 mov x17, x30 310 bl check_errata_2371105 311 cbz x0, 1f 312 313 /* Set bit 40 in CPUACTLR2_EL1 */ 314 mrs x1, CORTEX_X2_CPUACTLR2_EL1 315 orr x1, x1, #CORTEX_X2_CPUACTLR2_EL1_BIT_40 316 msr CORTEX_X2_CPUACTLR2_EL1, x1 317 isb 3181: 319 ret x17 320endfunc errata_x2_2371105_wa 321 322func check_errata_2371105 323 /* Applies to <= r2p0. */ 324 mov x1, #0x20 325 b cpu_rev_var_ls 326endfunc check_errata_2371105 327 328 /* ---------------------------------------------------- 329 * Errata Workaround for Cortex-X2 Errata #2768515 330 * This applies to revisions <= r2p1 and is still open. 331 * x0: variant[4:7] and revision[0:3] of current cpu. 332 * Shall clobber: x0-x17 333 * ---------------------------------------------------- 334 */ 335func errata_x2_2768515_wa 336 mov x17, x30 337 bl check_errata_2768515 338 cbz x0, 1f 339 340 /* dsb before isb of power down sequence */ 341 dsb sy 3421: 343 ret x17 344endfunc errata_x2_2768515_wa 345 346func check_errata_2768515 347 /* Applies to all revisions <= r2p1 */ 348 mov x1, #0x21 349 b cpu_rev_var_ls 350endfunc check_errata_2768515 351 352 /* ---------------------------------------------------- 353 * HW will do the cache maintenance while powering down 354 * ---------------------------------------------------- 355 */ 356func cortex_x2_core_pwr_dwn 357 /* --------------------------------------------------- 358 * Enable CPU power down bit in power control register 359 * --------------------------------------------------- 360 */ 361 mrs x0, CORTEX_X2_CPUPWRCTLR_EL1 362 orr x0, x0, #CORTEX_X2_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 363 msr CORTEX_X2_CPUPWRCTLR_EL1, x0 364#if ERRATA_X2_2768515 365 mov x15, x30 366 bl cpu_get_rev_var 367 bl errata_x2_2768515_wa 368 mov x30, x15 369#endif /* ERRATA_X2_2768515 */ 370 isb 371 ret 372endfunc cortex_x2_core_pwr_dwn 373 374 /* 375 * Errata printing function for Cortex X2. Must follow AAPCS. 376 */ 377#if REPORT_ERRATA 378func cortex_x2_errata_report 379 stp x8, x30, [sp, #-16]! 380 381 bl cpu_get_rev_var 382 mov x8, x0 383 384 /* 385 * Report all errata. The revision-variant information is passed to 386 * checking functions of each errata. 387 */ 388 report_errata ERRATA_X2_2002765, cortex_x2, 2002765 389 report_errata ERRATA_X2_2017096, cortex_x2, 2017096 390 report_errata ERRATA_X2_2058056, cortex_x2, 2058056 391 report_errata ERRATA_X2_2081180, cortex_x2, 2081180 392 report_errata ERRATA_X2_2083908, cortex_x2, 2083908 393 report_errata ERRATA_X2_2147715, cortex_x2, 2147715 394 report_errata ERRATA_X2_2216384, cortex_x2, 2216384 395 report_errata ERRATA_X2_2282622, cortex_x2, 2282622 396 report_errata ERRATA_X2_2371105, cortex_x2, 2371105 397 report_errata ERRATA_X2_2768515, cortex_x2, 2768515 398 report_errata WORKAROUND_CVE_2022_23960, cortex_x2, cve_2022_23960 399 report_errata ERRATA_DSU_2313941, cortex_x2, dsu_2313941 400 401 ldp x8, x30, [sp], #16 402 ret 403endfunc cortex_x2_errata_report 404#endif 405 406func cortex_x2_reset_func 407 mov x19, x30 408 409 /* Disable speculative loads */ 410 msr SSBS, xzr 411 412 /* Get the CPU revision and stash it in x18. */ 413 bl cpu_get_rev_var 414 mov x18, x0 415 416#if ERRATA_DSU_2313941 417 bl errata_dsu_2313941_wa 418#endif 419 420#if ERRATA_X2_2002765 421 mov x0, x18 422 bl errata_cortex_x2_2002765_wa 423#endif 424 425#if ERRATA_X2_2058056 426 mov x0, x18 427 bl errata_cortex_x2_2058056_wa 428#endif 429 430#if ERRATA_X2_2083908 431 mov x0, x18 432 bl errata_cortex_x2_2083908_wa 433#endif 434 435#if ERRATA_X2_2017096 436 mov x0, x18 437 bl errata_x2_2017096_wa 438#endif 439 440#if ERRATA_X2_2081180 441 mov x0, x18 442 bl errata_x2_2081180_wa 443#endif 444 445#if ERRATA_X2_2216384 446 mov x0, x18 447 bl errata_x2_2216384_wa 448#endif 449 450#if ERRATA_X2_2147715 451 mov x0, x18 452 bl errata_x2_2147715_wa 453#endif 454 455#if ERRATA_X2_2282622 456 mov x0, x18 457 bl errata_x2_2282622_wa 458#endif 459 460#if ERRATA_X2_2371105 461 mov x0, x18 462 bl errata_x2_2371105_wa 463#endif 464 465#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 466 /* 467 * The Cortex-X2 generic vectors are overridden to apply errata 468 * mitigation on exception entry from lower ELs. 469 */ 470 adr x0, wa_cve_vbar_cortex_x2 471 msr vbar_el3, x0 472#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 473 474 isb 475 ret x19 476endfunc cortex_x2_reset_func 477 478 /* --------------------------------------------- 479 * This function provides Cortex X2 specific 480 * register information for crash reporting. 481 * It needs to return with x6 pointing to 482 * a list of register names in ascii and 483 * x8 - x15 having values of registers to be 484 * reported. 485 * --------------------------------------------- 486 */ 487.section .rodata.cortex_x2_regs, "aS" 488cortex_x2_regs: /* The ascii list of register names to be reported */ 489 .asciz "cpuectlr_el1", "" 490 491func cortex_x2_cpu_reg_dump 492 adr x6, cortex_x2_regs 493 mrs x8, CORTEX_X2_CPUECTLR_EL1 494 ret 495endfunc cortex_x2_cpu_reg_dump 496 497declare_cpu_ops cortex_x2, CORTEX_X2_MIDR, \ 498 cortex_x2_reset_func, \ 499 cortex_x2_core_pwr_dwn 500