xref: /rk3399_ARM-atf/include/arch/aarch64/arch_features.h (revision 623f6140fc8eaa547d477179b67ca2fde2720fe4)
12559b2c8SAntonio Nino Diaz /*
2fd1dd4cbSAndre Przywara  * Copyright (c) 2019-2023, 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)					\
16fd1dd4cbSAndre Przywara 	((unsigned int)(((reg) >> (feat ## _SHIFT)) & (feat ## _MASK)))
17fd1dd4cbSAndre Przywara 
1829a24134SAntonio Nino Diaz static inline bool is_armv7_gentimer_present(void)
1929a24134SAntonio Nino Diaz {
2029a24134SAntonio Nino Diaz 	/* The Generic Timer is always present in an ARMv8-A implementation */
2129a24134SAntonio Nino Diaz 	return true;
2229a24134SAntonio Nino Diaz }
2329a24134SAntonio Nino Diaz 
244f5ef849SAndre Przywara static inline unsigned int read_feat_pan_id_field(void)
2537596fcbSDaniel Boulby {
264f5ef849SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_PAN);
274f5ef849SAndre Przywara }
284f5ef849SAndre Przywara 
294f5ef849SAndre Przywara static inline bool is_feat_pan_supported(void)
304f5ef849SAndre Przywara {
314f5ef849SAndre Przywara 	if (ENABLE_FEAT_PAN == FEAT_STATE_DISABLED) {
324f5ef849SAndre Przywara 		return false;
334f5ef849SAndre Przywara 	}
344f5ef849SAndre Przywara 
354f5ef849SAndre Przywara 	if (ENABLE_FEAT_PAN == FEAT_STATE_ALWAYS) {
364f5ef849SAndre Przywara 		return true;
374f5ef849SAndre Przywara 	}
384f5ef849SAndre Przywara 
394f5ef849SAndre Przywara 	return read_feat_pan_id_field() != 0U;
4037596fcbSDaniel Boulby }
4137596fcbSDaniel Boulby 
42ea735bf5SAndre Przywara static inline unsigned int read_feat_vhe_id_field(void)
4337596fcbSDaniel Boulby {
44ea735bf5SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_VHE);
45ea735bf5SAndre Przywara }
46ea735bf5SAndre Przywara 
47ea735bf5SAndre Przywara static inline bool is_feat_vhe_supported(void)
48ea735bf5SAndre Przywara {
49ea735bf5SAndre Przywara 	if (ENABLE_FEAT_VHE == FEAT_STATE_DISABLED) {
50ea735bf5SAndre Przywara 		return false;
51ea735bf5SAndre Przywara 	}
52ea735bf5SAndre Przywara 
53ea735bf5SAndre Przywara 	if (ENABLE_FEAT_VHE == FEAT_STATE_ALWAYS) {
54ea735bf5SAndre Przywara 		return true;
55ea735bf5SAndre Przywara 	}
56ea735bf5SAndre Przywara 
57ea735bf5SAndre Przywara 	return read_feat_vhe_id_field() != 0U;
5837596fcbSDaniel Boulby }
5937596fcbSDaniel Boulby 
602559b2c8SAntonio Nino Diaz static inline bool is_armv8_2_ttcnp_present(void)
612559b2c8SAntonio Nino Diaz {
622559b2c8SAntonio Nino Diaz 	return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_CNP_SHIFT) &
632559b2c8SAntonio Nino Diaz 		ID_AA64MMFR2_EL1_CNP_MASK) != 0U;
642559b2c8SAntonio Nino Diaz }
652559b2c8SAntonio Nino Diaz 
669ff5f754SJuan Pablo Conde static inline bool is_feat_pacqarma3_present(void)
679ff5f754SJuan Pablo Conde {
689ff5f754SJuan Pablo Conde 	uint64_t mask_id_aa64isar2 =
699ff5f754SJuan Pablo Conde 			(ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
709ff5f754SJuan Pablo Conde 			(ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
719ff5f754SJuan Pablo Conde 
729ff5f754SJuan Pablo Conde 	/* If any of the fields is not zero, QARMA3 algorithm is present */
739ff5f754SJuan Pablo Conde 	return (read_id_aa64isar2_el1() & mask_id_aa64isar2) != 0U;
749ff5f754SJuan Pablo Conde }
759ff5f754SJuan Pablo Conde 
76b86048c4SAntonio Nino Diaz static inline bool is_armv8_3_pauth_present(void)
77b86048c4SAntonio Nino Diaz {
789ff5f754SJuan Pablo Conde 	uint64_t mask_id_aa64isar1 =
799ff5f754SJuan Pablo Conde 		(ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
80b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
81b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
82b86048c4SAntonio Nino Diaz 		(ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
83b86048c4SAntonio Nino Diaz 
849ff5f754SJuan Pablo Conde 	/*
859ff5f754SJuan Pablo Conde 	 * If any of the fields is not zero or QARMA3 is present,
869ff5f754SJuan Pablo Conde 	 * PAuth is present
879ff5f754SJuan Pablo Conde 	 */
889ff5f754SJuan Pablo Conde 	return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
899ff5f754SJuan Pablo Conde 		is_feat_pacqarma3_present());
90b86048c4SAntonio Nino Diaz }
91b86048c4SAntonio Nino Diaz 
924d482156SDaniel Boulby static inline bool is_armv8_4_dit_present(void)
934d482156SDaniel Boulby {
944d482156SDaniel Boulby 	return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
954d482156SDaniel Boulby 		ID_AA64PFR0_DIT_MASK) == 1U;
964d482156SDaniel Boulby }
974d482156SDaniel Boulby 
98cedfa04bSSathees Balya static inline bool is_armv8_4_ttst_present(void)
99cedfa04bSSathees Balya {
100cedfa04bSSathees Balya 	return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
101cedfa04bSSathees Balya 		ID_AA64MMFR2_EL1_ST_MASK) == 1U;
102cedfa04bSSathees Balya }
103cedfa04bSSathees Balya 
1049fc59639SAlexei Fedorov static inline bool is_armv8_5_bti_present(void)
1059fc59639SAlexei Fedorov {
1069fc59639SAlexei Fedorov 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
1079fc59639SAlexei Fedorov 		ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
1089fc59639SAlexei Fedorov }
1099fc59639SAlexei Fedorov 
110b7e398d6SSoby Mathew static inline unsigned int get_armv8_5_mte_support(void)
111b7e398d6SSoby Mathew {
112b7e398d6SSoby Mathew 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
113b7e398d6SSoby Mathew 		ID_AA64PFR1_EL1_MTE_MASK);
114b7e398d6SSoby Mathew }
115b7e398d6SSoby Mathew 
116*623f6140SAndre Przywara static inline unsigned int read_feat_sel2_id_field(void)
11752696946SOlivier Deprez {
118*623f6140SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_SEL2);
119*623f6140SAndre Przywara }
120*623f6140SAndre Przywara 
121*623f6140SAndre Przywara static inline bool is_feat_sel2_supported(void)
122*623f6140SAndre Przywara {
123*623f6140SAndre Przywara 	if (ENABLE_FEAT_SEL2 == FEAT_STATE_DISABLED) {
124*623f6140SAndre Przywara 		return false;
125*623f6140SAndre Przywara 	}
126*623f6140SAndre Przywara 
127*623f6140SAndre Przywara 	if (ENABLE_FEAT_SEL2 == FEAT_STATE_ALWAYS) {
128*623f6140SAndre Przywara 		return true;
129*623f6140SAndre Przywara 	}
130*623f6140SAndre Przywara 
131*623f6140SAndre Przywara 	return read_feat_sel2_id_field() != 0U;
13252696946SOlivier Deprez }
13352696946SOlivier Deprez 
1341223d2a0SAndre Przywara static inline unsigned int read_feat_twed_id_field(void)
1356cac724dSjohpow01 {
1361223d2a0SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_TWED);
1371223d2a0SAndre Przywara }
1381223d2a0SAndre Przywara 
1391223d2a0SAndre Przywara static inline bool is_feat_twed_supported(void)
1401223d2a0SAndre Przywara {
1411223d2a0SAndre Przywara 	if (ENABLE_FEAT_TWED == FEAT_STATE_DISABLED) {
1421223d2a0SAndre Przywara 		return false;
1431223d2a0SAndre Przywara 	}
1441223d2a0SAndre Przywara 
1451223d2a0SAndre Przywara 	if (ENABLE_FEAT_TWED == FEAT_STATE_ALWAYS) {
1461223d2a0SAndre Przywara 		return true;
1471223d2a0SAndre Przywara 	}
1481223d2a0SAndre Przywara 
1491223d2a0SAndre Przywara 	return read_feat_twed_id_field() != 0U;
1506cac724dSjohpow01 }
1516cac724dSjohpow01 
152ce485955SAndre Przywara static unsigned int read_feat_fgt_id_field(void)
153110ee433SJimmy Brisson {
154fd1dd4cbSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_FGT);
155ce485955SAndre Przywara }
156ce485955SAndre Przywara 
157ce485955SAndre Przywara static inline bool is_feat_fgt_supported(void)
158ce485955SAndre Przywara {
159ce485955SAndre Przywara 	if (ENABLE_FEAT_FGT == FEAT_STATE_DISABLED) {
160ce485955SAndre Przywara 		return false;
161ce485955SAndre Przywara 	}
162ce485955SAndre Przywara 
163ce485955SAndre Przywara 	if (ENABLE_FEAT_FGT == FEAT_STATE_ALWAYS) {
164ce485955SAndre Przywara 		return true;
165ce485955SAndre Przywara 	}
166ce485955SAndre Przywara 
167ce485955SAndre Przywara 	return read_feat_fgt_id_field() != 0U;
168110ee433SJimmy Brisson }
169110ee433SJimmy Brisson 
170b8f03d29SAndre Przywara static unsigned int read_feat_ecv_id_field(void)
17129d0ee54SJimmy Brisson {
172b8f03d29SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_ECV);
173b8f03d29SAndre Przywara }
174b8f03d29SAndre Przywara 
175b8f03d29SAndre Przywara static inline bool is_feat_ecv_supported(void)
176b8f03d29SAndre Przywara {
177b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_DISABLED) {
178b8f03d29SAndre Przywara 		return false;
179b8f03d29SAndre Przywara 	}
180b8f03d29SAndre Przywara 
181b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_ALWAYS) {
182b8f03d29SAndre Przywara 		return true;
183b8f03d29SAndre Przywara 	}
184b8f03d29SAndre Przywara 
185b8f03d29SAndre Przywara 	return read_feat_ecv_id_field() != 0U;
186b8f03d29SAndre Przywara }
187b8f03d29SAndre Przywara 
188b8f03d29SAndre Przywara static inline bool is_feat_ecv_v2_supported(void)
189b8f03d29SAndre Przywara {
190b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_DISABLED) {
191b8f03d29SAndre Przywara 		return false;
192b8f03d29SAndre Przywara 	}
193b8f03d29SAndre Przywara 
194b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_ALWAYS) {
195b8f03d29SAndre Przywara 		return true;
196b8f03d29SAndre Przywara 	}
197b8f03d29SAndre Przywara 
198b8f03d29SAndre Przywara 	return read_feat_ecv_id_field() >= ID_AA64MMFR0_EL1_ECV_SELF_SYNCH;
19929d0ee54SJimmy Brisson }
20029d0ee54SJimmy Brisson 
2017c802c71STomas Pilar static inline bool is_armv8_5_rng_present(void)
2027c802c71STomas Pilar {
2037c802c71STomas Pilar 	return ((read_id_aa64isar0_el1() >> ID_AA64ISAR0_RNDR_SHIFT) &
2047c802c71STomas Pilar 		ID_AA64ISAR0_RNDR_MASK);
2057c802c71STomas Pilar }
2067c802c71STomas Pilar 
207d3331603SMark Brown static unsigned int read_feat_tcrx_id_field(void)
208d3331603SMark Brown {
209d3331603SMark Brown 	return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_TCRX);
210d3331603SMark Brown }
211d3331603SMark Brown 
212d3331603SMark Brown static inline bool is_feat_tcr2_supported(void)
213d3331603SMark Brown {
214d3331603SMark Brown 	if (ENABLE_FEAT_TCR2 == FEAT_STATE_DISABLED) {
215d3331603SMark Brown 		return false;
216d3331603SMark Brown 	}
217d3331603SMark Brown 
218d3331603SMark Brown 	if (ENABLE_FEAT_TCR2 == FEAT_STATE_ALWAYS) {
219d3331603SMark Brown 		return true;
220d3331603SMark Brown 	}
221d3331603SMark Brown 
222d3331603SMark Brown 	return read_feat_tcrx_id_field() != 0U;
223d3331603SMark Brown }
224d3331603SMark Brown 
225f0deb4c8SAndre Przywara /*******************************************************************************
226f0deb4c8SAndre Przywara  * Functions to identify the presence of the Activity Monitors Extension
227f0deb4c8SAndre Przywara  ******************************************************************************/
228f0deb4c8SAndre Przywara static unsigned int read_feat_amu_id_field(void)
229f0deb4c8SAndre Przywara {
230fd1dd4cbSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_AMU);
231f0deb4c8SAndre Przywara }
232f0deb4c8SAndre Przywara 
233f0deb4c8SAndre Przywara static inline bool is_feat_amu_supported(void)
234f0deb4c8SAndre Przywara {
235f0deb4c8SAndre Przywara 	if (ENABLE_FEAT_AMUv1 == FEAT_STATE_DISABLED) {
236f0deb4c8SAndre Przywara 		return false;
237f0deb4c8SAndre Przywara 	}
238f0deb4c8SAndre Przywara 
239f0deb4c8SAndre Przywara 	if (ENABLE_FEAT_AMUv1 == FEAT_STATE_ALWAYS) {
240f0deb4c8SAndre Przywara 		return true;
241f0deb4c8SAndre Przywara 	}
242f0deb4c8SAndre Przywara 
243f0deb4c8SAndre Przywara 	return read_feat_amu_id_field() >= ID_AA64PFR0_AMU_V1;
244f0deb4c8SAndre Przywara }
245f0deb4c8SAndre Przywara 
246873d4241Sjohpow01 static inline bool is_armv8_6_feat_amuv1p1_present(void)
247873d4241Sjohpow01 {
248f0deb4c8SAndre Przywara 	return read_feat_amu_id_field() >= ID_AA64PFR0_AMU_V1P1;
249873d4241Sjohpow01 }
250873d4241Sjohpow01 
251dbcc44a1SAlexei Fedorov /*
252dbcc44a1SAlexei Fedorov  * Return MPAM version:
253dbcc44a1SAlexei Fedorov  *
254dbcc44a1SAlexei Fedorov  * 0x00: None Armv8.0 or later
255dbcc44a1SAlexei Fedorov  * 0x01: v0.1 Armv8.4 or later
256dbcc44a1SAlexei Fedorov  * 0x10: v1.0 Armv8.2 or later
257dbcc44a1SAlexei Fedorov  * 0x11: v1.1 Armv8.4 or later
258dbcc44a1SAlexei Fedorov  *
259dbcc44a1SAlexei Fedorov  */
2609448f2b8SAndre Przywara static inline unsigned int read_feat_mpam_version(void)
261dbcc44a1SAlexei Fedorov {
262dbcc44a1SAlexei Fedorov 	return (unsigned int)((((read_id_aa64pfr0_el1() >>
263dbcc44a1SAlexei Fedorov 		ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
264dbcc44a1SAlexei Fedorov 				((read_id_aa64pfr1_el1() >>
265dbcc44a1SAlexei Fedorov 		ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK));
266dbcc44a1SAlexei Fedorov }
267dbcc44a1SAlexei Fedorov 
2689448f2b8SAndre Przywara static inline bool is_feat_mpam_supported(void)
2699448f2b8SAndre Przywara {
2709448f2b8SAndre Przywara 	if (ENABLE_MPAM_FOR_LOWER_ELS == FEAT_STATE_DISABLED) {
2719448f2b8SAndre Przywara 		return false;
2729448f2b8SAndre Przywara 	}
2739448f2b8SAndre Przywara 
2749448f2b8SAndre Przywara 	if (ENABLE_MPAM_FOR_LOWER_ELS == FEAT_STATE_ALWAYS) {
2759448f2b8SAndre Przywara 		return true;
2769448f2b8SAndre Przywara 	}
2779448f2b8SAndre Przywara 
2789448f2b8SAndre Przywara 	return read_feat_mpam_version() != 0U;
2799448f2b8SAndre Przywara }
2809448f2b8SAndre Przywara 
281d242128cSAndre Przywara static inline unsigned int read_feat_hcx_id_field(void)
282cb4ec47bSjohpow01 {
283fd1dd4cbSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_HCX);
284d242128cSAndre Przywara }
285d242128cSAndre Przywara 
286d242128cSAndre Przywara static inline bool is_feat_hcx_supported(void)
287d242128cSAndre Przywara {
288d242128cSAndre Przywara 	if (ENABLE_FEAT_HCX == FEAT_STATE_DISABLED) {
289d242128cSAndre Przywara 		return false;
290d242128cSAndre Przywara 	}
291d242128cSAndre Przywara 
292d242128cSAndre Przywara 	if (ENABLE_FEAT_HCX == FEAT_STATE_ALWAYS) {
293d242128cSAndre Przywara 		return true;
294d242128cSAndre Przywara 	}
295d242128cSAndre Przywara 
296d242128cSAndre Przywara 	return read_feat_hcx_id_field() != 0U;
297cb4ec47bSjohpow01 }
298cb4ec47bSjohpow01 
299ff86e0b4SJuan Pablo Conde static inline bool is_feat_rng_trap_present(void)
300ff86e0b4SJuan Pablo Conde {
301ff86e0b4SJuan Pablo Conde 	return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
302ff86e0b4SJuan Pablo Conde 			ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
303ff86e0b4SJuan Pablo Conde 			== ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
304ff86e0b4SJuan Pablo Conde }
305ff86e0b4SJuan Pablo Conde 
30681c272b3SZelalem Aweke static inline unsigned int get_armv9_2_feat_rme_support(void)
30781c272b3SZelalem Aweke {
30881c272b3SZelalem Aweke 	/*
30981c272b3SZelalem Aweke 	 * Return the RME version, zero if not supported.  This function can be
31081c272b3SZelalem Aweke 	 * used as both an integer value for the RME version or compared to zero
31181c272b3SZelalem Aweke 	 * to detect RME presence.
31281c272b3SZelalem Aweke 	 */
31381c272b3SZelalem Aweke 	return (unsigned int)(read_id_aa64pfr0_el1() >>
31481c272b3SZelalem Aweke 		ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
31581c272b3SZelalem Aweke }
31681c272b3SZelalem Aweke 
3176a0da736SJayanth Dodderi Chidanand /*********************************************************************************
3186a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SB (Speculation Barrier Instruction)
3196a0da736SJayanth Dodderi Chidanand  ********************************************************************************/
32024077098SAndre Przywara static inline unsigned int read_feat_sb_id_field(void)
3216a0da736SJayanth Dodderi Chidanand {
32224077098SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_SB);
3236a0da736SJayanth Dodderi Chidanand }
3246a0da736SJayanth Dodderi Chidanand 
3256a0da736SJayanth Dodderi Chidanand /*********************************************************************************
3266a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_CSV2_2 (Cache Speculation Variant 2)
3276a0da736SJayanth Dodderi Chidanand  ********************************************************************************/
3287db710f0SAndre Przywara static inline unsigned int read_feat_csv2_id_field(void)
3296a0da736SJayanth Dodderi Chidanand {
3307db710f0SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_CSV2);
3317db710f0SAndre Przywara }
3327db710f0SAndre Przywara 
3337db710f0SAndre Przywara static inline bool is_feat_csv2_2_supported(void)
3347db710f0SAndre Przywara {
3357db710f0SAndre Przywara 	if (ENABLE_FEAT_CSV2_2 == FEAT_STATE_DISABLED) {
3367db710f0SAndre Przywara 		return false;
3377db710f0SAndre Przywara 	}
3387db710f0SAndre Przywara 
3397db710f0SAndre Przywara 	if (ENABLE_FEAT_CSV2_2 == FEAT_STATE_ALWAYS) {
3407db710f0SAndre Przywara 		return true;
3417db710f0SAndre Przywara 	}
3427db710f0SAndre Przywara 
3437db710f0SAndre Przywara 	return read_feat_csv2_id_field() >= ID_AA64PFR0_CSV2_2_SUPPORTED;
3446a0da736SJayanth Dodderi Chidanand }
3456a0da736SJayanth Dodderi Chidanand 
3466a0da736SJayanth Dodderi Chidanand /**********************************************************************************
3476a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SPE (Statistical Profiling Extension)
3486a0da736SJayanth Dodderi Chidanand  *********************************************************************************/
3496437a09aSAndre Przywara static inline unsigned int read_feat_spe_id_field(void)
3506a0da736SJayanth Dodderi Chidanand {
3516437a09aSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_PMS);
3526437a09aSAndre Przywara }
3536437a09aSAndre Przywara 
3546437a09aSAndre Przywara static inline bool is_feat_spe_supported(void)
3556437a09aSAndre Przywara {
3566437a09aSAndre Przywara 	if (ENABLE_SPE_FOR_NS == FEAT_STATE_DISABLED) {
3576437a09aSAndre Przywara 		return false;
3586437a09aSAndre Przywara 	}
3596437a09aSAndre Przywara 
3606437a09aSAndre Przywara 	if (ENABLE_SPE_FOR_NS == FEAT_STATE_ALWAYS) {
3616437a09aSAndre Przywara 		return true;
3626437a09aSAndre Przywara 	}
3636437a09aSAndre Przywara 
3646437a09aSAndre Przywara 	return read_feat_spe_id_field() != 0U;
3656a0da736SJayanth Dodderi Chidanand }
3666a0da736SJayanth Dodderi Chidanand 
3676a0da736SJayanth Dodderi Chidanand /*******************************************************************************
3686a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SVE (Scalable Vector Extension)
3696a0da736SJayanth Dodderi Chidanand  ******************************************************************************/
3706a0da736SJayanth Dodderi Chidanand static inline bool is_armv8_2_feat_sve_present(void)
3716a0da736SJayanth Dodderi Chidanand {
3726a0da736SJayanth Dodderi Chidanand 	return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT) &
3736a0da736SJayanth Dodderi Chidanand 		ID_AA64PFR0_SVE_MASK) == ID_AA64PFR0_SVE_SUPPORTED);
3746a0da736SJayanth Dodderi Chidanand }
3756a0da736SJayanth Dodderi Chidanand 
3766a0da736SJayanth Dodderi Chidanand /*******************************************************************************
3776a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_RAS (Reliability,Availability,
3786a0da736SJayanth Dodderi Chidanand  * and Serviceability Extension)
3796a0da736SJayanth Dodderi Chidanand  ******************************************************************************/
3806a0da736SJayanth Dodderi Chidanand static inline bool is_armv8_2_feat_ras_present(void)
3816a0da736SJayanth Dodderi Chidanand {
3826a0da736SJayanth Dodderi Chidanand 	return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_RAS_SHIFT) &
3836a0da736SJayanth Dodderi Chidanand 		ID_AA64PFR0_RAS_MASK) != ID_AA64PFR0_RAS_NOT_SUPPORTED);
3846a0da736SJayanth Dodderi Chidanand }
3856a0da736SJayanth Dodderi Chidanand 
3866a0da736SJayanth Dodderi Chidanand /**************************************************************************
3876a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_DIT (Data Independent Timing)
3886a0da736SJayanth Dodderi Chidanand  *************************************************************************/
3896a0da736SJayanth Dodderi Chidanand static inline bool is_armv8_4_feat_dit_present(void)
3906a0da736SJayanth Dodderi Chidanand {
3916a0da736SJayanth Dodderi Chidanand 	return (((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
3926a0da736SJayanth Dodderi Chidanand 		ID_AA64PFR0_DIT_MASK) == ID_AA64PFR0_DIT_SUPPORTED);
3936a0da736SJayanth Dodderi Chidanand }
3946a0da736SJayanth Dodderi Chidanand 
395603a0c6fSAndre Przywara static inline unsigned int read_feat_tracever_id_field(void)
396603a0c6fSAndre Przywara {
397603a0c6fSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEVER);
398603a0c6fSAndre Przywara }
399603a0c6fSAndre Przywara 
400603a0c6fSAndre Przywara static inline bool is_feat_sys_reg_trace_supported(void)
401603a0c6fSAndre Przywara {
402603a0c6fSAndre Przywara 	if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_DISABLED) {
403603a0c6fSAndre Przywara 		return false;
404603a0c6fSAndre Przywara 	}
405603a0c6fSAndre Przywara 
406603a0c6fSAndre Przywara 	if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_ALWAYS) {
407603a0c6fSAndre Przywara 		return true;
408603a0c6fSAndre Przywara 	}
409603a0c6fSAndre Przywara 
410603a0c6fSAndre Przywara 	return read_feat_tracever_id_field() != 0U;
411603a0c6fSAndre Przywara }
412603a0c6fSAndre Przywara 
4136a0da736SJayanth Dodderi Chidanand /*************************************************************************
4146a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_TRF (TraceLift)
4156a0da736SJayanth Dodderi Chidanand  ************************************************************************/
416fc8d2d39SAndre Przywara static inline unsigned int read_feat_trf_id_field(void)
4176a0da736SJayanth Dodderi Chidanand {
418fc8d2d39SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEFILT);
419fc8d2d39SAndre Przywara }
420fc8d2d39SAndre Przywara 
421fc8d2d39SAndre Przywara static inline bool is_feat_trf_supported(void)
422fc8d2d39SAndre Przywara {
423fc8d2d39SAndre Przywara 	if (ENABLE_TRF_FOR_NS == FEAT_STATE_DISABLED) {
424fc8d2d39SAndre Przywara 		return false;
425fc8d2d39SAndre Przywara 	}
426fc8d2d39SAndre Przywara 
427fc8d2d39SAndre Przywara 	if (ENABLE_TRF_FOR_NS == FEAT_STATE_ALWAYS) {
428fc8d2d39SAndre Przywara 		return true;
429fc8d2d39SAndre Przywara 	}
430fc8d2d39SAndre Przywara 
431fc8d2d39SAndre Przywara 	return read_feat_trf_id_field() != 0U;
4326a0da736SJayanth Dodderi Chidanand }
4336a0da736SJayanth Dodderi Chidanand 
4346a0da736SJayanth Dodderi Chidanand /********************************************************************************
4356a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_NV2 (Enhanced Nested Virtualization
4366a0da736SJayanth Dodderi Chidanand  * Support)
4376a0da736SJayanth Dodderi Chidanand  *******************************************************************************/
438d5384b69SAndre Przywara static inline unsigned int read_feat_nv_id_field(void)
4396a0da736SJayanth Dodderi Chidanand {
440d5384b69SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr2_el1(), ID_AA64MMFR2_EL1_NV);
441d5384b69SAndre Przywara }
442d5384b69SAndre Przywara 
443d5384b69SAndre Przywara static inline bool is_feat_nv2_supported(void)
444d5384b69SAndre Przywara {
445d5384b69SAndre Przywara 	if (CTX_INCLUDE_NEVE_REGS == FEAT_STATE_DISABLED) {
446d5384b69SAndre Przywara 		return false;
447d5384b69SAndre Przywara 	}
448d5384b69SAndre Przywara 
449d5384b69SAndre Przywara 	if (CTX_INCLUDE_NEVE_REGS == FEAT_STATE_ALWAYS) {
450d5384b69SAndre Przywara 		return true;
451d5384b69SAndre Przywara 	}
452d5384b69SAndre Przywara 
453d5384b69SAndre Przywara 	return read_feat_nv_id_field() >= ID_AA64MMFR2_EL1_NV2_SUPPORTED;
4546a0da736SJayanth Dodderi Chidanand }
4556a0da736SJayanth Dodderi Chidanand 
4561298f2f1SJayanth Dodderi Chidanand /*******************************************************************************
4571298f2f1SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_BRBE (Branch Record Buffer
4581298f2f1SJayanth Dodderi Chidanand  * Extension)
4591298f2f1SJayanth Dodderi Chidanand  ******************************************************************************/
460ff491036SAndre Przywara static inline unsigned int read_feat_brbe_id_field(void)
4611298f2f1SJayanth Dodderi Chidanand {
462ff491036SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_BRBE);
463ff491036SAndre Przywara }
464ff491036SAndre Przywara 
465ff491036SAndre Przywara static inline bool is_feat_brbe_supported(void)
466ff491036SAndre Przywara {
467ff491036SAndre Przywara 	if (ENABLE_BRBE_FOR_NS == FEAT_STATE_DISABLED) {
468ff491036SAndre Przywara 		return false;
469ff491036SAndre Przywara 	}
470ff491036SAndre Przywara 
471ff491036SAndre Przywara 	if (ENABLE_BRBE_FOR_NS == FEAT_STATE_ALWAYS) {
472ff491036SAndre Przywara 		return true;
473ff491036SAndre Przywara 	}
474ff491036SAndre Przywara 
475ff491036SAndre Przywara 	return read_feat_brbe_id_field() != 0U;
4761298f2f1SJayanth Dodderi Chidanand }
4771298f2f1SJayanth Dodderi Chidanand 
47847c681b7SJayanth Dodderi Chidanand /*******************************************************************************
47947c681b7SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_TRBE (Trace Buffer Extension)
48047c681b7SJayanth Dodderi Chidanand  ******************************************************************************/
481f5360cfaSAndre Przywara static inline unsigned int read_feat_trbe_id_field(void)
48247c681b7SJayanth Dodderi Chidanand {
483f5360cfaSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEBUFFER);
48447c681b7SJayanth Dodderi Chidanand }
4851298f2f1SJayanth Dodderi Chidanand 
486f5360cfaSAndre Przywara static inline bool is_feat_trbe_supported(void)
487f5360cfaSAndre Przywara {
488f5360cfaSAndre Przywara 	if (ENABLE_TRBE_FOR_NS == FEAT_STATE_DISABLED) {
489f5360cfaSAndre Przywara 		return false;
490f5360cfaSAndre Przywara 	}
491f5360cfaSAndre Przywara 
492f5360cfaSAndre Przywara 	if (ENABLE_TRBE_FOR_NS == FEAT_STATE_ALWAYS) {
493f5360cfaSAndre Przywara 		return true;
494f5360cfaSAndre Przywara 	}
495f5360cfaSAndre Przywara 
496f5360cfaSAndre Przywara 	return read_feat_trbe_id_field() != 0U;
497f5360cfaSAndre Przywara 
498f5360cfaSAndre Przywara }
4992559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */
500