From 47c681b7d7f03e77f6cdd7b5d116ae64671ab8ca Mon Sep 17 00:00:00 2001 From: Jayanth Dodderi Chidanand Date: Thu, 19 May 2022 14:08:28 +0100 Subject: [PATCH] feat(trbe): add trbe under feature detection mechanism This change adds "FEAT_TRBE" to be part of feature detection mechanism. Previously feature enablement flags were of boolean type, containing either 0 or 1. With the introduction of feature detection procedure we now support three states for feature enablement build flags(0 to 2). Accordingly, "ENABLE_TRBE_FOR_NS" flag is now modified from boolean to numeric type to align with the feature detection. Change-Id: I53d3bc8dc2f6eac63feef22dfd627f3a48480afc Signed-off-by: Jayanth Dodderi Chidanand --- Makefile | 2 +- common/feat_detect.c | 11 +++++++++++ docs/getting_started/build-options.rst | 7 ++++--- include/arch/aarch64/arch_features.h | 8 ++++++++ lib/extensions/trbe/trbe.c | 16 ++++------------ 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index e0fc0e02a..ee5e2e7a8 100644 --- a/Makefile +++ b/Makefile @@ -1045,7 +1045,6 @@ $(eval $(call assert_booleans,\ COT_DESC_IN_DTB \ USE_SP804_TIMER \ PSA_FWU_SUPPORT \ - ENABLE_TRBE_FOR_NS \ ENABLE_SYS_REG_TRACE_FOR_NS \ ENABLE_MPMM \ ENABLE_MPMM_FCONF \ @@ -1062,6 +1061,7 @@ $(eval $(call assert_numerics,\ CTX_INCLUDE_MTE_REGS \ CTX_INCLUDE_NEVE_REGS \ ENABLE_BRBE_FOR_NS \ + ENABLE_TRBE_FOR_NS \ ENABLE_BTI \ ENABLE_PAUTH \ ENABLE_FEAT_AMUv1 \ diff --git a/common/feat_detect.c b/common/feat_detect.c index 9d0685be6..be3e20e6f 100644 --- a/common/feat_detect.c +++ b/common/feat_detect.c @@ -244,6 +244,16 @@ static void read_feat_brbe(void) #endif } +/****************************************************** + * Feature : FEAT_TRBE (Trace Buffer Extension) + *****************************************************/ +static void read_feat_trbe(void) +{ +#if (ENABLE_TRBE_FOR_NS == FEAT_STATE_1) + feat_detect_panic(is_feat_trbe_present(), "TRBE"); +#endif +} + /*********************************************************************************** * TF-A supports many Arm architectural features starting from arch version * (8.0 till 8.7+). These features are mostly enabled through build flags. This @@ -306,6 +316,7 @@ void detect_arch_features(void) /* v9.0 features */ read_feat_brbe(); + read_feat_trbe(); /* v9.2 features */ read_feat_rme(); diff --git a/docs/getting_started/build-options.rst b/docs/getting_started/build-options.rst index 79159b7cd..26d545805 100644 --- a/docs/getting_started/build-options.rst +++ b/docs/getting_started/build-options.rst @@ -988,11 +988,12 @@ Common build options 0 to 2, to align with the ``FEATURE_DETECTION`` mechanism. The default is 0 and it is automatically disabled when the target architecture is AArch32. -- ``ENABLE_TRBE_FOR_NS``: This flag is used to enable access of trace buffer +- ``ENABLE_TRBE_FOR_NS``: Numeric value to enable access of trace buffer control registers from NS ELs, NS-EL2 or NS-EL1(when NS-EL2 is implemented but unused) when FEAT_TRBE is implemented. TRBE is an optional architectural - feature for AArch64. The default is 0 and it is automatically disabled when - the target architecture is AArch32. + feature for AArch64. This flag can take the values 0 to 2, to align with the + ``FEATURE_DETECTION`` mechanism. The default is 0 and it is automatically + disabled when the target architecture is AArch32. - ``ENABLE_SYS_REG_TRACE_FOR_NS``: Boolean option to enable trace system registers access from NS ELs, NS-EL2 or NS-EL1 (when NS-EL2 is implemented diff --git a/include/arch/aarch64/arch_features.h b/include/arch/aarch64/arch_features.h index cf39e1094..79a61b5bb 100644 --- a/include/arch/aarch64/arch_features.h +++ b/include/arch/aarch64/arch_features.h @@ -234,5 +234,13 @@ static inline bool is_feat_brbe_present(void) ID_AA64DFR0_BRBE_MASK) == ID_AA64DFR0_BRBE_SUPPORTED); } +/******************************************************************************* + * Function to identify the presence of FEAT_TRBE (Trace Buffer Extension) + ******************************************************************************/ +static inline bool is_feat_trbe_present(void) +{ + return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT) & + ID_AA64DFR0_TRACEBUFFER_MASK) == ID_AA64DFR0_TRACEBUFFER_SUPPORTED); +} #endif /* ARCH_FEATURES_H */ diff --git a/lib/extensions/trbe/trbe.c b/lib/extensions/trbe/trbe.c index 9f754d521..b3463872b 100644 --- a/lib/extensions/trbe/trbe.c +++ b/lib/extensions/trbe/trbe.c @@ -1,10 +1,11 @@ /* - * Copyright (c) 2021, Arm Limited. All rights reserved. + * Copyright (c) 2021-2022, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include +#include #include #include #include @@ -18,20 +19,11 @@ static void tsb_csync(void) __asm__ volatile("hint #18"); } -static bool trbe_supported(void) -{ - uint64_t features; - - features = read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT; - return ((features & ID_AA64DFR0_TRACEBUFFER_MASK) == - ID_AA64DFR0_TRACEBUFFER_SUPPORTED); -} - void trbe_enable(void) { uint64_t val; - if (trbe_supported()) { + if (is_feat_trbe_present()) { /* * MDCR_EL3.NSTB = 0b11 * Allow access of trace buffer control registers from NS-EL1 @@ -46,7 +38,7 @@ void trbe_enable(void) static void *trbe_drain_trace_buffers_hook(const void *arg __unused) { - if (trbe_supported()) { + if (is_feat_trbe_present()) { /* * Before switching from normal world to secure world * the trace buffers need to be drained out to memory. This is