1/* 2 * Copyright (c) 2014-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 <bl_common.h> 10#include <cortex_a57.h> 11#include <cpu_macros.S> 12#include <debug.h> 13#include <plat_macros.S> 14 15 /* --------------------------------------------- 16 * Disable L1 data cache and unified L2 cache 17 * --------------------------------------------- 18 */ 19func cortex_a57_disable_dcache 20 mrs x1, sctlr_el3 21 bic x1, x1, #SCTLR_C_BIT 22 msr sctlr_el3, x1 23 isb 24 ret 25endfunc cortex_a57_disable_dcache 26 27 /* --------------------------------------------- 28 * Disable all types of L2 prefetches. 29 * --------------------------------------------- 30 */ 31func cortex_a57_disable_l2_prefetch 32 mrs x0, CORTEX_A57_ECTLR_EL1 33 orr x0, x0, #CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT 34 mov x1, #CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK 35 orr x1, x1, #CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK 36 bic x0, x0, x1 37 msr CORTEX_A57_ECTLR_EL1, x0 38 isb 39 dsb ish 40 ret 41endfunc cortex_a57_disable_l2_prefetch 42 43 /* --------------------------------------------- 44 * Disable intra-cluster coherency 45 * --------------------------------------------- 46 */ 47func cortex_a57_disable_smp 48 mrs x0, CORTEX_A57_ECTLR_EL1 49 bic x0, x0, #CORTEX_A57_ECTLR_SMP_BIT 50 msr CORTEX_A57_ECTLR_EL1, x0 51 ret 52endfunc cortex_a57_disable_smp 53 54 /* --------------------------------------------- 55 * Disable debug interfaces 56 * --------------------------------------------- 57 */ 58func cortex_a57_disable_ext_debug 59 mov x0, #1 60 msr osdlr_el1, x0 61 isb 62 dsb sy 63 ret 64endfunc cortex_a57_disable_ext_debug 65 66 /* -------------------------------------------------- 67 * Errata Workaround for Cortex A57 Errata #806969. 68 * This applies only to revision r0p0 of Cortex A57. 69 * Inputs: 70 * x0: variant[4:7] and revision[0:3] of current cpu. 71 * Shall clobber: x0-x17 72 * -------------------------------------------------- 73 */ 74func errata_a57_806969_wa 75 /* 76 * Compare x0 against revision r0p0 77 */ 78 mov x17, x30 79 bl check_errata_806969 80 cbz x0, 1f 81 mrs x1, CORTEX_A57_CPUACTLR_EL1 82 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_NO_ALLOC_WBWA 83 msr CORTEX_A57_CPUACTLR_EL1, x1 841: 85 ret x17 86endfunc errata_a57_806969_wa 87 88func check_errata_806969 89 mov x1, #0x00 90 b cpu_rev_var_ls 91endfunc check_errata_806969 92 93 /* --------------------------------------------------- 94 * Errata Workaround for Cortex A57 Errata #813419. 95 * This applies only to revision r0p0 of Cortex A57. 96 * --------------------------------------------------- 97 */ 98func check_errata_813419 99 /* 100 * Even though this is only needed for revision r0p0, it 101 * is always applied due to limitations of the current 102 * errata framework. 103 */ 104 mov x0, #ERRATA_APPLIES 105 ret 106endfunc check_errata_813419 107 108 /* --------------------------------------------------- 109 * Errata Workaround for Cortex A57 Errata #813420. 110 * This applies only to revision r0p0 of Cortex A57. 111 * Inputs: 112 * x0: variant[4:7] and revision[0:3] of current cpu. 113 * Shall clobber: x0-x17 114 * --------------------------------------------------- 115 */ 116func errata_a57_813420_wa 117 /* 118 * Compare x0 against revision r0p0 119 */ 120 mov x17, x30 121 bl check_errata_813420 122 cbz x0, 1f 123 mrs x1, CORTEX_A57_CPUACTLR_EL1 124 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_DCC_AS_DCCI 125 msr CORTEX_A57_CPUACTLR_EL1, x1 1261: 127 ret x17 128endfunc errata_a57_813420_wa 129 130func check_errata_813420 131 mov x1, #0x00 132 b cpu_rev_var_ls 133endfunc check_errata_813420 134 135 /* -------------------------------------------------------------------- 136 * Disable the over-read from the LDNP instruction. 137 * 138 * This applies to all revisions <= r1p2. The performance degradation 139 * observed with LDNP/STNP has been fixed on r1p3 and onwards. 140 * 141 * Inputs: 142 * x0: variant[4:7] and revision[0:3] of current cpu. 143 * Shall clobber: x0-x17 144 * --------------------------------------------------------------------- 145 */ 146func a57_disable_ldnp_overread 147 /* 148 * Compare x0 against revision r1p2 149 */ 150 mov x17, x30 151 bl check_errata_disable_ldnp_overread 152 cbz x0, 1f 153 mrs x1, CORTEX_A57_CPUACTLR_EL1 154 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_DIS_OVERREAD 155 msr CORTEX_A57_CPUACTLR_EL1, x1 1561: 157 ret x17 158endfunc a57_disable_ldnp_overread 159 160func check_errata_disable_ldnp_overread 161 mov x1, #0x12 162 b cpu_rev_var_ls 163endfunc check_errata_disable_ldnp_overread 164 165 /* --------------------------------------------------- 166 * Errata Workaround for Cortex A57 Errata #826974. 167 * This applies only to revision <= r1p1 of Cortex A57. 168 * Inputs: 169 * x0: variant[4:7] and revision[0:3] of current cpu. 170 * Shall clobber: x0-x17 171 * --------------------------------------------------- 172 */ 173func errata_a57_826974_wa 174 /* 175 * Compare x0 against revision r1p1 176 */ 177 mov x17, x30 178 bl check_errata_826974 179 cbz x0, 1f 180 mrs x1, CORTEX_A57_CPUACTLR_EL1 181 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_DIS_LOAD_PASS_DMB 182 msr CORTEX_A57_CPUACTLR_EL1, x1 1831: 184 ret x17 185endfunc errata_a57_826974_wa 186 187func check_errata_826974 188 mov x1, #0x11 189 b cpu_rev_var_ls 190endfunc check_errata_826974 191 192 /* --------------------------------------------------- 193 * Errata Workaround for Cortex A57 Errata #826977. 194 * This applies only to revision <= r1p1 of Cortex A57. 195 * Inputs: 196 * x0: variant[4:7] and revision[0:3] of current cpu. 197 * Shall clobber: x0-x17 198 * --------------------------------------------------- 199 */ 200func errata_a57_826977_wa 201 /* 202 * Compare x0 against revision r1p1 203 */ 204 mov x17, x30 205 bl check_errata_826977 206 cbz x0, 1f 207 mrs x1, CORTEX_A57_CPUACTLR_EL1 208 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_GRE_NGRE_AS_NGNRE 209 msr CORTEX_A57_CPUACTLR_EL1, x1 2101: 211 ret x17 212endfunc errata_a57_826977_wa 213 214func check_errata_826977 215 mov x1, #0x11 216 b cpu_rev_var_ls 217endfunc check_errata_826977 218 219 /* --------------------------------------------------- 220 * Errata Workaround for Cortex A57 Errata #828024. 221 * This applies only to revision <= r1p1 of Cortex A57. 222 * Inputs: 223 * x0: variant[4:7] and revision[0:3] of current cpu. 224 * Shall clobber: x0-x17 225 * --------------------------------------------------- 226 */ 227func errata_a57_828024_wa 228 /* 229 * Compare x0 against revision r1p1 230 */ 231 mov x17, x30 232 bl check_errata_828024 233 cbz x0, 1f 234 mrs x1, CORTEX_A57_CPUACTLR_EL1 235 /* 236 * Setting the relevant bits in CPUACTLR_EL1 has to be done in 2 237 * instructions here because the resulting bitmask doesn't fit in a 238 * 16-bit value so it cannot be encoded in a single instruction. 239 */ 240 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_NO_ALLOC_WBWA 241 orr x1, x1, #(CORTEX_A57_CPUACTLR_EL1_DIS_L1_STREAMING | \ 242 CORTEX_A57_CPUACTLR_EL1_DIS_STREAMING) 243 msr CORTEX_A57_CPUACTLR_EL1, x1 2441: 245 ret x17 246endfunc errata_a57_828024_wa 247 248func check_errata_828024 249 mov x1, #0x11 250 b cpu_rev_var_ls 251endfunc check_errata_828024 252 253 /* --------------------------------------------------- 254 * Errata Workaround for Cortex A57 Errata #829520. 255 * This applies only to revision <= r1p2 of Cortex A57. 256 * Inputs: 257 * x0: variant[4:7] and revision[0:3] of current cpu. 258 * Shall clobber: x0-x17 259 * --------------------------------------------------- 260 */ 261func errata_a57_829520_wa 262 /* 263 * Compare x0 against revision r1p2 264 */ 265 mov x17, x30 266 bl check_errata_829520 267 cbz x0, 1f 268 mrs x1, CORTEX_A57_CPUACTLR_EL1 269 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_DIS_INDIRECT_PREDICTOR 270 msr CORTEX_A57_CPUACTLR_EL1, x1 2711: 272 ret x17 273endfunc errata_a57_829520_wa 274 275func check_errata_829520 276 mov x1, #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 * x0: variant[4:7] and revision[0:3] of current cpu. 285 * Shall clobber: x0-x17 286 * --------------------------------------------------- 287 */ 288func errata_a57_833471_wa 289 /* 290 * Compare x0 against revision r1p2 291 */ 292 mov x17, x30 293 bl check_errata_833471 294 cbz x0, 1f 295 mrs x1, CORTEX_A57_CPUACTLR_EL1 296 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_FORCE_FPSCR_FLUSH 297 msr CORTEX_A57_CPUACTLR_EL1, x1 2981: 299 ret x17 300endfunc errata_a57_833471_wa 301 302func check_errata_833471 303 mov x1, #0x12 304 b cpu_rev_var_ls 305endfunc check_errata_833471 306 307 /* -------------------------------------------------- 308 * Errata Workaround for Cortex A57 Errata #859972. 309 * This applies only to revision <= r1p3 of Cortex A57. 310 * Inputs: 311 * x0: variant[4:7] and revision[0:3] of current cpu. 312 * Shall clobber: 313 * -------------------------------------------------- 314 */ 315func errata_a57_859972_wa 316 mov x17, x30 317 bl check_errata_859972 318 cbz x0, 1f 319 mrs x1, CORTEX_A57_CPUACTLR_EL1 320 orr x1, x1, #CORTEX_A57_CPUACTLR_EL1_DIS_INSTR_PREFETCH 321 msr CORTEX_A57_CPUACTLR_EL1, x1 3221: 323 ret x17 324endfunc errata_a57_859972_wa 325 326func check_errata_859972 327 mov x1, #0x13 328 b cpu_rev_var_ls 329endfunc check_errata_859972 330 331 /* ------------------------------------------------- 332 * The CPU Ops reset function for Cortex-A57. 333 * Shall clobber: x0-x19 334 * ------------------------------------------------- 335 */ 336func cortex_a57_reset_func 337 mov x19, x30 338 bl cpu_get_rev_var 339 mov x18, x0 340 341#if ERRATA_A57_806969 342 mov x0, x18 343 bl errata_a57_806969_wa 344#endif 345 346#if ERRATA_A57_813420 347 mov x0, x18 348 bl errata_a57_813420_wa 349#endif 350 351#if A57_DISABLE_NON_TEMPORAL_HINT 352 mov x0, x18 353 bl a57_disable_ldnp_overread 354#endif 355 356#if ERRATA_A57_826974 357 mov x0, x18 358 bl errata_a57_826974_wa 359#endif 360 361#if ERRATA_A57_826977 362 mov x0, x18 363 bl errata_a57_826977_wa 364#endif 365 366#if ERRATA_A57_828024 367 mov x0, x18 368 bl errata_a57_828024_wa 369#endif 370 371#if ERRATA_A57_829520 372 mov x0, x18 373 bl errata_a57_829520_wa 374#endif 375 376#if ERRATA_A57_833471 377 mov x0, x18 378 bl errata_a57_833471_wa 379#endif 380 381#if ERRATA_A57_859972 382 mov x0, x18 383 bl errata_a57_859972_wa 384#endif 385 386#if IMAGE_BL31 && WORKAROUND_CVE_2017_5715 387 adr x0, workaround_mmu_runtime_exceptions 388 msr vbar_el3, x0 389#endif 390 391 /* --------------------------------------------- 392 * Enable the SMP bit. 393 * --------------------------------------------- 394 */ 395 mrs x0, CORTEX_A57_ECTLR_EL1 396 orr x0, x0, #CORTEX_A57_ECTLR_SMP_BIT 397 msr CORTEX_A57_ECTLR_EL1, x0 398 isb 399 ret x19 400endfunc cortex_a57_reset_func 401 402 /* ---------------------------------------------------- 403 * The CPU Ops core power down function for Cortex-A57. 404 * ---------------------------------------------------- 405 */ 406func cortex_a57_core_pwr_dwn 407 mov x18, x30 408 409 /* --------------------------------------------- 410 * Turn off caches. 411 * --------------------------------------------- 412 */ 413 bl cortex_a57_disable_dcache 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 x0, #DCCISW 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 mov x30, x18 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 * ------------------------------------------------------- 445 */ 446func cortex_a57_cluster_pwr_dwn 447 mov x18, x30 448 449 /* --------------------------------------------- 450 * Turn off caches. 451 * --------------------------------------------- 452 */ 453 bl cortex_a57_disable_dcache 454 455 /* --------------------------------------------- 456 * Disable the L2 prefetches. 457 * --------------------------------------------- 458 */ 459 bl cortex_a57_disable_l2_prefetch 460 461#if !SKIP_A57_L1_FLUSH_PWR_DWN 462 /* ------------------------------------------------- 463 * Flush the L1 caches. 464 * ------------------------------------------------- 465 */ 466 mov x0, #DCCISW 467 bl dcsw_op_level1 468#endif 469 /* --------------------------------------------- 470 * Disable the optional ACP. 471 * --------------------------------------------- 472 */ 473 bl plat_disable_acp 474 475 /* ------------------------------------------------- 476 * Flush the L2 caches. 477 * ------------------------------------------------- 478 */ 479 mov x0, #DCCISW 480 bl dcsw_op_level2 481 482 /* --------------------------------------------- 483 * Come out of intra cluster coherency 484 * --------------------------------------------- 485 */ 486 bl cortex_a57_disable_smp 487 488 /* --------------------------------------------- 489 * Force the debug interfaces to be quiescent 490 * --------------------------------------------- 491 */ 492 mov x30, x18 493 b cortex_a57_disable_ext_debug 494endfunc cortex_a57_cluster_pwr_dwn 495 496#if REPORT_ERRATA 497/* 498 * Errata printing function for Cortex A57. Must follow AAPCS. 499 */ 500func cortex_a57_errata_report 501 stp x8, x30, [sp, #-16]! 502 503 bl cpu_get_rev_var 504 mov x8, x0 505 506 /* 507 * Report all errata. The revision-variant information is passed to 508 * checking functions of each errata. 509 */ 510 report_errata ERRATA_A57_806969, cortex_a57, 806969 511 report_errata ERRATA_A57_813419, cortex_a57, 813419 512 report_errata ERRATA_A57_813420, cortex_a57, 813420 513 report_errata A57_DISABLE_NON_TEMPORAL_HINT, cortex_a57, \ 514 disable_ldnp_overread 515 report_errata ERRATA_A57_826974, cortex_a57, 826974 516 report_errata ERRATA_A57_826977, cortex_a57, 826977 517 report_errata ERRATA_A57_828024, cortex_a57, 828024 518 report_errata ERRATA_A57_829520, cortex_a57, 829520 519 report_errata ERRATA_A57_833471, cortex_a57, 833471 520 report_errata ERRATA_A57_859972, cortex_a57, 859972 521 522 523 ldp x8, x30, [sp], #16 524 ret 525endfunc cortex_a57_errata_report 526#endif 527 528 /* --------------------------------------------- 529 * This function provides cortex_a57 specific 530 * register information for crash reporting. 531 * It needs to return with x6 pointing to 532 * a list of register names in ascii and 533 * x8 - x15 having values of registers to be 534 * reported. 535 * --------------------------------------------- 536 */ 537.section .rodata.cortex_a57_regs, "aS" 538cortex_a57_regs: /* The ascii list of register names to be reported */ 539 .asciz "cpuectlr_el1", "cpumerrsr_el1", "l2merrsr_el1", "" 540 541func cortex_a57_cpu_reg_dump 542 adr x6, cortex_a57_regs 543 mrs x8, CORTEX_A57_ECTLR_EL1 544 mrs x9, CORTEX_A57_MERRSR_EL1 545 mrs x10, CORTEX_A57_L2MERRSR_EL1 546 ret 547endfunc cortex_a57_cpu_reg_dump 548 549 550declare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \ 551 cortex_a57_reset_func, \ 552 cortex_a57_core_pwr_dwn, \ 553 cortex_a57_cluster_pwr_dwn 554