1dc787588SYatharth Kochar/* 2*3fb52e41SRyan Everett * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved. 3dc787588SYatharth Kochar * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5dc787588SYatharth Kochar */ 6dc787588SYatharth Kochar#include <arch.h> 7dc787588SYatharth Kochar#include <asm_macros.S> 8dc787588SYatharth Kochar#include <assert_macros.S> 909d40e0eSAntonio Nino Diaz#include <common/debug.h> 10dc787588SYatharth Kochar#include <cortex_a57.h> 11dc787588SYatharth Kochar#include <cpu_macros.S> 12dc787588SYatharth Kochar 13dc787588SYatharth Kochar /* --------------------------------------------- 14dc787588SYatharth Kochar * Disable intra-cluster coherency 15dc787588SYatharth Kochar * Clobbers: r0-r1 16dc787588SYatharth Kochar * --------------------------------------------- 17dc787588SYatharth Kochar */ 18dc787588SYatharth Kocharfunc cortex_a57_disable_smp 19fb7d32e5SVarun Wadekar ldcopr16 r0, r1, CORTEX_A57_ECTLR 20fb7d32e5SVarun Wadekar bic64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT 21fb7d32e5SVarun Wadekar stcopr16 r0, r1, CORTEX_A57_ECTLR 22dc787588SYatharth Kochar bx lr 23dc787588SYatharth Kocharendfunc cortex_a57_disable_smp 24dc787588SYatharth Kochar 25dc787588SYatharth Kochar /* --------------------------------------------- 26dc787588SYatharth Kochar * Disable all types of L2 prefetches. 27dc787588SYatharth Kochar * Clobbers: r0-r2 28dc787588SYatharth Kochar * --------------------------------------------- 29dc787588SYatharth Kochar */ 30dc787588SYatharth Kocharfunc cortex_a57_disable_l2_prefetch 31fb7d32e5SVarun Wadekar ldcopr16 r0, r1, CORTEX_A57_ECTLR 32fb7d32e5SVarun Wadekar orr64_imm r0, r1, CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT 33fb7d32e5SVarun Wadekar bic64_imm r0, r1, (CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK | \ 34fb7d32e5SVarun Wadekar CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK) 35fb7d32e5SVarun Wadekar stcopr16 r0, r1, CORTEX_A57_ECTLR 36dc787588SYatharth Kochar isb 37dc787588SYatharth Kochar dsb ish 38dc787588SYatharth Kochar bx lr 39dc787588SYatharth Kocharendfunc cortex_a57_disable_l2_prefetch 40dc787588SYatharth Kochar 41dc787588SYatharth Kochar /* --------------------------------------------- 42dc787588SYatharth Kochar * Disable debug interfaces 43dc787588SYatharth Kochar * --------------------------------------------- 44dc787588SYatharth Kochar */ 45dc787588SYatharth Kocharfunc cortex_a57_disable_ext_debug 46dc787588SYatharth Kochar mov r0, #1 47dc787588SYatharth Kochar stcopr r0, DBGOSDLR 48dc787588SYatharth Kochar isb 495bd2c24fSAmbroise Vincent#if ERRATA_A57_817169 505bd2c24fSAmbroise Vincent /* 515bd2c24fSAmbroise Vincent * Invalidate any TLB address 525bd2c24fSAmbroise Vincent */ 535bd2c24fSAmbroise Vincent mov r0, #0 545bd2c24fSAmbroise Vincent stcopr r0, TLBIMVA 555bd2c24fSAmbroise Vincent#endif 56dc787588SYatharth Kochar dsb sy 57dc787588SYatharth Kochar bx lr 58dc787588SYatharth Kocharendfunc cortex_a57_disable_ext_debug 59dc787588SYatharth Kochar 6094f7d1e2SDimitris Papastamos /* -------------------------------------------------- 6194f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #806969. 6294f7d1e2SDimitris Papastamos * This applies only to revision r0p0 of Cortex A57. 6394f7d1e2SDimitris Papastamos * Inputs: 6494f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 6594f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 6694f7d1e2SDimitris Papastamos * -------------------------------------------------- 6794f7d1e2SDimitris Papastamos */ 6894f7d1e2SDimitris Papastamosfunc errata_a57_806969_wa 6994f7d1e2SDimitris Papastamos /* 7094f7d1e2SDimitris Papastamos * Compare r0 against revision r0p0 7194f7d1e2SDimitris Papastamos */ 7294f7d1e2SDimitris Papastamos mov r2, lr 7394f7d1e2SDimitris Papastamos bl check_errata_806969 7494f7d1e2SDimitris Papastamos mov lr, r2 7594f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 7694f7d1e2SDimitris Papastamos beq 1f 7780bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 7880bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA 7980bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 8094f7d1e2SDimitris Papastamos1: 8194f7d1e2SDimitris Papastamos bx lr 8294f7d1e2SDimitris Papastamosendfunc errata_a57_806969_wa 8394f7d1e2SDimitris Papastamos 8494f7d1e2SDimitris Papastamosfunc check_errata_806969 8594f7d1e2SDimitris Papastamos mov r1, #0x00 8694f7d1e2SDimitris Papastamos b cpu_rev_var_ls 8794f7d1e2SDimitris Papastamosendfunc check_errata_806969 8894f7d1e2SDimitris Papastamos 89285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(806969), ERRATA_A57_806969 90285861d0SBoyan Karatotev 9194f7d1e2SDimitris Papastamos /* --------------------------------------------------- 9294f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #813419. 9394f7d1e2SDimitris Papastamos * This applies only to revision r0p0 of Cortex A57. 9494f7d1e2SDimitris Papastamos * --------------------------------------------------- 9594f7d1e2SDimitris Papastamos */ 9694f7d1e2SDimitris Papastamosfunc check_errata_813419 9794f7d1e2SDimitris Papastamos /* 9894f7d1e2SDimitris Papastamos * Even though this is only needed for revision r0p0, it 9994f7d1e2SDimitris Papastamos * is always applied due to limitations of the current 10094f7d1e2SDimitris Papastamos * errata framework. 10194f7d1e2SDimitris Papastamos */ 10294f7d1e2SDimitris Papastamos mov r0, #ERRATA_APPLIES 10394f7d1e2SDimitris Papastamos bx lr 10494f7d1e2SDimitris Papastamosendfunc check_errata_813419 10594f7d1e2SDimitris Papastamos 106285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(813419), ERRATA_A57_813419 107285861d0SBoyan Karatotev 10894f7d1e2SDimitris Papastamos /* --------------------------------------------------- 10994f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #813420. 11094f7d1e2SDimitris Papastamos * This applies only to revision r0p0 of Cortex A57. 11194f7d1e2SDimitris Papastamos * Inputs: 11294f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 11394f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 11494f7d1e2SDimitris Papastamos * --------------------------------------------------- 11594f7d1e2SDimitris Papastamos */ 11694f7d1e2SDimitris Papastamosfunc errata_a57_813420_wa 11794f7d1e2SDimitris Papastamos /* 11894f7d1e2SDimitris Papastamos * Compare r0 against revision r0p0 11994f7d1e2SDimitris Papastamos */ 12094f7d1e2SDimitris Papastamos mov r2, lr 12194f7d1e2SDimitris Papastamos bl check_errata_813420 12294f7d1e2SDimitris Papastamos mov lr, r2 12394f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 12494f7d1e2SDimitris Papastamos beq 1f 12580bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 12680bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DCC_AS_DCCI 12780bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 12894f7d1e2SDimitris Papastamos1: 12994f7d1e2SDimitris Papastamos bx lr 13094f7d1e2SDimitris Papastamosendfunc errata_a57_813420_wa 13194f7d1e2SDimitris Papastamos 13294f7d1e2SDimitris Papastamosfunc check_errata_813420 13394f7d1e2SDimitris Papastamos mov r1, #0x00 13494f7d1e2SDimitris Papastamos b cpu_rev_var_ls 13594f7d1e2SDimitris Papastamosendfunc check_errata_813420 13694f7d1e2SDimitris Papastamos 137285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(813420), ERRATA_A57_813420 138285861d0SBoyan Karatotev 1390f6fbbd2SAmbroise Vincent /* --------------------------------------------------- 1400f6fbbd2SAmbroise Vincent * Errata Workaround for Cortex A57 Errata #814670. 1410f6fbbd2SAmbroise Vincent * This applies only to revision r0p0 of Cortex A57. 1420f6fbbd2SAmbroise Vincent * Inputs: 1430f6fbbd2SAmbroise Vincent * r0: variant[4:7] and revision[0:3] of current cpu. 1440f6fbbd2SAmbroise Vincent * Shall clobber: r0-r3 1450f6fbbd2SAmbroise Vincent * --------------------------------------------------- 1460f6fbbd2SAmbroise Vincent */ 1470f6fbbd2SAmbroise Vincentfunc errata_a57_814670_wa 1480f6fbbd2SAmbroise Vincent /* 1490f6fbbd2SAmbroise Vincent * Compare r0 against revision r0p0 1500f6fbbd2SAmbroise Vincent */ 1510f6fbbd2SAmbroise Vincent mov r2, lr 1520f6fbbd2SAmbroise Vincent bl check_errata_814670 1530f6fbbd2SAmbroise Vincent cmp r0, #ERRATA_NOT_APPLIES 1540f6fbbd2SAmbroise Vincent beq 1f 1550f6fbbd2SAmbroise Vincent ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 1560f6fbbd2SAmbroise Vincent orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_DMB_NULLIFICATION 1570f6fbbd2SAmbroise Vincent stcopr16 r0, r1, CORTEX_A57_CPUACTLR 1580f6fbbd2SAmbroise Vincent isb 1590f6fbbd2SAmbroise Vincent1: 1600f6fbbd2SAmbroise Vincent bx r2 1610f6fbbd2SAmbroise Vincentendfunc errata_a57_814670_wa 1620f6fbbd2SAmbroise Vincent 1630f6fbbd2SAmbroise Vincentfunc check_errata_814670 1640f6fbbd2SAmbroise Vincent mov r1, #0x00 1650f6fbbd2SAmbroise Vincent b cpu_rev_var_ls 1660f6fbbd2SAmbroise Vincentendfunc check_errata_814670 1670f6fbbd2SAmbroise Vincent 168285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(814670), ERRATA_A57_814670 169285861d0SBoyan Karatotev 1705bd2c24fSAmbroise Vincent /* ---------------------------------------------------- 1715bd2c24fSAmbroise Vincent * Errata Workaround for Cortex A57 Errata #817169. 1725bd2c24fSAmbroise Vincent * This applies only to revision <= r0p1 of Cortex A57. 1735bd2c24fSAmbroise Vincent * ---------------------------------------------------- 1745bd2c24fSAmbroise Vincent */ 1755bd2c24fSAmbroise Vincentfunc check_errata_817169 1765bd2c24fSAmbroise Vincent /* 1775bd2c24fSAmbroise Vincent * Even though this is only needed for revision <= r0p1, it 1785bd2c24fSAmbroise Vincent * is always applied because of the low cost of the workaround. 1795bd2c24fSAmbroise Vincent */ 1805bd2c24fSAmbroise Vincent mov r0, #ERRATA_APPLIES 1815bd2c24fSAmbroise Vincent bx lr 1825bd2c24fSAmbroise Vincentendfunc check_errata_817169 1835bd2c24fSAmbroise Vincent 184285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(817169), ERRATA_A57_817169 185285861d0SBoyan Karatotev 18694f7d1e2SDimitris Papastamos /* -------------------------------------------------------------------- 18794f7d1e2SDimitris Papastamos * Disable the over-read from the LDNP instruction. 18894f7d1e2SDimitris Papastamos * 18994f7d1e2SDimitris Papastamos * This applies to all revisions <= r1p2. The performance degradation 19094f7d1e2SDimitris Papastamos * observed with LDNP/STNP has been fixed on r1p3 and onwards. 19194f7d1e2SDimitris Papastamos * 19294f7d1e2SDimitris Papastamos * Inputs: 19394f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 19494f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 19594f7d1e2SDimitris Papastamos * --------------------------------------------------------------------- 19694f7d1e2SDimitris Papastamos */ 19794f7d1e2SDimitris Papastamosfunc a57_disable_ldnp_overread 19894f7d1e2SDimitris Papastamos /* 19994f7d1e2SDimitris Papastamos * Compare r0 against revision r1p2 20094f7d1e2SDimitris Papastamos */ 20194f7d1e2SDimitris Papastamos mov r2, lr 20294f7d1e2SDimitris Papastamos bl check_errata_disable_ldnp_overread 20394f7d1e2SDimitris Papastamos mov lr, r2 20494f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 20594f7d1e2SDimitris Papastamos beq 1f 20680bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 20780bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_OVERREAD 20880bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 20994f7d1e2SDimitris Papastamos1: 21094f7d1e2SDimitris Papastamos bx lr 21194f7d1e2SDimitris Papastamosendfunc a57_disable_ldnp_overread 21294f7d1e2SDimitris Papastamos 21394f7d1e2SDimitris Papastamosfunc check_errata_disable_ldnp_overread 21494f7d1e2SDimitris Papastamos mov r1, #0x12 21594f7d1e2SDimitris Papastamos b cpu_rev_var_ls 21694f7d1e2SDimitris Papastamosendfunc check_errata_disable_ldnp_overread 21794f7d1e2SDimitris Papastamos 218285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(1), A57_DISABLE_NON_TEMPORAL_HINT, disable_ldnp_overread 219285861d0SBoyan Karatotev 22094f7d1e2SDimitris Papastamos /* --------------------------------------------------- 22194f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #826974. 22294f7d1e2SDimitris Papastamos * This applies only to revision <= r1p1 of Cortex A57. 22394f7d1e2SDimitris Papastamos * Inputs: 22494f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 22594f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 22694f7d1e2SDimitris Papastamos * --------------------------------------------------- 22794f7d1e2SDimitris Papastamos */ 22894f7d1e2SDimitris Papastamosfunc errata_a57_826974_wa 22994f7d1e2SDimitris Papastamos /* 23094f7d1e2SDimitris Papastamos * Compare r0 against revision r1p1 23194f7d1e2SDimitris Papastamos */ 23294f7d1e2SDimitris Papastamos mov r2, lr 23394f7d1e2SDimitris Papastamos bl check_errata_826974 23494f7d1e2SDimitris Papastamos mov lr, r2 23594f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 23694f7d1e2SDimitris Papastamos beq 1f 23780bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 23880bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_DMB 23980bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 24094f7d1e2SDimitris Papastamos1: 24194f7d1e2SDimitris Papastamos bx lr 24294f7d1e2SDimitris Papastamosendfunc errata_a57_826974_wa 24394f7d1e2SDimitris Papastamos 24494f7d1e2SDimitris Papastamosfunc check_errata_826974 24594f7d1e2SDimitris Papastamos mov r1, #0x11 24694f7d1e2SDimitris Papastamos b cpu_rev_var_ls 24794f7d1e2SDimitris Papastamosendfunc check_errata_826974 24894f7d1e2SDimitris Papastamos 249285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(826974), ERRATA_A57_826974 250285861d0SBoyan Karatotev 25194f7d1e2SDimitris Papastamos /* --------------------------------------------------- 25294f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #826977. 25394f7d1e2SDimitris Papastamos * This applies only to revision <= r1p1 of Cortex A57. 25494f7d1e2SDimitris Papastamos * Inputs: 25594f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 25694f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 25794f7d1e2SDimitris Papastamos * --------------------------------------------------- 25894f7d1e2SDimitris Papastamos */ 25994f7d1e2SDimitris Papastamosfunc errata_a57_826977_wa 26094f7d1e2SDimitris Papastamos /* 26194f7d1e2SDimitris Papastamos * Compare r0 against revision r1p1 26294f7d1e2SDimitris Papastamos */ 26394f7d1e2SDimitris Papastamos mov r2, lr 26494f7d1e2SDimitris Papastamos bl check_errata_826977 26594f7d1e2SDimitris Papastamos mov lr, r2 26694f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 26794f7d1e2SDimitris Papastamos beq 1f 26880bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 26980bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_GRE_NGRE_AS_NGNRE 27080bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 27194f7d1e2SDimitris Papastamos1: 27294f7d1e2SDimitris Papastamos bx lr 27394f7d1e2SDimitris Papastamosendfunc errata_a57_826977_wa 27494f7d1e2SDimitris Papastamos 27594f7d1e2SDimitris Papastamosfunc check_errata_826977 27694f7d1e2SDimitris Papastamos mov r1, #0x11 27794f7d1e2SDimitris Papastamos b cpu_rev_var_ls 27894f7d1e2SDimitris Papastamosendfunc check_errata_826977 27994f7d1e2SDimitris Papastamos 280285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(826977), ERRATA_A57_826977 281285861d0SBoyan Karatotev 28294f7d1e2SDimitris Papastamos /* --------------------------------------------------- 28394f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #828024. 28494f7d1e2SDimitris Papastamos * This applies only to revision <= r1p1 of Cortex A57. 28594f7d1e2SDimitris Papastamos * Inputs: 28694f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 28794f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 28894f7d1e2SDimitris Papastamos * --------------------------------------------------- 28994f7d1e2SDimitris Papastamos */ 29094f7d1e2SDimitris Papastamosfunc errata_a57_828024_wa 29194f7d1e2SDimitris Papastamos /* 29294f7d1e2SDimitris Papastamos * Compare r0 against revision r1p1 29394f7d1e2SDimitris Papastamos */ 29494f7d1e2SDimitris Papastamos mov r2, lr 29594f7d1e2SDimitris Papastamos bl check_errata_828024 29694f7d1e2SDimitris Papastamos mov lr, r2 29794f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 29894f7d1e2SDimitris Papastamos beq 1f 29980bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 30094f7d1e2SDimitris Papastamos /* 30180bcf981SEleanor Bonnici * Setting the relevant bits in CORTEX_A57_CPUACTLR has to be done in 2 30294f7d1e2SDimitris Papastamos * instructions here because the resulting bitmask doesn't fit in a 30394f7d1e2SDimitris Papastamos * 16-bit value so it cannot be encoded in a single instruction. 30494f7d1e2SDimitris Papastamos */ 30580bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA 30680bcf981SEleanor Bonnici orr64_imm r0, r1, (CORTEX_A57_CPUACTLR_DIS_L1_STREAMING | CORTEX_A57_CPUACTLR_DIS_STREAMING) 30780bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 30894f7d1e2SDimitris Papastamos1: 30994f7d1e2SDimitris Papastamos bx lr 31094f7d1e2SDimitris Papastamosendfunc errata_a57_828024_wa 31194f7d1e2SDimitris Papastamos 31294f7d1e2SDimitris Papastamosfunc check_errata_828024 31394f7d1e2SDimitris Papastamos mov r1, #0x11 31494f7d1e2SDimitris Papastamos b cpu_rev_var_ls 31594f7d1e2SDimitris Papastamosendfunc check_errata_828024 31694f7d1e2SDimitris Papastamos 317285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(828024), ERRATA_A57_828024 318285861d0SBoyan Karatotev 31994f7d1e2SDimitris Papastamos /* --------------------------------------------------- 32094f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #829520. 32194f7d1e2SDimitris Papastamos * This applies only to revision <= r1p2 of Cortex A57. 32294f7d1e2SDimitris Papastamos * Inputs: 32394f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 32494f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 32594f7d1e2SDimitris Papastamos * --------------------------------------------------- 32694f7d1e2SDimitris Papastamos */ 32794f7d1e2SDimitris Papastamosfunc errata_a57_829520_wa 32894f7d1e2SDimitris Papastamos /* 32994f7d1e2SDimitris Papastamos * Compare r0 against revision r1p2 33094f7d1e2SDimitris Papastamos */ 33194f7d1e2SDimitris Papastamos mov r2, lr 33294f7d1e2SDimitris Papastamos bl check_errata_829520 33394f7d1e2SDimitris Papastamos mov lr, r2 33494f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 33594f7d1e2SDimitris Papastamos beq 1f 33680bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 33780bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_INDIRECT_PREDICTOR 33880bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 33994f7d1e2SDimitris Papastamos1: 34094f7d1e2SDimitris Papastamos bx lr 34194f7d1e2SDimitris Papastamosendfunc errata_a57_829520_wa 34294f7d1e2SDimitris Papastamos 34394f7d1e2SDimitris Papastamosfunc check_errata_829520 34494f7d1e2SDimitris Papastamos mov r1, #0x12 34594f7d1e2SDimitris Papastamos b cpu_rev_var_ls 34694f7d1e2SDimitris Papastamosendfunc check_errata_829520 34794f7d1e2SDimitris Papastamos 348285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(829520), ERRATA_A57_829520 349285861d0SBoyan Karatotev 35094f7d1e2SDimitris Papastamos /* --------------------------------------------------- 35194f7d1e2SDimitris Papastamos * Errata Workaround for Cortex A57 Errata #833471. 35294f7d1e2SDimitris Papastamos * This applies only to revision <= r1p2 of Cortex A57. 35394f7d1e2SDimitris Papastamos * Inputs: 35494f7d1e2SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 35594f7d1e2SDimitris Papastamos * Shall clobber: r0-r3 35694f7d1e2SDimitris Papastamos * --------------------------------------------------- 35794f7d1e2SDimitris Papastamos */ 35894f7d1e2SDimitris Papastamosfunc errata_a57_833471_wa 35994f7d1e2SDimitris Papastamos /* 36094f7d1e2SDimitris Papastamos * Compare r0 against revision r1p2 36194f7d1e2SDimitris Papastamos */ 36294f7d1e2SDimitris Papastamos mov r2, lr 36394f7d1e2SDimitris Papastamos bl check_errata_833471 36494f7d1e2SDimitris Papastamos mov lr, r2 36594f7d1e2SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 36694f7d1e2SDimitris Papastamos beq 1f 36780bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 36880bcf981SEleanor Bonnici orr64_imm r1, r1, CORTEX_A57_CPUACTLR_FORCE_FPSCR_FLUSH 36980bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 37094f7d1e2SDimitris Papastamos1: 37194f7d1e2SDimitris Papastamos bx lr 37294f7d1e2SDimitris Papastamosendfunc errata_a57_833471_wa 37394f7d1e2SDimitris Papastamos 37494f7d1e2SDimitris Papastamosfunc check_errata_833471 37594f7d1e2SDimitris Papastamos mov r1, #0x12 37694f7d1e2SDimitris Papastamos b cpu_rev_var_ls 37794f7d1e2SDimitris Papastamosendfunc check_errata_833471 37894f7d1e2SDimitris Papastamos 379285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(833471), ERRATA_A57_833471 380285861d0SBoyan Karatotev 38145b52c20SEleanor Bonnici /* --------------------------------------------------- 38245b52c20SEleanor Bonnici * Errata Workaround for Cortex A57 Errata #859972. 38345b52c20SEleanor Bonnici * This applies only to revision <= r1p3 of Cortex A57. 38445b52c20SEleanor Bonnici * Inputs: 38545b52c20SEleanor Bonnici * r0: variant[4:7] and revision[0:3] of current cpu. 38645b52c20SEleanor Bonnici * Shall clobber: r0-r3 38745b52c20SEleanor Bonnici * --------------------------------------------------- 38845b52c20SEleanor Bonnici */ 38945b52c20SEleanor Bonnicifunc errata_a57_859972_wa 39045b52c20SEleanor Bonnici mov r2, lr 39145b52c20SEleanor Bonnici bl check_errata_859972 39245b52c20SEleanor Bonnici mov lr, r2 39345b52c20SEleanor Bonnici cmp r0, #ERRATA_NOT_APPLIES 39445b52c20SEleanor Bonnici beq 1f 39545b52c20SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 39645b52c20SEleanor Bonnici orr64_imm r1, r1, CORTEX_A57_CPUACTLR_DIS_INSTR_PREFETCH 39745b52c20SEleanor Bonnici stcopr16 r0, r1, CORTEX_A57_CPUACTLR 39845b52c20SEleanor Bonnici1: 39945b52c20SEleanor Bonnici bx lr 40045b52c20SEleanor Bonniciendfunc errata_a57_859972_wa 40145b52c20SEleanor Bonnici 40245b52c20SEleanor Bonnicifunc check_errata_859972 40345b52c20SEleanor Bonnici mov r1, #0x13 40445b52c20SEleanor Bonnici b cpu_rev_var_ls 40545b52c20SEleanor Bonniciendfunc check_errata_859972 40645b52c20SEleanor Bonnici 407285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(859972), ERRATA_A57_859972 408285861d0SBoyan Karatotev 409e4b34efaSDimitris Papastamosfunc check_errata_cve_2017_5715 410e4b34efaSDimitris Papastamos mov r0, #ERRATA_MISSING 411e4b34efaSDimitris Papastamos bx lr 412e4b34efaSDimitris Papastamosendfunc check_errata_cve_2017_5715 413e4b34efaSDimitris Papastamos 414285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, CVE(2017, 5715), WORKAROUND_CVE_2017_5715 415285861d0SBoyan Karatotev 416e0865708SDimitris Papastamosfunc check_errata_cve_2018_3639 417e0865708SDimitris Papastamos#if WORKAROUND_CVE_2018_3639 418e0865708SDimitris Papastamos mov r0, #ERRATA_APPLIES 419e0865708SDimitris Papastamos#else 420e0865708SDimitris Papastamos mov r0, #ERRATA_MISSING 421e0865708SDimitris Papastamos#endif 422e0865708SDimitris Papastamos bx lr 423e0865708SDimitris Papastamosendfunc check_errata_cve_2018_3639 424e0865708SDimitris Papastamos 425285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, CVE(2018, 3639), WORKAROUND_CVE_2018_3639 426285861d0SBoyan Karatotev 4272e5d7a4bSJohn Powellfunc check_errata_cve_2022_23960 4282e5d7a4bSJohn Powell mov r0, #ERRATA_MISSING 4292e5d7a4bSJohn Powell bx lr 4302e5d7a4bSJohn Powellendfunc check_errata_cve_2022_23960 4312e5d7a4bSJohn Powell 432285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 433285861d0SBoyan Karatotev 434dc787588SYatharth Kochar /* ------------------------------------------------- 435dc787588SYatharth Kochar * The CPU Ops reset function for Cortex-A57. 43694f7d1e2SDimitris Papastamos * Shall clobber: r0-r6 437dc787588SYatharth Kochar * ------------------------------------------------- 438dc787588SYatharth Kochar */ 439dc787588SYatharth Kocharfunc cortex_a57_reset_func 44094f7d1e2SDimitris Papastamos mov r5, lr 44194f7d1e2SDimitris Papastamos bl cpu_get_rev_var 44294f7d1e2SDimitris Papastamos mov r4, r0 44394f7d1e2SDimitris Papastamos 44494f7d1e2SDimitris Papastamos#if ERRATA_A57_806969 44594f7d1e2SDimitris Papastamos mov r0, r4 44694f7d1e2SDimitris Papastamos bl errata_a57_806969_wa 44794f7d1e2SDimitris Papastamos#endif 44894f7d1e2SDimitris Papastamos 44994f7d1e2SDimitris Papastamos#if ERRATA_A57_813420 45094f7d1e2SDimitris Papastamos mov r0, r4 45194f7d1e2SDimitris Papastamos bl errata_a57_813420_wa 45294f7d1e2SDimitris Papastamos#endif 45394f7d1e2SDimitris Papastamos 4540f6fbbd2SAmbroise Vincent#if ERRATA_A57_814670 4550f6fbbd2SAmbroise Vincent mov r0, r4 4560f6fbbd2SAmbroise Vincent bl errata_a57_814670_wa 4570f6fbbd2SAmbroise Vincent#endif 4580f6fbbd2SAmbroise Vincent 45994f7d1e2SDimitris Papastamos#if A57_DISABLE_NON_TEMPORAL_HINT 46094f7d1e2SDimitris Papastamos mov r0, r4 46194f7d1e2SDimitris Papastamos bl a57_disable_ldnp_overread 46294f7d1e2SDimitris Papastamos#endif 46394f7d1e2SDimitris Papastamos 46494f7d1e2SDimitris Papastamos#if ERRATA_A57_826974 46594f7d1e2SDimitris Papastamos mov r0, r4 46694f7d1e2SDimitris Papastamos bl errata_a57_826974_wa 46794f7d1e2SDimitris Papastamos#endif 46894f7d1e2SDimitris Papastamos 46994f7d1e2SDimitris Papastamos#if ERRATA_A57_826977 47094f7d1e2SDimitris Papastamos mov r0, r4 47194f7d1e2SDimitris Papastamos bl errata_a57_826977_wa 47294f7d1e2SDimitris Papastamos#endif 47394f7d1e2SDimitris Papastamos 47494f7d1e2SDimitris Papastamos#if ERRATA_A57_828024 47594f7d1e2SDimitris Papastamos mov r0, r4 47694f7d1e2SDimitris Papastamos bl errata_a57_828024_wa 47794f7d1e2SDimitris Papastamos#endif 47894f7d1e2SDimitris Papastamos 47994f7d1e2SDimitris Papastamos#if ERRATA_A57_829520 48094f7d1e2SDimitris Papastamos mov r0, r4 48194f7d1e2SDimitris Papastamos bl errata_a57_829520_wa 48294f7d1e2SDimitris Papastamos#endif 48394f7d1e2SDimitris Papastamos 48494f7d1e2SDimitris Papastamos#if ERRATA_A57_833471 48594f7d1e2SDimitris Papastamos mov r0, r4 48694f7d1e2SDimitris Papastamos bl errata_a57_833471_wa 48794f7d1e2SDimitris Papastamos#endif 48894f7d1e2SDimitris Papastamos 48945b52c20SEleanor Bonnici#if ERRATA_A57_859972 49045b52c20SEleanor Bonnici mov r0, r4 49145b52c20SEleanor Bonnici bl errata_a57_859972_wa 49245b52c20SEleanor Bonnici#endif 49345b52c20SEleanor Bonnici 494e0865708SDimitris Papastamos#if WORKAROUND_CVE_2018_3639 495e0865708SDimitris Papastamos ldcopr16 r0, r1, CORTEX_A57_CPUACTLR 496e0865708SDimitris Papastamos orr64_imm r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_STORE 497e0865708SDimitris Papastamos stcopr16 r0, r1, CORTEX_A57_CPUACTLR 498e0865708SDimitris Papastamos isb 499e0865708SDimitris Papastamos dsb sy 500e0865708SDimitris Papastamos#endif 501e0865708SDimitris Papastamos 502dc787588SYatharth Kochar /* --------------------------------------------- 503dc787588SYatharth Kochar * Enable the SMP bit. 504dc787588SYatharth Kochar * --------------------------------------------- 505dc787588SYatharth Kochar */ 506fb7d32e5SVarun Wadekar ldcopr16 r0, r1, CORTEX_A57_ECTLR 507fb7d32e5SVarun Wadekar orr64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT 508fb7d32e5SVarun Wadekar stcopr16 r0, r1, CORTEX_A57_ECTLR 509dc787588SYatharth Kochar isb 51094f7d1e2SDimitris Papastamos bx r5 511dc787588SYatharth Kocharendfunc cortex_a57_reset_func 512dc787588SYatharth Kochar 513dc787588SYatharth Kochar /* ---------------------------------------------------- 514dc787588SYatharth Kochar * The CPU Ops core power down function for Cortex-A57. 515dc787588SYatharth Kochar * ---------------------------------------------------- 516dc787588SYatharth Kochar */ 517dc787588SYatharth Kocharfunc cortex_a57_core_pwr_dwn 518dc787588SYatharth Kochar push {r12, lr} 519dc787588SYatharth Kochar 520dc787588SYatharth Kochar /* Assert if cache is enabled */ 5215f70d8deSMatt Ma#if ENABLE_ASSERTIONS 522dc787588SYatharth Kochar ldcopr r0, SCTLR 523dc787588SYatharth Kochar tst r0, #SCTLR_C_BIT 524dc787588SYatharth Kochar ASM_ASSERT(eq) 525dc787588SYatharth Kochar#endif 526dc787588SYatharth Kochar 527dc787588SYatharth Kochar /* --------------------------------------------- 528dc787588SYatharth Kochar * Disable the L2 prefetches. 529dc787588SYatharth Kochar * --------------------------------------------- 530dc787588SYatharth Kochar */ 531dc787588SYatharth Kochar bl cortex_a57_disable_l2_prefetch 532dc787588SYatharth Kochar 533dc787588SYatharth Kochar /* --------------------------------------------- 534dc787588SYatharth Kochar * Flush L1 caches. 535dc787588SYatharth Kochar * --------------------------------------------- 536dc787588SYatharth Kochar */ 537dc787588SYatharth Kochar mov r0, #DC_OP_CISW 538dc787588SYatharth Kochar bl dcsw_op_level1 539dc787588SYatharth Kochar 540dc787588SYatharth Kochar /* --------------------------------------------- 541dc787588SYatharth Kochar * Come out of intra cluster coherency 542dc787588SYatharth Kochar * --------------------------------------------- 543dc787588SYatharth Kochar */ 544dc787588SYatharth Kochar bl cortex_a57_disable_smp 545dc787588SYatharth Kochar 546dc787588SYatharth Kochar /* --------------------------------------------- 547dc787588SYatharth Kochar * Force the debug interfaces to be quiescent 548dc787588SYatharth Kochar * --------------------------------------------- 549dc787588SYatharth Kochar */ 550dc787588SYatharth Kochar pop {r12, lr} 551dc787588SYatharth Kochar b cortex_a57_disable_ext_debug 552dc787588SYatharth Kocharendfunc cortex_a57_core_pwr_dwn 553dc787588SYatharth Kochar 554dc787588SYatharth Kochar /* ------------------------------------------------------- 555dc787588SYatharth Kochar * The CPU Ops cluster power down function for Cortex-A57. 556dc787588SYatharth Kochar * Clobbers: r0-r3 557dc787588SYatharth Kochar * ------------------------------------------------------- 558dc787588SYatharth Kochar */ 559dc787588SYatharth Kocharfunc cortex_a57_cluster_pwr_dwn 560dc787588SYatharth Kochar push {r12, lr} 561dc787588SYatharth Kochar 562dc787588SYatharth Kochar /* Assert if cache is enabled */ 5635f70d8deSMatt Ma#if ENABLE_ASSERTIONS 564dc787588SYatharth Kochar ldcopr r0, SCTLR 565dc787588SYatharth Kochar tst r0, #SCTLR_C_BIT 566dc787588SYatharth Kochar ASM_ASSERT(eq) 567dc787588SYatharth Kochar#endif 568dc787588SYatharth Kochar 569dc787588SYatharth Kochar /* --------------------------------------------- 570dc787588SYatharth Kochar * Disable the L2 prefetches. 571dc787588SYatharth Kochar * --------------------------------------------- 572dc787588SYatharth Kochar */ 573dc787588SYatharth Kochar bl cortex_a57_disable_l2_prefetch 574dc787588SYatharth Kochar 575dc787588SYatharth Kochar /* --------------------------------------------- 576dc787588SYatharth Kochar * Flush L1 caches. 577dc787588SYatharth Kochar * --------------------------------------------- 578dc787588SYatharth Kochar */ 579dc787588SYatharth Kochar mov r0, #DC_OP_CISW 580dc787588SYatharth Kochar bl dcsw_op_level1 581dc787588SYatharth Kochar 582dc787588SYatharth Kochar /* --------------------------------------------- 583dc787588SYatharth Kochar * Disable the optional ACP. 584dc787588SYatharth Kochar * --------------------------------------------- 585dc787588SYatharth Kochar */ 586dc787588SYatharth Kochar bl plat_disable_acp 587dc787588SYatharth Kochar 588dc787588SYatharth Kochar /* --------------------------------------------- 589dc787588SYatharth Kochar * Flush L2 caches. 590dc787588SYatharth Kochar * --------------------------------------------- 591dc787588SYatharth Kochar */ 592dc787588SYatharth Kochar mov r0, #DC_OP_CISW 593dc787588SYatharth Kochar bl dcsw_op_level2 594dc787588SYatharth Kochar 595dc787588SYatharth Kochar /* --------------------------------------------- 596dc787588SYatharth Kochar * Come out of intra cluster coherency 597dc787588SYatharth Kochar * --------------------------------------------- 598dc787588SYatharth Kochar */ 599dc787588SYatharth Kochar bl cortex_a57_disable_smp 600dc787588SYatharth Kochar 601dc787588SYatharth Kochar /* --------------------------------------------- 602dc787588SYatharth Kochar * Force the debug interfaces to be quiescent 603dc787588SYatharth Kochar * --------------------------------------------- 604dc787588SYatharth Kochar */ 605dc787588SYatharth Kochar pop {r12, lr} 606dc787588SYatharth Kochar b cortex_a57_disable_ext_debug 607dc787588SYatharth Kocharendfunc cortex_a57_cluster_pwr_dwn 608dc787588SYatharth Kochar 609dc787588SYatharth Kochardeclare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \ 610dc787588SYatharth Kochar cortex_a57_reset_func, \ 611dc787588SYatharth Kochar cortex_a57_core_pwr_dwn, \ 612dc787588SYatharth Kochar cortex_a57_cluster_pwr_dwn 613