diff --git a/bl31/bl31.mk b/bl31/bl31.mk index 7e9fde352..ec68a8d59 100644 --- a/bl31/bl31.mk +++ b/bl31/bl31.mk @@ -42,6 +42,7 @@ BL31_SOURCES += bl31/bl31_main.c \ bl31/bl31_context_mgmt.c \ bl31/bl31_traps.c \ common/runtime_svc.c \ + lib/cpus/errata_common.c \ lib/cpus/aarch64/dsu_helpers.S \ plat/common/aarch64/platform_mp_stack.S \ services/arm_arch_svc/arm_arch_svc_setup.c \ diff --git a/lib/cpus/errata_common.c b/lib/cpus/errata_common.c new file mode 100644 index 000000000..9801245bc --- /dev/null +++ b/lib/cpus/errata_common.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* Runtime C routines for errata workarounds and common routines */ + +#include +#include +#include +#include +#include +#include + +#if ERRATA_A520_2938996 || ERRATA_X4_2726228 +unsigned int check_if_affected_core(void) +{ + uint32_t midr_val = read_midr(); + long rev_var = cpu_get_rev_var(); + + if (EXTRACT_PARTNUM(midr_val) == EXTRACT_PARTNUM(CORTEX_A520_MIDR)) { + return check_erratum_cortex_a520_2938996(rev_var); + } else if (EXTRACT_PARTNUM(midr_val) == EXTRACT_PARTNUM(CORTEX_X4_MIDR)) { + return check_erratum_cortex_x4_2726228(rev_var); + } + + return ERRATA_NOT_APPLIES; +} +#endif diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c index 370a34dc9..ce3a4da09 100644 --- a/lib/el3_runtime/aarch64/context_mgmt.c +++ b/lib/el3_runtime/aarch64/context_mgmt.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #include #include @@ -1548,6 +1550,17 @@ void cm_handle_asymmetric_features(void) spe_disable(spe_ctx); } #endif +#if ERRATA_A520_2938996 || ERRATA_X4_2726228 + cpu_context_t *trbe_ctx = cm_get_context(NON_SECURE); + + assert(trbe_ctx != NULL); + + if (check_if_affected_core() == ERRATA_APPLIES) { + if (is_feat_trbe_supported()) { + trbe_disable(trbe_ctx); + } + } +#endif } #endif