blob: b52e4d062eea060ec6b3f714ff6cb591ef545ec3 [file] [log] [blame]
Antonio Nino Diazc326c342019-01-11 11:20:10 +00001/*
Govindraj Raja24d3a4e2023-12-21 13:57:49 -06002 * Copyright (c) 2019-2024, 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 Przywara906776e2023-03-03 10:30:06 +000028static unsigned int read_feat_amu_id_field(void)
29{
30 return ISOLATE_FIELD(read_id_pfr0(), ID_PFR0_AMU);
31}
32
33static inline bool is_feat_amu_supported(void)
34{
35 if (ENABLE_FEAT_AMU == FEAT_STATE_DISABLED) {
36 return false;
37 }
38
39 if (ENABLE_FEAT_AMU == FEAT_STATE_ALWAYS) {
40 return true;
41 }
42
43 return read_feat_amu_id_field() >= ID_PFR0_AMU_V1;
44}
45
46static inline bool is_feat_amuv1p1_supported(void)
47{
48 if (ENABLE_FEAT_AMUv1p1 == FEAT_STATE_DISABLED) {
49 return false;
50 }
51
52 if (ENABLE_FEAT_AMUv1p1 == FEAT_STATE_ALWAYS) {
53 return true;
54 }
55
56 return read_feat_amu_id_field() >= ID_PFR0_AMU_V1P1;
57}
58
Andre Przywara06ea44e2022-11-17 17:30:43 +000059static inline unsigned int read_feat_trf_id_field(void)
60{
61 return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_TRACEFILT);
62}
63
64static inline bool is_feat_trf_supported(void)
65{
66 if (ENABLE_TRF_FOR_NS == FEAT_STATE_DISABLED) {
67 return false;
68 }
69
70 if (ENABLE_TRF_FOR_NS == FEAT_STATE_ALWAYS) {
71 return true;
72 }
73
74 return read_feat_trf_id_field() != 0U;
75}
76
Andre Przywara44e33e02022-11-17 16:42:09 +000077static inline unsigned int read_feat_coptrc_id_field(void)
78{
79 return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_COPTRC);
80}
81
82static inline bool is_feat_sys_reg_trace_supported(void)
83{
84 if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_DISABLED) {
85 return false;
86 }
87
88 if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_ALWAYS) {
89 return true;
90 }
91
92 return read_feat_coptrc_id_field() != 0U;
93}
94
Andre Przywara1f55c412023-01-26 16:47:52 +000095static inline unsigned int read_feat_dit_id_field(void)
96{
97 return ISOLATE_FIELD(read_id_pfr0(), ID_PFR0_DIT);
98}
99
100static inline bool is_feat_dit_supported(void)
101{
102 if (ENABLE_FEAT_DIT == FEAT_STATE_DISABLED) {
103 return false;
104 }
105
106 if (ENABLE_FEAT_DIT == FEAT_STATE_ALWAYS) {
107 return true;
108 }
109
110 return read_feat_dit_id_field() != 0U;
111}
112
Andre Przywara54d57912023-05-23 13:56:55 +0100113static inline unsigned int read_feat_pan_id_field(void)
114{
115 return ISOLATE_FIELD(read_id_mmfr3(), ID_MMFR3_PAN);
116}
117
118static inline bool is_feat_pan_supported(void)
119{
120 if (ENABLE_FEAT_PAN == FEAT_STATE_DISABLED) {
121 return false;
122 }
123
124 if (ENABLE_FEAT_PAN == FEAT_STATE_ALWAYS) {
125 return true;
126 }
127
128 return read_feat_pan_id_field() != 0U;
129}
130
Manish Pandey5cfe5152024-01-09 15:55:20 +0000131static inline bool is_feat_pan_present(void)
132{
133 return read_feat_pan_id_field() != 0U;
134}
135
136static inline unsigned int is_feat_ssbs_present(void)
137{
138 return ((read_id_pfr2() >> ID_PFR2_SSBS_SHIFT) &
139 ID_PFR2_SSBS_MASK) != SSBS_UNAVAILABLE;
140}
141
Andre Przywaradc3fcdf2023-05-23 10:34:38 +0100142/*
143 * TWED, ECV, CSV2, RAS are only used by the AArch64 EL2 context switch
144 * code. In fact, EL2 context switching is only needed for AArch64 (since
145 * there is no secure AArch32 EL2), so just disable these features here.
146 */
147static inline bool is_feat_twed_supported(void) { return false; }
148static inline bool is_feat_ecv_supported(void) { return false; }
149static inline bool is_feat_ecv_v2_supported(void) { return false; }
150static inline bool is_feat_csv2_2_supported(void) { return false; }
Sona Mathew3b84c962023-10-25 16:48:19 -0500151static inline bool is_feat_csv2_3_supported(void) { return false; }
Andre Przywaradc3fcdf2023-05-23 10:34:38 +0100152static inline bool is_feat_ras_supported(void) { return false; }
153
154/* The following features are supported in AArch64 only. */
155static inline bool is_feat_vhe_supported(void) { return false; }
156static inline bool is_feat_sel2_supported(void) { return false; }
157static inline bool is_feat_fgt_supported(void) { return false; }
158static inline bool is_feat_tcr2_supported(void) { return false; }
159static inline bool is_feat_spe_supported(void) { return false; }
160static inline bool is_feat_rng_supported(void) { return false; }
161static inline bool is_feat_gcs_supported(void) { return false; }
Govindraj Rajad7b63ac2024-01-26 10:08:37 -0600162static inline bool is_feat_mte2_supported(void) { return false; }
Andre Przywaradc3fcdf2023-05-23 10:34:38 +0100163static inline bool is_feat_mpam_supported(void) { return false; }
164static inline bool is_feat_hcx_supported(void) { return false; }
165static inline bool is_feat_sve_supported(void) { return false; }
166static inline bool is_feat_brbe_supported(void) { return false; }
167static inline bool is_feat_trbe_supported(void) { return false; }
168static inline bool is_feat_nv2_supported(void) { return false; }
169static inline bool is_feat_sme_supported(void) { return false; }
170static inline bool is_feat_sme2_supported(void) { return false; }
171static inline bool is_feat_s2poe_supported(void) { return false; }
172static inline bool is_feat_s1poe_supported(void) { return false; }
173static inline bool is_feat_sxpoe_supported(void) { return false; }
174static inline bool is_feat_s2pie_supported(void) { return false; }
175static inline bool is_feat_s1pie_supported(void) { return false; }
176static inline bool is_feat_sxpie_supported(void) { return false; }
Manish Pandey5cfe5152024-01-09 15:55:20 +0000177static inline bool is_feat_uao_present(void) { return false; }
178static inline bool is_feat_nmi_present(void) { return false; }
179static inline bool is_feat_ebep_present(void) { return false; }
180static inline bool is_feat_sebep_present(void) { return false; }
Andre Przywaradc3fcdf2023-05-23 10:34:38 +0100181
Boyan Karatotev05504ba2023-02-15 13:21:50 +0000182static inline unsigned int read_feat_pmuv3_id_field(void)
183{
184 return ISOLATE_FIELD(read_id_dfr0(), ID_DFR0_PERFMON);
185}
186
Boyan Karatotev677ed8a2023-02-16 09:45:29 +0000187static inline unsigned int read_feat_mtpmu_id_field(void)
188{
189 return ISOLATE_FIELD(read_id_dfr1(), ID_DFR1_MTPMU);
190}
191
192static inline bool is_feat_mtpmu_supported(void)
193{
194 if (DISABLE_MTPMU == FEAT_STATE_DISABLED) {
195 return false;
196 }
197
198 if (DISABLE_MTPMU == FEAT_STATE_ALWAYS) {
199 return true;
200 }
201
202 unsigned int mtpmu = read_feat_mtpmu_id_field();
203
204 return mtpmu != 0U && mtpmu != ID_DFR1_MTPMU_DISABLED;
205}
206
Antonio Nino Diazc326c342019-01-11 11:20:10 +0000207#endif /* ARCH_FEATURES_H */