1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <arch.h> 8*91f16700Schasinglulu#include <asm_macros.S> 9*91f16700Schasinglulu#include <common/bl_common.h> 10*91f16700Schasinglulu#include <cortex_a55.h> 11*91f16700Schasinglulu#include <cpu_macros.S> 12*91f16700Schasinglulu#include <plat_macros.S> 13*91f16700Schasinglulu 14*91f16700Schasinglulu/* Hardware handled coherency */ 15*91f16700Schasinglulu#if HW_ASSISTED_COHERENCY == 0 16*91f16700Schasinglulu#error "Cortex-A55 must be compiled with HW_ASSISTED_COHERENCY enabled" 17*91f16700Schasinglulu#endif 18*91f16700Schasinglulu 19*91f16700Schasinglulu .globl cortex_a55_reset_func 20*91f16700Schasinglulu .globl cortex_a55_core_pwr_dwn 21*91f16700Schasinglulu 22*91f16700Schasinglulu/* ERRATA_DSU_798953: 23*91f16700Schasinglulu * The errata is defined in dsu_helpers.S but applies to cortex_a55 24*91f16700Schasinglulu * as well. Henceforth creating symbolic names to the already existing errata 25*91f16700Schasinglulu * workaround functions to get them registered under the Errata Framework. 26*91f16700Schasinglulu */ 27*91f16700Schasinglulu.equ check_erratum_cortex_a55_798953, check_errata_dsu_798953 28*91f16700Schasinglulu.equ erratum_cortex_a55_798953_wa, errata_dsu_798953_wa 29*91f16700Schasingluluadd_erratum_entry cortex_a55, ERRATUM(798953), ERRATA_DSU_798953, APPLY_AT_RESET 30*91f16700Schasinglulu 31*91f16700Schasinglulu/* ERRATA_DSU_936184: 32*91f16700Schasinglulu * The errata is defined in dsu_helpers.S but applies to cortex_a55 33*91f16700Schasinglulu * as well. Henceforth creating symbolic names to the already existing errata 34*91f16700Schasinglulu * workaround functions to get them registered under the Errata Framework. 35*91f16700Schasinglulu */ 36*91f16700Schasinglulu.equ check_erratum_cortex_a55_936184, check_errata_dsu_936184 37*91f16700Schasinglulu.equ erratum_cortex_a55_936184_wa, errata_dsu_936184_wa 38*91f16700Schasingluluadd_erratum_entry cortex_a55, ERRATUM(936184), ERRATA_DSU_936184, APPLY_AT_RESET 39*91f16700Schasinglulu 40*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(768277), ERRATA_A55_768277 41*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_DUAL_ISSUE 42*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(768277) 43*91f16700Schasinglulu 44*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(768277), CPU_REV(0, 0) 45*91f16700Schasinglulu 46*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(778703), ERRATA_A55_778703 47*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUECTLR_EL1, CORTEX_A55_CPUECTLR_EL1_L1WSCTL 48*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_WRITE_STREAMING 49*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(778703) 50*91f16700Schasinglulu 51*91f16700Schasinglulucheck_erratum_custom_start cortex_a55, ERRATUM(778703) 52*91f16700Schasinglulu mov x16, x30 53*91f16700Schasinglulu mov x1, #0x00 54*91f16700Schasinglulu bl cpu_rev_var_ls 55*91f16700Schasinglulu /* 56*91f16700Schasinglulu * Check that no private L2 cache is configured 57*91f16700Schasinglulu */ 58*91f16700Schasinglulu mrs x1, CORTEX_A55_CLIDR_EL1 59*91f16700Schasinglulu and x1, x1, CORTEX_A55_CLIDR_EL1_CTYPE3 60*91f16700Schasinglulu cmp x1, #0 61*91f16700Schasinglulu mov x2, #ERRATA_NOT_APPLIES 62*91f16700Schasinglulu csel x0, x0, x2, eq 63*91f16700Schasinglulu ret x16 64*91f16700Schasinglulucheck_erratum_custom_end cortex_a55, ERRATUM(778703) 65*91f16700Schasinglulu 66*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(798797), ERRATA_A55_798797 67*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_L1_PAGEWALKS 68*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(798797) 69*91f16700Schasinglulu 70*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(798797), CPU_REV(0, 0) 71*91f16700Schasinglulu 72*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(846532), ERRATA_A55_846532 73*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_DUAL_ISSUE 74*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(846532) 75*91f16700Schasinglulu 76*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(846532), CPU_REV(0, 1) 77*91f16700Schasinglulu 78*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(903758), ERRATA_A55_903758 79*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUACTLR_EL1, CORTEX_A55_CPUACTLR_EL1_DISABLE_L1_PAGEWALKS 80*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(903758) 81*91f16700Schasinglulu 82*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(903758), CPU_REV(0, 1) 83*91f16700Schasinglulu 84*91f16700Schasingluluworkaround_reset_start cortex_a55, ERRATUM(1221012), ERRATA_A55_1221012 85*91f16700Schasinglulu mov x0, #0x0020 86*91f16700Schasinglulu movk x0, #0x0850, lsl #16 87*91f16700Schasinglulu msr CPUPOR_EL3, x0 88*91f16700Schasinglulu mov x0, #0x0000 89*91f16700Schasinglulu movk x0, #0x1FF0, lsl #16 90*91f16700Schasinglulu movk x0, #0x2, lsl #32 91*91f16700Schasinglulu msr CPUPMR_EL3, x0 92*91f16700Schasinglulu mov x0, #0x03fd 93*91f16700Schasinglulu movk x0, #0x0110, lsl #16 94*91f16700Schasinglulu msr CPUPCR_EL3, x0 95*91f16700Schasinglulu mov x0, #0x1 96*91f16700Schasinglulu msr CPUPSELR_EL3, x0 97*91f16700Schasinglulu mov x0, #0x0040 98*91f16700Schasinglulu movk x0, #0x08D0, lsl #16 99*91f16700Schasinglulu msr CPUPOR_EL3, x0 100*91f16700Schasinglulu mov x0, #0x0040 101*91f16700Schasinglulu movk x0, #0x1FF0, lsl #16 102*91f16700Schasinglulu movk x0, #0x2, lsl #32 103*91f16700Schasinglulu msr CPUPMR_EL3, x0 104*91f16700Schasinglulu mov x0, #0x03fd 105*91f16700Schasinglulu movk x0, #0x0110, lsl #16 106*91f16700Schasinglulu msr CPUPCR_EL3, x0 107*91f16700Schasingluluworkaround_reset_end cortex_a55, ERRATUM(1221012) 108*91f16700Schasinglulu 109*91f16700Schasinglulucheck_erratum_ls cortex_a55, ERRATUM(1221012), CPU_REV(1, 0) 110*91f16700Schasinglulu 111*91f16700Schasinglulucheck_erratum_chosen cortex_a55, ERRATUM(1530923), ERRATA_A55_1530923 112*91f16700Schasinglulu 113*91f16700Schasinglulu/* erratum has no workaround in the cpu. Generic code must take care */ 114*91f16700Schasingluluadd_erratum_entry cortex_a55, ERRATUM(1530923), ERRATA_A55_1530923, NO_APPLY_AT_RESET 115*91f16700Schasinglulu 116*91f16700Schasinglulucpu_reset_func_start cortex_a55 117*91f16700Schasinglulucpu_reset_func_end cortex_a55 118*91f16700Schasinglulu 119*91f16700Schasingluluerrata_report_shim cortex_a55 120*91f16700Schasinglulu 121*91f16700Schasinglulu /* --------------------------------------------- 122*91f16700Schasinglulu * HW will do the cache maintenance while powering down 123*91f16700Schasinglulu * --------------------------------------------- 124*91f16700Schasinglulu */ 125*91f16700Schasinglulufunc cortex_a55_core_pwr_dwn 126*91f16700Schasinglulu sysreg_bit_set CORTEX_A55_CPUPWRCTLR_EL1, CORTEX_A55_CORE_PWRDN_EN_MASK 127*91f16700Schasinglulu isb 128*91f16700Schasinglulu ret 129*91f16700Schasingluluendfunc cortex_a55_core_pwr_dwn 130*91f16700Schasinglulu 131*91f16700Schasinglulu /* --------------------------------------------- 132*91f16700Schasinglulu * This function provides cortex_a55 specific 133*91f16700Schasinglulu * register information for crash reporting. 134*91f16700Schasinglulu * It needs to return with x6 pointing to 135*91f16700Schasinglulu * a list of register names in ascii and 136*91f16700Schasinglulu * x8 - x15 having values of registers to be 137*91f16700Schasinglulu * reported. 138*91f16700Schasinglulu * --------------------------------------------- 139*91f16700Schasinglulu */ 140*91f16700Schasinglulu.section .rodata.cortex_a55_regs, "aS" 141*91f16700Schasinglulucortex_a55_regs: /* The ascii list of register names to be reported */ 142*91f16700Schasinglulu .asciz "cpuectlr_el1", "" 143*91f16700Schasinglulu 144*91f16700Schasinglulufunc cortex_a55_cpu_reg_dump 145*91f16700Schasinglulu adr x6, cortex_a55_regs 146*91f16700Schasinglulu mrs x8, CORTEX_A55_CPUECTLR_EL1 147*91f16700Schasinglulu ret 148*91f16700Schasingluluendfunc cortex_a55_cpu_reg_dump 149*91f16700Schasinglulu 150*91f16700Schasingluludeclare_cpu_ops cortex_a55, CORTEX_A55_MIDR, \ 151*91f16700Schasinglulu cortex_a55_reset_func, \ 152*91f16700Schasinglulu cortex_a55_core_pwr_dwn 153