mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 10:04:26 +00:00
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 <jayanthdodderi.chidanand@arm.com>
This commit is contained in:
parent
1298f2f13d
commit
47c681b7d7
5 changed files with 28 additions and 16 deletions
2
Makefile
2
Makefile
|
@ -1045,7 +1045,6 @@ $(eval $(call assert_booleans,\
|
||||||
COT_DESC_IN_DTB \
|
COT_DESC_IN_DTB \
|
||||||
USE_SP804_TIMER \
|
USE_SP804_TIMER \
|
||||||
PSA_FWU_SUPPORT \
|
PSA_FWU_SUPPORT \
|
||||||
ENABLE_TRBE_FOR_NS \
|
|
||||||
ENABLE_SYS_REG_TRACE_FOR_NS \
|
ENABLE_SYS_REG_TRACE_FOR_NS \
|
||||||
ENABLE_MPMM \
|
ENABLE_MPMM \
|
||||||
ENABLE_MPMM_FCONF \
|
ENABLE_MPMM_FCONF \
|
||||||
|
@ -1062,6 +1061,7 @@ $(eval $(call assert_numerics,\
|
||||||
CTX_INCLUDE_MTE_REGS \
|
CTX_INCLUDE_MTE_REGS \
|
||||||
CTX_INCLUDE_NEVE_REGS \
|
CTX_INCLUDE_NEVE_REGS \
|
||||||
ENABLE_BRBE_FOR_NS \
|
ENABLE_BRBE_FOR_NS \
|
||||||
|
ENABLE_TRBE_FOR_NS \
|
||||||
ENABLE_BTI \
|
ENABLE_BTI \
|
||||||
ENABLE_PAUTH \
|
ENABLE_PAUTH \
|
||||||
ENABLE_FEAT_AMUv1 \
|
ENABLE_FEAT_AMUv1 \
|
||||||
|
|
|
@ -244,6 +244,16 @@ static void read_feat_brbe(void)
|
||||||
#endif
|
#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
|
* 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
|
* (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 */
|
/* v9.0 features */
|
||||||
read_feat_brbe();
|
read_feat_brbe();
|
||||||
|
read_feat_trbe();
|
||||||
|
|
||||||
/* v9.2 features */
|
/* v9.2 features */
|
||||||
read_feat_rme();
|
read_feat_rme();
|
||||||
|
|
|
@ -988,11 +988,12 @@ Common build options
|
||||||
0 to 2, to align with the ``FEATURE_DETECTION`` mechanism. The default is 0
|
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.
|
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
|
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
|
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
|
feature for AArch64. This flag can take the values 0 to 2, to align with the
|
||||||
the target architecture is AArch32.
|
``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
|
- ``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
|
registers access from NS ELs, NS-EL2 or NS-EL1 (when NS-EL2 is implemented
|
||||||
|
|
|
@ -234,5 +234,13 @@ static inline bool is_feat_brbe_present(void)
|
||||||
ID_AA64DFR0_BRBE_MASK) == ID_AA64DFR0_BRBE_SUPPORTED);
|
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 */
|
#endif /* ARCH_FEATURES_H */
|
||||||
|
|
|
@ -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
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
#include <arch_features.h>
|
||||||
#include <arch_helpers.h>
|
#include <arch_helpers.h>
|
||||||
#include <lib/el3_runtime/pubsub.h>
|
#include <lib/el3_runtime/pubsub.h>
|
||||||
#include <lib/extensions/trbe.h>
|
#include <lib/extensions/trbe.h>
|
||||||
|
@ -18,20 +19,11 @@ static void tsb_csync(void)
|
||||||
__asm__ volatile("hint #18");
|
__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)
|
void trbe_enable(void)
|
||||||
{
|
{
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
|
|
||||||
if (trbe_supported()) {
|
if (is_feat_trbe_present()) {
|
||||||
/*
|
/*
|
||||||
* MDCR_EL3.NSTB = 0b11
|
* MDCR_EL3.NSTB = 0b11
|
||||||
* Allow access of trace buffer control registers from NS-EL1
|
* 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)
|
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
|
* Before switching from normal world to secure world
|
||||||
* the trace buffers need to be drained out to memory. This is
|
* the trace buffers need to be drained out to memory. This is
|
||||||
|
|
Loading…
Add table
Reference in a new issue