blob: 252b40734d672b753b80105637cc026c8d420d7d [file] [log] [blame]
Antonio Nino Diazc326c342019-01-11 11:20:10 +00001/*
Andre Przywarabb0db3b2023-01-25 12:26:14 +00002 * Copyright (c) 2019-2023, Arm Limited. All rights reserved.
Antonio Nino Diazc326c342019-01-11 11:20:10 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef ARCH_FEATURES_H
8#define ARCH_FEATURES_H
9
10#include <stdbool.h>
11
12#include <arch_helpers.h>
Andre Przywara06ea44e2022-11-17 17:30:43 +000013#include <common/feat_detect.h>
Antonio Nino Diazc326c342019-01-11 11:20:10 +000014
Andre Przywarabb0db3b2023-01-25 12:26:14 +000015#define ISOLATE_FIELD(reg, feat) \
16 ((unsigned int)(((reg) >> (feat ## _SHIFT)) & (feat ## _MASK)))
17
Antonio Nino Diazd29d21e2019-02-06 09:23:04 +000018static inline bool is_armv7_gentimer_present(void)
19{
Andre Przywarabb0db3b2023-01-25 12:26:14 +000020 return ISOLATE_FIELD(read_id_pfr1(), ID_PFR1_GENTIMER) != 0U;
Antonio Nino Diazd29d21e2019-02-06 09:23:04 +000021}
22
Antonio Nino Diazc326c342019-01-11 11:20:10 +000023static inline bool is_armv8_2_ttcnp_present(void)
24{
Andre Przywarabb0db3b2023-01-25 12:26:14 +000025 return ISOLATE_FIELD(read_id_mmfr4(), ID_MMFR4_CNP) != 0U;
Antonio Nino Diazc326c342019-01-11 11:20:10 +000026}
27
Andre Przywara06ea44e2022-11-17 17:30:43 +000028static inline unsigned int read_feat_trf_id_field(void)
29{
30 return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_TRACEFILT);
31}
32
33static inline bool is_feat_trf_supported(void)
34{
35 if (ENABLE_TRF_FOR_NS == FEAT_STATE_DISABLED) {
36 return false;
37 }
38
39 if (ENABLE_TRF_FOR_NS == FEAT_STATE_ALWAYS) {
40 return true;
41 }
42
43 return read_feat_trf_id_field() != 0U;
44}
45
Andre Przywara44e33e02022-11-17 16:42:09 +000046static inline unsigned int read_feat_coptrc_id_field(void)
47{
48 return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_COPTRC);
49}
50
51static inline bool is_feat_sys_reg_trace_supported(void)
52{
53 if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_DISABLED) {
54 return false;
55 }
56
57 if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_ALWAYS) {
58 return true;
59 }
60
61 return read_feat_coptrc_id_field() != 0U;
62}
63
Andre Przywaraf3e8cfc2022-11-17 16:42:09 +000064static inline bool is_feat_spe_supported(void)
65{
66 /* FEAT_SPE is AArch64 only */
67 return false;
68}
69
Antonio Nino Diazc326c342019-01-11 11:20:10 +000070#endif /* ARCH_FEATURES_H */