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