Home | History | Annotate | Download | only in aarch32
      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_a53.h>
     10 #include <cpu_macros.S>
     11 #include <debug.h>
     12 
     13 #if A53_DISABLE_NON_TEMPORAL_HINT
     14 #undef ERRATA_A53_836870
     15 #define ERRATA_A53_836870	1
     16 #endif
     17 
     18 	/* ---------------------------------------------
     19 	 * Disable intra-cluster coherency
     20 	 * ---------------------------------------------
     21 	 */
     22 func cortex_a53_disable_smp
     23 	ldcopr16	r0, r1, CORTEX_A53_ECTLR
     24 	bic64_imm	r0, r1, CORTEX_A53_ECTLR_SMP_BIT
     25 	stcopr16	r0, r1, CORTEX_A53_ECTLR
     26 	isb
     27 	dsb	sy
     28 	bx	lr
     29 endfunc cortex_a53_disable_smp
     30 
     31 	/* --------------------------------------------------
     32 	 * Errata Workaround for Cortex A53 Errata #826319.
     33 	 * This applies only to revision <= r0p2 of Cortex A53.
     34 	 * Inputs:
     35 	 * r0: variant[4:7] and revision[0:3] of current cpu.
     36 	 * Shall clobber: r0-r3
     37 	 * --------------------------------------------------
     38 	 */
     39 func errata_a53_826319_wa
     40 	/*
     41 	 * Compare r0 against revision r0p2
     42 	 */
     43 	mov	r2, lr
     44 	bl	check_errata_826319
     45 	mov	lr, r2
     46 	cmp	r0, #ERRATA_NOT_APPLIES
     47 	beq	1f
     48 	ldcopr	r0, CORTEX_A53_L2ACTLR
     49 	bic	r0, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN
     50 	orr	r0, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH
     51 	stcopr	r0, CORTEX_A53_L2ACTLR
     52 1:
     53 	bx	lr
     54 endfunc errata_a53_826319_wa
     55 
     56 func check_errata_826319
     57 	mov	r1, #0x02
     58 	b	cpu_rev_var_ls
     59 endfunc check_errata_826319
     60 
     61 	/* ---------------------------------------------------------------------
     62 	 * Disable the cache non-temporal hint.
     63 	 *
     64 	 * This ignores the Transient allocation hint in the MAIR and treats
     65 	 * allocations the same as non-transient allocation types. As a result,
     66 	 * the LDNP and STNP instructions in AArch64 behave the same as the
     67 	 * equivalent LDP and STP instructions.
     68 	 *
     69 	 * This is relevant only for revisions <= r0p3 of Cortex-A53.
     70 	 * From r0p4 and onwards, the bit to disable the hint is enabled by
     71 	 * default at reset.
     72 	 *
     73 	 * Inputs:
     74 	 * r0: variant[4:7] and revision[0:3] of current cpu.
     75 	 * Shall clobber: r0-r3
     76 	 * ---------------------------------------------------------------------
     77 	 */
     78 func a53_disable_non_temporal_hint
     79 	/*
     80 	 * Compare r0 against revision r0p3
     81 	 */
     82 	mov		r2, lr
     83 	bl		check_errata_disable_non_temporal_hint
     84 	mov		lr, r2
     85 	cmp		r0, #ERRATA_NOT_APPLIES
     86 	beq		1f
     87 	ldcopr16	r0, r1, CORTEX_A53_CPUACTLR
     88 	orr64_imm	r0, r1, CORTEX_A53_CPUACTLR_DTAH
     89 	stcopr16	r0, r1, CORTEX_A53_CPUACTLR
     90 1:
     91 	bx		lr
     92 endfunc a53_disable_non_temporal_hint
     93 
     94 func check_errata_disable_non_temporal_hint
     95 	mov	r1, #0x03
     96 	b	cpu_rev_var_ls
     97 endfunc check_errata_disable_non_temporal_hint
     98 
     99 	/* --------------------------------------------------
    100 	 * Errata Workaround for Cortex A53 Errata #855873.
    101 	 *
    102 	 * This applies only to revisions >= r0p3 of Cortex A53.
    103 	 * Earlier revisions of the core are affected as well, but don't
    104 	 * have the chicken bit in the CPUACTLR register. It is expected that
    105 	 * the rich OS takes care of that, especially as the workaround is
    106 	 * shared with other erratas in those revisions of the CPU.
    107 	 * Inputs:
    108 	 * r0: variant[4:7] and revision[0:3] of current cpu.
    109 	 * Shall clobber: r0-r3
    110 	 * --------------------------------------------------
    111 	 */
    112 func errata_a53_855873_wa
    113 	/*
    114 	 * Compare r0 against revision r0p3 and higher
    115 	 */
    116 	mov		r2, lr
    117 	bl		check_errata_855873
    118 	mov		lr, r2
    119 	cmp		r0, #ERRATA_NOT_APPLIES
    120 	beq		1f
    121 	ldcopr16	r0, r1, CORTEX_A53_CPUACTLR
    122 	orr64_imm	r0, r1, CORTEX_A53_CPUACTLR_ENDCCASCI
    123 	stcopr16	r0, r1, CORTEX_A53_CPUACTLR
    124 1:
    125 	bx		lr
    126 endfunc errata_a53_855873_wa
    127 
    128 func check_errata_855873
    129 	mov	r1, #0x03
    130 	b	cpu_rev_var_hs
    131 endfunc check_errata_855873
    132 
    133 	/* -------------------------------------------------
    134 	 * The CPU Ops reset function for Cortex-A53.
    135 	 * Shall clobber: r0-r6
    136 	 * -------------------------------------------------
    137 	 */
    138 func cortex_a53_reset_func
    139 	mov	r5, lr
    140 	bl	cpu_get_rev_var
    141 	mov	r4, r0
    142 
    143 #if ERRATA_A53_826319
    144 	mov	r0, r4
    145 	bl	errata_a53_826319_wa
    146 #endif
    147 
    148 #if ERRATA_A53_836870
    149 	mov	r0, r4
    150 	bl	a53_disable_non_temporal_hint
    151 #endif
    152 
    153 #if ERRATA_A53_855873
    154 	mov	r0, r4
    155 	bl	errata_a53_855873_wa
    156 #endif
    157 
    158 	/* ---------------------------------------------
    159 	 * Enable the SMP bit.
    160 	 * ---------------------------------------------
    161 	 */
    162 	ldcopr16	r0, r1, CORTEX_A53_ECTLR
    163 	orr64_imm	r0, r1, CORTEX_A53_ECTLR_SMP_BIT
    164 	stcopr16	r0, r1,	CORTEX_A53_ECTLR
    165 	isb
    166 	bx	r5
    167 endfunc cortex_a53_reset_func
    168 
    169 	/* ----------------------------------------------------
    170 	 * The CPU Ops core power down function for Cortex-A53.
    171 	 * ----------------------------------------------------
    172 	 */
    173 func cortex_a53_core_pwr_dwn
    174 	push	{r12, lr}
    175 
    176 	/* Assert if cache is enabled */
    177 #if ASM_ASSERTION
    178 	ldcopr	r0, SCTLR
    179 	tst	r0, #SCTLR_C_BIT
    180 	ASM_ASSERT(eq)
    181 #endif
    182 
    183 	/* ---------------------------------------------
    184 	 * Flush L1 caches.
    185 	 * ---------------------------------------------
    186 	 */
    187 	mov	r0, #DC_OP_CISW
    188 	bl	dcsw_op_level1
    189 
    190 	/* ---------------------------------------------
    191 	 * Come out of intra cluster coherency
    192 	 * ---------------------------------------------
    193 	 */
    194 	pop	{r12, lr}
    195 	b	cortex_a53_disable_smp
    196 endfunc cortex_a53_core_pwr_dwn
    197 
    198 	/* -------------------------------------------------------
    199 	 * The CPU Ops cluster power down function for Cortex-A53.
    200 	 * Clobbers: r0-r3
    201 	 * -------------------------------------------------------
    202 	 */
    203 func cortex_a53_cluster_pwr_dwn
    204 	push	{r12, lr}
    205 
    206 	/* Assert if cache is enabled */
    207 #if ASM_ASSERTION
    208 	ldcopr	r0, SCTLR
    209 	tst	r0, #SCTLR_C_BIT
    210 	ASM_ASSERT(eq)
    211 #endif
    212 
    213 	/* ---------------------------------------------
    214 	 * Flush L1 caches.
    215 	 * ---------------------------------------------
    216 	 */
    217 	mov	r0, #DC_OP_CISW
    218 	bl	dcsw_op_level1
    219 
    220 	/* ---------------------------------------------
    221 	 * Disable the optional ACP.
    222 	 * ---------------------------------------------
    223 	 */
    224 	bl	plat_disable_acp
    225 
    226 	/* ---------------------------------------------
    227 	 * Flush L2 caches.
    228 	 * ---------------------------------------------
    229 	 */
    230 	mov	r0, #DC_OP_CISW
    231 	bl	dcsw_op_level2
    232 
    233 	/* ---------------------------------------------
    234 	 * Come out of intra cluster coherency
    235 	 * ---------------------------------------------
    236 	 */
    237 	pop	{r12, lr}
    238 	b	cortex_a53_disable_smp
    239 endfunc cortex_a53_cluster_pwr_dwn
    240 
    241 #if REPORT_ERRATA
    242 /*
    243  * Errata printing function for Cortex A53. Must follow AAPCS.
    244  */
    245 func cortex_a53_errata_report
    246 	push	{r12, lr}
    247 
    248 	bl	cpu_get_rev_var
    249 	mov	r4, r0
    250 
    251 	/*
    252 	 * Report all errata. The revision-variant information is passed to
    253 	 * checking functions of each errata.
    254 	 */
    255 	report_errata ERRATA_A53_826319, cortex_a53, 826319
    256 	report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint
    257 	report_errata ERRATA_A53_855873, cortex_a53, 855873
    258 
    259 	pop	{r12, lr}
    260 	bx	lr
    261 endfunc cortex_a53_errata_report
    262 #endif
    263 
    264 declare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \
    265 	cortex_a53_reset_func, \
    266 	cortex_a53_core_pwr_dwn, \
    267 	cortex_a53_cluster_pwr_dwn
    268