blob: 8a6e4b7f9353b935e10c7eff8c36e353ababb86a [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
31static inline bool is_armv8_2_pan2_present(void)
32{
33 u_register_t id_aa64mmfr1_pan =
34 EXTRACT(ID_AA64MMFR1_EL1_PAN, read_id_aa64mmfr1_el1());
35 return (id_aa64mmfr1_pan >= ID_AA64MMFR1_EL1_PAN2_SUPPORTED) &&
36 (id_aa64mmfr1_pan <= ID_AA64MMFR1_EL1_PAN3_SUPPORTED);
Daniel Boulby39e4df22021-02-02 19:27:41 +000037}
38
Ambroise Vincentfae77722019-03-07 10:17:15 +000039static inline bool is_armv8_2_sve_present(void)
40{
41 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT) &
42 ID_AA64PFR0_SVE_MASK) == 1U;
43}
44
Olivier Deprez2661ba52024-02-19 18:50:53 +010045static inline bool is_feat_advsimd_present(void)
46{
47 u_register_t id_aa64pfr0_advsimd =
48 EXTRACT(ID_AA64PFR0_ADVSIMD, read_id_aa64pfr0_el1());
49 return (id_aa64pfr0_advsimd == 0 || id_aa64pfr0_advsimd == 1);
50}
51
52static inline bool is_feat_fp_present(void)
53{
54 u_register_t id_aa64pfr0_fp =
55 EXTRACT(ID_AA64PFR0_FP, read_id_aa64pfr0_el1());
56 return (id_aa64pfr0_fp == 0 || id_aa64pfr0_fp == 1);
57}
58
Antonio Nino Diaz69068db2019-01-11 13:01:45 +000059static inline bool is_armv8_2_ttcnp_present(void)
60{
61 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_CNP_SHIFT) &
62 ID_AA64MMFR2_EL1_CNP_MASK) != 0U;
63}
64
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040065static inline bool is_feat_pacqarma3_present(void)
66{
67 uint64_t mask_id_aa64isar2 =
68 (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
69 (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
70
71 /* If any of the fields is not zero, QARMA3 algorithm is present */
72 return (read_id_aa64isar2_el1() & mask_id_aa64isar2) != 0U;
73}
74
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000075static inline bool is_armv8_3_pauth_present(void)
76{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040077 uint64_t mask_id_aa64isar1 =
78 (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
79 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
80 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
81 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000082
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040083 /*
84 * If any of the fields is not zero or QARMA3 is present,
85 * PAuth is present.
86 */
87 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
88 is_feat_pacqarma3_present());
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000089}
90
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040091static inline bool is_armv8_3_pauth_apa_api_apa3_present(void)
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000092{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040093 uint64_t mask_id_aa64isar1 =
94 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
95 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000096
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040097 uint64_t mask_id_aa64isar2 =
98 (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
99
100 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
101 (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +0000102}
103
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400104static inline bool is_armv8_3_pauth_gpa_gpi_gpa3_present(void)
Joel Hutton8790f022019-03-15 14:47:02 +0000105{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400106 uint64_t mask_id_aa64isar1 =
107 (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
108 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT);
Joel Hutton8790f022019-03-15 14:47:02 +0000109
Juan Pablo Condeebd1b692022-06-30 17:47:35 -0400110 uint64_t mask_id_aa64isar2 =
111 (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT);
112
113 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
114 (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
Joel Hutton8790f022019-03-15 14:47:02 +0000115}
116
Daniel Boulby39e4df22021-02-02 19:27:41 +0000117static inline bool is_armv8_4_dit_present(void)
118{
119 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
120 ID_AA64PFR0_DIT_MASK) == 1U;
121}
122
Antonio Nino Diazffdfd162019-02-11 15:34:32 +0000123static inline bool is_armv8_4_ttst_present(void)
124{
125 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
126 ID_AA64MMFR2_EL1_ST_MASK) == 1U;
127}
128
Alexei Fedorov9cd75022020-06-17 18:54:20 +0100129static inline bool is_armv8_5_bti_present(void)
130{
131 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
132 ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
133}
134
Sandrine Bailleux277fb762019-10-08 12:10:45 +0200135static inline unsigned int get_armv8_5_mte_support(void)
136{
137 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
138 ID_AA64PFR1_EL1_MTE_MASK);
139}
140
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500141static inline bool is_armv8_6_fgt_present(void)
142{
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500143 return (((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
144 ID_AA64MMFR0_EL1_FGT_MASK) != 0U);
145}
146
147static inline bool is_armv8_9_fgt2_present(void)
148{
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500149 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
Arvind Ram Prakash94963d42024-06-13 17:19:56 -0500150 ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT2_SUPPORTED;
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500151}
152
Jimmy Brisson945095a2020-04-16 10:54:59 -0500153static inline unsigned long int get_armv8_6_ecv_support(void)
154{
155 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_ECV_SHIFT) &
156 ID_AA64MMFR0_EL1_ECV_MASK);
157}
158
Federico Recanatid3749b02022-01-14 15:44:45 +0100159static inline unsigned long int get_pa_range(void)
160{
161 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_PARANGE_SHIFT) &
162 ID_AA64MMFR0_EL1_PARANGE_MASK);
163}
164
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100165static inline uint32_t arch_get_debug_version(void)
166{
167 return ((read_id_aa64dfr0_el1() & ID_AA64DFR0_DEBUG_BITS) >>
168 ID_AA64DFR0_DEBUG_SHIFT);
169}
170
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100171static inline bool get_armv9_0_trbe_support(void)
172{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000173 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT) &
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100174 ID_AA64DFR0_TRACEBUFFER_MASK) ==
175 ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
176}
177
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100178static inline bool get_armv8_4_trf_support(void)
179{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000180 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT) &
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100181 ID_AA64DFR0_TRACEFILT_MASK) ==
182 ID_AA64DFR0_TRACEFILT_SUPPORTED;
183}
184
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100185static inline bool get_armv8_0_sys_reg_trace_support(void)
186{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000187 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEVER_SHIFT) &
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100188 ID_AA64DFR0_TRACEVER_MASK) ==
189 ID_AA64DFR0_TRACEVER_SUPPORTED;
190}
191
Mark Dykes16b71692021-09-15 14:13:55 -0500192static inline unsigned int get_armv9_2_feat_rme_support(void)
193{
194 /*
195 * Return the RME version, zero if not supported. This function can be
196 * used as both an integer value for the RME version or compared to zero
197 * to detect RME presence.
198 */
199 return (unsigned int)(read_id_aa64pfr0_el1() >>
200 ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
201}
202
johpow01d0bbe6e2021-11-11 16:13:32 -0600203static inline bool get_feat_hcx_support(void)
204{
205 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_HCX_SHIFT) &
206 ID_AA64MMFR1_EL1_HCX_MASK) == ID_AA64MMFR1_EL1_HCX_SUPPORTED);
207}
208
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000209static inline bool get_feat_afp_present(void)
210{
211 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_AFP_SHIFT) &
212 ID_AA64MMFR1_EL1_AFP_MASK) == ID_AA64MMFR1_EL1_AFP_SUPPORTED);
213}
214
johpow018c3da8b2022-01-31 18:14:41 -0600215static inline bool get_feat_brbe_support(void)
216{
217 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_BRBE_SHIFT) &
218 ID_AA64DFR0_BRBE_MASK) ==
219 ID_AA64DFR0_BRBE_SUPPORTED;
220}
221
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000222static inline bool get_feat_wfxt_present(void)
223{
224 return (((read_id_aa64isar2_el1() >> ID_AA64ISAR2_WFXT_SHIFT) &
225 ID_AA64ISAR2_WFXT_MASK) == ID_AA64ISAR2_WFXT_SUPPORTED);
226}
227
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400228static inline bool is_feat_rng_trap_present(void)
229{
230 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
231 ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
232 == ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
233}
234
Arvind Ram Prakash13887ac2024-01-04 15:22:52 -0600235static inline bool is_feat_mpam_supported(void)
236{
237 /*
238 * If the MPAM version retreived from the Processor Feature registers
239 * is a non-zero value, then MPAM is supported.
240 */
241
242 return (((((read_id_aa64pfr0_el1() >>
243 ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) |
244 ((read_id_aa64pfr1_el1() >>
245 ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK)) != 0U);
246}
247
Manish V Badarkhe41bce212022-11-17 12:34:40 +0000248static inline unsigned int spe_get_version(void)
249{
250 return (unsigned int)((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMS_SHIFT) &
251 ID_AA64DFR0_PMS_MASK);
252}
253
Charlie Barehame4f2eaa2024-08-12 17:59:54 +0100254static inline bool is_feat_spe_supported(void)
255{
256 return spe_get_version() >= ID_AA64DFR0_SPE;
257}
258
Jayanth Dodderi Chidanandf2f1e272024-09-03 11:49:51 +0100259static inline bool is_feat_tcr2_supported(void)
260{
261 return (((read_id_aa64mmfr3_el1() >> ID_AA64MMFR3_TCR2_SHIFT) &
262 ID_AA64MMFR3_TCR2_MASK) != 0);
263}
264
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100265static inline bool get_feat_pmuv3_supported(void)
266{
267 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMUVER_SHIFT) &
268 ID_AA64DFR0_PMUVER_MASK) != ID_AA64DFR0_PMUVER_NOT_SUPPORTED);
269}
270
271static inline bool get_feat_hpmn0_supported(void)
272{
273 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_HPMN0_SHIFT) &
274 ID_AA64DFR0_HPMN0_MASK) == ID_AA64DFR0_HPMN0_SUPPORTED);
275}
Jayanth Dodderi Chidanandb3ffd3c2023-02-13 12:15:11 +0000276
277static inline bool is_feat_sme_supported(void)
278{
279 uint64_t features;
280
281 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
282 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME_SUPPORTED;
283}
284
285static inline bool is_feat_sme_fa64_supported(void)
286{
287 uint64_t features;
288
289 features = read_id_aa64smfr0_el1();
290 return (features & ID_AA64SMFR0_EL1_FA64_BIT) != 0U;
291}
292
Jayanth Dodderi Chidanand95d5d272023-01-16 17:58:47 +0000293static inline bool is_feat_sme2_supported(void)
294{
295 uint64_t features;
296
297 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
298 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME2_SUPPORTED;
299}
300
Javier Almansa Sobrino2a32ff72023-05-25 17:51:48 +0100301static inline u_register_t get_id_aa64mmfr0_el0_tgran4(void)
302{
303 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN4, read_id_aa64mmfr0_el1());
304}
305
306static inline u_register_t get_id_aa64mmfr0_el0_tgran4_2(void)
307{
308 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN4_2, read_id_aa64mmfr0_el1());
309}
310
311static inline u_register_t get_id_aa64mmfr0_el0_tgran16(void)
312{
313 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN16, read_id_aa64mmfr0_el1());
314}
315
316static inline u_register_t get_id_aa64mmfr0_el0_tgran16_2(void)
317{
318 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN16_2, read_id_aa64mmfr0_el1());
319}
320
321static inline u_register_t get_id_aa64mmfr0_el0_tgran64(void)
322{
323 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN64, read_id_aa64mmfr0_el1());
324}
325
326static inline u_register_t get_id_aa64mmfr0_el0_tgran64_2(void)
327{
328 return EXTRACT(ID_AA64MMFR0_EL1_TGRAN64_2, read_id_aa64mmfr0_el1());
329}
330
331static inline bool is_feat_52b_on_4k_supported(void)
332{
333 return (get_id_aa64mmfr0_el0_tgran4() ==
334 ID_AA64MMFR0_EL1_TGRAN4_52B_SUPPORTED);
335}
336
337static inline bool is_feat_52b_on_4k_2_supported(void)
338{
339 u_register_t tgran4_2 = get_id_aa64mmfr0_el0_tgran4_2();
340
341 return ((tgran4_2 == ID_AA64MMFR0_EL1_TGRAN4_2_52B_SUPPORTED) ||
342 ((tgran4_2 == ID_AA64MMFR0_EL1_TGRAN4_2_AS_1)
343 && (is_feat_52b_on_4k_supported() == true)));
344}
345
Juan Pablo Condec94fb402023-07-21 17:19:42 -0500346static inline bool is_feat_specres_present(void)
347{
348 return EXTRACT(ID_AA64ISAR1_SPECRES, read_id_aa64isar1_el1())
349 == ID_AA64ISAR1_SPECRES_SUPPORTED;
350}
351
352static inline bool is_feat_tlbirange_present(void)
353{
354 return EXTRACT(ID_AA64ISAR0_TLB, read_id_aa64isar0_el1())
355 == ID_AA64ISAR0_TLBIRANGE_SUPPORTED;
356}
357
358static inline bool is_feat_tlbios_present(void)
359{
360 return EXTRACT(ID_AA64ISAR0_TLB, read_id_aa64isar0_el1())
361 != ID_AA64ISAR0_TLB_NOT_SUPPORTED;
362}
363
364static inline bool is_feat_dpb_present(void)
365{
366 return EXTRACT(ID_AA64ISAR1_DPB, read_id_aa64isar1_el1())
367 >= ID_AA64ISAR1_DPB_SUPPORTED;
368}
369
370static inline bool is_feat_dpb2_present(void)
371{
372 return EXTRACT(ID_AA64ISAR1_DPB, read_id_aa64isar1_el1())
373 >= ID_AA64ISAR1_DPB2_SUPPORTED;
374}
375
376static inline bool is_feat_ls64_present(void)
377{
378 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
379 >= ID_AA64ISAR1_LS64_SUPPORTED;
380}
381
382static inline bool is_feat_ls64_v_present(void)
383{
384 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
385 >= ID_AA64ISAR1_LS64_V_SUPPORTED;
386}
387
388static inline bool is_feat_ls64_accdata_present(void)
389{
390 return EXTRACT(ID_AA64ISAR1_LS64, read_id_aa64isar1_el1())
391 >= ID_AA64ISAR1_LS64_ACCDATA_SUPPORTED;
392}
393
394static inline bool is_feat_ras_present(void)
395{
396 return EXTRACT(ID_AA64PFR0_RAS, read_id_aa64pfr0_el1())
397 == ID_AA64PFR0_RAS_SUPPORTED;
398}
399
400static inline bool is_feat_rasv1p1_present(void)
401{
402 return (EXTRACT(ID_AA64PFR0_RAS, read_id_aa64pfr0_el1())
403 == ID_AA64PFR0_RASV1P1_SUPPORTED)
404 || (is_feat_ras_present() &&
405 (EXTRACT(ID_AA64PFR1_RAS_FRAC, read_id_aa64pfr1_el1())
406 == ID_AA64PFR1_RASV1P1_SUPPORTED))
407 || (EXTRACT(ID_PFR0_EL1_RAS, read_id_pfr0_el1())
408 == ID_PFR0_EL1_RASV1P1_SUPPORTED)
409 || ((EXTRACT(ID_PFR0_EL1_RAS, read_id_pfr0_el1())
410 == ID_PFR0_EL1_RAS_SUPPORTED) &&
411 (EXTRACT(ID_PFR2_EL1_RAS_FRAC, read_id_pfr2_el1())
412 == ID_PFR2_EL1_RASV1P1_SUPPORTED));
413}
414
415static inline bool is_feat_gicv3_gicv4_present(void)
416{
417 return EXTRACT(ID_AA64PFR0_GIC, read_id_aa64pfr0_el1())
418 == ID_AA64PFR0_GICV3_GICV4_SUPPORTED;
419}
420
421static inline bool is_feat_csv2_present(void)
422{
423 return EXTRACT(ID_AA64PFR0_CSV2, read_id_aa64pfr0_el1())
424 == ID_AA64PFR0_CSV2_SUPPORTED;
425}
426
427static inline bool is_feat_csv2_2_present(void)
428{
429 return EXTRACT(ID_AA64PFR0_CSV2, read_id_aa64pfr0_el1())
430 == ID_AA64PFR0_CSV2_2_SUPPORTED;
431}
432
433static inline bool is_feat_csv2_1p1_present(void)
434{
435 return is_feat_csv2_present() &&
436 (EXTRACT(ID_AA64PFR1_CSV2_FRAC, read_id_aa64pfr1_el1())
437 == ID_AA64PFR1_CSV2_1P1_SUPPORTED);
438}
439
440static inline bool is_feat_csv2_1p2_present(void)
441{
442 return is_feat_csv2_present() &&
443 (EXTRACT(ID_AA64PFR1_CSV2_FRAC, read_id_aa64pfr1_el1())
444 == ID_AA64PFR1_CSV2_1P2_SUPPORTED);
445}
446
447static inline bool is_feat_lor_present(void)
448{
449 return EXTRACT(ID_AA64MMFR1_EL1_LO, read_id_aa64mmfr1_el1())
450 != ID_AA64MMFR1_EL1_LOR_NOT_SUPPORTED;
451}
452
Jayanth Dodderi Chidanandcd6c94b2022-02-15 17:19:05 +0000453static inline unsigned int get_feat_ls64_support(void)
454{
455 return ((read_id_aa64isar1_el1() >> ID_AA64ISAR1_LS64_SHIFT) &
456 ID_AA64ISAR1_LS64_MASK);
457}
458
Charlie Bareham9601dc52024-08-28 17:27:18 +0100459static inline bool is_feat_trbe_present(void)
460{
461 return EXTRACT(ID_AA64DFR0_TRACEBUFFER, read_id_aa64dfr0_el1())
462 >= ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
463}
464
Antonio Nino Diaz69068db2019-01-11 13:01:45 +0000465#endif /* ARCH_FEATURES_H */