xref: /rk3399_ARM-atf/include/arch/aarch64/arch_features.h (revision 30f05b4f5db605ddc1a3ca0ae0cbd13ed0e728b6)
12559b2c8SAntonio Nino Diaz /*
20a33adc0SGovindraj Raja  * Copyright (c) 2019-2024, 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 
15fd1dd4cbSAndre Przywara #define ISOLATE_FIELD(reg, feat)					\
16a8d5d3d5SAndre Przywara 	((unsigned int)(((reg) >> (feat)) & ID_REG_FIELD_MASK))
17a8d5d3d5SAndre Przywara 
18a8d5d3d5SAndre Przywara #define CREATE_FEATURE_FUNCS_VER(name, read_func, idvalue, guard)	\
19a8d5d3d5SAndre Przywara static inline bool is_ ## name ## _supported(void)			\
20a8d5d3d5SAndre Przywara {									\
21a8d5d3d5SAndre Przywara 	if ((guard) == FEAT_STATE_DISABLED) {				\
22a8d5d3d5SAndre Przywara 		return false;						\
23a8d5d3d5SAndre Przywara 	}								\
24a8d5d3d5SAndre Przywara 	if ((guard) == FEAT_STATE_ALWAYS) {				\
25a8d5d3d5SAndre Przywara 		return true;						\
26a8d5d3d5SAndre Przywara 	}								\
27a8d5d3d5SAndre Przywara 	return read_func() >= (idvalue);				\
28a8d5d3d5SAndre Przywara }
29a8d5d3d5SAndre Przywara 
30a8d5d3d5SAndre Przywara #define CREATE_FEATURE_FUNCS(name, idreg, idfield, guard)		\
31a8d5d3d5SAndre Przywara static unsigned int read_ ## name ## _id_field(void)			\
32a8d5d3d5SAndre Przywara {									\
33a8d5d3d5SAndre Przywara 	return ISOLATE_FIELD(read_ ## idreg(), idfield);		\
34a8d5d3d5SAndre Przywara }									\
35a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(name, read_ ## name ## _id_field, 1U, guard)
36fd1dd4cbSAndre Przywara 
3729a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void)
3829a24134SAntonio Nino Diaz {
3929a24134SAntonio Nino Diaz 	/* The Generic Timer is always present in an ARMv8-A implementation */
4029a24134SAntonio Nino Diaz 	return true;
4129a24134SAntonio Nino Diaz }
4229a24134SAntonio Nino Diaz 
43a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_pan, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_PAN_SHIFT,
44a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_PAN)
45*30f05b4fSManish Pandey static inline bool is_feat_pan_present(void)
46*30f05b4fSManish Pandey {
47*30f05b4fSManish Pandey 	return read_feat_pan_id_field() != 0U;
48*30f05b4fSManish Pandey }
49*30f05b4fSManish Pandey 
50a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_vhe, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_VHE_SHIFT,
51a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_VHE)
5237596fcbSDaniel Boulby 
532559b2c8SAntonio Nino Diaz static inline bool is_armv8_2_ttcnp_present(void)
542559b2c8SAntonio Nino Diaz {
552559b2c8SAntonio Nino Diaz 	return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_CNP_SHIFT) &
562559b2c8SAntonio Nino Diaz 		ID_AA64MMFR2_EL1_CNP_MASK) != 0U;
572559b2c8SAntonio Nino Diaz }
582559b2c8SAntonio Nino Diaz 
59*30f05b4fSManish Pandey static inline bool is_feat_uao_present(void)
60*30f05b4fSManish Pandey {
61*30f05b4fSManish Pandey 	return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_UAO_SHIFT) &
62*30f05b4fSManish Pandey 		ID_AA64MMFR2_EL1_UAO_MASK) != 0U;
63*30f05b4fSManish Pandey }
64*30f05b4fSManish Pandey 
659ff5f754SJuan Pablo Conde static inline bool is_feat_pacqarma3_present(void)
669ff5f754SJuan Pablo Conde {
679ff5f754SJuan Pablo Conde 	uint64_t mask_id_aa64isar2 =
689ff5f754SJuan Pablo Conde 			(ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
699ff5f754SJuan Pablo Conde 			(ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
709ff5f754SJuan Pablo Conde 
719ff5f754SJuan Pablo Conde 	/* If any of the fields is not zero, QARMA3 algorithm is present */
729ff5f754SJuan Pablo Conde 	return (read_id_aa64isar2_el1() & mask_id_aa64isar2) != 0U;
739ff5f754SJuan Pablo Conde }
749ff5f754SJuan Pablo Conde 
75b86048c4SAntonio Nino Diaz static inline bool is_armv8_3_pauth_present(void)
76b86048c4SAntonio Nino Diaz {
779ff5f754SJuan Pablo Conde 	uint64_t mask_id_aa64isar1 =
789ff5f754SJuan Pablo Conde 		(ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
79b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
80b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
81b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
82b86048c4SAntonio Nino Diaz 
839ff5f754SJuan Pablo Conde 	/*
849ff5f754SJuan Pablo Conde 	 * If any of the fields is not zero or QARMA3 is present,
859ff5f754SJuan Pablo Conde 	 * PAuth is present
869ff5f754SJuan Pablo Conde 	 */
879ff5f754SJuan Pablo Conde 	return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
889ff5f754SJuan Pablo Conde 		is_feat_pacqarma3_present());
89b86048c4SAntonio Nino Diaz }
90b86048c4SAntonio Nino Diaz 
91cedfa04bSSathees Balya static inline bool is_armv8_4_ttst_present(void)
92cedfa04bSSathees Balya {
93cedfa04bSSathees Balya 	return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
94cedfa04bSSathees Balya 		ID_AA64MMFR2_EL1_ST_MASK) == 1U;
95cedfa04bSSathees Balya }
96cedfa04bSSathees Balya 
979fc59639SAlexei Fedorov static inline bool is_armv8_5_bti_present(void)
989fc59639SAlexei Fedorov {
999fc59639SAlexei Fedorov 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
1009fc59639SAlexei Fedorov 		ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
1019fc59639SAlexei Fedorov }
1029fc59639SAlexei Fedorov 
103*30f05b4fSManish Pandey static inline unsigned int get_armv8_5_mte_support(void)
104*30f05b4fSManish Pandey {
105*30f05b4fSManish Pandey 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
106*30f05b4fSManish Pandey 		ID_AA64PFR1_EL1_MTE_MASK);
107*30f05b4fSManish Pandey }
108*30f05b4fSManish Pandey 
109*30f05b4fSManish Pandey static inline bool is_feat_ssbs_present(void)
110*30f05b4fSManish Pandey {
111*30f05b4fSManish Pandey 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SSBS_SHIFT) &
112*30f05b4fSManish Pandey 		ID_AA64PFR1_EL1_SSBS_MASK) != SSBS_UNAVAILABLE;
113*30f05b4fSManish Pandey }
114*30f05b4fSManish Pandey 
115*30f05b4fSManish Pandey static inline bool is_feat_nmi_present(void)
116*30f05b4fSManish Pandey {
117*30f05b4fSManish Pandey 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_NMI_SHIFT) &
118*30f05b4fSManish Pandey 		ID_AA64PFR1_EL1_NMI_MASK) == NMI_IMPLEMENTED;
119*30f05b4fSManish Pandey }
120*30f05b4fSManish Pandey 
121*30f05b4fSManish Pandey static inline bool is_feat_gcs_present(void)
122*30f05b4fSManish Pandey {
123*30f05b4fSManish Pandey 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_GCS_SHIFT) &
124*30f05b4fSManish Pandey 		ID_AA64PFR1_EL1_GCS_MASK) == GCS_IMPLEMENTED;
125*30f05b4fSManish Pandey }
126*30f05b4fSManish Pandey 
127*30f05b4fSManish Pandey static inline bool is_feat_ebep_present(void)
128*30f05b4fSManish Pandey {
129*30f05b4fSManish Pandey 	return ((read_id_aa64dfr1_el1() >> ID_AA64DFR1_EBEP_SHIFT) &
130*30f05b4fSManish Pandey 		ID_AA64DFR1_EBEP_MASK) == EBEP_IMPLEMENTED;
131*30f05b4fSManish Pandey }
132*30f05b4fSManish Pandey 
133*30f05b4fSManish Pandey static inline bool is_feat_sebep_present(void)
134*30f05b4fSManish Pandey {
135*30f05b4fSManish Pandey 	return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_SEBEP_SHIFT) &
136*30f05b4fSManish Pandey 		ID_AA64DFR0_SEBEP_MASK) == SEBEP_IMPLEMENTED;
137*30f05b4fSManish Pandey }
138*30f05b4fSManish Pandey 
1390a33adc0SGovindraj Raja CREATE_FEATURE_FUNCS(feat_mte, id_aa64pfr1_el1, ID_AA64PFR1_EL1_MTE_SHIFT,
1400a33adc0SGovindraj Raja 		     ENABLE_FEAT_MTE)
1418e397889SGovindraj Raja CREATE_FEATURE_FUNCS_VER(feat_mte2, read_feat_mte_id_field, MTE_IMPLEMENTED_ELX,
1428e397889SGovindraj Raja 		     ENABLE_FEAT_MTE2)
143a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sel2, id_aa64pfr0_el1, ID_AA64PFR0_SEL2_SHIFT,
144a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_SEL2)
145a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_twed, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_TWED_SHIFT,
146a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_TWED)
147a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_fgt, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_FGT_SHIFT,
148a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_FGT)
149a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_mte_perm, id_aa64pfr2_el1,
150a8d5d3d5SAndre Przywara 		     ID_AA64PFR2_EL1_MTEPERM_SHIFT, ENABLE_FEAT_MTE_PERM)
151a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_ecv, id_aa64mmfr0_el1, ID_AA64MMFR0_EL1_ECV_SHIFT,
152a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_ECV)
153a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(feat_ecv_v2, read_feat_ecv_id_field,
154a8d5d3d5SAndre Przywara 			 ID_AA64MMFR0_EL1_ECV_SELF_SYNCH, ENABLE_FEAT_ECV)
155623f6140SAndre Przywara 
156a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_rng, id_aa64isar0_el1, ID_AA64ISAR0_RNDR_SHIFT,
157a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_RNG)
158a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_tcr2, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_TCRX_SHIFT,
159a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_TCR2)
160623f6140SAndre Przywara 
161a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2POE_SHIFT,
162a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_S2POE)
163a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1poe, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1POE_SHIFT,
164a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_S1POE)
165062b6c6bSMark Brown static inline bool is_feat_sxpoe_supported(void)
166062b6c6bSMark Brown {
167062b6c6bSMark Brown 	return is_feat_s1poe_supported() || is_feat_s2poe_supported();
168062b6c6bSMark Brown }
169062b6c6bSMark Brown 
170a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s2pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S2PIE_SHIFT,
171a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_S2PIE)
172a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_s1pie, id_aa64mmfr3_el1, ID_AA64MMFR3_EL1_S1PIE_SHIFT,
173a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_S1PIE)
174062b6c6bSMark Brown static inline bool is_feat_sxpie_supported(void)
175062b6c6bSMark Brown {
176062b6c6bSMark Brown 	return is_feat_s1pie_supported() || is_feat_s2pie_supported();
177062b6c6bSMark Brown }
178062b6c6bSMark Brown 
179a8d5d3d5SAndre Przywara /* FEAT_GCS: Guarded Control Stack */
180a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_gcs, id_aa64pfr1_el1, ID_AA64PFR1_EL1_GCS_SHIFT,
181a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_GCS)
182688ab57bSMark Brown 
183a8d5d3d5SAndre Przywara /* FEAT_AMU: Activity Monitors Extension */
184a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_amu, id_aa64pfr0_el1, ID_AA64PFR0_AMU_SHIFT,
185a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_AMU)
186a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(feat_amuv1p1, read_feat_amu_id_field,
187a8d5d3d5SAndre Przywara 			 ID_AA64PFR0_AMU_V1P1, ENABLE_FEAT_AMUv1p1)
188873d4241Sjohpow01 
189dbcc44a1SAlexei Fedorov /*
190dbcc44a1SAlexei Fedorov  * Return MPAM version:
191dbcc44a1SAlexei Fedorov  *
192dbcc44a1SAlexei Fedorov  * 0x00: None Armv8.0 or later
193dbcc44a1SAlexei Fedorov  * 0x01: v0.1 Armv8.4 or later
194dbcc44a1SAlexei Fedorov  * 0x10: v1.0 Armv8.2 or later
195dbcc44a1SAlexei Fedorov  * 0x11: v1.1 Armv8.4 or later
196dbcc44a1SAlexei Fedorov  *
197dbcc44a1SAlexei Fedorov  */
1989448f2b8SAndre Przywara static inline unsigned int read_feat_mpam_version(void)
199dbcc44a1SAlexei Fedorov {
200dbcc44a1SAlexei Fedorov 	return (unsigned int)((((read_id_aa64pfr0_el1() >>
201dbcc44a1SAlexei Fedorov 		ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
202dbcc44a1SAlexei Fedorov 				((read_id_aa64pfr1_el1() >>
203dbcc44a1SAlexei Fedorov 		ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK));
204dbcc44a1SAlexei Fedorov }
205dbcc44a1SAlexei Fedorov 
206a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(feat_mpam, read_feat_mpam_version, 1U,
207edebefbcSArvind Ram Prakash 			 ENABLE_FEAT_MPAM)
2089448f2b8SAndre Przywara 
209a8d5d3d5SAndre Przywara /* FEAT_HCX: Extended Hypervisor Configuration Register */
210a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_hcx, id_aa64mmfr1_el1, ID_AA64MMFR1_EL1_HCX_SHIFT,
211a8d5d3d5SAndre Przywara 		     ENABLE_FEAT_HCX)
212cb4ec47bSjohpow01 
213ff86e0b4SJuan Pablo Conde static inline bool is_feat_rng_trap_present(void)
214ff86e0b4SJuan Pablo Conde {
215ff86e0b4SJuan Pablo Conde 	return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
216ff86e0b4SJuan Pablo Conde 			ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
217ff86e0b4SJuan Pablo Conde 			== ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
218ff86e0b4SJuan Pablo Conde }
219ff86e0b4SJuan Pablo Conde 
22081c272b3SZelalem Aweke static inline unsigned int get_armv9_2_feat_rme_support(void)
22181c272b3SZelalem Aweke {
22281c272b3SZelalem Aweke 	/*
22381c272b3SZelalem Aweke 	 * Return the RME version, zero if not supported.  This function can be
22481c272b3SZelalem Aweke 	 * used as both an integer value for the RME version or compared to zero
22581c272b3SZelalem Aweke 	 * to detect RME presence.
22681c272b3SZelalem Aweke 	 */
22781c272b3SZelalem Aweke 	return (unsigned int)(read_id_aa64pfr0_el1() >>
22881c272b3SZelalem Aweke 		ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
22981c272b3SZelalem Aweke }
23081c272b3SZelalem Aweke 
2316a0da736SJayanth Dodderi Chidanand /*********************************************************************************
2326a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SB (Speculation Barrier Instruction)
2336a0da736SJayanth Dodderi Chidanand  ********************************************************************************/
23424077098SAndre Przywara static inline unsigned int read_feat_sb_id_field(void)
2356a0da736SJayanth Dodderi Chidanand {
236a8d5d3d5SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_SB_SHIFT);
2376a0da736SJayanth Dodderi Chidanand }
2386a0da736SJayanth Dodderi Chidanand 
23930019d86SSona Mathew /*
24030019d86SSona Mathew  * FEAT_CSV2: Cache Speculation Variant 2. This checks bit fields[56-59]
24130019d86SSona Mathew  * of id_aa64pfr0_el1 register and can be used to check for below features:
24230019d86SSona Mathew  * FEAT_CSV2_2: Cache Speculation Variant CSV2_2.
24330019d86SSona Mathew  * FEAT_CSV2_3: Cache Speculation Variant CSV2_3.
24430019d86SSona Mathew  * 0b0000 - Feature FEAT_CSV2 is not implemented.
24530019d86SSona Mathew  * 0b0001 - Feature FEAT_CSV2 is implemented, but FEAT_CSV2_2 and FEAT_CSV2_3
24630019d86SSona Mathew  *          are not implemented.
24730019d86SSona Mathew  * 0b0010 - Feature FEAT_CSV2_2 is implemented but FEAT_CSV2_3 is not
24830019d86SSona Mathew  *          implemented.
24930019d86SSona Mathew  * 0b0011 - Feature FEAT_CSV2_3 is implemented.
25030019d86SSona Mathew  */
25130019d86SSona Mathew static inline unsigned int read_feat_csv2_id_field(void)
25230019d86SSona Mathew {
25330019d86SSona Mathew 	return (unsigned int)(read_id_aa64pfr0_el1() >>
25430019d86SSona Mathew 		ID_AA64PFR0_CSV2_SHIFT) & ID_AA64PFR0_CSV2_MASK;
25530019d86SSona Mathew }
25630019d86SSona Mathew 
257a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(feat_csv2_2, read_feat_csv2_id_field,
258a8d5d3d5SAndre Przywara 			 ID_AA64PFR0_CSV2_2_SUPPORTED, ENABLE_FEAT_CSV2_2)
25930019d86SSona Mathew CREATE_FEATURE_FUNCS_VER(feat_csv2_3, read_feat_csv2_id_field,
26030019d86SSona Mathew 			 ID_AA64PFR0_CSV2_3_SUPPORTED, ENABLE_FEAT_CSV2_3)
2617db710f0SAndre Przywara 
262a8d5d3d5SAndre Przywara /* FEAT_SPE: Statistical Profiling Extension */
263a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_spe, id_aa64dfr0_el1, ID_AA64DFR0_PMS_SHIFT,
264a8d5d3d5SAndre Przywara 		     ENABLE_SPE_FOR_NS)
2657db710f0SAndre Przywara 
266a8d5d3d5SAndre Przywara /* FEAT_SVE: Scalable Vector Extension */
267a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sve, id_aa64pfr0_el1, ID_AA64PFR0_SVE_SHIFT,
268a8d5d3d5SAndre Przywara 		     ENABLE_SVE_FOR_NS)
2697db710f0SAndre Przywara 
270a8d5d3d5SAndre Przywara /* FEAT_RAS: Reliability, Accessibility, Serviceability */
271a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_ras, id_aa64pfr0_el1,
272a8d5d3d5SAndre Przywara 		     ID_AA64PFR0_RAS_SHIFT, ENABLE_FEAT_RAS)
2736a0da736SJayanth Dodderi Chidanand 
274a8d5d3d5SAndre Przywara /* FEAT_DIT: Data Independent Timing instructions */
275a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_dit, id_aa64pfr0_el1,
276a8d5d3d5SAndre Przywara 		     ID_AA64PFR0_DIT_SHIFT, ENABLE_FEAT_DIT)
2776437a09aSAndre Przywara 
278a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sys_reg_trace, id_aa64dfr0_el1,
279a8d5d3d5SAndre Przywara 		     ID_AA64DFR0_TRACEVER_SHIFT, ENABLE_SYS_REG_TRACE_FOR_NS)
2806437a09aSAndre Przywara 
281a8d5d3d5SAndre Przywara /* FEAT_TRF: TraceFilter */
282a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_trf, id_aa64dfr0_el1, ID_AA64DFR0_TRACEFILT_SHIFT,
283a8d5d3d5SAndre Przywara 		     ENABLE_TRF_FOR_NS)
2846437a09aSAndre Przywara 
285a8d5d3d5SAndre Przywara /* FEAT_NV2: Enhanced Nested Virtualization */
286a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_nv, id_aa64mmfr2_el1, ID_AA64MMFR2_EL1_NV_SHIFT, 0)
287a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(feat_nv2, read_feat_nv_id_field,
288a8d5d3d5SAndre Przywara 			 ID_AA64MMFR2_EL1_NV2_SUPPORTED, CTX_INCLUDE_NEVE_REGS)
2896a0da736SJayanth Dodderi Chidanand 
290a8d5d3d5SAndre Przywara /* FEAT_BRBE: Branch Record Buffer Extension */
291a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_brbe, id_aa64dfr0_el1, ID_AA64DFR0_BRBE_SHIFT,
292a8d5d3d5SAndre Przywara 		     ENABLE_BRBE_FOR_NS)
2932b0bc4e0SJayanth Dodderi Chidanand 
294a8d5d3d5SAndre Przywara /* FEAT_TRBE: Trace Buffer Extension */
295a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_trbe, id_aa64dfr0_el1, ID_AA64DFR0_TRACEBUFFER_SHIFT,
296a8d5d3d5SAndre Przywara 		     ENABLE_TRBE_FOR_NS)
2972b0bc4e0SJayanth Dodderi Chidanand 
29845007acdSJayanth Dodderi Chidanand static inline unsigned int read_feat_sme_fa64_id_field(void)
29945007acdSJayanth Dodderi Chidanand {
300a8d5d3d5SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64smfr0_el1(),
301a8d5d3d5SAndre Przywara 			     ID_AA64SMFR0_EL1_SME_FA64_SHIFT);
30245007acdSJayanth Dodderi Chidanand }
303a8d5d3d5SAndre Przywara /* FEAT_SMEx: Scalar Matrix Extension */
304a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS(feat_sme, id_aa64pfr1_el1, ID_AA64PFR1_EL1_SME_SHIFT,
305a8d5d3d5SAndre Przywara 		     ENABLE_SME_FOR_NS)
306a8d5d3d5SAndre Przywara CREATE_FEATURE_FUNCS_VER(feat_sme2, read_feat_sme_id_field,
307a8d5d3d5SAndre Przywara 			 ID_AA64PFR1_EL1_SME2_SUPPORTED, ENABLE_SME2_FOR_NS)
30803d3c0d7SJayanth Dodderi Chidanand 
309bff074ddSJavier Almansa Sobrino /*******************************************************************************
310bff074ddSJavier Almansa Sobrino  * Function to get hardware granularity support
311bff074ddSJavier Almansa Sobrino  ******************************************************************************/
312bff074ddSJavier Almansa Sobrino 
313bff074ddSJavier Almansa Sobrino static inline unsigned int read_id_aa64mmfr0_el0_tgran4_field(void)
314bff074ddSJavier Almansa Sobrino {
315a8d5d3d5SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
316a8d5d3d5SAndre Przywara 			     ID_AA64MMFR0_EL1_TGRAN4_SHIFT);
317bff074ddSJavier Almansa Sobrino }
318bff074ddSJavier Almansa Sobrino 
319bff074ddSJavier Almansa Sobrino static inline unsigned int read_id_aa64mmfr0_el0_tgran16_field(void)
320bff074ddSJavier Almansa Sobrino {
321bff074ddSJavier Almansa Sobrino 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
322a8d5d3d5SAndre Przywara 			     ID_AA64MMFR0_EL1_TGRAN16_SHIFT);
323bff074ddSJavier Almansa Sobrino }
324bff074ddSJavier Almansa Sobrino 
325bff074ddSJavier Almansa Sobrino static inline unsigned int read_id_aa64mmfr0_el0_tgran64_field(void)
326bff074ddSJavier Almansa Sobrino {
327bff074ddSJavier Almansa Sobrino 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
328a8d5d3d5SAndre Przywara 			     ID_AA64MMFR0_EL1_TGRAN64_SHIFT);
329bff074ddSJavier Almansa Sobrino }
330bff074ddSJavier Almansa Sobrino 
331c73686a1SBoyan Karatotev static inline unsigned int read_feat_pmuv3_id_field(void)
332c73686a1SBoyan Karatotev {
333a8d5d3d5SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_PMUVER_SHIFT);
334c73686a1SBoyan Karatotev }
335c73686a1SBoyan Karatotev 
33683a4dae1SBoyan Karatotev static inline unsigned int read_feat_mtpmu_id_field(void)
33783a4dae1SBoyan Karatotev {
338a8d5d3d5SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_MTPMU_SHIFT);
33983a4dae1SBoyan Karatotev }
34083a4dae1SBoyan Karatotev 
34183a4dae1SBoyan Karatotev static inline bool is_feat_mtpmu_supported(void)
34283a4dae1SBoyan Karatotev {
34383a4dae1SBoyan Karatotev 	if (DISABLE_MTPMU == FEAT_STATE_DISABLED) {
34483a4dae1SBoyan Karatotev 		return false;
34583a4dae1SBoyan Karatotev 	}
34683a4dae1SBoyan Karatotev 
34783a4dae1SBoyan Karatotev 	if (DISABLE_MTPMU == FEAT_STATE_ALWAYS) {
34883a4dae1SBoyan Karatotev 		return true;
34983a4dae1SBoyan Karatotev 	}
35083a4dae1SBoyan Karatotev 
35183a4dae1SBoyan Karatotev 	unsigned int mtpmu = read_feat_mtpmu_id_field();
35283a4dae1SBoyan Karatotev 
35383a4dae1SBoyan Karatotev 	return (mtpmu != 0U) && (mtpmu != ID_AA64DFR0_MTPMU_DISABLED);
35483a4dae1SBoyan Karatotev }
35583a4dae1SBoyan Karatotev 
3562559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */
357