blob: cee8dd2e49dffe4cc4e2ef826ca62fefacd54cf5 [file] [log] [blame]
Antonio Nino Diaz69068db2019-01-11 13:01:45 +00001/*
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -06002 * Copyright (c) 2020-2024, Arm Limited. All rights reserved.
Antonio Nino Diaz69068db2019-01-11 13:01:45 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef ARCH_FEATURES_H
8#define ARCH_FEATURES_H
9
10#include <stdbool.h>
Javier Almansa Sobrino2a32ff72023-05-25 17:51:48 +010011#include <stdint.h>
12
13#include <arch_features.h>
Antonio Nino Diaz69068db2019-01-11 13:01:45 +000014#include <arch_helpers.h>
Javier Almansa Sobrino2a32ff72023-05-25 17:51:48 +010015#include <utils_def.h>
Antonio Nino Diaz69068db2019-01-11 13:01:45 +000016
Antonio Nino Diazffdfd162019-02-11 15:34:32 +000017static inline bool is_armv7_gentimer_present(void)
18{
19 /* The Generic Timer is always present in an ARMv8-A implementation */
20 return true;
21}
22
Daniel Boulby39e4df22021-02-02 19:27:41 +000023static inline bool is_armv8_1_pan_present(void)
24{
Juan Pablo Condec94fb402023-07-21 17:19:42 -050025 u_register_t id_aa64mmfr1_pan =
26 EXTRACT(ID_AA64MMFR1_EL1_PAN, read_id_aa64mmfr1_el1());
27 return (id_aa64mmfr1_pan >= ID_AA64MMFR1_EL1_PAN_SUPPORTED) &&
28 (id_aa64mmfr1_pan <= ID_AA64MMFR1_EL1_PAN3_SUPPORTED);
29}
30
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +020031static inline bool is_armv8_1_vhe_present(void)
32{
33 return ((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_VHE_SHIFT) &
34 ID_AA64MMFR1_EL1_VHE_MASK) == 1U;
35}
36
Juan Pablo Condec94fb402023-07-21 17:19:42 -050037static inline bool is_armv8_2_pan2_present(void)
38{
39 u_register_t id_aa64mmfr1_pan =
40 EXTRACT(ID_AA64MMFR1_EL1_PAN, read_id_aa64mmfr1_el1());
41 return (id_aa64mmfr1_pan >= ID_AA64MMFR1_EL1_PAN2_SUPPORTED) &&
42 (id_aa64mmfr1_pan <= ID_AA64MMFR1_EL1_PAN3_SUPPORTED);
Daniel Boulby39e4df22021-02-02 19:27:41 +000043}
44
Ambroise Vincentfae77722019-03-07 10:17:15 +000045static inline bool is_armv8_2_sve_present(void)
46{
47 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT) &
48 ID_AA64PFR0_SVE_MASK) == 1U;
49}
50
Olivier Deprez2661ba52024-02-19 18:50:53 +010051static inline bool is_feat_advsimd_present(void)
52{
53 u_register_t id_aa64pfr0_advsimd =
54 EXTRACT(ID_AA64PFR0_ADVSIMD, read_id_aa64pfr0_el1());
55 return (id_aa64pfr0_advsimd == 0 || id_aa64pfr0_advsimd == 1);
56}
57
58static inline bool is_feat_fp_present(void)
59{
60 u_register_t id_aa64pfr0_fp =
61 EXTRACT(ID_AA64PFR0_FP, read_id_aa64pfr0_el1());
62 return (id_aa64pfr0_fp == 0 || id_aa64pfr0_fp == 1);
63}
64
Antonio Nino Diaz69068db2019-01-11 13:01:45 +000065static inline bool is_armv8_2_ttcnp_present(void)
66{
67 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_CNP_SHIFT) &
68 ID_AA64MMFR2_EL1_CNP_MASK) != 0U;
69}
70
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040071static inline bool is_feat_pacqarma3_present(void)
72{
73 uint64_t mask_id_aa64isar2 =
74 (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
75 (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
76
77 /* If any of the fields is not zero, QARMA3 algorithm is present */
78 return (read_id_aa64isar2_el1() & mask_id_aa64isar2) != 0U;
79}
80
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000081static inline bool is_armv8_3_pauth_present(void)
82{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040083 uint64_t mask_id_aa64isar1 =
84 (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
85 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
86 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
87 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000088
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040089 /*
90 * If any of the fields is not zero or QARMA3 is present,
91 * PAuth is present.
92 */
93 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
94 is_feat_pacqarma3_present());
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000095}
96
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040097static inline bool is_armv8_3_pauth_apa_api_apa3_present(void)
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000098{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040099 uint64_t mask_id_aa64isar1 =
100 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
101 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +0000102
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400103 uint64_t mask_id_aa64isar2 =
104 (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
105
106 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
107 (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +0000108}
109
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400110static inline bool is_armv8_3_pauth_gpa_gpi_gpa3_present(void)
Joel Hutton8790f022019-03-15 14:47:02 +0000111{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400112 uint64_t mask_id_aa64isar1 =
113 (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
114 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT);
Joel Hutton8790f022019-03-15 14:47:02 +0000115
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400116 uint64_t mask_id_aa64isar2 =
117 (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT);
118
119 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
120 (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
Joel Hutton8790f022019-03-15 14:47:02 +0000121}
122
Daniel Boulby39e4df22021-02-02 19:27:41 +0000123static inline bool is_armv8_4_dit_present(void)
124{
125 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
126 ID_AA64PFR0_DIT_MASK) == 1U;
127}
128
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +0200129static inline bool is_armv8_4_nv2_present(void)
130{
131 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_NV_SHIFT) &
132 ID_AA64MMFR2_EL1_NV_MASK) == NV2_IMPLEMENTED;
133}
134
Antonio Nino Diazffdfd162019-02-11 15:34:32 +0000135static inline bool is_armv8_4_ttst_present(void)
136{
137 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
138 ID_AA64MMFR2_EL1_ST_MASK) == 1U;
139}
140
Alexei Fedorov9cd75022020-06-17 18:54:20 +0100141static inline bool is_armv8_5_bti_present(void)
142{
143 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
144 ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
145}
146
Sandrine Bailleux277fb762019-10-08 12:10:45 +0200147static inline unsigned int get_armv8_5_mte_support(void)
148{
149 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
150 ID_AA64PFR1_EL1_MTE_MASK);
151}
152
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500153static inline bool is_armv8_6_fgt_present(void)
154{
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500155 return (((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
156 ID_AA64MMFR0_EL1_FGT_MASK) != 0U);
157}
158
159static inline bool is_armv8_9_fgt2_present(void)
160{
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500161 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500162 ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT2_SUPPORTED;
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500163}
164
Jimmy Brisson945095a2020-04-16 10:54:59 -0500165static inline unsigned long int get_armv8_6_ecv_support(void)
166{
167 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_ECV_SHIFT) &
168 ID_AA64MMFR0_EL1_ECV_MASK);
169}
170
Federico Recanatid3749b02022-01-14 15:44:45 +0100171static inline unsigned long int get_pa_range(void)
172{
173 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_PARANGE_SHIFT) &
174 ID_AA64MMFR0_EL1_PARANGE_MASK);
175}
176
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100177static inline uint32_t arch_get_debug_version(void)
178{
179 return ((read_id_aa64dfr0_el1() & ID_AA64DFR0_DEBUG_BITS) >>
180 ID_AA64DFR0_DEBUG_SHIFT);
181}
182
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100183static inline bool get_armv8_4_trf_support(void)
184{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000185 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT) &
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100186 ID_AA64DFR0_TRACEFILT_MASK) ==
187 ID_AA64DFR0_TRACEFILT_SUPPORTED;
188}
189
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100190static inline bool get_armv8_0_sys_reg_trace_support(void)
191{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000192 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEVER_SHIFT) &
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100193 ID_AA64DFR0_TRACEVER_MASK) ==
194 ID_AA64DFR0_TRACEVER_SUPPORTED;
195}
196
Mark Dykes16b71692021-09-15 14:13:55 -0500197static inline unsigned int get_armv9_2_feat_rme_support(void)
198{
199 /*
200 * Return the RME version, zero if not supported. This function can be
201 * used as both an integer value for the RME version or compared to zero
202 * to detect RME presence.
203 */
204 return (unsigned int)(read_id_aa64pfr0_el1() >>
205 ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
206}
207
johpow01d0bbe6e2021-11-11 16:13:32 -0600208static inline bool get_feat_hcx_support(void)
209{
210 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_HCX_SHIFT) &
211 ID_AA64MMFR1_EL1_HCX_MASK) == ID_AA64MMFR1_EL1_HCX_SUPPORTED);
212}
213
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000214static inline bool get_feat_afp_present(void)
215{
216 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_AFP_SHIFT) &
217 ID_AA64MMFR1_EL1_AFP_MASK) == ID_AA64MMFR1_EL1_AFP_SUPPORTED);
218}
219
johpow018c3da8b2022-01-31 18:14:41 -0600220static inline bool get_feat_brbe_support(void)
221{
222 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_BRBE_SHIFT) &
Boyan Karatotevb24cc132024-10-28 10:35:35 +0000223 ID_AA64DFR0_BRBE_MASK) >=
johpow018c3da8b2022-01-31 18:14:41 -0600224 ID_AA64DFR0_BRBE_SUPPORTED;
225}
226
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000227static inline bool get_feat_wfxt_present(void)
228{
229 return (((read_id_aa64isar2_el1() >> ID_AA64ISAR2_WFXT_SHIFT) &
230 ID_AA64ISAR2_WFXT_MASK) == ID_AA64ISAR2_WFXT_SUPPORTED);
231}
232
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400233static inline bool is_feat_rng_trap_present(void)
234{
235 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
236 ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
237 == ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
238}
239
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -0600240static inline bool is_feat_mpam_supported(void)
241{
242 /*
243 * If the MPAM version retreived from the Processor Feature registers
244 * is a non-zero value, then MPAM is supported.
245 */
246
247 return (((((read_id_aa64pfr0_el1() >>
248 ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
249 ((read_id_aa64pfr1_el1() >>
250 ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK)) != 0U);
251}
252
Manish V Badarkhe41bce212022-11-17 12:34:40 +0000253static inline unsigned int spe_get_version(void)
254{
255 return (unsigned int)((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMS_SHIFT) &
256 ID_AA64DFR0_PMS_MASK);
257}
258
Charlie Barehame4f2eaa2024-08-12 17:59:54 +0100259static inline bool is_feat_spe_supported(void)
260{
261 return spe_get_version() >= ID_AA64DFR0_SPE;
262}
263
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100264static inline bool is_feat_tcr2_supported(void)
265{
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100266 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_TCRX_SHIFT) &
267 ID_AA64MMFR3_EL1_TCRX_MASK) >= ID_AA64MMFR3_EL1_TCR2_SUPPORTED);
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100268}
269
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100270static inline bool get_feat_pmuv3_supported(void)
271{
272 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMUVER_SHIFT) &
273 ID_AA64DFR0_PMUVER_MASK) != ID_AA64DFR0_PMUVER_NOT_SUPPORTED);
274}
275
276static inline bool get_feat_hpmn0_supported(void)
277{
278 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_HPMN0_SHIFT) &
279 ID_AA64DFR0_HPMN0_MASK) == ID_AA64DFR0_HPMN0_SUPPORTED);
280}
Jayanth Dodderi Chidanandb3ffd3c2023-02-13 12:15:11 +0000281
282static inline bool is_feat_sme_supported(void)
283{
284 uint64_t features;
285
286 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
287 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME_SUPPORTED;
288}
289
290static inline bool is_feat_sme_fa64_supported(void)
291{
292 uint64_t features;
293
294 features = read_id_aa64smfr0_el1();
295 return (features & ID_AA64SMFR0_EL1_FA64_BIT) != 0U;
296}
297
Jayanth Dodderi Chidanand95d5d272023-01-16 17:58:47 +0000298static inline bool is_feat_sme2_supported(void)
299{
300 uint64_t features;
301
302 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
303 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME2_SUPPORTED;
304}
305
Javier Almansa Sobrino2a32ff72023-05-25 17:51:48 +0100306static inline u_register_t get_id_aa64mmfr0_el0_tgran4(void)
307{
308 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN4, read_id_aa64mmfr0_el1());
309}
310
311static inline u_register_t get_id_aa64mmfr0_el0_tgran4_2(void)
312{
313 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN4_2, read_id_aa64mmfr0_el1());
314}
315
316static inline u_register_t get_id_aa64mmfr0_el0_tgran16(void)
317{
318 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN16, read_id_aa64mmfr0_el1());
319}
320
321static inline u_register_t get_id_aa64mmfr0_el0_tgran16_2(void)
322{
323 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN16_2, read_id_aa64mmfr0_el1());
324}
325
326static inline u_register_t get_id_aa64mmfr0_el0_tgran64(void)
327{
328 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN64, read_id_aa64mmfr0_el1());
329}
330
331static inline u_register_t get_id_aa64mmfr0_el0_tgran64_2(void)
332{
333 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN64_2, read_id_aa64mmfr0_el1());
334}
335
336static inline bool is_feat_52b_on_4k_supported(void)
337{
338 return (get_id_aa64mmfr0_el0_tgran4() ==
339 ID_AA64MMFR0_EL1_TGRAN4_52B_SUPPORTED);
340}
341
342static inline bool is_feat_52b_on_4k_2_supported(void)
343{
344 u_register_t tgran4_2 = get_id_aa64mmfr0_el0_tgran4_2();
345
346 return ((tgran4_2 == ID_AA64MMFR0_EL1_TGRAN4_2_52B_SUPPORTED) ||
347 ((tgran4_2 == ID_AA64MMFR0_EL1_TGRAN4_2_AS_1)
348 && (is_feat_52b_on_4k_supported() == true)));
349}
350
Juan Pablo Condec94fb402023-07-21 17:19:42 -0500351static inline bool is_feat_specres_present(void)
352{
353 return EXTRACT(ID_AA64ISAR1_SPECRES, read_id_aa64isar1_el1())
354 == ID_AA64ISAR1_SPECRES_SUPPORTED;
355}
356
357static inline bool is_feat_tlbirange_present(void)
358{
359 return EXTRACT(ID_AA64ISAR0_TLB, read_id_aa64isar0_el1())
360 == ID_AA64ISAR0_TLBIRANGE_SUPPORTED;
361}
362
363static inline bool is_feat_tlbios_present(void)
364{
365 return EXTRACT(ID_AA64ISAR0_TLB, read_id_aa64isar0_el1())
366 != ID_AA64ISAR0_TLB_NOT_SUPPORTED;
367}
368
369static inline bool is_feat_dpb_present(void)
370{
371 return EXTRACT(ID_AA64ISAR1_DPB, read_id_aa64isar1_el1())
372 >= ID_AA64ISAR1_DPB_SUPPORTED;
373}
374
375static inline bool is_feat_dpb2_present(void)
376{
377 return EXTRACT(ID_AA64ISAR1_DPB, read_id_aa64isar1_el1())
378 >= ID_AA64ISAR1_DPB2_SUPPORTED;
379}
380
381static inline bool is_feat_ls64_present(void)
382{
383 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
384 >= ID_AA64ISAR1_LS64_SUPPORTED;
385}
386
387static inline bool is_feat_ls64_v_present(void)
388{
389 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
390 >= ID_AA64ISAR1_LS64_V_SUPPORTED;
391}
392
393static inline bool is_feat_ls64_accdata_present(void)
394{
395 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
396 >= ID_AA64ISAR1_LS64_ACCDATA_SUPPORTED;
397}
398
399static inline bool is_feat_ras_present(void)
400{
401 return EXTRACT(ID_AA64PFR0_RAS, read_id_aa64pfr0_el1())
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100402 >= ID_AA64PFR0_RAS_SUPPORTED;
Juan Pablo Condec94fb402023-07-21 17:19:42 -0500403}
404
405static inline bool is_feat_rasv1p1_present(void)
406{
407 return (EXTRACT(ID_AA64PFR0_RAS, read_id_aa64pfr0_el1())
408 == ID_AA64PFR0_RASV1P1_SUPPORTED)
409 || (is_feat_ras_present() &&
410 (EXTRACT(ID_AA64PFR1_RAS_FRAC, read_id_aa64pfr1_el1())
411 == ID_AA64PFR1_RASV1P1_SUPPORTED))
412 || (EXTRACT(ID_PFR0_EL1_RAS, read_id_pfr0_el1())
413 == ID_PFR0_EL1_RASV1P1_SUPPORTED)
414 || ((EXTRACT(ID_PFR0_EL1_RAS, read_id_pfr0_el1())
415 == ID_PFR0_EL1_RAS_SUPPORTED) &&
416 (EXTRACT(ID_PFR2_EL1_RAS_FRAC, read_id_pfr2_el1())
417 == ID_PFR2_EL1_RASV1P1_SUPPORTED));
418}
419
420static inline bool is_feat_gicv3_gicv4_present(void)
421{
422 return EXTRACT(ID_AA64PFR0_GIC, read_id_aa64pfr0_el1())
423 == ID_AA64PFR0_GICV3_GICV4_SUPPORTED;
424}
425
426static inline bool is_feat_csv2_present(void)
427{
428 return EXTRACT(ID_AA64PFR0_CSV2, read_id_aa64pfr0_el1())
429 == ID_AA64PFR0_CSV2_SUPPORTED;
430}
431
432static inline bool is_feat_csv2_2_present(void)
433{
434 return EXTRACT(ID_AA64PFR0_CSV2, read_id_aa64pfr0_el1())
435 == ID_AA64PFR0_CSV2_2_SUPPORTED;
436}
437
438static inline bool is_feat_csv2_1p1_present(void)
439{
440 return is_feat_csv2_present() &&
441 (EXTRACT(ID_AA64PFR1_CSV2_FRAC, read_id_aa64pfr1_el1())
442 == ID_AA64PFR1_CSV2_1P1_SUPPORTED);
443}
444
445static inline bool is_feat_csv2_1p2_present(void)
446{
447 return is_feat_csv2_present() &&
448 (EXTRACT(ID_AA64PFR1_CSV2_FRAC, read_id_aa64pfr1_el1())
449 == ID_AA64PFR1_CSV2_1P2_SUPPORTED);
450}
451
452static inline bool is_feat_lor_present(void)
453{
454 return EXTRACT(ID_AA64MMFR1_EL1_LO, read_id_aa64mmfr1_el1())
455 != ID_AA64MMFR1_EL1_LOR_NOT_SUPPORTED;
456}
457
Jayanth Dodderi Chidanandcd6c94b2022-02-15 17:19:05 +0000458static inline unsigned int get_feat_ls64_support(void)
459{
460 return ((read_id_aa64isar1_el1() >> ID_AA64ISAR1_LS64_SHIFT) &
461 ID_AA64ISAR1_LS64_MASK);
462}
463
Boyan Karatotev4e282422024-10-25 14:34:13 +0100464static inline unsigned int amu_get_version(void)
465{
466 return (unsigned int)(read_id_aa64pfr0_el1() >> ID_AA64PFR0_AMU_SHIFT) &
467 ID_AA64PFR0_AMU_MASK;
468}
469
470static inline bool is_feat_amuv1_present(void)
471{
472 return amu_get_version() >= ID_AA64PFR0_AMU_V1;
473}
474
475static inline bool is_feat_amuv1p1_present(void)
476{
477 return amu_get_version() >= ID_AA64PFR0_AMU_V1P1;
478}
479
Charlie Bareham9601dc52024-08-28 17:27:18 +0100480static inline bool is_feat_trbe_present(void)
481{
482 return EXTRACT(ID_AA64DFR0_TRACEBUFFER, read_id_aa64dfr0_el1())
483 >= ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
484}
485
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100486static inline bool is_feat_gcs_present(void)
487{
488 return EXTRACT(ID_AA64PFR1_EL1_GCS, read_id_aa64pfr1_el1())
489 >= ID_AA64PFR1_EL1_GCS_SUPPORTED;
490}
491
492static inline bool is_feat_s1poe_present(void)
493{
494 return EXTRACT(ID_AA64MMFR3_EL1_S1POE, read_id_aa64mmfr3_el1())
495 >= ID_AA64MMFR3_EL1_S1POE_SUPPORTED;
496}
497
498static inline bool is_feat_s2poe_present(void)
499{
500 return EXTRACT(ID_AA64MMFR3_EL1_S2POE, read_id_aa64mmfr3_el1())
501 >= ID_AA64MMFR3_EL1_S2POE_SUPPORTED;
502}
503
504static inline bool is_feat_s1pie_present(void)
505{
506 return EXTRACT(ID_AA64MMFR3_EL1_S1PIE, read_id_aa64mmfr3_el1())
507 >= ID_AA64MMFR3_EL1_S1PIE_SUPPORTED;
508}
509
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +0200510static inline bool is_feat_s2pie_present(void)
511{
512 return EXTRACT(ID_AA64MMFR3_EL1_S2PIE, read_id_aa64mmfr3_el1())
513 >= ID_AA64MMFR3_EL1_S2PIE_SUPPORTED;
514}
515
516static inline bool is_feat_sxpoe_present(void)
517{
518 return is_feat_s1poe_present() || is_feat_s2poe_present();
519}
520
521static inline bool is_feat_sxpie_present(void)
522{
523 return is_feat_s1pie_present() || is_feat_s2pie_present();
524}
525
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100526static inline bool is_feat_mte2_present(void)
527{
528 return EXTRACT(ID_AA64PFR1_EL1_MTE, read_id_aa64pfr1_el1())
529 >= MTE_IMPLEMENTED_ELX;
530}
Javier Almansa Sobrino7c78f7b2024-10-25 11:44:32 +0100531
532static inline bool is_feat_double_fault2_present(void)
533{
534 return (EXTRACT(ID_AA64PFR1_EL1_DF2,
535 read_id_aa64pfr1_el1()) == 1UL);
536}
537
Arvind Ram Prakash1ab21e52024-11-12 10:52:08 -0600538static inline bool is_feat_fpmr_present(void)
539{
540 return EXTRACT(ID_AA64PFR2_EL1_FPMR, read_id_aa64pfr2_el1())
541 == ID_AA64PFR2_EL1_FPMR_SUPPORTED;
542}
Igor Podgainõid1a7f4d2024-11-26 12:50:47 +0100543
544static inline bool is_feat_sctlr2_supported(void)
545{
546 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_SCTLRX_SHIFT) &
547 ID_AA64MMFR3_EL1_SCTLRX_MASK) == ID_AA64MMFR3_EL1_SCTLR2_SUPPORTED);
548}
549
550static inline bool is_feat_the_supported(void)
551{
552 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_THE_SHIFT) &
553 ID_AA64PFR1_EL1_THE_MASK) == ID_AA64PFR1_EL1_THE_SUPPORTED);
554}
555
556static inline bool is_feat_d128_supported(void)
557{
558 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_D128_SHIFT) &
559 ID_AA64MMFR3_EL1_D128_MASK) == ID_AA64MMFR3_EL1_D128_SUPPORTED);
560}
Boyan Karatotev4e282422024-10-25 14:34:13 +0100561
562static inline bool is_feat_doublelock_present(void)
563{
564 return EXTRACT(ID_AA64DFR0_DOUBLELOCK, read_id_aa64dfr0_el1())
565 >= DOUBLELOCK_IMPLEMENTED;
566}
Antonio Nino Diaz69068db2019-01-11 13:01:45 +0000567#endif /* ARCH_FEATURES_H */