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 <cortex_a57.h> 10#include <cpu_macros.S> 11#include <debug.h> 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 340 /* ------------------------------------------------- 341 * The CPU Ops reset function for Cortex-A57. 342 * Shall clobber: r0-r6 343 * ------------------------------------------------- 344 */ 345func cortex_a57_reset_func 346 mov r5, lr 347 bl cpu_get_rev_var 348 mov r4, r0 349 350#if ERRATA_A57_806969 351 mov r0, r4 352 bl errata_a57_806969_wa 353#endif 354 355#if ERRATA_A57_813420 356 mov r0, r4 357 bl errata_a57_813420_wa 358#endif 359 360#if A57_DISABLE_NON_TEMPORAL_HINT 361 mov r0, r4 362 bl a57_disable_ldnp_overread 363#endif 364 365#if ERRATA_A57_826974 366 mov r0, r4 367 bl errata_a57_826974_wa 368#endif 369 370#if ERRATA_A57_826977 371 mov r0, r4 372 bl errata_a57_826977_wa 373#endif 374 375#if ERRATA_A57_828024 376 mov r0, r4 377 bl errata_a57_828024_wa 378#endif 379 380#if ERRATA_A57_829520 381 mov r0, r4 382 bl errata_a57_829520_wa 383#endif 384 385#if ERRATA_A57_833471 386 mov r0, r4 387 bl errata_a57_833471_wa 388#endif 389 390#if ERRATA_A57_859972 391 mov r0, r4 392 bl errata_a57_859972_wa 393#endif 394 395 /* --------------------------------------------- 396 * Enable the SMP bit. 397 * --------------------------------------------- 398 */ 399 ldcopr16 r0, r1, CORTEX_A57_ECTLR 400 orr64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT 401 stcopr16 r0, r1, CORTEX_A57_ECTLR 402 isb 403 bx r5 404endfunc cortex_a57_reset_func 405 406 /* ---------------------------------------------------- 407 * The CPU Ops core power down function for Cortex-A57. 408 * ---------------------------------------------------- 409 */ 410func cortex_a57_core_pwr_dwn 411 push {r12, lr} 412 413 /* Assert if cache is enabled */ 414#if ENABLE_ASSERTIONS 415 ldcopr r0, SCTLR 416 tst r0, #SCTLR_C_BIT 417 ASM_ASSERT(eq) 418#endif 419 420 /* --------------------------------------------- 421 * Disable the L2 prefetches. 422 * --------------------------------------------- 423 */ 424 bl cortex_a57_disable_l2_prefetch 425 426 /* --------------------------------------------- 427 * Flush L1 caches. 428 * --------------------------------------------- 429 */ 430 mov r0, #DC_OP_CISW 431 bl dcsw_op_level1 432 433 /* --------------------------------------------- 434 * Come out of intra cluster coherency 435 * --------------------------------------------- 436 */ 437 bl cortex_a57_disable_smp 438 439 /* --------------------------------------------- 440 * Force the debug interfaces to be quiescent 441 * --------------------------------------------- 442 */ 443 pop {r12, lr} 444 b cortex_a57_disable_ext_debug 445endfunc cortex_a57_core_pwr_dwn 446 447 /* ------------------------------------------------------- 448 * The CPU Ops cluster power down function for Cortex-A57. 449 * Clobbers: r0-r3 450 * ------------------------------------------------------- 451 */ 452func cortex_a57_cluster_pwr_dwn 453 push {r12, lr} 454 455 /* Assert if cache is enabled */ 456#if ENABLE_ASSERTIONS 457 ldcopr r0, SCTLR 458 tst r0, #SCTLR_C_BIT 459 ASM_ASSERT(eq) 460#endif 461 462 /* --------------------------------------------- 463 * Disable the L2 prefetches. 464 * --------------------------------------------- 465 */ 466 bl cortex_a57_disable_l2_prefetch 467 468 /* --------------------------------------------- 469 * Flush L1 caches. 470 * --------------------------------------------- 471 */ 472 mov r0, #DC_OP_CISW 473 bl dcsw_op_level1 474 475 /* --------------------------------------------- 476 * Disable the optional ACP. 477 * --------------------------------------------- 478 */ 479 bl plat_disable_acp 480 481 /* --------------------------------------------- 482 * Flush L2 caches. 483 * --------------------------------------------- 484 */ 485 mov r0, #DC_OP_CISW 486 bl dcsw_op_level2 487 488 /* --------------------------------------------- 489 * Come out of intra cluster coherency 490 * --------------------------------------------- 491 */ 492 bl cortex_a57_disable_smp 493 494 /* --------------------------------------------- 495 * Force the debug interfaces to be quiescent 496 * --------------------------------------------- 497 */ 498 pop {r12, lr} 499 b cortex_a57_disable_ext_debug 500endfunc cortex_a57_cluster_pwr_dwn 501 502#if REPORT_ERRATA 503/* 504 * Errata printing function for Cortex A57. Must follow AAPCS. 505 */ 506func cortex_a57_errata_report 507 push {r12, lr} 508 509 bl cpu_get_rev_var 510 mov r4, r0 511 512 /* 513 * Report all errata. The revision-variant information is passed to 514 * checking functions of each errata. 515 */ 516 report_errata ERRATA_A57_806969, cortex_a57, 806969 517 report_errata ERRATA_A57_813419, cortex_a57, 813419 518 report_errata ERRATA_A57_813420, cortex_a57, 813420 519 report_errata A57_DISABLE_NON_TEMPORAL_HINT, cortex_a57, \ 520 disable_ldnp_overread 521 report_errata ERRATA_A57_826974, cortex_a57, 826974 522 report_errata ERRATA_A57_826977, cortex_a57, 826977 523 report_errata ERRATA_A57_828024, cortex_a57, 828024 524 report_errata ERRATA_A57_829520, cortex_a57, 829520 525 report_errata ERRATA_A57_833471, cortex_a57, 833471 526 report_errata ERRATA_A57_859972, cortex_a57, 859972 527 report_errata WORKAROUND_CVE_2017_5715, cortex_a57, cve_2017_5715 528 529 pop {r12, lr} 530 bx lr 531endfunc cortex_a57_errata_report 532#endif 533 534declare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \ 535 cortex_a57_reset_func, \ 536 cortex_a57_core_pwr_dwn, \ 537 cortex_a57_cluster_pwr_dwn 538