mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 02:24:18 +00:00

At the moment we only support access to the trace unit by system registers (SYS_REG_TRACE) to be either unconditionally compiled in, or to be not supported at all. Add support for runtime detection (ENABLE_SYS_REG_TRACE_FOR_NS=2), by adding is_feat_sys_reg_trace_supported(). That function considers both build time settings and runtime information (if needed), and is used before we access SYS_REG_TRACE related registers. The FVP platform decided to compile in support unconditionally (=1), even though this is an optional feature, so it is not available with the FVP model's default command line. Change that to the now supported dynamic option (=2), so the right decision can be made by the code at runtime. Change-Id: I450a574a4f6bd9fc269887037049c94c906f54b2 Signed-off-by: Andre Przywara <andre.przywara@arm.com>
70 lines
1.4 KiB
C
70 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2019-2023, Arm Limited. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef ARCH_FEATURES_H
|
|
#define ARCH_FEATURES_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <arch_helpers.h>
|
|
#include <common/feat_detect.h>
|
|
|
|
#define ISOLATE_FIELD(reg, feat) \
|
|
((unsigned int)(((reg) >> (feat ## _SHIFT)) & (feat ## _MASK)))
|
|
|
|
static inline bool is_armv7_gentimer_present(void)
|
|
{
|
|
return ISOLATE_FIELD(read_id_pfr1(), ID_PFR1_GENTIMER) != 0U;
|
|
}
|
|
|
|
static inline bool is_armv8_2_ttcnp_present(void)
|
|
{
|
|
return ISOLATE_FIELD(read_id_mmfr4(), ID_MMFR4_CNP) != 0U;
|
|
}
|
|
|
|
static inline unsigned int read_feat_trf_id_field(void)
|
|
{
|
|
return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_TRACEFILT);
|
|
}
|
|
|
|
static inline bool is_feat_trf_supported(void)
|
|
{
|
|
if (ENABLE_TRF_FOR_NS == FEAT_STATE_DISABLED) {
|
|
return false;
|
|
}
|
|
|
|
if (ENABLE_TRF_FOR_NS == FEAT_STATE_ALWAYS) {
|
|
return true;
|
|
}
|
|
|
|
return read_feat_trf_id_field() != 0U;
|
|
}
|
|
|
|
static inline unsigned int read_feat_coptrc_id_field(void)
|
|
{
|
|
return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_COPTRC);
|
|
}
|
|
|
|
static inline bool is_feat_sys_reg_trace_supported(void)
|
|
{
|
|
if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_DISABLED) {
|
|
return false;
|
|
}
|
|
|
|
if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_ALWAYS) {
|
|
return true;
|
|
}
|
|
|
|
return read_feat_coptrc_id_field() != 0U;
|
|
}
|
|
|
|
static inline bool is_feat_spe_supported(void)
|
|
{
|
|
/* FEAT_SPE is AArch64 only */
|
|
return false;
|
|
}
|
|
|
|
#endif /* ARCH_FEATURES_H */
|