blob: 1d9013846c050e739a975fb9934bafc570fa9e6d [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
Antonio Nino Diaz9c9f92c2019-03-13 13:57:39 +000037static inline bool is_armv8_3_pauth_present(void)
38{
39 uint64_t mask = (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
40 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
41 (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
42 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
43
44 /* If any of the fields is not zero, PAuth is present */
45 return (read_id_aa64isar1_el1() & mask) != 0U;
46}
47
48static inline bool is_armv8_3_pauth_apa_api_present(void)
49{
50 uint64_t mask = (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
51 (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
52
53 return (read_id_aa64isar1_el1() & mask) != 0U;
54}
55
Joel Hutton8790f022019-03-15 14:47:02 +000056static inline bool is_armv8_3_pauth_gpa_gpi_present(void)
57{
58 uint64_t mask = (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
Alexei Fedorov719714f2019-10-03 10:57:53 +010059 (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT);
Joel Hutton8790f022019-03-15 14:47:02 +000060
61 return (read_id_aa64isar1_el1() & mask) != 0U;
62}
63
Daniel Boulby39e4df22021-02-02 19:27:41 +000064static inline bool is_armv8_4_dit_present(void)
65{
66 return ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_DIT_SHIFT) &
67 ID_AA64PFR0_DIT_MASK) == 1U;
68}
69
Antonio Nino Diazffdfd162019-02-11 15:34:32 +000070static inline bool is_armv8_4_ttst_present(void)
71{
72 return ((read_id_aa64mmfr2_el1() >> ID_AA64MMFR2_EL1_ST_SHIFT) &
73 ID_AA64MMFR2_EL1_ST_MASK) == 1U;
74}
75
Alexei Fedorov9cd75022020-06-17 18:54:20 +010076static inline bool is_armv8_5_bti_present(void)
77{
78 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_BT_SHIFT) &
79 ID_AA64PFR1_EL1_BT_MASK) == BTI_IMPLEMENTED;
80}
81
Sandrine Bailleux277fb762019-10-08 12:10:45 +020082static inline unsigned int get_armv8_5_mte_support(void)
83{
84 return ((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
85 ID_AA64PFR1_EL1_MTE_MASK);
86}
87
Jimmy Brisson90f1d5c2020-04-16 10:54:51 -050088static inline bool is_armv8_6_fgt_present(void)
89{
90 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
91 ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT_SUPPORTED;
92}
93
Jimmy Brisson945095a2020-04-16 10:54:59 -050094static inline unsigned long int get_armv8_6_ecv_support(void)
95{
96 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_ECV_SHIFT) &
97 ID_AA64MMFR0_EL1_ECV_MASK);
98}
99
Federico Recanatid3749b02022-01-14 15:44:45 +0100100static inline unsigned long int get_pa_range(void)
101{
102 return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_PARANGE_SHIFT) &
103 ID_AA64MMFR0_EL1_PARANGE_MASK);
104}
105
Petre-Ionut Tudorf1a45f72019-10-08 16:51:45 +0100106static inline uint32_t arch_get_debug_version(void)
107{
108 return ((read_id_aa64dfr0_el1() & ID_AA64DFR0_DEBUG_BITS) >>
109 ID_AA64DFR0_DEBUG_SHIFT);
110}
111
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100112static inline bool get_armv9_0_trbe_support(void)
113{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000114 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEBUFFER_SHIFT) &
Manish V Badarkhe87c03d12021-07-06 22:57:11 +0100115 ID_AA64DFR0_TRACEBUFFER_MASK) ==
116 ID_AA64DFR0_TRACEBUFFER_SUPPORTED;
117}
118
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100119static inline bool get_armv8_4_trf_support(void)
120{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000121 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT) &
Manish V Badarkhe2c518e52021-07-08 16:36:57 +0100122 ID_AA64DFR0_TRACEFILT_MASK) ==
123 ID_AA64DFR0_TRACEFILT_SUPPORTED;
124}
125
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100126static inline bool get_armv8_0_sys_reg_trace_support(void)
127{
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000128 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEVER_SHIFT) &
Manish V Badarkhe6d0e1b62021-07-09 13:58:28 +0100129 ID_AA64DFR0_TRACEVER_MASK) ==
130 ID_AA64DFR0_TRACEVER_SUPPORTED;
131}
132
Mark Dykes16b71692021-09-15 14:13:55 -0500133static inline unsigned int get_armv9_2_feat_rme_support(void)
134{
135 /*
136 * Return the RME version, zero if not supported. This function can be
137 * used as both an integer value for the RME version or compared to zero
138 * to detect RME presence.
139 */
140 return (unsigned int)(read_id_aa64pfr0_el1() >>
141 ID_AA64PFR0_FEAT_RME_SHIFT) & ID_AA64PFR0_FEAT_RME_MASK;
142}
143
johpow01d0bbe6e2021-11-11 16:13:32 -0600144static inline bool get_feat_hcx_support(void)
145{
146 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_HCX_SHIFT) &
147 ID_AA64MMFR1_EL1_HCX_MASK) == ID_AA64MMFR1_EL1_HCX_SUPPORTED);
148}
149
Manish V Badarkhe82e1a252022-01-04 13:45:31 +0000150static inline bool get_feat_afp_present(void)
151{
152 return (((read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_AFP_SHIFT) &
153 ID_AA64MMFR1_EL1_AFP_MASK) == ID_AA64MMFR1_EL1_AFP_SUPPORTED);
154}
155
johpow018c3da8b2022-01-31 18:14:41 -0600156static inline bool get_feat_brbe_support(void)
157{
158 return ((read_id_aa64dfr0_el1() >> ID_AA64DFR0_BRBE_SHIFT) &
159 ID_AA64DFR0_BRBE_MASK) ==
160 ID_AA64DFR0_BRBE_SUPPORTED;
161}
162
Manish V Badarkheb31bc752021-12-24 08:52:52 +0000163static inline bool get_feat_wfxt_present(void)
164{
165 return (((read_id_aa64isar2_el1() >> ID_AA64ISAR2_WFXT_SHIFT) &
166 ID_AA64ISAR2_WFXT_MASK) == ID_AA64ISAR2_WFXT_SUPPORTED);
167}
168
Juan Pablo Conde9303f4d2022-07-25 16:38:01 -0400169static inline bool is_feat_rng_trap_present(void)
170{
171 return (((read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT) &
172 ID_AA64PFR1_EL1_RNDR_TRAP_MASK)
173 == ID_AA64PFR1_EL1_RNG_TRAP_SUPPORTED);
174}
175
Antonio Nino Diaz69068db2019-01-11 13:01:45 +0000176#endif /* ARCH_FEATURES_H */