xref: /rk3399_ARM-atf/include/arch/aarch64/arch_features.h (revision d508bab30dfc96fc837ae82bfa0e52f33d617c79)
12559b2c8SAntonio Nino Diaz /*
2b0b7609eSBoyan Karatotev  * Copyright (c) 2019-2025, Arm Limited. All rights reserved.
32559b2c8SAntonio Nino Diaz  *
42559b2c8SAntonio Nino Diaz  * SPDX-License-Identifier: BSD-3-Clause
52559b2c8SAntonio Nino Diaz  */
62559b2c8SAntonio Nino Diaz 
72559b2c8SAntonio Nino Diaz #ifndef ARCH_FEATURES_H
82559b2c8SAntonio Nino Diaz #define ARCH_FEATURES_H
92559b2c8SAntonio Nino Diaz 
102559b2c8SAntonio Nino Diaz #include <stdbool.h>
112559b2c8SAntonio Nino Diaz 
122559b2c8SAntonio Nino Diaz #include <arch_helpers.h>
13ce485955SAndre Przywara #include <common/feat_detect.h>
142559b2c8SAntonio Nino Diaz 
15*d508bab3SArvind Ram Prakash #if ENABLE_RME
16*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_ALL_WORLDS			\
17*d508bab3SArvind Ram Prakash 	((1u << CPU_CONTEXT_SECURE)	|	\
18*d508bab3SArvind Ram Prakash 	(1u << CPU_CONTEXT_NS)		|	\
19*d508bab3SArvind Ram Prakash 	(1u << CPU_CONTEXT_REALM))
20*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_REALM		(1 << CPU_CONTEXT_REALM)
21*d508bab3SArvind Ram Prakash #else
22*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_ALL_WORLDS			\
23*d508bab3SArvind Ram Prakash 	((1u << CPU_CONTEXT_SECURE)	|	\
24*d508bab3SArvind Ram Prakash 	(1u << CPU_CONTEXT_NS))
25*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_REALM		U(0)
26*d508bab3SArvind Ram Prakash #endif
27*d508bab3SArvind Ram Prakash 
28*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_SECURE		(1 << CPU_CONTEXT_SECURE)
29*d508bab3SArvind Ram Prakash #define FEAT_ENABLE_NS			(1 << CPU_CONTEXT_NS)
30*d508bab3SArvind Ram Prakash 
31aaaf2cc3SSona Mathew #define ISOLATE_FIELD(reg, feat, mask)						\
32aaaf2cc3SSona Mathew 	((unsigned int)(((reg) >> (feat)) & mask))
33a8d5d3d5SAndre Przywara 
34aaaf2cc3SSona Mathew #define CREATE_FEATURE_SUPPORTED(name, read_func, guard)			\
350dfa07b6SOlivier Deprez __attribute__((always_inline))							\
36a8d5d3d5SAndre Przywara static inline bool is_ ## name ## _supported(void)				\
37a8d5d3d5SAndre Przywara {										\
38a8d5d3d5SAndre Przywara 	if ((guard) == FEAT_STATE_DISABLED) {					\
39a8d5d3d5SAndre Przywara 		return false;							\
40a8d5d3d5SAndre Przywara 	}									\
41a8d5d3d5SAndre Przywara 	if ((guard) == FEAT_STATE_ALWAYS) {					\
42a8d5d3d5SAndre Przywara 		return true;							\
43a8d5d3d5SAndre Przywara 	}									\
44aaaf2cc3SSona Mathew 	return read_func();							\
45a8d5d3d5SAndre Przywara }
46a8d5d3d5SAndre Przywara 
47aaaf2cc3SSona Mathew #define CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval)		\
480dfa07b6SOlivier Deprez __attribute__((always_inline))							\
49aaaf2cc3SSona Mathew static inline bool is_ ## name ## _present(void)				\
50a8d5d3d5SAndre Przywara {										\
51aaaf2cc3SSona Mathew 	return (ISOLATE_FIELD(read_ ## idreg(), idfield, mask) >= idval) 	\
52aaaf2cc3SSona Mathew 		? true : false; 						\
53aaaf2cc3SSona Mathew }
54aaaf2cc3SSona Mathew 
55*d508bab3SArvind Ram Prakash #define CREATE_FEATURE_FUNCS(name, idreg, idfield, mask, idval, guard,		\
56*d508bab3SArvind Ram Prakash 			     enabled_worlds)					\
57aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(name, idreg, idfield, mask, idval)			\
58aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(name, is_ ## name ## _present, guard)
59aaaf2cc3SSona Mathew 
60aaaf2cc3SSona Mathew 
61aaaf2cc3SSona Mathew /* +----------------------------+
62aaaf2cc3SSona Mathew  * |	Features supported	|
63aaaf2cc3SSona Mathew  * +----------------------------+
64aaaf2cc3SSona Mathew  * |	GENTIMER		|
65aaaf2cc3SSona Mathew  * +----------------------------+
66aaaf2cc3SSona Mathew  * |	FEAT_PAN		|
67aaaf2cc3SSona Mathew  * +----------------------------+
68aaaf2cc3SSona Mathew  * |	FEAT_VHE		|
69aaaf2cc3SSona Mathew  * +----------------------------+
70aaaf2cc3SSona Mathew  * |	FEAT_TTCNP		|
71aaaf2cc3SSona Mathew  * +----------------------------+
72aaaf2cc3SSona Mathew  * |	FEAT_UAO		|
73aaaf2cc3SSona Mathew  * +----------------------------+
74aaaf2cc3SSona Mathew  * |	FEAT_PACQARMA3		|
75aaaf2cc3SSona Mathew  * +----------------------------+
76aaaf2cc3SSona Mathew  * |	FEAT_PAUTH		|
77aaaf2cc3SSona Mathew  * +----------------------------+
78aaaf2cc3SSona Mathew  * |	FEAT_TTST		|
79aaaf2cc3SSona Mathew  * +----------------------------+
80aaaf2cc3SSona Mathew  * |	FEAT_BTI		|
81aaaf2cc3SSona Mathew  * +----------------------------+
82aaaf2cc3SSona Mathew  * |	FEAT_MTE2		|
83aaaf2cc3SSona Mathew  * +----------------------------+
84aaaf2cc3SSona Mathew  * |	FEAT_SSBS		|
85aaaf2cc3SSona Mathew  * +----------------------------+
86aaaf2cc3SSona Mathew  * |	FEAT_NMI		|
87aaaf2cc3SSona Mathew  * +----------------------------+
88aaaf2cc3SSona Mathew  * |	FEAT_GCS		|
89aaaf2cc3SSona Mathew  * +----------------------------+
90aaaf2cc3SSona Mathew  * |	FEAT_EBEP		|
91aaaf2cc3SSona Mathew  * +----------------------------+
92aaaf2cc3SSona Mathew  * |	FEAT_SEBEP		|
93aaaf2cc3SSona Mathew  * +----------------------------+
94aaaf2cc3SSona Mathew  * |	FEAT_SEL2		|
95aaaf2cc3SSona Mathew  * +----------------------------+
96aaaf2cc3SSona Mathew  * |	FEAT_TWED		|
97aaaf2cc3SSona Mathew  * +----------------------------+
98aaaf2cc3SSona Mathew  * |	FEAT_FGT		|
99aaaf2cc3SSona Mathew  * +----------------------------+
100aaaf2cc3SSona Mathew  * |	FEAT_EC/ECV2		|
101aaaf2cc3SSona Mathew  * +----------------------------+
102aaaf2cc3SSona Mathew  * |	FEAT_RNG		|
103aaaf2cc3SSona Mathew  * +----------------------------+
104aaaf2cc3SSona Mathew  * |	FEAT_TCR2		|
105aaaf2cc3SSona Mathew  * +----------------------------+
106aaaf2cc3SSona Mathew  * |	FEAT_S2POE		|
107aaaf2cc3SSona Mathew  * +----------------------------+
108aaaf2cc3SSona Mathew  * |	FEAT_S1POE		|
109aaaf2cc3SSona Mathew  * +----------------------------+
110aaaf2cc3SSona Mathew  * |	FEAT_S2PIE		|
111aaaf2cc3SSona Mathew  * +----------------------------+
112aaaf2cc3SSona Mathew  * |	FEAT_S1PIE		|
113aaaf2cc3SSona Mathew  * +----------------------------+
114aaaf2cc3SSona Mathew  * |	FEAT_AMU/AMUV1P1	|
115aaaf2cc3SSona Mathew  * +----------------------------+
116aaaf2cc3SSona Mathew  * |	FEAT_MPAM		|
117aaaf2cc3SSona Mathew  * +----------------------------+
118aaaf2cc3SSona Mathew  * |	FEAT_HCX		|
119aaaf2cc3SSona Mathew  * +----------------------------+
120aaaf2cc3SSona Mathew  * |	FEAT_RNG_TRAP		|
121aaaf2cc3SSona Mathew  * +----------------------------+
122aaaf2cc3SSona Mathew  * |	FEAT_RME		|
123aaaf2cc3SSona Mathew  * +----------------------------+
124aaaf2cc3SSona Mathew  * |	FEAT_SB			|
125aaaf2cc3SSona Mathew  * +----------------------------+
126aaaf2cc3SSona Mathew  * |	FEAT_CSV2/CSV3		|
127aaaf2cc3SSona Mathew  * +----------------------------+
128aaaf2cc3SSona Mathew  * |	FEAT_SPE		|
129aaaf2cc3SSona Mathew  * +----------------------------+
130aaaf2cc3SSona Mathew  * |	FEAT_SVE		|
131aaaf2cc3SSona Mathew  * +----------------------------+
132aaaf2cc3SSona Mathew  * |	FEAT_RAS		|
133aaaf2cc3SSona Mathew  * +----------------------------+
134aaaf2cc3SSona Mathew  * |	FEAT_DIT		|
135aaaf2cc3SSona Mathew  * +----------------------------+
136aaaf2cc3SSona Mathew  * |	FEAT_SYS_REG_TRACE	|
137aaaf2cc3SSona Mathew  * +----------------------------+
138aaaf2cc3SSona Mathew  * |	FEAT_TRF		|
139aaaf2cc3SSona Mathew  * +----------------------------+
1403c0ebab5SArvind Ram Prakash  * |	FEAT_NV2		|
141aaaf2cc3SSona Mathew  * +----------------------------+
142aaaf2cc3SSona Mathew  * |	FEAT_BRBE		|
143aaaf2cc3SSona Mathew  * +----------------------------+
144aaaf2cc3SSona Mathew  * |	FEAT_TRBE		|
145aaaf2cc3SSona Mathew  * +----------------------------+
146aaaf2cc3SSona Mathew  * |	FEAT_SME/SME2		|
147aaaf2cc3SSona Mathew  * +----------------------------+
148aaaf2cc3SSona Mathew  * |	FEAT_PMUV3		|
149aaaf2cc3SSona Mathew  * +----------------------------+
150aaaf2cc3SSona Mathew  * |	FEAT_MTPMU		|
151aaaf2cc3SSona Mathew  * +----------------------------+
15233e6aaacSArvind Ram Prakash  * |	FEAT_FGT2		|
15333e6aaacSArvind Ram Prakash  * +----------------------------+
1546d0433f0SJayanth Dodderi Chidanand  * |	FEAT_THE		|
1556d0433f0SJayanth Dodderi Chidanand  * +----------------------------+
1564ec4e545SJayanth Dodderi Chidanand  * |	FEAT_SCTLR2		|
1574ec4e545SJayanth Dodderi Chidanand  * +----------------------------+
15830655136SGovindraj Raja  * |	FEAT_D128		|
15930655136SGovindraj Raja  * +----------------------------+
16019d52a83SAndre Przywara  * |	FEAT_LS64_ACCDATA	|
16119d52a83SAndre Przywara  * +----------------------------+
162a57e18e4SArvind Ram Prakash  * |	FEAT_FPMR		|
163a57e18e4SArvind Ram Prakash  * +----------------------------+
1646b8df7b9SArvind Ram Prakash  * |	FEAT_MOPS		|
1656b8df7b9SArvind Ram Prakash  * +----------------------------+
166025b1b81SJohn Powell  * |	FEAT_PAUTH_LR		|
167025b1b81SJohn Powell  * +----------------------------+
1684274b526SArvind Ram Prakash  * |	FEAT_FGWTE3		|
1694274b526SArvind Ram Prakash  * +----------------------------+
170c42aefd3SArvind Ram Prakash  * |	FEAT_MPAM_PE_BW_CTRL	|
171c42aefd3SArvind Ram Prakash  * +----------------------------+
172a1032bebSJohn Powell  * |	FEAT_CPA2		|
173a1032bebSJohn Powell  * +----------------------------+
174cc2523bbSAndre Przywara  * |	FEAT_AIE		|
175cc2523bbSAndre Przywara  * +----------------------------+
176b3bcfd12SAndre Przywara  * |	FEAT_PFAR		|
177b3bcfd12SAndre Przywara  * +----------------------------+
17809a4bcb8SGirish Pathak  * |	FEAT_RME_GPC2		|
17909a4bcb8SGirish Pathak  * +----------------------------+
1805e827bf0STimothy Hayes  * |	FEAT_RME_GDI		|
1815e827bf0STimothy Hayes  * +----------------------------+
182aaaf2cc3SSona Mathew  */
183fd1dd4cbSAndre Przywara 
1840dfa07b6SOlivier Deprez __attribute__((always_inline))
18529a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void)
18629a24134SAntonio Nino Diaz {
18729a24134SAntonio Nino Diaz 	/* The Generic Timer is always present in an ARMv8-A implementation */
18829a24134SAntonio Nino Diaz 	return true;
18929a24134SAntonio Nino Diaz }
19029a24134SAntonio Nino Diaz 
191aaaf2cc3SSona Mathew /* FEAT_PAN: Privileged access never */
192a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_pan, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_PAN_SHIFT,
193*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR1_EL1_PAN_MASK, 1U, ENABLE_FEAT_PAN,
194*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
19530f05b4fSManish Pandey 
196aaaf2cc3SSona Mathew /* FEAT_VHE: Virtualization Host Extensions */
197a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_vhe, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_VHE_SHIFT,
198*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR1_EL1_VHE_MASK, 1U, ENABLE_FEAT_VHE,
199*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
20037596fcbSDaniel Boulby 
201aaaf2cc3SSona Mathew /* FEAT_TTCNP: Translation table common not private */
202aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttcnp, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_CNP_SHIFT,
203aaaf2cc3SSona Mathew 			ID_AA64MMFR2_EL1_CNP_MASK, 1U)
2042559b2c8SAntonio Nino Diaz 
205aaaf2cc3SSona Mathew /* FEAT_UAO: User access override */
206aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_uao, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_UAO_SHIFT,
207aaaf2cc3SSona Mathew 			ID_AA64MMFR2_EL1_UAO_MASK, 1U)
2089ff5f754SJuan Pablo Conde 
2099ff5f754SJuan Pablo Conde /* If any of the fields is not zero, QARMA3 algorithm is present */
210aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_pacqarma3, id_aa64isar2_el1, 0,
211aaaf2cc3SSona Mathew 			((ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
212aaaf2cc3SSona Mathew 			(ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT)), 1U)
2139ff5f754SJuan Pablo Conde 
214b0b7609eSBoyan Karatotev /* FEAT_PAUTH: Pointer Authentication */
2150dfa07b6SOlivier Deprez __attribute__((always_inline))
216b0b7609eSBoyan Karatotev static inline bool is_feat_pauth_present(void)
217b86048c4SAntonio Nino Diaz {
2189ff5f754SJuan Pablo Conde 	uint64_t mask_id_aa64isar1 =
2199ff5f754SJuan Pablo Conde 		(ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
220b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
221b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
222b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
223b86048c4SAntonio Nino Diaz 
2249ff5f754SJuan Pablo Conde 	/*
2259ff5f754SJuan Pablo Conde 	 * If any of the fields is not zero or QARMA3 is present,
2269ff5f754SJuan Pablo Conde 	 * PAuth is present
2279ff5f754SJuan Pablo Conde 	 */
2289ff5f754SJuan Pablo Conde 	return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
2299ff5f754SJuan Pablo Conde 		is_feat_pacqarma3_present());
230b86048c4SAntonio Nino Diaz }
231b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(feat_pauth, is_feat_pauth_present, ENABLE_PAUTH)
232b0b7609eSBoyan Karatotev CREATE_FEATURE_SUPPORTED(ctx_pauth, is_feat_pauth_present, CTX_INCLUDE_PAUTH_REGS)
233b86048c4SAntonio Nino Diaz 
234025b1b81SJohn Powell /*
235025b1b81SJohn Powell  * FEAT_PAUTH_LR
236025b1b81SJohn Powell  * This feature has a non-standard discovery method so define this function
237025b1b81SJohn Powell  * manually then call use the CREATE_FEATURE_SUPPORTED macro with it. This
238025b1b81SJohn Powell  * feature is enabled with ENABLE_PAUTH when present.
239025b1b81SJohn Powell  */
240025b1b81SJohn Powell __attribute__((always_inline))
241025b1b81SJohn Powell static inline bool is_feat_pauth_lr_present(void)
242025b1b81SJohn Powell {
243025b1b81SJohn Powell 	/*
244025b1b81SJohn Powell 	 * FEAT_PAUTH_LR support is indicated by up to 3 fields, if one or more
245025b1b81SJohn Powell 	 * of these is 0b0110 then the feature is present.
246025b1b81SJohn Powell 	 *   1) id_aa64isr1_el1.api
247025b1b81SJohn Powell 	 *   2) id_aa64isr1_el1.apa
248025b1b81SJohn Powell 	 *   3) id_aa64isr2_el1.apa3
249025b1b81SJohn Powell 	 */
250025b1b81SJohn Powell 	if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_API_SHIFT, ID_AA64ISAR1_API_MASK) == 0b0110) {
251025b1b81SJohn Powell 		return true;
252025b1b81SJohn Powell 	}
253025b1b81SJohn Powell 	if (ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_APA_SHIFT, ID_AA64ISAR1_APA_MASK) == 0b0110) {
254025b1b81SJohn Powell 		return true;
255025b1b81SJohn Powell 	}
256025b1b81SJohn Powell 	if (ISOLATE_FIELD(read_id_aa64isar2_el1(), ID_AA64ISAR2_APA3_SHIFT, ID_AA64ISAR2_APA3_MASK) == 0b0110) {
257025b1b81SJohn Powell 		return true;
258025b1b81SJohn Powell 	}
259025b1b81SJohn Powell 	return false;
260025b1b81SJohn Powell }
261025b1b81SJohn Powell CREATE_FEATURE_SUPPORTED(feat_pauth_lr, is_feat_pauth_lr_present, ENABLE_FEAT_PAUTH_LR)
262025b1b81SJohn Powell 
263aaaf2cc3SSona Mathew /* FEAT_TTST: Small translation tables */
264aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ttst, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_ST_SHIFT,
265aaaf2cc3SSona Mathew 			ID_AA64MMFR2_EL1_ST_MASK, 1U)
266cedfa04bSSathees Balya 
267aaaf2cc3SSona Mathew /* FEAT_BTI: Branch target identification */
26810ecd580SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_bti, id_aa64pfr1_el1, ID_AA64PFR1_EL1_BT_SHIFT,
269*d508bab3SArvind Ram Prakash 			ID_AA64PFR1_EL1_BT_MASK, BTI_IMPLEMENTED, ENABLE_BTI,
270*d508bab3SArvind Ram Prakash 			FEAT_ENABLE_ALL_WORLDS)
2719fc59639SAlexei Fedorov 
272aaaf2cc3SSona Mathew /* FEAT_MTE2: Memory tagging extension */
273aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_mte2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_MTE_SHIFT,
274*d508bab3SArvind Ram Prakash 		     ID_AA64PFR1_EL1_MTE_MASK, MTE_IMPLEMENTED_ELX, ENABLE_FEAT_MTE2,
275*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_SECURE | FEAT_ENABLE_NS)
27630f05b4fSManish Pandey 
277aaaf2cc3SSona Mathew /* FEAT_SSBS: Speculative store bypass safe */
278aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_ssbs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SSBS_SHIFT,
279aaaf2cc3SSona Mathew 			ID_AA64PFR1_EL1_SSBS_MASK, 1U)
28030f05b4fSManish Pandey 
281aaaf2cc3SSona Mathew /* FEAT_NMI: Non-maskable interrupts */
282aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_nmi, id_aa64pfr1_el1, ID_AA64PFR1_EL1_NMI_SHIFT,
283aaaf2cc3SSona Mathew 			ID_AA64PFR1_EL1_NMI_MASK, NMI_IMPLEMENTED)
28430f05b4fSManish Pandey 
285aaaf2cc3SSona Mathew /* FEAT_EBEP */
286714a1a93SManish Pandey CREATE_FEATURE_FUNCS(feat_ebep, id_aa64dfr1_el1, ID_AA64DFR1_EBEP_SHIFT,
287714a1a93SManish Pandey 		     ID_AA64DFR1_EBEP_MASK, 1U,  ENABLE_FEAT_EBEP)
28830f05b4fSManish Pandey 
289aaaf2cc3SSona Mathew /* FEAT_SEBEP */
290aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sebep, id_aa64dfr0_el1, ID_AA64DFR0_SEBEP_SHIFT,
291aaaf2cc3SSona Mathew 			ID_AA64DFR0_SEBEP_MASK, SEBEP_IMPLEMENTED)
29230f05b4fSManish Pandey 
293aaaf2cc3SSona Mathew /* FEAT_SEL2: Secure EL2 */
294a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sel2, id_aa64pfr0_el1, ID_AA64PFR0_SEL2_SHIFT,
295*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_SEL2_MASK, 1U, ENABLE_FEAT_SEL2,
296*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
297aaaf2cc3SSona Mathew 
298aaaf2cc3SSona Mathew /* FEAT_TWED: Delayed trapping of WFE */
299a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_twed, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_TWED_SHIFT,
300*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR1_EL1_TWED_MASK, 1U, ENABLE_FEAT_TWED,
301*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
302aaaf2cc3SSona Mathew 
303aaaf2cc3SSona Mathew /* FEAT_FGT: Fine-grained traps */
304a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_fgt, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT,
305*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR0_EL1_FGT_MASK, 1U, ENABLE_FEAT_FGT,
306*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
307aaaf2cc3SSona Mathew 
30833e6aaacSArvind Ram Prakash /* FEAT_FGT2: Fine-grained traps extended */
30933e6aaacSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgt2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT,
310*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR0_EL1_FGT_MASK, FGT2_IMPLEMENTED, ENABLE_FEAT_FGT2,
311*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
31233e6aaacSArvind Ram Prakash 
3134274b526SArvind Ram Prakash /* FEAT_FGWTE3: Fine-grained write traps EL3 */
3144274b526SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fgwte3, id_aa64mmfr4_el1, ID_AA64MMFR4_EL1_FGWTE3_SHIFT,
3154274b526SArvind Ram Prakash 		     ID_AA64MMFR4_EL1_FGWTE3_MASK, FGWTE3_IMPLEMENTED,
316*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_FGWTE3, FEAT_ENABLE_ALL_WORLDS)
3174274b526SArvind Ram Prakash 
318aaaf2cc3SSona Mathew /* FEAT_ECV: Enhanced Counter Virtualization */
319a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_ecv, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT,
320*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR0_EL1_ECV_MASK, 1U, ENABLE_FEAT_ECV,
321*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
322aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ecv_v2, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT,
323*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR0_EL1_ECV_MASK, ID_AA64MMFR0_EL1_ECV_SELF_SYNCH,
324*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_ECV, FEAT_ENABLE_ALL_WORLDS)
325623f6140SAndre Przywara 
326aaaf2cc3SSona Mathew /* FEAT_RNG: Random number generator */
327a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_rng, id_aa64isar0_el1, ID_AA64ISAR0_RNDR_SHIFT,
328*d508bab3SArvind Ram Prakash 		     ID_AA64ISAR0_RNDR_MASK, 1U, ENABLE_FEAT_RNG,
329*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
330623f6140SAndre Przywara 
331aaaf2cc3SSona Mathew /* FEAT_TCR2: Support TCR2_ELx regs */
332aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_tcr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_TCRX_SHIFT,
333*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR3_EL1_TCRX_MASK, 1U, ENABLE_FEAT_TCR2,
334*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
335aaaf2cc3SSona Mathew 
336aaaf2cc3SSona Mathew /* FEAT_S2POE */
337a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2POE_SHIFT,
338*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR3_EL1_S2POE_MASK, 1U, ENABLE_FEAT_S2POE,
339*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
340aaaf2cc3SSona Mathew 
341aaaf2cc3SSona Mathew /* FEAT_S1POE */
342a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1POE_SHIFT,
343*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR3_EL1_S1POE_MASK, 1U, ENABLE_FEAT_S1POE,
344*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
345aaaf2cc3SSona Mathew 
3460dfa07b6SOlivier Deprez __attribute__((always_inline))
347062b6c6bSMark Brown static inline bool is_feat_sxpoe_supported(void)
348062b6c6bSMark Brown {
349062b6c6bSMark Brown 	return is_feat_s1poe_supported() || is_feat_s2poe_supported();
350062b6c6bSMark Brown }
351062b6c6bSMark Brown 
352aaaf2cc3SSona Mathew /* FEAT_S2PIE */
353a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2PIE_SHIFT,
354*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR3_EL1_S2PIE_MASK, 1U, ENABLE_FEAT_S2PIE,
355*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
356aaaf2cc3SSona Mathew 
357aaaf2cc3SSona Mathew /* FEAT_S1PIE */
358a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1PIE_SHIFT,
359*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR3_EL1_S1PIE_MASK, 1U, ENABLE_FEAT_S1PIE,
360*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
361aaaf2cc3SSona Mathew 
3626d0433f0SJayanth Dodderi Chidanand /* FEAT_THE: Translation Hardening Extension */
3636d0433f0SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_the, id_aa64pfr1_el1, ID_AA64PFR1_EL1_THE_SHIFT,
364*d508bab3SArvind Ram Prakash 		     ID_AA64PFR1_EL1_THE_MASK, THE_IMPLEMENTED, ENABLE_FEAT_THE,
365*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS)
3666d0433f0SJayanth Dodderi Chidanand 
3674ec4e545SJayanth Dodderi Chidanand /* FEAT_SCTLR2 */
3684ec4e545SJayanth Dodderi Chidanand CREATE_FEATURE_FUNCS(feat_sctlr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_SCTLR2_SHIFT,
3694ec4e545SJayanth Dodderi Chidanand 		     ID_AA64MMFR3_EL1_SCTLR2_MASK, SCTLR2_IMPLEMENTED,
370*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_SCTLR2,
371*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS | FEAT_ENABLE_REALM)
3724ec4e545SJayanth Dodderi Chidanand 
37330655136SGovindraj Raja /* FEAT_D128 */
37430655136SGovindraj Raja CREATE_FEATURE_FUNCS(feat_d128, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_D128_SHIFT,
37530655136SGovindraj Raja 		     ID_AA64MMFR3_EL1_D128_MASK, D128_IMPLEMENTED,
376*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_D128, FEAT_ENABLE_NS | FEAT_ENABLE_REALM)
37730655136SGovindraj Raja 
37809a4bcb8SGirish Pathak /* FEAT_RME_GPC2 */
37909a4bcb8SGirish Pathak CREATE_FEATURE_PRESENT(feat_rme_gpc2, id_aa64pfr0_el1,
38009a4bcb8SGirish Pathak 		       ID_AA64PFR0_FEAT_RME_SHIFT, ID_AA64PFR0_FEAT_RME_MASK,
38109a4bcb8SGirish Pathak 		       RME_GPC2_IMPLEMENTED)
38209a4bcb8SGirish Pathak 
3835e827bf0STimothy Hayes /* FEAT_RME_GDI */
3845e827bf0STimothy Hayes CREATE_FEATURE_FUNCS(feat_rme_gdi, id_aa64mmfr4_el1,
3855e827bf0STimothy Hayes 		     ID_AA64MMFR4_EL1_RME_GDI_SHIFT,
3865e827bf0STimothy Hayes 		     ID_AA64MMFR4_EL1_RME_GDI_MASK, RME_GDI_IMPLEMENTED,
3875e827bf0STimothy Hayes 		     ENABLE_FEAT_RME_GDI)
3885e827bf0STimothy Hayes 
389a57e18e4SArvind Ram Prakash /* FEAT_FPMR */
390a57e18e4SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_fpmr, id_aa64pfr2_el1, ID_AA64PFR2_EL1_FPMR_SHIFT,
391a57e18e4SArvind Ram Prakash 		     ID_AA64PFR2_EL1_FPMR_MASK, FPMR_IMPLEMENTED,
392*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_FPMR, FEAT_ENABLE_NS)
3936b8df7b9SArvind Ram Prakash /* FEAT_MOPS */
3946b8df7b9SArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_mops, id_aa64isar2_el1, ID_AA64ISAR2_EL1_MOPS_SHIFT,
3956b8df7b9SArvind Ram Prakash 		     ID_AA64ISAR2_EL1_MOPS_MASK, MOPS_IMPLEMENTED,
396*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_MOPS, FEAT_ENABLE_ALL_WORLDS)
397a57e18e4SArvind Ram Prakash 
3980dfa07b6SOlivier Deprez __attribute__((always_inline))
399062b6c6bSMark Brown static inline bool is_feat_sxpie_supported(void)
400062b6c6bSMark Brown {
401062b6c6bSMark Brown 	return is_feat_s1pie_supported() || is_feat_s2pie_supported();
402062b6c6bSMark Brown }
403062b6c6bSMark Brown 
404a8d5d3d5SAndre Przywara /* FEAT_GCS: Guarded Control Stack */
405a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_gcs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_GCS_SHIFT,
406*d508bab3SArvind Ram Prakash 		     ID_AA64PFR1_EL1_GCS_MASK, 1U, ENABLE_FEAT_GCS,
407*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
408688ab57bSMark Brown 
409a8d5d3d5SAndre Przywara /* FEAT_AMU: Activity Monitors Extension */
410a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_amu, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT,
411*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_AMU_MASK, 1U, ENABLE_FEAT_AMU,
412*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS)
413aaaf2cc3SSona Mathew 
41483ec7e45SBoyan Karatotev /* Auxiliary counters for FEAT_AMU */
41583ec7e45SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_amu_aux, amcfgr_el0, AMCFGR_EL0_NCG_SHIFT,
41683ec7e45SBoyan Karatotev 		     AMCFGR_EL0_NCG_MASK, 1U, ENABLE_AMU_AUXILIARY_COUNTERS)
41783ec7e45SBoyan Karatotev 
418aaaf2cc3SSona Mathew /* FEAT_AMUV1P1: AMU Extension v1.1 */
419aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_amuv1p1, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT,
420*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_AMU_MASK, ID_AA64PFR0_AMU_V1P1, ENABLE_FEAT_AMUv1p1,
421*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS)
422873d4241Sjohpow01 
423dbcc44a1SAlexei Fedorov /*
424dbcc44a1SAlexei Fedorov  * Return MPAM version:
425dbcc44a1SAlexei Fedorov  *
426dbcc44a1SAlexei Fedorov  * 0x00: None Armv8.0 or later
427dbcc44a1SAlexei Fedorov  * 0x01: v0.1 Armv8.4 or later
428dbcc44a1SAlexei Fedorov  * 0x10: v1.0 Armv8.2 or later
429dbcc44a1SAlexei Fedorov  * 0x11: v1.1 Armv8.4 or later
430dbcc44a1SAlexei Fedorov  *
431dbcc44a1SAlexei Fedorov  */
4320dfa07b6SOlivier Deprez __attribute__((always_inline))
433aaaf2cc3SSona Mathew static inline bool is_feat_mpam_present(void)
434dbcc44a1SAlexei Fedorov {
435aaaf2cc3SSona Mathew 	unsigned int ret = (unsigned int)((((read_id_aa64pfr0_el1() >>
436dbcc44a1SAlexei Fedorov 		ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
437aaaf2cc3SSona Mathew 		((read_id_aa64pfr1_el1() >> ID_AA64PFR1_MPAM_FRAC_SHIFT)
438aaaf2cc3SSona Mathew 			& ID_AA64PFR1_MPAM_FRAC_MASK));
439aaaf2cc3SSona Mathew 	return ret;
440dbcc44a1SAlexei Fedorov }
441dbcc44a1SAlexei Fedorov 
442aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mpam, is_feat_mpam_present, ENABLE_FEAT_MPAM)
4439448f2b8SAndre Przywara 
444c42aefd3SArvind Ram Prakash 
445c42aefd3SArvind Ram Prakash 
446c42aefd3SArvind Ram Prakash /* FEAT_MPAM_PE_BW_CTRL: MPAM PE-side bandwidth controls */
447c42aefd3SArvind Ram Prakash __attribute__((always_inline))
448c42aefd3SArvind Ram Prakash static inline bool is_feat_mpam_pe_bw_ctrl_present(void)
449c42aefd3SArvind Ram Prakash {
450c42aefd3SArvind Ram Prakash 	if (is_feat_mpam_present()) {
451c42aefd3SArvind Ram Prakash 		return ((unsigned long long)(read_mpamidr_el1() &
452c42aefd3SArvind Ram Prakash 				MPAMIDR_HAS_BW_CTRL_BIT) != 0U);
453c42aefd3SArvind Ram Prakash 	}
454c42aefd3SArvind Ram Prakash 	return false;
455c42aefd3SArvind Ram Prakash }
456c42aefd3SArvind Ram Prakash 
457c42aefd3SArvind Ram Prakash CREATE_FEATURE_SUPPORTED(feat_mpam_pe_bw_ctrl, is_feat_mpam_pe_bw_ctrl_present,
458c42aefd3SArvind Ram Prakash 		ENABLE_FEAT_MPAM_PE_BW_CTRL)
459c42aefd3SArvind Ram Prakash 
46083271d5aSArvind Ram Prakash /*
46183271d5aSArvind Ram Prakash  * FEAT_DebugV8P9: Debug extension. This function checks the field 3:0 of
46283271d5aSArvind Ram Prakash  * ID_AA64DFR0 Aarch64 Debug Feature Register 0 for the version of
46383271d5aSArvind Ram Prakash  * Feat_Debug supported. The value of the field determines feature presence
46483271d5aSArvind Ram Prakash  *
46583271d5aSArvind Ram Prakash  * 0b0110 - Arm v8.0 debug
46683271d5aSArvind Ram Prakash  * 0b0111 - Arm v8.0 debug architecture with Virtualization host extensions
46783271d5aSArvind Ram Prakash  * 0x1000 - FEAT_Debugv8p2 is supported
46883271d5aSArvind Ram Prakash  * 0x1001 - FEAT_Debugv8p4 is supported
46983271d5aSArvind Ram Prakash  * 0x1010 - FEAT_Debugv8p8 is supported
47083271d5aSArvind Ram Prakash  * 0x1011 - FEAT_Debugv8p9 is supported
47183271d5aSArvind Ram Prakash  *
47283271d5aSArvind Ram Prakash  */
47383271d5aSArvind Ram Prakash CREATE_FEATURE_FUNCS(feat_debugv8p9, id_aa64dfr0_el1, ID_AA64DFR0_DEBUGVER_SHIFT,
47483271d5aSArvind Ram Prakash 		ID_AA64DFR0_DEBUGVER_MASK, DEBUGVER_V8P9_IMPLEMENTED,
475*d508bab3SArvind Ram Prakash 		ENABLE_FEAT_DEBUGV8P9, FEAT_ENABLE_NS | FEAT_ENABLE_REALM)
47683271d5aSArvind Ram Prakash 
477a8d5d3d5SAndre Przywara /* FEAT_HCX: Extended Hypervisor Configuration Register */
478a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_hcx, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_HCX_SHIFT,
479*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR1_EL1_HCX_MASK, 1U, ENABLE_FEAT_HCX,
480*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
481cb4ec47bSjohpow01 
482aaaf2cc3SSona Mathew /* FEAT_RNG_TRAP: Trapping support */
48379c0c7faSBoyan Karatotev CREATE_FEATURE_FUNCS(feat_rng_trap, id_aa64pfr1_el1, ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT,
484*d508bab3SArvind Ram Prakash 		      ID_AA64PFR1_EL1_RNDR_TRAP_MASK, RNG_TRAP_IMPLEMENTED, ENABLE_FEAT_RNG_TRAP,
485*d508bab3SArvind Ram Prakash 		      FEAT_ENABLE_ALL_WORLDS)
486ff86e0b4SJuan Pablo Conde 
487aaaf2cc3SSona Mathew /* Return the RME version, zero if not supported. */
488aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_rme, id_aa64pfr0_el1, ID_AA64PFR0_FEAT_RME_SHIFT,
489aaaf2cc3SSona Mathew 		    ID_AA64PFR0_FEAT_RME_MASK, 1U, ENABLE_RME)
49081c272b3SZelalem Aweke 
491aaaf2cc3SSona Mathew /* FEAT_SB: Speculation barrier instruction */
492aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sb, id_aa64isar1_el1, ID_AA64ISAR1_SB_SHIFT,
493aaaf2cc3SSona Mathew 		       ID_AA64ISAR1_SB_MASK, 1U)
4946a0da736SJayanth Dodderi Chidanand 
4957e84f3cfSTushar Khandelwal /* FEAT_MEC: Memory Encryption Contexts */
4967e84f3cfSTushar Khandelwal CREATE_FEATURE_FUNCS(feat_mec, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_MEC_SHIFT,
497*d508bab3SArvind Ram Prakash 		ID_AA64MMFR3_EL1_MEC_MASK, 1U, ENABLE_FEAT_MEC,
498*d508bab3SArvind Ram Prakash 		FEAT_ENABLE_ALL_WORLDS)
4997e84f3cfSTushar Khandelwal 
50030019d86SSona Mathew /*
50130019d86SSona Mathew  * FEAT_CSV2: Cache Speculation Variant 2. This checks bit fields[56-59]
50230019d86SSona Mathew  * of id_aa64pfr0_el1 register and can be used to check for below features:
50330019d86SSona Mathew  * FEAT_CSV2_2: Cache Speculation Variant CSV2_2.
50430019d86SSona Mathew  * FEAT_CSV2_3: Cache Speculation Variant CSV2_3.
50530019d86SSona Mathew  * 0b0000 - Feature FEAT_CSV2 is not implemented.
50630019d86SSona Mathew  * 0b0001 - Feature FEAT_CSV2 is implemented, but FEAT_CSV2_2 and FEAT_CSV2_3
50730019d86SSona Mathew  *          are not implemented.
50830019d86SSona Mathew  * 0b0010 - Feature FEAT_CSV2_2 is implemented but FEAT_CSV2_3 is not
50930019d86SSona Mathew  *          implemented.
51030019d86SSona Mathew  * 0b0011 - Feature FEAT_CSV2_3 is implemented.
51130019d86SSona Mathew  */
51230019d86SSona Mathew 
513aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_2, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT,
514*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_CSV2_MASK, CSV2_2_IMPLEMENTED, ENABLE_FEAT_CSV2_2,
515*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS | FEAT_ENABLE_REALM)
516aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_csv2_3, id_aa64pfr0_el1, ID_AA64PFR0_CSV2_SHIFT,
517*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_CSV2_MASK, CSV2_3_IMPLEMENTED, ENABLE_FEAT_CSV2_3,
518*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5197db710f0SAndre Przywara 
520a8d5d3d5SAndre Przywara /* FEAT_SPE: Statistical Profiling Extension */
521a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_spe, id_aa64dfr0_el1, ID_AA64DFR0_PMS_SHIFT,
522*d508bab3SArvind Ram Prakash 		     ID_AA64DFR0_PMS_MASK, 1U, ENABLE_SPE_FOR_NS,
523*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5247db710f0SAndre Przywara 
525a8d5d3d5SAndre Przywara /* FEAT_SVE: Scalable Vector Extension */
526a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sve, id_aa64pfr0_el1, ID_AA64PFR0_SVE_SHIFT,
527*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_SVE_MASK, 1U, ENABLE_SVE_FOR_NS,
528*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5297db710f0SAndre Przywara 
530a8d5d3d5SAndre Przywara /* FEAT_RAS: Reliability, Accessibility, Serviceability */
531aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_ras, id_aa64pfr0_el1, ID_AA64PFR0_RAS_SHIFT,
532*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_RAS_MASK, 1U, ENABLE_FEAT_RAS,
533*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5346a0da736SJayanth Dodderi Chidanand 
535a8d5d3d5SAndre Przywara /* FEAT_DIT: Data Independent Timing instructions */
536aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_dit, id_aa64pfr0_el1, ID_AA64PFR0_DIT_SHIFT,
537*d508bab3SArvind Ram Prakash 		     ID_AA64PFR0_DIT_MASK, 1U, ENABLE_FEAT_DIT,
538*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5396437a09aSAndre Przywara 
540aaaf2cc3SSona Mathew /* FEAT_SYS_REG_TRACE */
541aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_sys_reg_trace, id_aa64dfr0_el1, ID_AA64DFR0_TRACEVER_SHIFT,
542*d508bab3SArvind Ram Prakash 		    ID_AA64DFR0_TRACEVER_MASK, 1U, ENABLE_SYS_REG_TRACE_FOR_NS,
543*d508bab3SArvind Ram Prakash 		    FEAT_ENABLE_ALL_WORLDS)
5446437a09aSAndre Przywara 
545a8d5d3d5SAndre Przywara /* FEAT_TRF: TraceFilter */
546a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_trf, id_aa64dfr0_el1, ID_AA64DFR0_TRACEFILT_SHIFT,
547*d508bab3SArvind Ram Prakash 		     ID_AA64DFR0_TRACEFILT_MASK, 1U, ENABLE_TRF_FOR_NS,
548*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5496437a09aSAndre Przywara 
550a8d5d3d5SAndre Przywara /* FEAT_NV2: Enhanced Nested Virtualization */
551aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_nv2, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_NV_SHIFT,
552*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR2_EL1_NV_MASK, NV2_IMPLEMENTED, CTX_INCLUDE_NEVE_REGS,
553*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
5546a0da736SJayanth Dodderi Chidanand 
555a8d5d3d5SAndre Przywara /* FEAT_BRBE: Branch Record Buffer Extension */
556a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_brbe, id_aa64dfr0_el1, ID_AA64DFR0_BRBE_SHIFT,
557*d508bab3SArvind Ram Prakash 		     ID_AA64DFR0_BRBE_MASK, 1U, ENABLE_BRBE_FOR_NS,
558*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS | FEAT_ENABLE_REALM)
5592b0bc4e0SJayanth Dodderi Chidanand 
560a8d5d3d5SAndre Przywara /* FEAT_TRBE: Trace Buffer Extension */
561a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT,
562aaaf2cc3SSona Mathew 		     ID_AA64DFR0_TRACEBUFFER_MASK, 1U, ENABLE_TRBE_FOR_NS)
5632b0bc4e0SJayanth Dodderi Chidanand 
564aaaf2cc3SSona Mathew /* FEAT_SME_FA64: Full A64 Instruction support in streaming SVE mode */
565aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_sme_fa64, id_aa64smfr0_el1, ID_AA64SMFR0_EL1_SME_FA64_SHIFT,
566aaaf2cc3SSona Mathew 		    ID_AA64SMFR0_EL1_SME_FA64_MASK, 1U)
567aaaf2cc3SSona Mathew 
568a8d5d3d5SAndre Przywara /* FEAT_SMEx: Scalar Matrix Extension */
569a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sme, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT,
570*d508bab3SArvind Ram Prakash 		     ID_AA64PFR1_EL1_SME_MASK, 1U, ENABLE_SME_FOR_NS,
571*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
572aaaf2cc3SSona Mathew 
573aaaf2cc3SSona Mathew CREATE_FEATURE_FUNCS(feat_sme2, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT,
574*d508bab3SArvind Ram Prakash 		     ID_AA64PFR1_EL1_SME_MASK, SME2_IMPLEMENTED, ENABLE_SME2_FOR_NS,
575*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
57603d3c0d7SJayanth Dodderi Chidanand 
57719d52a83SAndre Przywara /* FEAT_LS64_ACCDATA: */
57819d52a83SAndre Przywara CREATE_FEATURE_FUNCS(feat_ls64_accdata, id_aa64isar1_el1, ID_AA64ISAR1_LS64_SHIFT,
57919d52a83SAndre Przywara 		     ID_AA64ISAR1_LS64_MASK, LS64_ACCDATA_IMPLEMENTED,
580*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_LS64_ACCDATA, FEAT_ENABLE_ALL_WORLDS)
58119d52a83SAndre Przywara 
582cc2523bbSAndre Przywara /* FEAT_AIE: */
583cc2523bbSAndre Przywara CREATE_FEATURE_FUNCS(feat_aie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_AIE_SHIFT,
584*d508bab3SArvind Ram Prakash 		     ID_AA64MMFR3_EL1_AIE_MASK, 1U, ENABLE_FEAT_AIE,
585*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS)
586cc2523bbSAndre Przywara 
587b3bcfd12SAndre Przywara /* FEAT_PFAR: */
588b3bcfd12SAndre Przywara CREATE_FEATURE_FUNCS(feat_pfar, id_aa64pfr1_el1, ID_AA64PFR1_EL1_PFAR_SHIFT,
589*d508bab3SArvind Ram Prakash 		     ID_AA64PFR1_EL1_PFAR_MASK, 1U, ENABLE_FEAT_PFAR,
590*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_NS)
591b3bcfd12SAndre Przywara 
592bff074ddSJavier Almansa Sobrino /*******************************************************************************
593bff074ddSJavier Almansa Sobrino  * Function to get hardware granularity support
594bff074ddSJavier Almansa Sobrino  ******************************************************************************/
595bff074ddSJavier Almansa Sobrino 
5960dfa07b6SOlivier Deprez __attribute__((always_inline))
597aaaf2cc3SSona Mathew static inline bool is_feat_tgran4K_present(void)
598bff074ddSJavier Almansa Sobrino {
599aaaf2cc3SSona Mathew 	unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
600aaaf2cc3SSona Mathew 			     ID_AA64MMFR0_EL1_TGRAN4_SHIFT, ID_REG_FIELD_MASK);
601aaaf2cc3SSona Mathew 	return (tgranx < 8U);
602bff074ddSJavier Almansa Sobrino }
603bff074ddSJavier Almansa Sobrino 
604aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_tgran16K, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_TGRAN16_SHIFT,
605aaaf2cc3SSona Mathew 		       ID_AA64MMFR0_EL1_TGRAN16_MASK, TGRAN16_IMPLEMENTED)
606aaaf2cc3SSona Mathew 
6070dfa07b6SOlivier Deprez __attribute__((always_inline))
608aaaf2cc3SSona Mathew static inline bool is_feat_tgran64K_present(void)
609bff074ddSJavier Almansa Sobrino {
610aaaf2cc3SSona Mathew 	unsigned int tgranx = ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
611aaaf2cc3SSona Mathew 			     ID_AA64MMFR0_EL1_TGRAN64_SHIFT, ID_REG_FIELD_MASK);
612aaaf2cc3SSona Mathew 	return (tgranx < 8U);
613bff074ddSJavier Almansa Sobrino }
614bff074ddSJavier Almansa Sobrino 
615aaaf2cc3SSona Mathew /* FEAT_PMUV3 */
616aaaf2cc3SSona Mathew CREATE_FEATURE_PRESENT(feat_pmuv3, id_aa64dfr0_el1, ID_AA64DFR0_PMUVER_SHIFT,
617aaaf2cc3SSona Mathew 		      ID_AA64DFR0_PMUVER_MASK, 1U)
618aaaf2cc3SSona Mathew 
619aaaf2cc3SSona Mathew /* FEAT_MTPMU */
6200dfa07b6SOlivier Deprez __attribute__((always_inline))
621aaaf2cc3SSona Mathew static inline bool is_feat_mtpmu_present(void)
622bff074ddSJavier Almansa Sobrino {
623aaaf2cc3SSona Mathew 	unsigned int mtpmu = ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_MTPMU_SHIFT,
624aaaf2cc3SSona Mathew 					   ID_AA64DFR0_MTPMU_MASK);
6259e51f15eSSona Mathew 	return (mtpmu != 0U) && (mtpmu != MTPMU_NOT_IMPLEMENTED);
62683a4dae1SBoyan Karatotev }
62783a4dae1SBoyan Karatotev 
628aaaf2cc3SSona Mathew CREATE_FEATURE_SUPPORTED(feat_mtpmu, is_feat_mtpmu_present, DISABLE_MTPMU)
629aaaf2cc3SSona Mathew 
6308cef63d6SBoyan Karatotev /*************************************************************************
6318cef63d6SBoyan Karatotev  * Function to identify the presence of FEAT_GCIE (GICv5 CPU interface
6328cef63d6SBoyan Karatotev  * extension).
6338cef63d6SBoyan Karatotev  ************************************************************************/
6348cef63d6SBoyan Karatotev CREATE_FEATURE_FUNCS(feat_gcie, id_aa64pfr2_el1, ID_AA64PFR2_EL1_GCIE_SHIFT,
635*d508bab3SArvind Ram Prakash 		     ID_AA64PFR2_EL1_GCIE_MASK, 1U, ENABLE_FEAT_GCIE,
636*d508bab3SArvind Ram Prakash 		     FEAT_ENABLE_ALL_WORLDS)
6378cef63d6SBoyan Karatotev 
638a1032bebSJohn Powell CREATE_FEATURE_FUNCS(feat_cpa2, id_aa64isar3_el1, ID_AA64ISAR3_EL1_CPA_SHIFT,
639a1032bebSJohn Powell 		     ID_AA64ISAR3_EL1_CPA_MASK, CPA2_IMPLEMENTED,
640*d508bab3SArvind Ram Prakash 		     ENABLE_FEAT_CPA2, FEAT_ENABLE_ALL_WORLDS)
641a1032bebSJohn Powell 
6422559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */
643