blob: 3b4fffcd988d71c7b4c2e739cb5320e4edf24220 [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
Andre Przywara37e3f3e2025-03-07 17:25:24 +0000233static inline bool is_feat_rng_present(void)
234{
235 return (((read_id_aa64isar0_el1() >> ID_AA64ISAR0_RNDR_SHIFT) &
236 ID_AA64ISAR0_RNDR_MASK)
237 >= ID_AA64ISAR0_RNDR_SUPPORTED);
238}
239
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400240static inline bool is_feat_rng_trap_present(void)
241{
242 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
243 ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
244 == ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
245}
246
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -0600247static inline bool is_feat_mpam_supported(void)
248{
249 /*
250 * If the MPAM version retreived from the Processor Feature registers
251 * is a non-zero value, then MPAM is supported.
252 */
253
254 return (((((read_id_aa64pfr0_el1() >>
255 ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
256 ((read_id_aa64pfr1_el1() >>
257 ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK)) != 0U);
258}
259
Manish V Badarkhe41bce212022-11-17 12:34:40 +0000260static inline unsigned int spe_get_version(void)
261{
262 return (unsigned int)((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMS_SHIFT) &
263 ID_AA64DFR0_PMS_MASK);
264}
265
Charlie Barehame4f2eaa2024-08-12 17:59:54 +0100266static inline bool is_feat_spe_supported(void)
267{
268 return spe_get_version() >= ID_AA64DFR0_SPE;
269}
270
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100271static inline bool is_feat_tcr2_supported(void)
272{
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100273 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_TCRX_SHIFT) &
274 ID_AA64MMFR3_EL1_TCRX_MASK) >= ID_AA64MMFR3_EL1_TCR2_SUPPORTED);
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100275}
276
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100277static inline bool get_feat_pmuv3_supported(void)
278{
279 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMUVER_SHIFT) &
280 ID_AA64DFR0_PMUVER_MASK) != ID_AA64DFR0_PMUVER_NOT_SUPPORTED);
281}
282
Andre Przywara37e3f3e2025-03-07 17:25:24 +0000283static inline bool is_feat_pmuv3p9_present(void)
284{
285 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMUVER_SHIFT) &
286 ID_AA64DFR0_PMUVER_MASK) >= ID_AA64DFR0_PMUVER_V3P9_SUPPORTED);
287}
288
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100289static inline bool get_feat_hpmn0_supported(void)
290{
291 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_HPMN0_SHIFT) &
292 ID_AA64DFR0_HPMN0_MASK) == ID_AA64DFR0_HPMN0_SUPPORTED);
293}
Jayanth Dodderi Chidanandb3ffd3c2023-02-13 12:15:11 +0000294
295static inline bool is_feat_sme_supported(void)
296{
297 uint64_t features;
298
299 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
300 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME_SUPPORTED;
301}
302
303static inline bool is_feat_sme_fa64_supported(void)
304{
305 uint64_t features;
306
307 features = read_id_aa64smfr0_el1();
308 return (features & ID_AA64SMFR0_EL1_FA64_BIT) != 0U;
309}
310
Jayanth Dodderi Chidanand95d5d272023-01-16 17:58:47 +0000311static inline bool is_feat_sme2_supported(void)
312{
313 uint64_t features;
314
315 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
316 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME2_SUPPORTED;
317}
318
Javier Almansa Sobrino2a32ff72023-05-25 17:51:48 +0100319static inline u_register_t get_id_aa64mmfr0_el0_tgran4(void)
320{
321 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN4, read_id_aa64mmfr0_el1());
322}
323
324static inline u_register_t get_id_aa64mmfr0_el0_tgran4_2(void)
325{
326 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN4_2, read_id_aa64mmfr0_el1());
327}
328
329static inline u_register_t get_id_aa64mmfr0_el0_tgran16(void)
330{
331 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN16, read_id_aa64mmfr0_el1());
332}
333
334static inline u_register_t get_id_aa64mmfr0_el0_tgran16_2(void)
335{
336 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN16_2, read_id_aa64mmfr0_el1());
337}
338
339static inline u_register_t get_id_aa64mmfr0_el0_tgran64(void)
340{
341 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN64, read_id_aa64mmfr0_el1());
342}
343
344static inline u_register_t get_id_aa64mmfr0_el0_tgran64_2(void)
345{
346 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN64_2, read_id_aa64mmfr0_el1());
347}
348
349static inline bool is_feat_52b_on_4k_supported(void)
350{
351 return (get_id_aa64mmfr0_el0_tgran4() ==
352 ID_AA64MMFR0_EL1_TGRAN4_52B_SUPPORTED);
353}
354
355static inline bool is_feat_52b_on_4k_2_supported(void)
356{
357 u_register_t tgran4_2 = get_id_aa64mmfr0_el0_tgran4_2();
358
359 return ((tgran4_2 == ID_AA64MMFR0_EL1_TGRAN4_2_52B_SUPPORTED) ||
360 ((tgran4_2 == ID_AA64MMFR0_EL1_TGRAN4_2_AS_1)
361 && (is_feat_52b_on_4k_supported() == true)));
362}
363
Juan Pablo Condec94fb402023-07-21 17:19:42 -0500364static inline bool is_feat_specres_present(void)
365{
366 return EXTRACT(ID_AA64ISAR1_SPECRES, read_id_aa64isar1_el1())
367 == ID_AA64ISAR1_SPECRES_SUPPORTED;
368}
369
370static inline bool is_feat_tlbirange_present(void)
371{
372 return EXTRACT(ID_AA64ISAR0_TLB, read_id_aa64isar0_el1())
373 == ID_AA64ISAR0_TLBIRANGE_SUPPORTED;
374}
375
376static inline bool is_feat_tlbios_present(void)
377{
378 return EXTRACT(ID_AA64ISAR0_TLB, read_id_aa64isar0_el1())
379 != ID_AA64ISAR0_TLB_NOT_SUPPORTED;
380}
381
382static inline bool is_feat_dpb_present(void)
383{
384 return EXTRACT(ID_AA64ISAR1_DPB, read_id_aa64isar1_el1())
385 >= ID_AA64ISAR1_DPB_SUPPORTED;
386}
387
388static inline bool is_feat_dpb2_present(void)
389{
390 return EXTRACT(ID_AA64ISAR1_DPB, read_id_aa64isar1_el1())
391 >= ID_AA64ISAR1_DPB2_SUPPORTED;
392}
393
394static inline bool is_feat_ls64_present(void)
395{
396 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
397 >= ID_AA64ISAR1_LS64_SUPPORTED;
398}
399
400static inline bool is_feat_ls64_v_present(void)
401{
402 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
403 >= ID_AA64ISAR1_LS64_V_SUPPORTED;
404}
405
406static inline bool is_feat_ls64_accdata_present(void)
407{
408 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
409 >= ID_AA64ISAR1_LS64_ACCDATA_SUPPORTED;
410}
411
412static inline bool is_feat_ras_present(void)
413{
414 return EXTRACT(ID_AA64PFR0_RAS, read_id_aa64pfr0_el1())
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100415 >= ID_AA64PFR0_RAS_SUPPORTED;
Juan Pablo Condec94fb402023-07-21 17:19:42 -0500416}
417
418static inline bool is_feat_rasv1p1_present(void)
419{
420 return (EXTRACT(ID_AA64PFR0_RAS, read_id_aa64pfr0_el1())
421 == ID_AA64PFR0_RASV1P1_SUPPORTED)
422 || (is_feat_ras_present() &&
423 (EXTRACT(ID_AA64PFR1_RAS_FRAC, read_id_aa64pfr1_el1())
424 == ID_AA64PFR1_RASV1P1_SUPPORTED))
425 || (EXTRACT(ID_PFR0_EL1_RAS, read_id_pfr0_el1())
426 == ID_PFR0_EL1_RASV1P1_SUPPORTED)
427 || ((EXTRACT(ID_PFR0_EL1_RAS, read_id_pfr0_el1())
428 == ID_PFR0_EL1_RAS_SUPPORTED) &&
429 (EXTRACT(ID_PFR2_EL1_RAS_FRAC, read_id_pfr2_el1())
430 == ID_PFR2_EL1_RASV1P1_SUPPORTED));
431}
432
433static inline bool is_feat_gicv3_gicv4_present(void)
434{
435 return EXTRACT(ID_AA64PFR0_GIC, read_id_aa64pfr0_el1())
436 == ID_AA64PFR0_GICV3_GICV4_SUPPORTED;
437}
438
439static inline bool is_feat_csv2_present(void)
440{
441 return EXTRACT(ID_AA64PFR0_CSV2, read_id_aa64pfr0_el1())
442 == ID_AA64PFR0_CSV2_SUPPORTED;
443}
444
445static inline bool is_feat_csv2_2_present(void)
446{
447 return EXTRACT(ID_AA64PFR0_CSV2, read_id_aa64pfr0_el1())
448 == ID_AA64PFR0_CSV2_2_SUPPORTED;
449}
450
451static inline bool is_feat_csv2_1p1_present(void)
452{
453 return is_feat_csv2_present() &&
454 (EXTRACT(ID_AA64PFR1_CSV2_FRAC, read_id_aa64pfr1_el1())
455 == ID_AA64PFR1_CSV2_1P1_SUPPORTED);
456}
457
458static inline bool is_feat_csv2_1p2_present(void)
459{
460 return is_feat_csv2_present() &&
461 (EXTRACT(ID_AA64PFR1_CSV2_FRAC, read_id_aa64pfr1_el1())
462 == ID_AA64PFR1_CSV2_1P2_SUPPORTED);
463}
464
465static inline bool is_feat_lor_present(void)
466{
467 return EXTRACT(ID_AA64MMFR1_EL1_LO, read_id_aa64mmfr1_el1())
468 != ID_AA64MMFR1_EL1_LOR_NOT_SUPPORTED;
469}
470
Jayanth Dodderi Chidanandcd6c94b2022-02-15 17:19:05 +0000471static inline unsigned int get_feat_ls64_support(void)
472{
473 return ((read_id_aa64isar1_el1() >> ID_AA64ISAR1_LS64_SHIFT) &
474 ID_AA64ISAR1_LS64_MASK);
475}
476
Boyan Karatotev4e282422024-10-25 14:34:13 +0100477static inline unsigned int amu_get_version(void)
478{
479 return (unsigned int)(read_id_aa64pfr0_el1() >> ID_AA64PFR0_AMU_SHIFT) &
480 ID_AA64PFR0_AMU_MASK;
481}
482
483static inline bool is_feat_amuv1_present(void)
484{
485 return amu_get_version() >= ID_AA64PFR0_AMU_V1;
486}
487
488static inline bool is_feat_amuv1p1_present(void)
489{
490 return amu_get_version() >= ID_AA64PFR0_AMU_V1P1;
491}
492
Andre Przywara37e3f3e2025-03-07 17:25:24 +0000493static inline bool is_feat_twed_present(void)
494{
495 return EXTRACT(ID_AA64MMFR1_EL1_TWED, read_id_aa64mmfr1_el1())
496 >= ID_AA64MMFR1_EL1_TWED_SUPPORTED;
497}
498
Charlie Bareham9601dc52024-08-28 17:27:18 +0100499static inline bool is_feat_trbe_present(void)
500{
501 return EXTRACT(ID_AA64DFR0_TRACEBUFFER, read_id_aa64dfr0_el1())
502 >= ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
503}
504
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100505static inline bool is_feat_gcs_present(void)
506{
507 return EXTRACT(ID_AA64PFR1_EL1_GCS, read_id_aa64pfr1_el1())
508 >= ID_AA64PFR1_EL1_GCS_SUPPORTED;
509}
510
511static inline bool is_feat_s1poe_present(void)
512{
513 return EXTRACT(ID_AA64MMFR3_EL1_S1POE, read_id_aa64mmfr3_el1())
514 >= ID_AA64MMFR3_EL1_S1POE_SUPPORTED;
515}
516
517static inline bool is_feat_s2poe_present(void)
518{
519 return EXTRACT(ID_AA64MMFR3_EL1_S2POE, read_id_aa64mmfr3_el1())
520 >= ID_AA64MMFR3_EL1_S2POE_SUPPORTED;
521}
522
523static inline bool is_feat_s1pie_present(void)
524{
525 return EXTRACT(ID_AA64MMFR3_EL1_S1PIE, read_id_aa64mmfr3_el1())
526 >= ID_AA64MMFR3_EL1_S1PIE_SUPPORTED;
527}
528
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +0200529static inline bool is_feat_s2pie_present(void)
530{
531 return EXTRACT(ID_AA64MMFR3_EL1_S2PIE, read_id_aa64mmfr3_el1())
532 >= ID_AA64MMFR3_EL1_S2PIE_SUPPORTED;
533}
534
535static inline bool is_feat_sxpoe_present(void)
536{
537 return is_feat_s1poe_present() || is_feat_s2poe_present();
538}
539
540static inline bool is_feat_sxpie_present(void)
541{
542 return is_feat_s1pie_present() || is_feat_s2pie_present();
543}
544
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100545static inline bool is_feat_mte2_present(void)
546{
547 return EXTRACT(ID_AA64PFR1_EL1_MTE, read_id_aa64pfr1_el1())
548 >= MTE_IMPLEMENTED_ELX;
549}
Javier Almansa Sobrino7c78f7b2024-10-25 11:44:32 +0100550
551static inline bool is_feat_double_fault2_present(void)
552{
553 return (EXTRACT(ID_AA64PFR1_EL1_DF2,
554 read_id_aa64pfr1_el1()) == 1UL);
555}
556
Arvind Ram Prakash1ab21e52024-11-12 10:52:08 -0600557static inline bool is_feat_fpmr_present(void)
558{
559 return EXTRACT(ID_AA64PFR2_EL1_FPMR, read_id_aa64pfr2_el1())
560 == ID_AA64PFR2_EL1_FPMR_SUPPORTED;
561}
Igor Podgainõid1a7f4d2024-11-26 12:50:47 +0100562
563static inline bool is_feat_sctlr2_supported(void)
564{
565 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_SCTLRX_SHIFT) &
566 ID_AA64MMFR3_EL1_SCTLRX_MASK) == ID_AA64MMFR3_EL1_SCTLR2_SUPPORTED);
567}
568
569static inline bool is_feat_the_supported(void)
570{
571 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_THE_SHIFT) &
572 ID_AA64PFR1_EL1_THE_MASK) == ID_AA64PFR1_EL1_THE_SUPPORTED);
573}
574
575static inline bool is_feat_d128_supported(void)
576{
577 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_D128_SHIFT) &
578 ID_AA64MMFR3_EL1_D128_MASK) == ID_AA64MMFR3_EL1_D128_SUPPORTED);
579}
Boyan Karatotev4e282422024-10-25 14:34:13 +0100580
581static inline bool is_feat_doublelock_present(void)
582{
583 return EXTRACT(ID_AA64DFR0_DOUBLELOCK, read_id_aa64dfr0_el1())
584 >= DOUBLELOCK_IMPLEMENTED;
585}
Antonio Nino Diaz69068db2019-01-11 13:01:45 +0000586#endif /* ARCH_FEATURES_H */