blob: bb1d156c8ce458746ac54bffa56582cd3ddf9559 [file] [log] [blame]
Antonio Nino Diaz69068db2019-01-11 13:01:45 +00001/*
Manish V Badarkhe82e1a252022-01-04 13:45:31 +00002 * Copyright (c) 2020-2022, 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>
Antonio Nino Diaz69068db2019-01-11 13:01:45 +000011#include <arch_helpers.h>
12
Antonio Nino Diazffdfd162019-02-11 15:34:32 +000013static inline bool is_armv7_gentimer_present(void)
14{
15 /* The Generic Timer is always present in an ARMv8-A implementation */
16 return true;
17}
18
Daniel Boulby39e4df22021-02-02 19:27:41 +000019static inline bool is_armv8_1_pan_present(void)
20{
21 return ((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_PAN_SHIFT) &
22 ID_AA64MMFR1_EL1_PAN_MASK) != 0U;
23}
24
Ambroise Vincentfae77722019-03-07 10:17:15 +000025static inline bool is_armv8_2_sve_present(void)
26{
27 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT) &
28 ID_AA64PFR0_SVE_MASK) == 1U;
29}
30
Antonio Nino Diaz69068db2019-01-11 13:01:45 +000031static inline bool is_armv8_2_ttcnp_present(void)
32{
33 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_CNP_SHIFT) &
34 ID_AA64MMFR2_EL1_CNP_MASK) != 0U;
35}
36
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040037static inline bool is_feat_pacqarma3_present(void)
38{
39 uint64_t mask_id_aa64isar2 =
40 (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
41 (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
42
43 /* If any of the fields is not zero, QARMA3 algorithm is present */
44 return (read_id_aa64isar2_el1() & mask_id_aa64isar2) != 0U;
45}
46
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000047static inline bool is_armv8_3_pauth_present(void)
48{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040049 uint64_t mask_id_aa64isar1 =
50 (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
51 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
52 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
53 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000054
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040055 /*
56 * If any of the fields is not zero or QARMA3 is present,
57 * PAuth is present.
58 */
59 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
60 is_feat_pacqarma3_present());
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000061}
62
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040063static inline bool is_armv8_3_pauth_apa_api_apa3_present(void)
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000064{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040065 uint64_t mask_id_aa64isar1 =
66 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
67 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000068
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040069 uint64_t mask_id_aa64isar2 =
70 (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
71
72 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
73 (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000074}
75
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040076static inline bool is_armv8_3_pauth_gpa_gpi_gpa3_present(void)
Joel Hutton8790f022019-03-15 14:47:02 +000077{
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040078 uint64_t mask_id_aa64isar1 =
79 (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
80 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT);
Joel Hutton8790f022019-03-15 14:47:02 +000081
Juan Pablo Condeebd1b692022-06-30 17:47:35 -040082 uint64_t mask_id_aa64isar2 =
83 (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT);
84
85 return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
86 (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
Joel Hutton8790f022019-03-15 14:47:02 +000087}
88
Daniel Boulby39e4df22021-02-02 19:27:41 +000089static inline bool is_armv8_4_dit_present(void)
90{
91 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
92 ID_AA64PFR0_DIT_MASK) == 1U;
93}
94
Antonio Nino Diazffdfd162019-02-11 15:34:32 +000095static inline bool is_armv8_4_ttst_present(void)
96{
97 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
98 ID_AA64MMFR2_EL1_ST_MASK) == 1U;
99}
100
Alexei Fedorov9cd75022020-06-17 18:54:20 +0100101static inline bool is_armv8_5_bti_present(void)
102{
103 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
104 ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
105}
106
Sandrine Bailleux277fb762019-10-08 12:10:45 +0200107static inline unsigned int get_armv8_5_mte_support(void)
108{
109 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
110 ID_AA64PFR1_EL1_MTE_MASK);
111}
112
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -0500113static inline bool is_armv8_6_fgt_present(void)
114{
115 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
116 ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT_SUPPORTED;
117}
118
Jimmy Brisson945095a2020-04-16 10:54:59 -0500119static inline unsigned long int get_armv8_6_ecv_support(void)
120{
121 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_ECV_SHIFT) &
122 ID_AA64MMFR0_EL1_ECV_MASK);
123}
124
Federico Recanatid3749b02022-01-14 15:44:45 +0100125static inline unsigned long int get_pa_range(void)
126{
127 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_PARANGE_SHIFT) &
128 ID_AA64MMFR0_EL1_PARANGE_MASK);
129}
130
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100131static inline uint32_t arch_get_debug_version(void)
132{
133 return ((read_id_aa64dfr0_el1() & ID_AA64DFR0_DEBUG_BITS) >>
134 ID_AA64DFR0_DEBUG_SHIFT);
135}
136
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100137static inline bool get_armv9_0_trbe_support(void)
138{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000139 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT) &
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100140 ID_AA64DFR0_TRACEBUFFER_MASK) ==
141 ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
142}
143
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100144static inline bool get_armv8_4_trf_support(void)
145{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000146 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT) &
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100147 ID_AA64DFR0_TRACEFILT_MASK) ==
148 ID_AA64DFR0_TRACEFILT_SUPPORTED;
149}
150
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100151static inline bool get_armv8_0_sys_reg_trace_support(void)
152{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000153 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEVER_SHIFT) &
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100154 ID_AA64DFR0_TRACEVER_MASK) ==
155 ID_AA64DFR0_TRACEVER_SUPPORTED;
156}
157
Mark Dykes16b71692021-09-15 14:13:55 -0500158static inline unsigned int get_armv9_2_feat_rme_support(void)
159{
160 /*
161 * Return the RME version, zero if not supported. This function can be
162 * used as both an integer value for the RME version or compared to zero
163 * to detect RME presence.
164 */
165 return (unsigned int)(read_id_aa64pfr0_el1() >>
166 ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
167}
168
johpow01d0bbe6e2021-11-11 16:13:32 -0600169static inline bool get_feat_hcx_support(void)
170{
171 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_HCX_SHIFT) &
172 ID_AA64MMFR1_EL1_HCX_MASK) == ID_AA64MMFR1_EL1_HCX_SUPPORTED);
173}
174
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000175static inline bool get_feat_afp_present(void)
176{
177 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_AFP_SHIFT) &
178 ID_AA64MMFR1_EL1_AFP_MASK) == ID_AA64MMFR1_EL1_AFP_SUPPORTED);
179}
180
johpow018c3da8b2022-01-31 18:14:41 -0600181static inline bool get_feat_brbe_support(void)
182{
183 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_BRBE_SHIFT) &
184 ID_AA64DFR0_BRBE_MASK) ==
185 ID_AA64DFR0_BRBE_SUPPORTED;
186}
187
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000188static inline bool get_feat_wfxt_present(void)
189{
190 return (((read_id_aa64isar2_el1() >> ID_AA64ISAR2_WFXT_SHIFT) &
191 ID_AA64ISAR2_WFXT_MASK) == ID_AA64ISAR2_WFXT_SUPPORTED);
192}
193
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400194static inline bool is_feat_rng_trap_present(void)
195{
196 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
197 ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
198 == ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
199}
200
Manish V Badarkhe41bce212022-11-17 12:34:40 +0000201static inline unsigned int spe_get_version(void)
202{
203 return (unsigned int)((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMS_SHIFT) &
204 ID_AA64DFR0_PMS_MASK);
205}
206
Boyan Karatotev35e3ca02022-10-10 16:39:45 +0100207static inline bool get_feat_pmuv3_supported(void)
208{
209 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_PMUVER_SHIFT) &
210 ID_AA64DFR0_PMUVER_MASK) != ID_AA64DFR0_PMUVER_NOT_SUPPORTED);
211}
212
213static inline bool get_feat_hpmn0_supported(void)
214{
215 return (((read_id_aa64dfr0_el1() >> ID_AA64DFR0_HPMN0_SHIFT) &
216 ID_AA64DFR0_HPMN0_MASK) == ID_AA64DFR0_HPMN0_SUPPORTED);
217}
Jayanth Dodderi Chidanandb3ffd3c2023-02-13 12:15:11 +0000218
219static inline bool is_feat_sme_supported(void)
220{
221 uint64_t features;
222
223 features = read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_SME_SHIFT;
224 return (features & ID_AA64PFR1_EL1_SME_MASK) >= ID_AA64PFR1_EL1_SME_SUPPORTED;
225}
226
227static inline bool is_feat_sme_fa64_supported(void)
228{
229 uint64_t features;
230
231 features = read_id_aa64smfr0_el1();
232 return (features & ID_AA64SMFR0_EL1_FA64_BIT) != 0U;
233}
234
Antonio Nino Diaz69068db2019-01-11 13:01:45 +0000235#endif /* ARCH_FEATURES_H */