xref: /rk3399_ARM-atf/include/arch/aarch64/arch_features.h (revision bff074dd941d4fb51d6abade5db4b636f977d6f7)
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 
92cedfa04bSSathees Balya static inline bool is_armv8_4_ttst_present(void)
93cedfa04bSSathees Balya {
94cedfa04bSSathees Balya 	return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
95cedfa04bSSathees Balya 		ID_AA64MMFR2_EL1_ST_MASK) == 1U;
96cedfa04bSSathees Balya }
97cedfa04bSSathees Balya 
989fc59639SAlexei Fedorov static inline bool is_armv8_5_bti_present(void)
999fc59639SAlexei Fedorov {
1009fc59639SAlexei Fedorov 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
1019fc59639SAlexei Fedorov 		ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
1029fc59639SAlexei Fedorov }
1039fc59639SAlexei Fedorov 
104b7e398d6SSoby Mathew static inline unsigned int get_armv8_5_mte_support(void)
105b7e398d6SSoby Mathew {
106b7e398d6SSoby Mathew 	return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
107b7e398d6SSoby Mathew 		ID_AA64PFR1_EL1_MTE_MASK);
108b7e398d6SSoby Mathew }
109b7e398d6SSoby Mathew 
110623f6140SAndre Przywara static inline unsigned int read_feat_sel2_id_field(void)
11152696946SOlivier Deprez {
112623f6140SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_SEL2);
113623f6140SAndre Przywara }
114623f6140SAndre Przywara 
115623f6140SAndre Przywara static inline bool is_feat_sel2_supported(void)
116623f6140SAndre Przywara {
117623f6140SAndre Przywara 	if (ENABLE_FEAT_SEL2 == FEAT_STATE_DISABLED) {
118623f6140SAndre Przywara 		return false;
119623f6140SAndre Przywara 	}
120623f6140SAndre Przywara 
121623f6140SAndre Przywara 	if (ENABLE_FEAT_SEL2 == FEAT_STATE_ALWAYS) {
122623f6140SAndre Przywara 		return true;
123623f6140SAndre Przywara 	}
124623f6140SAndre Przywara 
125623f6140SAndre Przywara 	return read_feat_sel2_id_field() != 0U;
12652696946SOlivier Deprez }
12752696946SOlivier Deprez 
1281223d2a0SAndre Przywara static inline unsigned int read_feat_twed_id_field(void)
1296cac724dSjohpow01 {
1301223d2a0SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_TWED);
1311223d2a0SAndre Przywara }
1321223d2a0SAndre Przywara 
1331223d2a0SAndre Przywara static inline bool is_feat_twed_supported(void)
1341223d2a0SAndre Przywara {
1351223d2a0SAndre Przywara 	if (ENABLE_FEAT_TWED == FEAT_STATE_DISABLED) {
1361223d2a0SAndre Przywara 		return false;
1371223d2a0SAndre Przywara 	}
1381223d2a0SAndre Przywara 
1391223d2a0SAndre Przywara 	if (ENABLE_FEAT_TWED == FEAT_STATE_ALWAYS) {
1401223d2a0SAndre Przywara 		return true;
1411223d2a0SAndre Przywara 	}
1421223d2a0SAndre Przywara 
1431223d2a0SAndre Przywara 	return read_feat_twed_id_field() != 0U;
1446cac724dSjohpow01 }
1456cac724dSjohpow01 
146ce485955SAndre Przywara static unsigned int read_feat_fgt_id_field(void)
147110ee433SJimmy Brisson {
148fd1dd4cbSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_FGT);
149ce485955SAndre Przywara }
150ce485955SAndre Przywara 
151ce485955SAndre Przywara static inline bool is_feat_fgt_supported(void)
152ce485955SAndre Przywara {
153ce485955SAndre Przywara 	if (ENABLE_FEAT_FGT == FEAT_STATE_DISABLED) {
154ce485955SAndre Przywara 		return false;
155ce485955SAndre Przywara 	}
156ce485955SAndre Przywara 
157ce485955SAndre Przywara 	if (ENABLE_FEAT_FGT == FEAT_STATE_ALWAYS) {
158ce485955SAndre Przywara 		return true;
159ce485955SAndre Przywara 	}
160ce485955SAndre Przywara 
161ce485955SAndre Przywara 	return read_feat_fgt_id_field() != 0U;
162110ee433SJimmy Brisson }
163110ee433SJimmy Brisson 
164b8f03d29SAndre Przywara static unsigned int read_feat_ecv_id_field(void)
16529d0ee54SJimmy Brisson {
166b8f03d29SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_ECV);
167b8f03d29SAndre Przywara }
168b8f03d29SAndre Przywara 
169b8f03d29SAndre Przywara static inline bool is_feat_ecv_supported(void)
170b8f03d29SAndre Przywara {
171b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_DISABLED) {
172b8f03d29SAndre Przywara 		return false;
173b8f03d29SAndre Przywara 	}
174b8f03d29SAndre Przywara 
175b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_ALWAYS) {
176b8f03d29SAndre Przywara 		return true;
177b8f03d29SAndre Przywara 	}
178b8f03d29SAndre Przywara 
179b8f03d29SAndre Przywara 	return read_feat_ecv_id_field() != 0U;
180b8f03d29SAndre Przywara }
181b8f03d29SAndre Przywara 
182b8f03d29SAndre Przywara static inline bool is_feat_ecv_v2_supported(void)
183b8f03d29SAndre Przywara {
184b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_DISABLED) {
185b8f03d29SAndre Przywara 		return false;
186b8f03d29SAndre Przywara 	}
187b8f03d29SAndre Przywara 
188b8f03d29SAndre Przywara 	if (ENABLE_FEAT_ECV == FEAT_STATE_ALWAYS) {
189b8f03d29SAndre Przywara 		return true;
190b8f03d29SAndre Przywara 	}
191b8f03d29SAndre Przywara 
192b8f03d29SAndre Przywara 	return read_feat_ecv_id_field() >= ID_AA64MMFR0_EL1_ECV_SELF_SYNCH;
19329d0ee54SJimmy Brisson }
19429d0ee54SJimmy Brisson 
195ac17e52cSAndre Przywara static unsigned int read_feat_rng_id_field(void)
1967c802c71STomas Pilar {
197ac17e52cSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64isar0_el1(), ID_AA64ISAR0_RNDR);
198ac17e52cSAndre Przywara }
199ac17e52cSAndre Przywara 
200ac17e52cSAndre Przywara static inline bool is_feat_rng_supported(void)
201ac17e52cSAndre Przywara {
202ac17e52cSAndre Przywara 	if (ENABLE_FEAT_RNG == FEAT_STATE_DISABLED) {
203ac17e52cSAndre Przywara 		return false;
204ac17e52cSAndre Przywara 	}
205ac17e52cSAndre Przywara 
206ac17e52cSAndre Przywara 	if (ENABLE_FEAT_RNG == FEAT_STATE_ALWAYS) {
207ac17e52cSAndre Przywara 		return true;
208ac17e52cSAndre Przywara 	}
209ac17e52cSAndre Przywara 
210ac17e52cSAndre Przywara 	return read_feat_rng_id_field() != 0U;
2117c802c71STomas Pilar }
2127c802c71STomas Pilar 
213d3331603SMark Brown static unsigned int read_feat_tcrx_id_field(void)
214d3331603SMark Brown {
215d3331603SMark Brown 	return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_TCRX);
216d3331603SMark Brown }
217d3331603SMark Brown 
218d3331603SMark Brown static inline bool is_feat_tcr2_supported(void)
219d3331603SMark Brown {
220d3331603SMark Brown 	if (ENABLE_FEAT_TCR2 == FEAT_STATE_DISABLED) {
221d3331603SMark Brown 		return false;
222d3331603SMark Brown 	}
223d3331603SMark Brown 
224d3331603SMark Brown 	if (ENABLE_FEAT_TCR2 == FEAT_STATE_ALWAYS) {
225d3331603SMark Brown 		return true;
226d3331603SMark Brown 	}
227d3331603SMark Brown 
228d3331603SMark Brown 	return read_feat_tcrx_id_field() != 0U;
229d3331603SMark Brown }
230d3331603SMark Brown 
231062b6c6bSMark Brown static unsigned int read_feat_s2poe_id_field(void)
232062b6c6bSMark Brown {
233062b6c6bSMark Brown 	return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S2POE);
234062b6c6bSMark Brown }
235062b6c6bSMark Brown 
236062b6c6bSMark Brown static inline bool is_feat_s2poe_supported(void)
237062b6c6bSMark Brown {
238062b6c6bSMark Brown 	if (ENABLE_FEAT_S2POE == FEAT_STATE_DISABLED) {
239062b6c6bSMark Brown 		return false;
240062b6c6bSMark Brown 	}
241062b6c6bSMark Brown 
242062b6c6bSMark Brown 	if (ENABLE_FEAT_S2POE == FEAT_STATE_ALWAYS) {
243062b6c6bSMark Brown 		return true;
244062b6c6bSMark Brown 	}
245062b6c6bSMark Brown 
246062b6c6bSMark Brown 	return read_feat_s2poe_id_field() != 0U;
247062b6c6bSMark Brown }
248062b6c6bSMark Brown 
249062b6c6bSMark Brown static unsigned int read_feat_s1poe_id_field(void)
250062b6c6bSMark Brown {
251062b6c6bSMark Brown 	return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S1POE);
252062b6c6bSMark Brown }
253062b6c6bSMark Brown 
254062b6c6bSMark Brown static inline bool is_feat_s1poe_supported(void)
255062b6c6bSMark Brown {
256062b6c6bSMark Brown 	if (ENABLE_FEAT_S1POE == FEAT_STATE_DISABLED) {
257062b6c6bSMark Brown 		return false;
258062b6c6bSMark Brown 	}
259062b6c6bSMark Brown 
260062b6c6bSMark Brown 	if (ENABLE_FEAT_S1POE == FEAT_STATE_ALWAYS) {
261062b6c6bSMark Brown 		return true;
262062b6c6bSMark Brown 	}
263062b6c6bSMark Brown 
264062b6c6bSMark Brown 	return read_feat_s1poe_id_field() != 0U;
265062b6c6bSMark Brown }
266062b6c6bSMark Brown 
267062b6c6bSMark Brown static inline bool is_feat_sxpoe_supported(void)
268062b6c6bSMark Brown {
269062b6c6bSMark Brown 	return is_feat_s1poe_supported() || is_feat_s2poe_supported();
270062b6c6bSMark Brown }
271062b6c6bSMark Brown 
272062b6c6bSMark Brown static unsigned int read_feat_s2pie_id_field(void)
273062b6c6bSMark Brown {
274062b6c6bSMark Brown 	return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S2PIE);
275062b6c6bSMark Brown }
276062b6c6bSMark Brown 
277062b6c6bSMark Brown static inline bool is_feat_s2pie_supported(void)
278062b6c6bSMark Brown {
279062b6c6bSMark Brown 	if (ENABLE_FEAT_S2PIE == FEAT_STATE_DISABLED) {
280062b6c6bSMark Brown 		return false;
281062b6c6bSMark Brown 	}
282062b6c6bSMark Brown 
283062b6c6bSMark Brown 	if (ENABLE_FEAT_S2PIE == FEAT_STATE_ALWAYS) {
284062b6c6bSMark Brown 		return true;
285062b6c6bSMark Brown 	}
286062b6c6bSMark Brown 
287062b6c6bSMark Brown 	return read_feat_s2pie_id_field() != 0U;
288062b6c6bSMark Brown }
289062b6c6bSMark Brown 
290062b6c6bSMark Brown static unsigned int read_feat_s1pie_id_field(void)
291062b6c6bSMark Brown {
292062b6c6bSMark Brown 	return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S1PIE);
293062b6c6bSMark Brown }
294062b6c6bSMark Brown 
295062b6c6bSMark Brown static inline bool is_feat_s1pie_supported(void)
296062b6c6bSMark Brown {
297062b6c6bSMark Brown 	if (ENABLE_FEAT_S1PIE == FEAT_STATE_DISABLED) {
298062b6c6bSMark Brown 		return false;
299062b6c6bSMark Brown 	}
300062b6c6bSMark Brown 
301062b6c6bSMark Brown 	if (ENABLE_FEAT_S1PIE == FEAT_STATE_ALWAYS) {
302062b6c6bSMark Brown 		return true;
303062b6c6bSMark Brown 	}
304062b6c6bSMark Brown 
305062b6c6bSMark Brown 	return read_feat_s1pie_id_field() != 0U;
306062b6c6bSMark Brown }
307062b6c6bSMark Brown 
308062b6c6bSMark Brown static inline bool is_feat_sxpie_supported(void)
309062b6c6bSMark Brown {
310062b6c6bSMark Brown 	return is_feat_s1pie_supported() || is_feat_s2pie_supported();
311062b6c6bSMark Brown }
312062b6c6bSMark Brown 
313688ab57bSMark Brown static unsigned int read_feat_gcs_id_field(void)
314688ab57bSMark Brown {
315688ab57bSMark Brown 	return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_GCS);
316688ab57bSMark Brown }
317688ab57bSMark Brown 
318688ab57bSMark Brown static inline bool is_feat_gcs_supported(void)
319688ab57bSMark Brown {
320688ab57bSMark Brown 	if (ENABLE_FEAT_GCS == FEAT_STATE_DISABLED) {
321688ab57bSMark Brown 		return false;
322688ab57bSMark Brown 	}
323688ab57bSMark Brown 
324688ab57bSMark Brown 	if (ENABLE_FEAT_GCS == FEAT_STATE_ALWAYS) {
325688ab57bSMark Brown 		return true;
326688ab57bSMark Brown 	}
327688ab57bSMark Brown 
328688ab57bSMark Brown 	return read_feat_gcs_id_field() != 0U;
329688ab57bSMark Brown }
330688ab57bSMark Brown 
331f0deb4c8SAndre Przywara /*******************************************************************************
332f0deb4c8SAndre Przywara  * Functions to identify the presence of the Activity Monitors Extension
333f0deb4c8SAndre Przywara  ******************************************************************************/
334f0deb4c8SAndre Przywara static unsigned int read_feat_amu_id_field(void)
335f0deb4c8SAndre Przywara {
336fd1dd4cbSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_AMU);
337f0deb4c8SAndre Przywara }
338f0deb4c8SAndre Przywara 
339f0deb4c8SAndre Przywara static inline bool is_feat_amu_supported(void)
340f0deb4c8SAndre Przywara {
341d23acc9eSAndre Przywara 	if (ENABLE_FEAT_AMU == FEAT_STATE_DISABLED) {
342f0deb4c8SAndre Przywara 		return false;
343f0deb4c8SAndre Przywara 	}
344f0deb4c8SAndre Przywara 
345d23acc9eSAndre Przywara 	if (ENABLE_FEAT_AMU == FEAT_STATE_ALWAYS) {
346f0deb4c8SAndre Przywara 		return true;
347f0deb4c8SAndre Przywara 	}
348f0deb4c8SAndre Przywara 
349f0deb4c8SAndre Przywara 	return read_feat_amu_id_field() >= ID_AA64PFR0_AMU_V1;
350f0deb4c8SAndre Przywara }
351f0deb4c8SAndre Przywara 
352b57e16a4SAndre Przywara static inline bool is_feat_amuv1p1_supported(void)
353873d4241Sjohpow01 {
354b57e16a4SAndre Przywara 	if (ENABLE_FEAT_AMUv1p1 == FEAT_STATE_DISABLED) {
355b57e16a4SAndre Przywara 		return false;
356b57e16a4SAndre Przywara 	}
357b57e16a4SAndre Przywara 
358b57e16a4SAndre Przywara 	if (ENABLE_FEAT_AMUv1p1 == FEAT_STATE_ALWAYS) {
359b57e16a4SAndre Przywara 		return true;
360b57e16a4SAndre Przywara 	}
361b57e16a4SAndre Przywara 
362f0deb4c8SAndre Przywara 	return read_feat_amu_id_field() >= ID_AA64PFR0_AMU_V1P1;
363873d4241Sjohpow01 }
364873d4241Sjohpow01 
365dbcc44a1SAlexei Fedorov /*
366dbcc44a1SAlexei Fedorov  * Return MPAM version:
367dbcc44a1SAlexei Fedorov  *
368dbcc44a1SAlexei Fedorov  * 0x00: None Armv8.0 or later
369dbcc44a1SAlexei Fedorov  * 0x01: v0.1 Armv8.4 or later
370dbcc44a1SAlexei Fedorov  * 0x10: v1.0 Armv8.2 or later
371dbcc44a1SAlexei Fedorov  * 0x11: v1.1 Armv8.4 or later
372dbcc44a1SAlexei Fedorov  *
373dbcc44a1SAlexei Fedorov  */
3749448f2b8SAndre Przywara static inline unsigned int read_feat_mpam_version(void)
375dbcc44a1SAlexei Fedorov {
376dbcc44a1SAlexei Fedorov 	return (unsigned int)((((read_id_aa64pfr0_el1() >>
377dbcc44a1SAlexei Fedorov 		ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
378dbcc44a1SAlexei Fedorov 				((read_id_aa64pfr1_el1() >>
379dbcc44a1SAlexei Fedorov 		ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK));
380dbcc44a1SAlexei Fedorov }
381dbcc44a1SAlexei Fedorov 
3829448f2b8SAndre Przywara static inline bool is_feat_mpam_supported(void)
3839448f2b8SAndre Przywara {
3849448f2b8SAndre Przywara 	if (ENABLE_MPAM_FOR_LOWER_ELS == FEAT_STATE_DISABLED) {
3859448f2b8SAndre Przywara 		return false;
3869448f2b8SAndre Przywara 	}
3879448f2b8SAndre Przywara 
3889448f2b8SAndre Przywara 	if (ENABLE_MPAM_FOR_LOWER_ELS == FEAT_STATE_ALWAYS) {
3899448f2b8SAndre Przywara 		return true;
3909448f2b8SAndre Przywara 	}
3919448f2b8SAndre Przywara 
3929448f2b8SAndre Przywara 	return read_feat_mpam_version() != 0U;
3939448f2b8SAndre Przywara }
3949448f2b8SAndre Przywara 
395d242128cSAndre Przywara static inline unsigned int read_feat_hcx_id_field(void)
396cb4ec47bSjohpow01 {
397fd1dd4cbSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_HCX);
398d242128cSAndre Przywara }
399d242128cSAndre Przywara 
400d242128cSAndre Przywara static inline bool is_feat_hcx_supported(void)
401d242128cSAndre Przywara {
402d242128cSAndre Przywara 	if (ENABLE_FEAT_HCX == FEAT_STATE_DISABLED) {
403d242128cSAndre Przywara 		return false;
404d242128cSAndre Przywara 	}
405d242128cSAndre Przywara 
406d242128cSAndre Przywara 	if (ENABLE_FEAT_HCX == FEAT_STATE_ALWAYS) {
407d242128cSAndre Przywara 		return true;
408d242128cSAndre Przywara 	}
409d242128cSAndre Przywara 
410d242128cSAndre Przywara 	return read_feat_hcx_id_field() != 0U;
411cb4ec47bSjohpow01 }
412cb4ec47bSjohpow01 
413ff86e0b4SJuan Pablo Conde static inline bool is_feat_rng_trap_present(void)
414ff86e0b4SJuan Pablo Conde {
415ff86e0b4SJuan Pablo Conde 	return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
416ff86e0b4SJuan Pablo Conde 			ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
417ff86e0b4SJuan Pablo Conde 			== ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
418ff86e0b4SJuan Pablo Conde }
419ff86e0b4SJuan Pablo Conde 
42081c272b3SZelalem Aweke static inline unsigned int get_armv9_2_feat_rme_support(void)
42181c272b3SZelalem Aweke {
42281c272b3SZelalem Aweke 	/*
42381c272b3SZelalem Aweke 	 * Return the RME version, zero if not supported.  This function can be
42481c272b3SZelalem Aweke 	 * used as both an integer value for the RME version or compared to zero
42581c272b3SZelalem Aweke 	 * to detect RME presence.
42681c272b3SZelalem Aweke 	 */
42781c272b3SZelalem Aweke 	return (unsigned int)(read_id_aa64pfr0_el1() >>
42881c272b3SZelalem Aweke 		ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
42981c272b3SZelalem Aweke }
43081c272b3SZelalem Aweke 
4316a0da736SJayanth Dodderi Chidanand /*********************************************************************************
4326a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SB (Speculation Barrier Instruction)
4336a0da736SJayanth Dodderi Chidanand  ********************************************************************************/
43424077098SAndre Przywara static inline unsigned int read_feat_sb_id_field(void)
4356a0da736SJayanth Dodderi Chidanand {
43624077098SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_SB);
4376a0da736SJayanth Dodderi Chidanand }
4386a0da736SJayanth Dodderi Chidanand 
4396a0da736SJayanth Dodderi Chidanand /*********************************************************************************
4406a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_CSV2_2 (Cache Speculation Variant 2)
4416a0da736SJayanth Dodderi Chidanand  ********************************************************************************/
4427db710f0SAndre Przywara static inline unsigned int read_feat_csv2_id_field(void)
4436a0da736SJayanth Dodderi Chidanand {
4447db710f0SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_CSV2);
4457db710f0SAndre Przywara }
4467db710f0SAndre Przywara 
4477db710f0SAndre Przywara static inline bool is_feat_csv2_2_supported(void)
4487db710f0SAndre Przywara {
4497db710f0SAndre Przywara 	if (ENABLE_FEAT_CSV2_2 == FEAT_STATE_DISABLED) {
4507db710f0SAndre Przywara 		return false;
4517db710f0SAndre Przywara 	}
4527db710f0SAndre Przywara 
4537db710f0SAndre Przywara 	if (ENABLE_FEAT_CSV2_2 == FEAT_STATE_ALWAYS) {
4547db710f0SAndre Przywara 		return true;
4557db710f0SAndre Przywara 	}
4567db710f0SAndre Przywara 
4577db710f0SAndre Przywara 	return read_feat_csv2_id_field() >= ID_AA64PFR0_CSV2_2_SUPPORTED;
4586a0da736SJayanth Dodderi Chidanand }
4596a0da736SJayanth Dodderi Chidanand 
4606a0da736SJayanth Dodderi Chidanand /**********************************************************************************
4616a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SPE (Statistical Profiling Extension)
4626a0da736SJayanth Dodderi Chidanand  *********************************************************************************/
4636437a09aSAndre Przywara static inline unsigned int read_feat_spe_id_field(void)
4646a0da736SJayanth Dodderi Chidanand {
4656437a09aSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_PMS);
4666437a09aSAndre Przywara }
4676437a09aSAndre Przywara 
4686437a09aSAndre Przywara static inline bool is_feat_spe_supported(void)
4696437a09aSAndre Przywara {
4706437a09aSAndre Przywara 	if (ENABLE_SPE_FOR_NS == FEAT_STATE_DISABLED) {
4716437a09aSAndre Przywara 		return false;
4726437a09aSAndre Przywara 	}
4736437a09aSAndre Przywara 
4746437a09aSAndre Przywara 	if (ENABLE_SPE_FOR_NS == FEAT_STATE_ALWAYS) {
4756437a09aSAndre Przywara 		return true;
4766437a09aSAndre Przywara 	}
4776437a09aSAndre Przywara 
4786437a09aSAndre Przywara 	return read_feat_spe_id_field() != 0U;
4796a0da736SJayanth Dodderi Chidanand }
4806a0da736SJayanth Dodderi Chidanand 
4816a0da736SJayanth Dodderi Chidanand /*******************************************************************************
4826a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SVE (Scalable Vector Extension)
4836a0da736SJayanth Dodderi Chidanand  ******************************************************************************/
4842b0bc4e0SJayanth Dodderi Chidanand static inline unsigned int read_feat_sve_id_field(void)
4856a0da736SJayanth Dodderi Chidanand {
4862b0bc4e0SJayanth Dodderi Chidanand 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_SVE);
4872b0bc4e0SJayanth Dodderi Chidanand }
4882b0bc4e0SJayanth Dodderi Chidanand 
4892b0bc4e0SJayanth Dodderi Chidanand static inline bool is_feat_sve_supported(void)
4902b0bc4e0SJayanth Dodderi Chidanand {
4912b0bc4e0SJayanth Dodderi Chidanand 	if (ENABLE_SVE_FOR_NS == FEAT_STATE_DISABLED) {
4922b0bc4e0SJayanth Dodderi Chidanand 		return false;
4932b0bc4e0SJayanth Dodderi Chidanand 	}
4942b0bc4e0SJayanth Dodderi Chidanand 
4952b0bc4e0SJayanth Dodderi Chidanand 	if (ENABLE_SVE_FOR_NS == FEAT_STATE_ALWAYS) {
4962b0bc4e0SJayanth Dodderi Chidanand 		return true;
4972b0bc4e0SJayanth Dodderi Chidanand 	}
4982b0bc4e0SJayanth Dodderi Chidanand 
4992b0bc4e0SJayanth Dodderi Chidanand 	return read_feat_sve_id_field() >= ID_AA64PFR0_SVE_SUPPORTED;
5006a0da736SJayanth Dodderi Chidanand }
5016a0da736SJayanth Dodderi Chidanand 
5026503ff29SAndre Przywara static unsigned int read_feat_ras_id_field(void)
5036a0da736SJayanth Dodderi Chidanand {
5046503ff29SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_RAS);
5056503ff29SAndre Przywara }
5066503ff29SAndre Przywara 
5076503ff29SAndre Przywara static inline bool is_feat_ras_supported(void)
5086503ff29SAndre Przywara {
5096503ff29SAndre Przywara 	if (ENABLE_FEAT_RAS == FEAT_STATE_DISABLED) {
5106503ff29SAndre Przywara 		return false;
5116503ff29SAndre Przywara 	}
5126503ff29SAndre Przywara 
5136503ff29SAndre Przywara 	if (ENABLE_FEAT_RAS == FEAT_STATE_ALWAYS) {
5146503ff29SAndre Przywara 		return true;
5156503ff29SAndre Przywara 	}
5166503ff29SAndre Przywara 
5176503ff29SAndre Przywara 	return read_feat_ras_id_field() != 0U;
5186a0da736SJayanth Dodderi Chidanand }
5196a0da736SJayanth Dodderi Chidanand 
52088727fc3SAndre Przywara static unsigned int read_feat_dit_id_field(void)
5216a0da736SJayanth Dodderi Chidanand {
52288727fc3SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_DIT);
52388727fc3SAndre Przywara }
52488727fc3SAndre Przywara 
52588727fc3SAndre Przywara static inline bool is_feat_dit_supported(void)
52688727fc3SAndre Przywara {
52788727fc3SAndre Przywara 	if (ENABLE_FEAT_DIT == FEAT_STATE_DISABLED) {
52888727fc3SAndre Przywara 		return false;
52988727fc3SAndre Przywara 	}
53088727fc3SAndre Przywara 
53188727fc3SAndre Przywara 	if (ENABLE_FEAT_DIT == FEAT_STATE_ALWAYS) {
53288727fc3SAndre Przywara 		return true;
53388727fc3SAndre Przywara 	}
53488727fc3SAndre Przywara 
53588727fc3SAndre Przywara 	return read_feat_dit_id_field() != 0U;
5366a0da736SJayanth Dodderi Chidanand }
5376a0da736SJayanth Dodderi Chidanand 
538603a0c6fSAndre Przywara static inline unsigned int read_feat_tracever_id_field(void)
539603a0c6fSAndre Przywara {
540603a0c6fSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEVER);
541603a0c6fSAndre Przywara }
542603a0c6fSAndre Przywara 
543603a0c6fSAndre Przywara static inline bool is_feat_sys_reg_trace_supported(void)
544603a0c6fSAndre Przywara {
545603a0c6fSAndre Przywara 	if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_DISABLED) {
546603a0c6fSAndre Przywara 		return false;
547603a0c6fSAndre Przywara 	}
548603a0c6fSAndre Przywara 
549603a0c6fSAndre Przywara 	if (ENABLE_SYS_REG_TRACE_FOR_NS == FEAT_STATE_ALWAYS) {
550603a0c6fSAndre Przywara 		return true;
551603a0c6fSAndre Przywara 	}
552603a0c6fSAndre Przywara 
553603a0c6fSAndre Przywara 	return read_feat_tracever_id_field() != 0U;
554603a0c6fSAndre Przywara }
555603a0c6fSAndre Przywara 
5566a0da736SJayanth Dodderi Chidanand /*************************************************************************
5576a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_TRF (TraceLift)
5586a0da736SJayanth Dodderi Chidanand  ************************************************************************/
559fc8d2d39SAndre Przywara static inline unsigned int read_feat_trf_id_field(void)
5606a0da736SJayanth Dodderi Chidanand {
561fc8d2d39SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEFILT);
562fc8d2d39SAndre Przywara }
563fc8d2d39SAndre Przywara 
564fc8d2d39SAndre Przywara static inline bool is_feat_trf_supported(void)
565fc8d2d39SAndre Przywara {
566fc8d2d39SAndre Przywara 	if (ENABLE_TRF_FOR_NS == FEAT_STATE_DISABLED) {
567fc8d2d39SAndre Przywara 		return false;
568fc8d2d39SAndre Przywara 	}
569fc8d2d39SAndre Przywara 
570fc8d2d39SAndre Przywara 	if (ENABLE_TRF_FOR_NS == FEAT_STATE_ALWAYS) {
571fc8d2d39SAndre Przywara 		return true;
572fc8d2d39SAndre Przywara 	}
573fc8d2d39SAndre Przywara 
574fc8d2d39SAndre Przywara 	return read_feat_trf_id_field() != 0U;
5756a0da736SJayanth Dodderi Chidanand }
5766a0da736SJayanth Dodderi Chidanand 
5776a0da736SJayanth Dodderi Chidanand /********************************************************************************
5786a0da736SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_NV2 (Enhanced Nested Virtualization
5796a0da736SJayanth Dodderi Chidanand  * Support)
5806a0da736SJayanth Dodderi Chidanand  *******************************************************************************/
581d5384b69SAndre Przywara static inline unsigned int read_feat_nv_id_field(void)
5826a0da736SJayanth Dodderi Chidanand {
583d5384b69SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64mmfr2_el1(), ID_AA64MMFR2_EL1_NV);
584d5384b69SAndre Przywara }
585d5384b69SAndre Przywara 
586d5384b69SAndre Przywara static inline bool is_feat_nv2_supported(void)
587d5384b69SAndre Przywara {
588d5384b69SAndre Przywara 	if (CTX_INCLUDE_NEVE_REGS == FEAT_STATE_DISABLED) {
589d5384b69SAndre Przywara 		return false;
590d5384b69SAndre Przywara 	}
591d5384b69SAndre Przywara 
592d5384b69SAndre Przywara 	if (CTX_INCLUDE_NEVE_REGS == FEAT_STATE_ALWAYS) {
593d5384b69SAndre Przywara 		return true;
594d5384b69SAndre Przywara 	}
595d5384b69SAndre Przywara 
596d5384b69SAndre Przywara 	return read_feat_nv_id_field() >= ID_AA64MMFR2_EL1_NV2_SUPPORTED;
5976a0da736SJayanth Dodderi Chidanand }
5986a0da736SJayanth Dodderi Chidanand 
5991298f2f1SJayanth Dodderi Chidanand /*******************************************************************************
6001298f2f1SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_BRBE (Branch Record Buffer
6011298f2f1SJayanth Dodderi Chidanand  * Extension)
6021298f2f1SJayanth Dodderi Chidanand  ******************************************************************************/
603ff491036SAndre Przywara static inline unsigned int read_feat_brbe_id_field(void)
6041298f2f1SJayanth Dodderi Chidanand {
605ff491036SAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_BRBE);
606ff491036SAndre Przywara }
607ff491036SAndre Przywara 
608ff491036SAndre Przywara static inline bool is_feat_brbe_supported(void)
609ff491036SAndre Przywara {
610ff491036SAndre Przywara 	if (ENABLE_BRBE_FOR_NS == FEAT_STATE_DISABLED) {
611ff491036SAndre Przywara 		return false;
612ff491036SAndre Przywara 	}
613ff491036SAndre Przywara 
614ff491036SAndre Przywara 	if (ENABLE_BRBE_FOR_NS == FEAT_STATE_ALWAYS) {
615ff491036SAndre Przywara 		return true;
616ff491036SAndre Przywara 	}
617ff491036SAndre Przywara 
618ff491036SAndre Przywara 	return read_feat_brbe_id_field() != 0U;
6191298f2f1SJayanth Dodderi Chidanand }
6201298f2f1SJayanth Dodderi Chidanand 
62147c681b7SJayanth Dodderi Chidanand /*******************************************************************************
62247c681b7SJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_TRBE (Trace Buffer Extension)
62347c681b7SJayanth Dodderi Chidanand  ******************************************************************************/
624f5360cfaSAndre Przywara static inline unsigned int read_feat_trbe_id_field(void)
62547c681b7SJayanth Dodderi Chidanand {
626f5360cfaSAndre Przywara 	return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEBUFFER);
62747c681b7SJayanth Dodderi Chidanand }
6281298f2f1SJayanth Dodderi Chidanand 
629f5360cfaSAndre Przywara static inline bool is_feat_trbe_supported(void)
630f5360cfaSAndre Przywara {
631f5360cfaSAndre Przywara 	if (ENABLE_TRBE_FOR_NS == FEAT_STATE_DISABLED) {
632f5360cfaSAndre Przywara 		return false;
633f5360cfaSAndre Przywara 	}
634f5360cfaSAndre Przywara 
635f5360cfaSAndre Przywara 	if (ENABLE_TRBE_FOR_NS == FEAT_STATE_ALWAYS) {
636f5360cfaSAndre Przywara 		return true;
637f5360cfaSAndre Przywara 	}
638f5360cfaSAndre Przywara 
639f5360cfaSAndre Przywara 	return read_feat_trbe_id_field() != 0U;
640f5360cfaSAndre Przywara 
641f5360cfaSAndre Przywara }
64245007acdSJayanth Dodderi Chidanand /*******************************************************************************
64345007acdSJayanth Dodderi Chidanand  * Function to identify the presence of FEAT_SMEx (Scalar Matrix Extension)
64445007acdSJayanth Dodderi Chidanand  ******************************************************************************/
64545007acdSJayanth Dodderi Chidanand static inline unsigned int read_feat_sme_fa64_id_field(void)
64645007acdSJayanth Dodderi Chidanand {
64745007acdSJayanth Dodderi Chidanand 	return ISOLATE_FIELD(read_id_aa64smfr0_el1(), ID_AA64SMFR0_EL1_SME_FA64);
64845007acdSJayanth Dodderi Chidanand }
64945007acdSJayanth Dodderi Chidanand 
65045007acdSJayanth Dodderi Chidanand static inline unsigned int read_feat_sme_id_field(void)
65145007acdSJayanth Dodderi Chidanand {
65245007acdSJayanth Dodderi Chidanand 	return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_SME);
65345007acdSJayanth Dodderi Chidanand }
65445007acdSJayanth Dodderi Chidanand 
65545007acdSJayanth Dodderi Chidanand static inline bool is_feat_sme_supported(void)
65645007acdSJayanth Dodderi Chidanand {
65745007acdSJayanth Dodderi Chidanand 	if (ENABLE_SME_FOR_NS == FEAT_STATE_DISABLED) {
65845007acdSJayanth Dodderi Chidanand 		return false;
65945007acdSJayanth Dodderi Chidanand 	}
66045007acdSJayanth Dodderi Chidanand 
66145007acdSJayanth Dodderi Chidanand 	if (ENABLE_SME_FOR_NS == FEAT_STATE_ALWAYS) {
66245007acdSJayanth Dodderi Chidanand 		return true;
66345007acdSJayanth Dodderi Chidanand 	}
66445007acdSJayanth Dodderi Chidanand 
66545007acdSJayanth Dodderi Chidanand 	return read_feat_sme_id_field() >= ID_AA64PFR1_EL1_SME_SUPPORTED;
66645007acdSJayanth Dodderi Chidanand }
66745007acdSJayanth Dodderi Chidanand 
66803d3c0d7SJayanth Dodderi Chidanand static inline bool is_feat_sme2_supported(void)
66903d3c0d7SJayanth Dodderi Chidanand {
67003d3c0d7SJayanth Dodderi Chidanand 	if (ENABLE_SME2_FOR_NS == FEAT_STATE_DISABLED) {
67103d3c0d7SJayanth Dodderi Chidanand 		return false;
67203d3c0d7SJayanth Dodderi Chidanand 	}
67303d3c0d7SJayanth Dodderi Chidanand 
67403d3c0d7SJayanth Dodderi Chidanand 	if (ENABLE_SME2_FOR_NS == FEAT_STATE_ALWAYS) {
67503d3c0d7SJayanth Dodderi Chidanand 		return true;
67603d3c0d7SJayanth Dodderi Chidanand 	}
67703d3c0d7SJayanth Dodderi Chidanand 
67803d3c0d7SJayanth Dodderi Chidanand 	return read_feat_sme_id_field() >= ID_AA64PFR1_EL1_SME2_SUPPORTED;
67903d3c0d7SJayanth Dodderi Chidanand }
68003d3c0d7SJayanth Dodderi Chidanand 
681*bff074ddSJavier Almansa Sobrino /*******************************************************************************
682*bff074ddSJavier Almansa Sobrino  * Function to get hardware granularity support
683*bff074ddSJavier Almansa Sobrino  ******************************************************************************/
684*bff074ddSJavier Almansa Sobrino 
685*bff074ddSJavier Almansa Sobrino static inline unsigned int read_id_aa64mmfr0_el0_tgran4_field(void)
686*bff074ddSJavier Almansa Sobrino {
687*bff074ddSJavier Almansa Sobrino 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_TGRAN4);
688*bff074ddSJavier Almansa Sobrino }
689*bff074ddSJavier Almansa Sobrino 
690*bff074ddSJavier Almansa Sobrino static inline unsigned int read_id_aa64mmfr0_el0_tgran16_field(void)
691*bff074ddSJavier Almansa Sobrino {
692*bff074ddSJavier Almansa Sobrino 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
693*bff074ddSJavier Almansa Sobrino 			     ID_AA64MMFR0_EL1_TGRAN16);
694*bff074ddSJavier Almansa Sobrino }
695*bff074ddSJavier Almansa Sobrino 
696*bff074ddSJavier Almansa Sobrino static inline unsigned int read_id_aa64mmfr0_el0_tgran64_field(void)
697*bff074ddSJavier Almansa Sobrino {
698*bff074ddSJavier Almansa Sobrino 	return ISOLATE_FIELD(read_id_aa64mmfr0_el1(),
699*bff074ddSJavier Almansa Sobrino 			     ID_AA64MMFR0_EL1_TGRAN64);
700*bff074ddSJavier Almansa Sobrino }
701*bff074ddSJavier Almansa Sobrino 
7022559b2c8SAntonio Nino Diaz #endif /* ARCH_FEATURES_H */
703