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 /* --------------------------------------------- 387 * Enable the SMP bit. 388 * --------------------------------------------- 389 */ 390 mrs x0, CORTEX_A57_ECTLR_EL1 391 orr x0, x0, #CORTEX_A57_ECTLR_SMP_BIT 392 msr CORTEX_A57_ECTLR_EL1, x0 393 isb 394 ret x19 395endfunc cortex_a57_reset_func 396 397 /* ---------------------------------------------------- 398 * The CPU Ops core power down function for Cortex-A57. 399 * ---------------------------------------------------- 400 */ 401func cortex_a57_core_pwr_dwn 402 mov x18, x30 403 404 /* --------------------------------------------- 405 * Turn off caches. 406 * --------------------------------------------- 407 */ 408 bl cortex_a57_disable_dcache 409 410 /* --------------------------------------------- 411 * Disable the L2 prefetches. 412 * --------------------------------------------- 413 */ 414 bl cortex_a57_disable_l2_prefetch 415 416 /* --------------------------------------------- 417 * Flush L1 caches. 418 * --------------------------------------------- 419 */ 420 mov x0, #DCCISW 421 bl dcsw_op_level1 422 423 /* --------------------------------------------- 424 * Come out of intra cluster coherency 425 * --------------------------------------------- 426 */ 427 bl cortex_a57_disable_smp 428 429 /* --------------------------------------------- 430 * Force the debug interfaces to be quiescent 431 * --------------------------------------------- 432 */ 433 mov x30, x18 434 b cortex_a57_disable_ext_debug 435endfunc cortex_a57_core_pwr_dwn 436 437 /* ------------------------------------------------------- 438 * The CPU Ops cluster power down function for Cortex-A57. 439 * ------------------------------------------------------- 440 */ 441func cortex_a57_cluster_pwr_dwn 442 mov x18, x30 443 444 /* --------------------------------------------- 445 * Turn off caches. 446 * --------------------------------------------- 447 */ 448 bl cortex_a57_disable_dcache 449 450 /* --------------------------------------------- 451 * Disable the L2 prefetches. 452 * --------------------------------------------- 453 */ 454 bl cortex_a57_disable_l2_prefetch 455 456#if !SKIP_A57_L1_FLUSH_PWR_DWN 457 /* ------------------------------------------------- 458 * Flush the L1 caches. 459 * ------------------------------------------------- 460 */ 461 mov x0, #DCCISW 462 bl dcsw_op_level1 463#endif 464 /* --------------------------------------------- 465 * Disable the optional ACP. 466 * --------------------------------------------- 467 */ 468 bl plat_disable_acp 469 470 /* ------------------------------------------------- 471 * Flush the L2 caches. 472 * ------------------------------------------------- 473 */ 474 mov x0, #DCCISW 475 bl dcsw_op_level2 476 477 /* --------------------------------------------- 478 * Come out of intra cluster coherency 479 * --------------------------------------------- 480 */ 481 bl cortex_a57_disable_smp 482 483 /* --------------------------------------------- 484 * Force the debug interfaces to be quiescent 485 * --------------------------------------------- 486 */ 487 mov x30, x18 488 b cortex_a57_disable_ext_debug 489endfunc cortex_a57_cluster_pwr_dwn 490 491#if REPORT_ERRATA 492/* 493 * Errata printing function for Cortex A57. Must follow AAPCS. 494 */ 495func cortex_a57_errata_report 496 stp x8, x30, [sp, #-16]! 497 498 bl cpu_get_rev_var 499 mov x8, x0 500 501 /* 502 * Report all errata. The revision-variant information is passed to 503 * checking functions of each errata. 504 */ 505 report_errata ERRATA_A57_806969, cortex_a57, 806969 506 report_errata ERRATA_A57_813419, cortex_a57, 813419 507 report_errata ERRATA_A57_813420, cortex_a57, 813420 508 report_errata A57_DISABLE_NON_TEMPORAL_HINT, cortex_a57, \ 509 disable_ldnp_overread 510 report_errata ERRATA_A57_826974, cortex_a57, 826974 511 report_errata ERRATA_A57_826977, cortex_a57, 826977 512 report_errata ERRATA_A57_828024, cortex_a57, 828024 513 report_errata ERRATA_A57_829520, cortex_a57, 829520 514 report_errata ERRATA_A57_833471, cortex_a57, 833471 515 report_errata ERRATA_A57_859972, cortex_a57, 859972 516 517 518 ldp x8, x30, [sp], #16 519 ret 520endfunc cortex_a57_errata_report 521#endif 522 523 /* --------------------------------------------- 524 * This function provides cortex_a57 specific 525 * register information for crash reporting. 526 * It needs to return with x6 pointing to 527 * a list of register names in ascii and 528 * x8 - x15 having values of registers to be 529 * reported. 530 * --------------------------------------------- 531 */ 532.section .rodata.cortex_a57_regs, "aS" 533cortex_a57_regs: /* The ascii list of register names to be reported */ 534 .asciz "cpuectlr_el1", "cpumerrsr_el1", "l2merrsr_el1", "" 535 536func cortex_a57_cpu_reg_dump 537 adr x6, cortex_a57_regs 538 mrs x8, CORTEX_A57_ECTLR_EL1 539 mrs x9, CORTEX_A57_MERRSR_EL1 540 mrs x10, CORTEX_A57_L2MERRSR_EL1 541 ret 542endfunc cortex_a57_cpu_reg_dump 543 544 545declare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \ 546 cortex_a57_reset_func, \ 547 cortex_a57_core_pwr_dwn, \ 548 cortex_a57_cluster_pwr_dwn 549