1/* 2 * Copyright (c) 2021-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 <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 2371105. 272 * This applies to revisions <= r2p0 and is fixed in r2p1. 273 * x0: variant[4:7] and revision[0:3] of current cpu. 274 * Shall clobber: x0-x17 275 * ------------------------------------------------------- 276 */ 277func errata_x2_2371105_wa 278 /* Check workaround compatibility. */ 279 mov x17, x30 280 bl check_errata_2371105 281 cbz x0, 1f 282 283 /* Set bit 40 in CPUACTLR2_EL1 */ 284 mrs x1, CORTEX_X2_CPUACTLR2_EL1 285 orr x1, x1, #CORTEX_X2_CPUACTLR2_EL1_BIT_40 286 msr CORTEX_X2_CPUACTLR2_EL1, x1 287 isb 2881: 289 ret x17 290endfunc errata_x2_2371105_wa 291 292func check_errata_2371105 293 /* Applies to <= r2p0. */ 294 mov x1, #0x20 295 b cpu_rev_var_ls 296endfunc check_errata_2371105 297 298/* ---------------------------------------------------- 299 * Errata Workaround for Cortex-X2 Errata #2768515 300 * This applies to revisions <= r2p1 and is still open. 301 * x0: variant[4:7] and revision[0:3] of current cpu. 302 * Shall clobber: x0-x17 303 * ---------------------------------------------------- 304 */ 305func errata_x2_2768515_wa 306 mov x17, x30 307 bl check_errata_2768515 308 cbz x0, 1f 309 310 /* dsb before isb of power down sequence */ 311 dsb sy 3121: 313 ret x17 314endfunc errata_x2_2768515_wa 315 316func check_errata_2768515 317 /* Applies to all revisions <= r2p1 */ 318 mov x1, #0x21 319 b cpu_rev_var_ls 320endfunc check_errata_2768515 321 322 /* ---------------------------------------------------- 323 * HW will do the cache maintenance while powering down 324 * ---------------------------------------------------- 325 */ 326func cortex_x2_core_pwr_dwn 327 /* --------------------------------------------------- 328 * Enable CPU power down bit in power control register 329 * --------------------------------------------------- 330 */ 331 mrs x0, CORTEX_X2_CPUPWRCTLR_EL1 332 orr x0, x0, #CORTEX_X2_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 333 msr CORTEX_X2_CPUPWRCTLR_EL1, x0 334#if ERRATA_X2_2768515 335 mov x15, x30 336 bl cpu_get_rev_var 337 bl errata_x2_2768515_wa 338 mov x30, x15 339#endif /* ERRATA_X2_2768515 */ 340 isb 341 ret 342endfunc cortex_x2_core_pwr_dwn 343 344 /* 345 * Errata printing function for Cortex X2. Must follow AAPCS. 346 */ 347#if REPORT_ERRATA 348func cortex_x2_errata_report 349 stp x8, x30, [sp, #-16]! 350 351 bl cpu_get_rev_var 352 mov x8, x0 353 354 /* 355 * Report all errata. The revision-variant information is passed to 356 * checking functions of each errata. 357 */ 358 report_errata ERRATA_X2_2002765, cortex_x2, 2002765 359 report_errata ERRATA_X2_2017096, cortex_x2, 2017096 360 report_errata ERRATA_X2_2058056, cortex_x2, 2058056 361 report_errata ERRATA_X2_2081180, cortex_x2, 2081180 362 report_errata ERRATA_X2_2083908, cortex_x2, 2083908 363 report_errata ERRATA_X2_2147715, cortex_x2, 2147715 364 report_errata ERRATA_X2_2216384, cortex_x2, 2216384 365 report_errata ERRATA_X2_2371105, cortex_x2, 2371105 366 report_errata ERRATA_X2_2768515, cortex_x2, 2768515 367 report_errata WORKAROUND_CVE_2022_23960, cortex_x2, cve_2022_23960 368 report_errata ERRATA_DSU_2313941, cortex_x2, dsu_2313941 369 370 ldp x8, x30, [sp], #16 371 ret 372endfunc cortex_x2_errata_report 373#endif 374 375func cortex_x2_reset_func 376 mov x19, x30 377 378 /* Disable speculative loads */ 379 msr SSBS, xzr 380 381 /* Get the CPU revision and stash it in x18. */ 382 bl cpu_get_rev_var 383 mov x18, x0 384 385#if ERRATA_DSU_2313941 386 bl errata_dsu_2313941_wa 387#endif 388 389#if ERRATA_X2_2002765 390 mov x0, x18 391 bl errata_cortex_x2_2002765_wa 392#endif 393 394#if ERRATA_X2_2058056 395 mov x0, x18 396 bl errata_cortex_x2_2058056_wa 397#endif 398 399#if ERRATA_X2_2083908 400 mov x0, x18 401 bl errata_cortex_x2_2083908_wa 402#endif 403 404#if ERRATA_X2_2017096 405 mov x0, x18 406 bl errata_x2_2017096_wa 407#endif 408 409#if ERRATA_X2_2081180 410 mov x0, x18 411 bl errata_x2_2081180_wa 412#endif 413 414#if ERRATA_X2_2216384 415 mov x0, x18 416 bl errata_x2_2216384_wa 417#endif 418 419#if ERRATA_X2_2147715 420 mov x0, x18 421 bl errata_x2_2147715_wa 422#endif 423 424#if ERRATA_X2_2371105 425 mov x0, x18 426 bl errata_x2_2371105_wa 427#endif 428 429#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 430 /* 431 * The Cortex-X2 generic vectors are overridden to apply errata 432 * mitigation on exception entry from lower ELs. 433 */ 434 adr x0, wa_cve_vbar_cortex_x2 435 msr vbar_el3, x0 436#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 437 438 isb 439 ret x19 440endfunc cortex_x2_reset_func 441 442 /* --------------------------------------------- 443 * This function provides Cortex X2 specific 444 * register information for crash reporting. 445 * It needs to return with x6 pointing to 446 * a list of register names in ascii and 447 * x8 - x15 having values of registers to be 448 * reported. 449 * --------------------------------------------- 450 */ 451.section .rodata.cortex_x2_regs, "aS" 452cortex_x2_regs: /* The ascii list of register names to be reported */ 453 .asciz "cpuectlr_el1", "" 454 455func cortex_x2_cpu_reg_dump 456 adr x6, cortex_x2_regs 457 mrs x8, CORTEX_X2_CPUECTLR_EL1 458 ret 459endfunc cortex_x2_cpu_reg_dump 460 461declare_cpu_ops cortex_x2, CORTEX_X2_MIDR, \ 462 cortex_x2_reset_func, \ 463 cortex_x2_core_pwr_dwn 464