1/* 2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6#include <arch.h> 7#include <asm_macros.S> 8#include <assert_macros.S> 9#include <common/debug.h> 10#include <cortex_a57.h> 11#include <cpu_macros.S> 12 13 /* --------------------------------------------- 14 * Disable intra-cluster coherency 15 * Clobbers: r0-r1 16 * --------------------------------------------- 17 */ 18func cortex_a57_disable_smp 19 ldcopr16 r0, r1, CORTEX_A57_ECTLR 20 bic64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT 21 stcopr16 r0, r1, CORTEX_A57_ECTLR 22 bx lr 23endfunc cortex_a57_disable_smp 24 25 /* --------------------------------------------- 26 * Disable all types of L2 prefetches. 27 * Clobbers: r0-r2 28 * --------------------------------------------- 29 */ 30func cortex_a57_disable_l2_prefetch 31 ldcopr16 r0, r1, CORTEX_A57_ECTLR 32 orr64_imm r0, r1, CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT 33 bic64_imm r0, r1, (CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK | \ 34 CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK) 35 stcopr16 r0, r1, CORTEX_A57_ECTLR 36 isb 37 dsb ish 38 bx lr 39endfunc cortex_a57_disable_l2_prefetch 40 41 /* --------------------------------------------- 42 * Disable debug interfaces 43 * --------------------------------------------- 44 */ 45func cortex_a57_disable_ext_debug 46 mov r0, #1 47 stcopr r0, DBGOSDLR 48 isb 49 dsb sy 50 bx lr 51endfunc cortex_a57_disable_ext_debug 52 53 /* -------------------------------------------------- 54 * Errata Workaround for Cortex A57 Errata #806969. 55 * This applies only to revision r0p0 of Cortex A57. 56 * Inputs: 57 * r0: variant[4:7] and revision[0:3] of current cpu. 58 * Shall clobber: r0-r3 59 * -------------------------------------------------- 60 */ 61func errata_a57_806969_wa 62 /* 63 * Compare r0 against revision r0p0 64 */ 65 mov r2, lr 66 bl check_errata_806969 67 mov lr, r2 68 cmp r0, #ERRATA_NOT_APPLIES 69 beq 1f 70 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 71 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA 72 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 731: 74 bx lr 75endfunc errata_a57_806969_wa 76 77func check_errata_806969 78 mov r1, #0x00 79 b cpu_rev_var_ls 80endfunc check_errata_806969 81 82 /* --------------------------------------------------- 83 * Errata Workaround for Cortex A57 Errata #813419. 84 * This applies only to revision r0p0 of Cortex A57. 85 * --------------------------------------------------- 86 */ 87func check_errata_813419 88 /* 89 * Even though this is only needed for revision r0p0, it 90 * is always applied due to limitations of the current 91 * errata framework. 92 */ 93 mov r0, #ERRATA_APPLIES 94 bx lr 95endfunc check_errata_813419 96 97 /* --------------------------------------------------- 98 * Errata Workaround for Cortex A57 Errata #813420. 99 * This applies only to revision r0p0 of Cortex A57. 100 * Inputs: 101 * r0: variant[4:7] and revision[0:3] of current cpu. 102 * Shall clobber: r0-r3 103 * --------------------------------------------------- 104 */ 105func errata_a57_813420_wa 106 /* 107 * Compare r0 against revision r0p0 108 */ 109 mov r2, lr 110 bl check_errata_813420 111 mov lr, r2 112 cmp r0, #ERRATA_NOT_APPLIES 113 beq 1f 114 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 115 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DCC_AS_DCCI 116 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 1171: 118 bx lr 119endfunc errata_a57_813420_wa 120 121func check_errata_813420 122 mov r1, #0x00 123 b cpu_rev_var_ls 124endfunc check_errata_813420 125 126 /* -------------------------------------------------------------------- 127 * Disable the over-read from the LDNP instruction. 128 * 129 * This applies to all revisions <= r1p2. The performance degradation 130 * observed with LDNP/STNP has been fixed on r1p3 and onwards. 131 * 132 * Inputs: 133 * r0: variant[4:7] and revision[0:3] of current cpu. 134 * Shall clobber: r0-r3 135 * --------------------------------------------------------------------- 136 */ 137func a57_disable_ldnp_overread 138 /* 139 * Compare r0 against revision r1p2 140 */ 141 mov r2, lr 142 bl check_errata_disable_ldnp_overread 143 mov lr, r2 144 cmp r0, #ERRATA_NOT_APPLIES 145 beq 1f 146 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 147 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_OVERREAD 148 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 1491: 150 bx lr 151endfunc a57_disable_ldnp_overread 152 153func check_errata_disable_ldnp_overread 154 mov r1, #0x12 155 b cpu_rev_var_ls 156endfunc check_errata_disable_ldnp_overread 157 158 /* --------------------------------------------------- 159 * Errata Workaround for Cortex A57 Errata #826974. 160 * This applies only to revision <= r1p1 of Cortex A57. 161 * Inputs: 162 * r0: variant[4:7] and revision[0:3] of current cpu. 163 * Shall clobber: r0-r3 164 * --------------------------------------------------- 165 */ 166func errata_a57_826974_wa 167 /* 168 * Compare r0 against revision r1p1 169 */ 170 mov r2, lr 171 bl check_errata_826974 172 mov lr, r2 173 cmp r0, #ERRATA_NOT_APPLIES 174 beq 1f 175 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 176 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_DMB 177 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 1781: 179 bx lr 180endfunc errata_a57_826974_wa 181 182func check_errata_826974 183 mov r1, #0x11 184 b cpu_rev_var_ls 185endfunc check_errata_826974 186 187 /* --------------------------------------------------- 188 * Errata Workaround for Cortex A57 Errata #826977. 189 * This applies only to revision <= r1p1 of Cortex A57. 190 * Inputs: 191 * r0: variant[4:7] and revision[0:3] of current cpu. 192 * Shall clobber: r0-r3 193 * --------------------------------------------------- 194 */ 195func errata_a57_826977_wa 196 /* 197 * Compare r0 against revision r1p1 198 */ 199 mov r2, lr 200 bl check_errata_826977 201 mov lr, r2 202 cmp r0, #ERRATA_NOT_APPLIES 203 beq 1f 204 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 205 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_GRE_NGRE_AS_NGNRE 206 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 2071: 208 bx lr 209endfunc errata_a57_826977_wa 210 211func check_errata_826977 212 mov r1, #0x11 213 b cpu_rev_var_ls 214endfunc check_errata_826977 215 216 /* --------------------------------------------------- 217 * Errata Workaround for Cortex A57 Errata #828024. 218 * This applies only to revision <= r1p1 of Cortex A57. 219 * Inputs: 220 * r0: variant[4:7] and revision[0:3] of current cpu. 221 * Shall clobber: r0-r3 222 * --------------------------------------------------- 223 */ 224func errata_a57_828024_wa 225 /* 226 * Compare r0 against revision r1p1 227 */ 228 mov r2, lr 229 bl check_errata_828024 230 mov lr, r2 231 cmp r0, #ERRATA_NOT_APPLIES 232 beq 1f 233 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 234 /* 235 * Setting the relevant bits in CORTEX_A57_CPUACTLR has to be done in 2 236 * instructions here because the resulting bitmask doesn't fit in a 237 * 16-bit value so it cannot be encoded in a single instruction. 238 */ 239 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA 240 orr64_imm r0, r1, (CORTEX_A57_CPUACTLR_DIS_L1_STREAMING | CORTEX_A57_CPUACTLR_DIS_STREAMING) 241 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 2421: 243 bx lr 244endfunc errata_a57_828024_wa 245 246func check_errata_828024 247 mov r1, #0x11 248 b cpu_rev_var_ls 249endfunc check_errata_828024 250 251 /* --------------------------------------------------- 252 * Errata Workaround for Cortex A57 Errata #829520. 253 * This applies only to revision <= r1p2 of Cortex A57. 254 * Inputs: 255 * r0: variant[4:7] and revision[0:3] of current cpu. 256 * Shall clobber: r0-r3 257 * --------------------------------------------------- 258 */ 259func errata_a57_829520_wa 260 /* 261 * Compare r0 against revision r1p2 262 */ 263 mov r2, lr 264 bl check_errata_829520 265 mov lr, r2 266 cmp r0, #ERRATA_NOT_APPLIES 267 beq 1f 268 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 269 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_INDIRECT_PREDICTOR 270 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 2711: 272 bx lr 273endfunc errata_a57_829520_wa 274 275func check_errata_829520 276 mov r1, #0x12 277 b cpu_rev_var_ls 278endfunc check_errata_829520 279 280 /* --------------------------------------------------- 281 * Errata Workaround for Cortex A57 Errata #833471. 282 * This applies only to revision <= r1p2 of Cortex A57. 283 * Inputs: 284 * r0: variant[4:7] and revision[0:3] of current cpu. 285 * Shall clobber: r0-r3 286 * --------------------------------------------------- 287 */ 288func errata_a57_833471_wa 289 /* 290 * Compare r0 against revision r1p2 291 */ 292 mov r2, lr 293 bl check_errata_833471 294 mov lr, r2 295 cmp r0, #ERRATA_NOT_APPLIES 296 beq 1f 297 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 298 orr64_imm r1, r1, CORTEX_A57_CPUACTLR_FORCE_FPSCR_FLUSH 299 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 3001: 301 bx lr 302endfunc errata_a57_833471_wa 303 304func check_errata_833471 305 mov r1, #0x12 306 b cpu_rev_var_ls 307endfunc check_errata_833471 308 309 /* --------------------------------------------------- 310 * Errata Workaround for Cortex A57 Errata #859972. 311 * This applies only to revision <= r1p3 of Cortex A57. 312 * Inputs: 313 * r0: variant[4:7] and revision[0:3] of current cpu. 314 * Shall clobber: r0-r3 315 * --------------------------------------------------- 316 */ 317func errata_a57_859972_wa 318 mov r2, lr 319 bl check_errata_859972 320 mov lr, r2 321 cmp r0, #ERRATA_NOT_APPLIES 322 beq 1f 323 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 324 orr64_imm r1, r1, CORTEX_A57_CPUACTLR_DIS_INSTR_PREFETCH 325 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 3261: 327 bx lr 328endfunc errata_a57_859972_wa 329 330func check_errata_859972 331 mov r1, #0x13 332 b cpu_rev_var_ls 333endfunc check_errata_859972 334 335func check_errata_cve_2017_5715 336 mov r0, #ERRATA_MISSING 337 bx lr 338endfunc check_errata_cve_2017_5715 339 340func check_errata_cve_2018_3639 341#if WORKAROUND_CVE_2018_3639 342 mov r0, #ERRATA_APPLIES 343#else 344 mov r0, #ERRATA_MISSING 345#endif 346 bx lr 347endfunc check_errata_cve_2018_3639 348 349 /* ------------------------------------------------- 350 * The CPU Ops reset function for Cortex-A57. 351 * Shall clobber: r0-r6 352 * ------------------------------------------------- 353 */ 354func cortex_a57_reset_func 355 mov r5, lr 356 bl cpu_get_rev_var 357 mov r4, r0 358 359#if ERRATA_A57_806969 360 mov r0, r4 361 bl errata_a57_806969_wa 362#endif 363 364#if ERRATA_A57_813420 365 mov r0, r4 366 bl errata_a57_813420_wa 367#endif 368 369#if A57_DISABLE_NON_TEMPORAL_HINT 370 mov r0, r4 371 bl a57_disable_ldnp_overread 372#endif 373 374#if ERRATA_A57_826974 375 mov r0, r4 376 bl errata_a57_826974_wa 377#endif 378 379#if ERRATA_A57_826977 380 mov r0, r4 381 bl errata_a57_826977_wa 382#endif 383 384#if ERRATA_A57_828024 385 mov r0, r4 386 bl errata_a57_828024_wa 387#endif 388 389#if ERRATA_A57_829520 390 mov r0, r4 391 bl errata_a57_829520_wa 392#endif 393 394#if ERRATA_A57_833471 395 mov r0, r4 396 bl errata_a57_833471_wa 397#endif 398 399#if ERRATA_A57_859972 400 mov r0, r4 401 bl errata_a57_859972_wa 402#endif 403 404#if WORKAROUND_CVE_2018_3639 405 ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 406 orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_STORE 407 stcopr16 r0, r1, CORTEX_A57_CPUACTLR 408 isb 409 dsb sy 410#endif 411 412 /* --------------------------------------------- 413 * Enable the SMP bit. 414 * --------------------------------------------- 415 */ 416 ldcopr16 r0, r1, CORTEX_A57_ECTLR 417 orr64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT 418 stcopr16 r0, r1, CORTEX_A57_ECTLR 419 isb 420 bx r5 421endfunc cortex_a57_reset_func 422 423 /* ---------------------------------------------------- 424 * The CPU Ops core power down function for Cortex-A57. 425 * ---------------------------------------------------- 426 */ 427func cortex_a57_core_pwr_dwn 428 push {r12, lr} 429 430 /* Assert if cache is enabled */ 431#if ENABLE_ASSERTIONS 432 ldcopr r0, SCTLR 433 tst r0, #SCTLR_C_BIT 434 ASM_ASSERT(eq) 435#endif 436 437 /* --------------------------------------------- 438 * Disable the L2 prefetches. 439 * --------------------------------------------- 440 */ 441 bl cortex_a57_disable_l2_prefetch 442 443 /* --------------------------------------------- 444 * Flush L1 caches. 445 * --------------------------------------------- 446 */ 447 mov r0, #DC_OP_CISW 448 bl dcsw_op_level1 449 450 /* --------------------------------------------- 451 * Come out of intra cluster coherency 452 * --------------------------------------------- 453 */ 454 bl cortex_a57_disable_smp 455 456 /* --------------------------------------------- 457 * Force the debug interfaces to be quiescent 458 * --------------------------------------------- 459 */ 460 pop {r12, lr} 461 b cortex_a57_disable_ext_debug 462endfunc cortex_a57_core_pwr_dwn 463 464 /* ------------------------------------------------------- 465 * The CPU Ops cluster power down function for Cortex-A57. 466 * Clobbers: r0-r3 467 * ------------------------------------------------------- 468 */ 469func cortex_a57_cluster_pwr_dwn 470 push {r12, lr} 471 472 /* Assert if cache is enabled */ 473#if ENABLE_ASSERTIONS 474 ldcopr r0, SCTLR 475 tst r0, #SCTLR_C_BIT 476 ASM_ASSERT(eq) 477#endif 478 479 /* --------------------------------------------- 480 * Disable the L2 prefetches. 481 * --------------------------------------------- 482 */ 483 bl cortex_a57_disable_l2_prefetch 484 485 /* --------------------------------------------- 486 * Flush L1 caches. 487 * --------------------------------------------- 488 */ 489 mov r0, #DC_OP_CISW 490 bl dcsw_op_level1 491 492 /* --------------------------------------------- 493 * Disable the optional ACP. 494 * --------------------------------------------- 495 */ 496 bl plat_disable_acp 497 498 /* --------------------------------------------- 499 * Flush L2 caches. 500 * --------------------------------------------- 501 */ 502 mov r0, #DC_OP_CISW 503 bl dcsw_op_level2 504 505 /* --------------------------------------------- 506 * Come out of intra cluster coherency 507 * --------------------------------------------- 508 */ 509 bl cortex_a57_disable_smp 510 511 /* --------------------------------------------- 512 * Force the debug interfaces to be quiescent 513 * --------------------------------------------- 514 */ 515 pop {r12, lr} 516 b cortex_a57_disable_ext_debug 517endfunc cortex_a57_cluster_pwr_dwn 518 519#if REPORT_ERRATA 520/* 521 * Errata printing function for Cortex A57. Must follow AAPCS. 522 */ 523func cortex_a57_errata_report 524 push {r12, lr} 525 526 bl cpu_get_rev_var 527 mov r4, r0 528 529 /* 530 * Report all errata. The revision-variant information is passed to 531 * checking functions of each errata. 532 */ 533 report_errata ERRATA_A57_806969, cortex_a57, 806969 534 report_errata ERRATA_A57_813419, cortex_a57, 813419 535 report_errata ERRATA_A57_813420, cortex_a57, 813420 536 report_errata A57_DISABLE_NON_TEMPORAL_HINT, cortex_a57, \ 537 disable_ldnp_overread 538 report_errata ERRATA_A57_826974, cortex_a57, 826974 539 report_errata ERRATA_A57_826977, cortex_a57, 826977 540 report_errata ERRATA_A57_828024, cortex_a57, 828024 541 report_errata ERRATA_A57_829520, cortex_a57, 829520 542 report_errata ERRATA_A57_833471, cortex_a57, 833471 543 report_errata ERRATA_A57_859972, cortex_a57, 859972 544 report_errata WORKAROUND_CVE_2017_5715, cortex_a57, cve_2017_5715 545 report_errata WORKAROUND_CVE_2018_3639, cortex_a57, cve_2018_3639 546 547 pop {r12, lr} 548 bx lr 549endfunc cortex_a57_errata_report 550#endif 551 552declare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \ 553 cortex_a57_reset_func, \ 554 cortex_a57_core_pwr_dwn, \ 555 cortex_a57_cluster_pwr_dwn 556