blob: c7d824ad72485a1f4014b53ff893dbd8e2b144b0 [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
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +0200123static inline bool is_armv8_4_amuv1_present(void)
124{
125 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_AMU_SHIFT) &
126 ID_AA64PFR0_AMU_MASK) == 1U;
127}
128
Daniel Boulby39e4df22021-02-02 19:27:41 +0000129static inline bool is_armv8_4_dit_present(void)
130{
131 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
132 ID_AA64PFR0_DIT_MASK) == 1U;
133}
134
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +0200135static inline bool is_armv8_4_nv2_present(void)
136{
137 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_NV_SHIFT) &
138 ID_AA64MMFR2_EL1_NV_MASK) == NV2_IMPLEMENTED;
139}
140
Antonio Nino Diazffdfd162019-02-11 15:34:32 +0000141static inline bool is_armv8_4_ttst_present(void)
142{
143 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
144 ID_AA64MMFR2_EL1_ST_MASK) == 1U;
145}
146
Alexei Fedorov9cd75022020-06-17 18:54:20 +0100147static inline bool is_armv8_5_bti_present(void)
148{
149 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
150 ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
151}
152
Sandrine Bailleux277fb762019-10-08 12:10:45 +0200153static inline unsigned int get_armv8_5_mte_support(void)
154{
155 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
156 ID_AA64PFR1_EL1_MTE_MASK);
157}
158
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500159static inline bool is_armv8_6_fgt_present(void)
160{
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500161 return (((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
162 ID_AA64MMFR0_EL1_FGT_MASK) != 0U);
163}
164
165static inline bool is_armv8_9_fgt2_present(void)
166{
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500167 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500168 ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT2_SUPPORTED;
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500169}
170
Jimmy Brisson945095a2020-04-16 10:54:59 -0500171static inline unsigned long int get_armv8_6_ecv_support(void)
172{
173 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_ECV_SHIFT) &
174 ID_AA64MMFR0_EL1_ECV_MASK);
175}
176
Federico Recanatid3749b02022-01-14 15:44:45 +0100177static inline unsigned long int get_pa_range(void)
178{
179 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_PARANGE_SHIFT) &
180 ID_AA64MMFR0_EL1_PARANGE_MASK);
181}
182
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100183static inline uint32_t arch_get_debug_version(void)
184{
185 return ((read_id_aa64dfr0_el1() & ID_AA64DFR0_DEBUG_BITS) >>
186 ID_AA64DFR0_DEBUG_SHIFT);
187}
188
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100189static inline bool get_armv9_0_trbe_support(void)
190{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000191 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT) &
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100192 ID_AA64DFR0_TRACEBUFFER_MASK) ==
193 ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
194}
195
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100196static inline bool get_armv8_4_trf_support(void)
197{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000198 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT) &
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100199 ID_AA64DFR0_TRACEFILT_MASK) ==
200 ID_AA64DFR0_TRACEFILT_SUPPORTED;
201}
202
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100203static inline bool get_armv8_0_sys_reg_trace_support(void)
204{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000205 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEVER_SHIFT) &
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100206 ID_AA64DFR0_TRACEVER_MASK) ==
207 ID_AA64DFR0_TRACEVER_SUPPORTED;
208}
209
Mark Dykes16b71692021-09-15 14:13:55 -0500210static inline unsigned int get_armv9_2_feat_rme_support(void)
211{
212 /*
213 * Return the RME version, zero if not supported. This function can be
214 * used as both an integer value for the RME version or compared to zero
215 * to detect RME presence.
216 */
217 return (unsigned int)(read_id_aa64pfr0_el1() >>
218 ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
219}
220
johpow01d0bbe6e2021-11-11 16:13:32 -0600221static inline bool get_feat_hcx_support(void)
222{
223 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_HCX_SHIFT) &
224 ID_AA64MMFR1_EL1_HCX_MASK) == ID_AA64MMFR1_EL1_HCX_SUPPORTED);
225}
226
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000227static inline bool get_feat_afp_present(void)
228{
229 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_AFP_SHIFT) &
230 ID_AA64MMFR1_EL1_AFP_MASK) == ID_AA64MMFR1_EL1_AFP_SUPPORTED);
231}
232
johpow018c3da8b2022-01-31 18:14:41 -0600233static inline bool get_feat_brbe_support(void)
234{
235 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_BRBE_SHIFT) &
236 ID_AA64DFR0_BRBE_MASK) ==
237 ID_AA64DFR0_BRBE_SUPPORTED;
238}
239
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000240static inline bool get_feat_wfxt_present(void)
241{
242 return (((read_id_aa64isar2_el1() >> ID_AA64ISAR2_WFXT_SHIFT) &
243 ID_AA64ISAR2_WFXT_MASK) == ID_AA64ISAR2_WFXT_SUPPORTED);
244}
245
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400246static inline bool is_feat_rng_trap_present(void)
247{
248 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
249 ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
250 == ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
251}
252
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -0600253static inline bool is_feat_mpam_supported(void)
254{
255 /*
256 * If the MPAM version retreived from the Processor Feature registers
257 * is a non-zero value, then MPAM is supported.
258 */
259
260 return (((((read_id_aa64pfr0_el1() >>
261 ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
262 ((read_id_aa64pfr1_el1() >>
263 ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK)) != 0U);
264}
265
Manish V Badarkhe41bce212022-11-17 12:34:40 +0000266static inline unsigned int spe_get_version(void)
267{
268 return (unsigned int)((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMS_SHIFT) &
269 ID_AA64DFR0_PMS_MASK);
270}
271
Charlie Barehame4f2eaa2024-08-12 17:59:54 +0100272static inline bool is_feat_spe_supported(void)
273{
274 return spe_get_version() >= ID_AA64DFR0_SPE;
275}
276
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100277static inline bool is_feat_tcr2_supported(void)
278{
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100279 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_EL1_TCRX_SHIFT) &
280 ID_AA64MMFR3_EL1_TCRX_MASK) >= ID_AA64MMFR3_EL1_TCR2_SUPPORTED);
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100281}
282
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100283static inline bool get_feat_pmuv3_supported(void)
284{
285 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMUVER_SHIFT) &
286 ID_AA64DFR0_PMUVER_MASK) != ID_AA64DFR0_PMUVER_NOT_SUPPORTED);
287}
288
289static 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
Charlie Bareham9601dc52024-08-28 17:27:18 +0100477static inline bool is_feat_trbe_present(void)
478{
479 return EXTRACT(ID_AA64DFR0_TRACEBUFFER, read_id_aa64dfr0_el1())
480 >= ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
481}
482
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100483static inline bool is_feat_gcs_present(void)
484{
485 return EXTRACT(ID_AA64PFR1_EL1_GCS, read_id_aa64pfr1_el1())
486 >= ID_AA64PFR1_EL1_GCS_SUPPORTED;
487}
488
489static inline bool is_feat_s1poe_present(void)
490{
491 return EXTRACT(ID_AA64MMFR3_EL1_S1POE, read_id_aa64mmfr3_el1())
492 >= ID_AA64MMFR3_EL1_S1POE_SUPPORTED;
493}
494
495static inline bool is_feat_s2poe_present(void)
496{
497 return EXTRACT(ID_AA64MMFR3_EL1_S2POE, read_id_aa64mmfr3_el1())
498 >= ID_AA64MMFR3_EL1_S2POE_SUPPORTED;
499}
500
501static inline bool is_feat_s1pie_present(void)
502{
503 return EXTRACT(ID_AA64MMFR3_EL1_S1PIE, read_id_aa64mmfr3_el1())
504 >= ID_AA64MMFR3_EL1_S1PIE_SUPPORTED;
505}
506
Igor Podgainõi0db4a3c2024-09-23 12:52:15 +0200507static inline bool is_feat_s2pie_present(void)
508{
509 return EXTRACT(ID_AA64MMFR3_EL1_S2PIE, read_id_aa64mmfr3_el1())
510 >= ID_AA64MMFR3_EL1_S2PIE_SUPPORTED;
511}
512
513static inline bool is_feat_sxpoe_present(void)
514{
515 return is_feat_s1poe_present() || is_feat_s2poe_present();
516}
517
518static inline bool is_feat_sxpie_present(void)
519{
520 return is_feat_s1pie_present() || is_feat_s2pie_present();
521}
522
Jayanth Dodderi Chidanandaf493072024-08-12 17:26:10 +0100523static inline bool is_feat_mte2_present(void)
524{
525 return EXTRACT(ID_AA64PFR1_EL1_MTE, read_id_aa64pfr1_el1())
526 >= MTE_IMPLEMENTED_ELX;
527}
Antonio Nino Diaz69068db2019-01-11 13:01:45 +0000528#endif /* ARCH_FEATURES_H */