xref: /optee_os/core/arch/arm/include/arm.h (revision f0489baa765d4c0f88ad047b5e4d5120907161f1)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2abe38974SJens Wiklander /*
3abe38974SJens Wiklander  * Copyright (c) 2015, Linaro Limited
4d4351c1eSBalint Dobszay  * Copyright (c) 2019-2023, Arm Limited. All rights reserved.
5abe38974SJens Wiklander  */
6d50fee03SEtienne Carriere #ifndef __ARM_H
7d50fee03SEtienne Carriere #define __ARM_H
8abe38974SJens Wiklander 
913a1e5cbSRuchika Gupta #include <stdbool.h>
104a6784caSJens Wiklander #include <stdint.h>
110c07a905SIgor Opaniuk #include <util.h>
12abe38974SJens Wiklander 
132a45d862SJens Wiklander /* MIDR definitions */
144a6784caSJens Wiklander #define MIDR_PRIMARY_PART_NUM_SHIFT	U(4)
154a6784caSJens Wiklander #define MIDR_PRIMARY_PART_NUM_WIDTH	U(12)
16cb615cceSJens Wiklander #define MIDR_PRIMARY_PART_NUM_MASK	(BIT(MIDR_PRIMARY_PART_NUM_WIDTH) - 1)
172a45d862SJens Wiklander 
184a6784caSJens Wiklander #define MIDR_IMPLEMENTER_SHIFT		U(24)
194a6784caSJens Wiklander #define MIDR_IMPLEMENTER_WIDTH		U(8)
20cb615cceSJens Wiklander #define MIDR_IMPLEMENTER_MASK		(BIT(MIDR_IMPLEMENTER_WIDTH) - 1)
214a6784caSJens Wiklander #define MIDR_IMPLEMENTER_ARM		U(0x41)
222a45d862SJens Wiklander 
23b168eda7SJens Wiklander #define MIDR_VARIANT_SHIFT		U(20)
24b168eda7SJens Wiklander #define MIDR_VARIANT_WIDTH		U(4)
25b168eda7SJens Wiklander #define MIDR_VARIANT_MASK		(BIT(MIDR_VARIANT_WIDTH) - 1)
26b168eda7SJens Wiklander 
27b168eda7SJens Wiklander #define MIDR_REVISION_SHIFT		U(0)
28b168eda7SJens Wiklander #define MIDR_REVISION_WIDTH		U(4)
29b168eda7SJens Wiklander #define MIDR_REVISION_MASK		(BIT(MIDR_REVISION_WIDTH) - 1)
30b168eda7SJens Wiklander 
310d2c657cSClément Léger #define CORTEX_A5_PART_NUM		U(0xC05)
324a6784caSJens Wiklander #define CORTEX_A7_PART_NUM		U(0xC07)
334a6784caSJens Wiklander #define CORTEX_A8_PART_NUM		U(0xC08)
344a6784caSJens Wiklander #define CORTEX_A9_PART_NUM		U(0xC09)
354a6784caSJens Wiklander #define CORTEX_A15_PART_NUM		U(0xC0F)
364a6784caSJens Wiklander #define CORTEX_A17_PART_NUM		U(0xC0E)
374a6784caSJens Wiklander #define CORTEX_A57_PART_NUM		U(0xD07)
384a6784caSJens Wiklander #define CORTEX_A72_PART_NUM		U(0xD08)
394a6784caSJens Wiklander #define CORTEX_A73_PART_NUM		U(0xD09)
404a6784caSJens Wiklander #define CORTEX_A75_PART_NUM		U(0xD0A)
41b168eda7SJens Wiklander #define CORTEX_A65_PART_NUM		U(0xD06)
42b168eda7SJens Wiklander #define CORTEX_A65AE_PART_NUM		U(0xD43)
43b168eda7SJens Wiklander #define CORTEX_A76_PART_NUM		U(0xD0B)
44b168eda7SJens Wiklander #define CORTEX_A76AE_PART_NUM		U(0xD0E)
45b168eda7SJens Wiklander #define CORTEX_A77_PART_NUM		U(0xD0D)
46b168eda7SJens Wiklander #define CORTEX_A78_PART_NUM		U(0xD41)
47b168eda7SJens Wiklander #define CORTEX_A78AE_PART_NUM		U(0xD42)
48b168eda7SJens Wiklander #define CORTEX_A78C_PART_NUM		U(0xD4B)
49b168eda7SJens Wiklander #define CORTEX_A710_PART_NUM		U(0xD47)
50b168eda7SJens Wiklander #define CORTEX_X1_PART_NUM		U(0xD44)
51b168eda7SJens Wiklander #define CORTEX_X2_PART_NUM		U(0xD48)
52b168eda7SJens Wiklander #define NEOVERSE_E1_PART_NUM		U(0xD4A)
53b168eda7SJens Wiklander #define NEOVERSE_N1_PART_NUM		U(0xD0C)
54b168eda7SJens Wiklander #define NEOVERSE_N2_PART_NUM		U(0xD49)
55b168eda7SJens Wiklander #define NEOVERSE_V1_PART_NUM		U(0xD40)
562a45d862SJens Wiklander 
572a45d862SJens Wiklander /* MPIDR definitions */
584a6784caSJens Wiklander #define MPIDR_AFFINITY_BITS	U(8)
5956856ba6SMark-PK Tsai #define MPIDR_AFFLVL_MASK	ULL(0xff)
604a6784caSJens Wiklander #define MPIDR_AFF0_SHIFT	U(0)
618be2de1aSImre Kis #define MPIDR_AFF0_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF0_SHIFT)
624a6784caSJens Wiklander #define MPIDR_AFF1_SHIFT	U(8)
638be2de1aSImre Kis #define MPIDR_AFF1_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF1_SHIFT)
644a6784caSJens Wiklander #define MPIDR_AFF2_SHIFT	U(16)
658be2de1aSImre Kis #define MPIDR_AFF2_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF2_SHIFT)
6656856ba6SMark-PK Tsai #define MPIDR_AFF3_SHIFT	U(32)
6756856ba6SMark-PK Tsai #define MPIDR_AFF3_MASK		(MPIDR_AFFLVL_MASK << MPIDR_AFF3_SHIFT)
688be2de1aSImre Kis 
694a6784caSJens Wiklander #define MPIDR_MT_SHIFT		U(24)
708be2de1aSImre Kis #define MPIDR_MT_MASK		BIT(MPIDR_MT_SHIFT)
718be2de1aSImre Kis 
728be2de1aSImre Kis #define MPIDR_CPU_MASK		MPIDR_AFF0_MASK
738be2de1aSImre Kis #define MPIDR_CLUSTER_SHIFT	MPIDR_AFF1_SHIFT
748be2de1aSImre Kis #define MPIDR_CLUSTER_MASK	MPIDR_AFF1_MASK
75abe38974SJens Wiklander 
76b0490ed1SAchin Gupta #define MPIDR_AARCH32_AFF_MASK	(MPIDR_AFF0_MASK | MPIDR_AFF1_MASK | \
77b0490ed1SAchin Gupta 				 MPIDR_AFF2_MASK)
78b0490ed1SAchin Gupta 
79*f0489baaSSungbae Yoo /* MPIDR definitions for VCPU */
80*f0489baaSSungbae Yoo #define MPIDR_VCPU_MASK		ULL(0xffffff)
81*f0489baaSSungbae Yoo 
8285c99f39SIgor Opaniuk /* ID_ISAR5 Cryptography Extension masks */
8385c99f39SIgor Opaniuk #define ID_ISAR5_AES		GENMASK_32(7, 4)
8485c99f39SIgor Opaniuk #define ID_ISAR5_SHA1		GENMASK_32(11, 8)
8585c99f39SIgor Opaniuk #define ID_ISAR5_SHA2		GENMASK_32(15, 12)
8685c99f39SIgor Opaniuk #define ID_ISAR5_CRC32		GENMASK_32(19, 16)
8785c99f39SIgor Opaniuk 
8815329378SJens Wiklander /* CLIDR definitions */
894a6784caSJens Wiklander #define CLIDR_LOUIS_SHIFT	U(21)
904a6784caSJens Wiklander #define CLIDR_LOC_SHIFT		U(24)
914a6784caSJens Wiklander #define CLIDR_FIELD_WIDTH	U(3)
9215329378SJens Wiklander 
9315329378SJens Wiklander /* CSSELR definitions */
944a6784caSJens Wiklander #define CSSELR_LEVEL_SHIFT	U(1)
9515329378SJens Wiklander 
9615329378SJens Wiklander /* CTR definitions */
974a6784caSJens Wiklander #define CTR_CWG_SHIFT		U(24)
984a6784caSJens Wiklander #define CTR_CWG_MASK		U(0xf)
994a6784caSJens Wiklander #define CTR_ERG_SHIFT		U(20)
1004a6784caSJens Wiklander #define CTR_ERG_MASK		U(0xf)
1014a6784caSJens Wiklander #define CTR_DMINLINE_SHIFT	U(16)
1024a6784caSJens Wiklander #define CTR_DMINLINE_WIDTH	U(4)
103135f53feSJens Wiklander #define CTR_DMINLINE_MASK	(BIT(4) - 1)
1044a6784caSJens Wiklander #define CTR_L1IP_SHIFT		U(14)
1054a6784caSJens Wiklander #define CTR_L1IP_MASK		U(0x3)
1064a6784caSJens Wiklander #define CTR_IMINLINE_SHIFT	U(0)
1074a6784caSJens Wiklander #define CTR_IMINLINE_MASK	U(0xf)
1084a6784caSJens Wiklander #define CTR_WORD_SIZE		U(4)
10915329378SJens Wiklander 
1104a6784caSJens Wiklander #define ARM32_CPSR_MODE_MASK	U(0x1f)
1114a6784caSJens Wiklander #define ARM32_CPSR_MODE_USR	U(0x10)
1124a6784caSJens Wiklander #define ARM32_CPSR_MODE_FIQ	U(0x11)
1134a6784caSJens Wiklander #define ARM32_CPSR_MODE_IRQ	U(0x12)
1144a6784caSJens Wiklander #define ARM32_CPSR_MODE_SVC	U(0x13)
1154a6784caSJens Wiklander #define ARM32_CPSR_MODE_MON	U(0x16)
1164a6784caSJens Wiklander #define ARM32_CPSR_MODE_ABT	U(0x17)
1174a6784caSJens Wiklander #define ARM32_CPSR_MODE_UND	U(0x1b)
1184a6784caSJens Wiklander #define ARM32_CPSR_MODE_SYS	U(0x1f)
119abe38974SJens Wiklander 
120135f53feSJens Wiklander #define ARM32_CPSR_T		BIT(5)
1214a6784caSJens Wiklander #define ARM32_CPSR_F_SHIFT	U(6)
122135f53feSJens Wiklander #define ARM32_CPSR_F		BIT(6)
123135f53feSJens Wiklander #define ARM32_CPSR_I		BIT(7)
124135f53feSJens Wiklander #define ARM32_CPSR_A		BIT(8)
125135f53feSJens Wiklander #define ARM32_CPSR_E		BIT(9)
126abe38974SJens Wiklander #define ARM32_CPSR_FIA		(ARM32_CPSR_F | ARM32_CPSR_I | ARM32_CPSR_A)
127abe38974SJens Wiklander #define ARM32_CPSR_IT_MASK	(ARM32_CPSR_IT_MASK1 | ARM32_CPSR_IT_MASK2)
1284a6784caSJens Wiklander #define ARM32_CPSR_IT_MASK1	U(0x06000000)
1294a6784caSJens Wiklander #define ARM32_CPSR_IT_MASK2	U(0x0000fc00)
130abe38974SJens Wiklander 
1310c07a905SIgor Opaniuk /* ARM Generic timer definitions */
1320c07a905SIgor Opaniuk #define CNTKCTL_PL0PCTEN	BIT(0) /* physical counter el0 access enable */
1330c07a905SIgor Opaniuk #define CNTKCTL_PL0VCTEN	BIT(1) /* virtual counter el0 access enable */
134abe38974SJens Wiklander 
135abe38974SJens Wiklander #ifdef ARM32
136abe38974SJens Wiklander #include <arm32.h>
137abe38974SJens Wiklander #endif
138abe38974SJens Wiklander 
139e0cbf7deSJens Wiklander #ifdef ARM64
140e0cbf7deSJens Wiklander #include <arm64.h>
141e0cbf7deSJens Wiklander #endif
142e0cbf7deSJens Wiklander 
143e19a75cbSJens Wiklander #ifndef __ASSEMBLER__
barrier_read_counter_timer(void)144c6e827c0SJens Wiklander static inline __noprof uint64_t barrier_read_counter_timer(void)
145e19a75cbSJens Wiklander {
146e19a75cbSJens Wiklander 	isb();
147fb19e98eSJens Wiklander #ifdef CFG_CORE_SEL2_SPMC
148fb19e98eSJens Wiklander 	return read_cntvct();
149fb19e98eSJens Wiklander #else
150e19a75cbSJens Wiklander 	return read_cntpct();
151fb19e98eSJens Wiklander #endif
152e19a75cbSJens Wiklander }
15313a1e5cbSRuchika Gupta 
feat_bti_is_implemented(void)15413a1e5cbSRuchika Gupta static inline bool feat_bti_is_implemented(void)
15513a1e5cbSRuchika Gupta {
15613a1e5cbSRuchika Gupta #ifdef ARM32
15713a1e5cbSRuchika Gupta 	return false;
15813a1e5cbSRuchika Gupta #else
15913a1e5cbSRuchika Gupta 	return ((read_id_aa64pfr1_el1() & ID_AA64PFR1_EL1_BT_MASK) ==
16013a1e5cbSRuchika Gupta 		FEAT_BTI_IMPLEMENTED);
16113a1e5cbSRuchika Gupta #endif
16213a1e5cbSRuchika Gupta }
163e8a5e425SRuchika Gupta 
feat_mte_implemented(void)164aa88017cSJens Wiklander static inline unsigned int feat_mte_implemented(void)
165aa88017cSJens Wiklander {
166aa88017cSJens Wiklander #ifdef ARM32
167aa88017cSJens Wiklander 	return 0;
168aa88017cSJens Wiklander #else
169aa88017cSJens Wiklander 	return (read_id_aa64pfr1_el1() >> ID_AA64PFR1_EL1_MTE_SHIFT) &
170aa88017cSJens Wiklander 	       ID_AA64PFR1_EL1_MTE_MASK;
171aa88017cSJens Wiklander #endif
172aa88017cSJens Wiklander }
173aa88017cSJens Wiklander 
feat_pan_implemented(void)174cad31b28SJens Wiklander static inline unsigned int feat_pan_implemented(void)
175cad31b28SJens Wiklander {
176cad31b28SJens Wiklander #ifdef ARM32
177cad31b28SJens Wiklander 	return 0;
178cad31b28SJens Wiklander #else
179cad31b28SJens Wiklander 	return (read_id_aa64mmfr1_el1() >> ID_AA64MMFR1_EL1_PAN_SHIFT) &
180cad31b28SJens Wiklander 	       ID_AA64MMFR1_EL1_PAN_MASK;
181cad31b28SJens Wiklander #endif
182cad31b28SJens Wiklander }
183cad31b28SJens Wiklander 
feat_crc32_implemented(void)184d4351c1eSBalint Dobszay static inline bool feat_crc32_implemented(void)
185d4351c1eSBalint Dobszay {
186d4351c1eSBalint Dobszay #ifdef ARM32
187a0635f17SIgor Opaniuk 	return read_id_isar5() & ID_ISAR5_CRC32;
188d4351c1eSBalint Dobszay #else
189443b5e01SIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_CRC32;
190d4351c1eSBalint Dobszay #endif
191d4351c1eSBalint Dobszay }
192d4351c1eSBalint Dobszay 
feat_aes_implemented(void)193f73f678cSIgor Opaniuk static inline bool feat_aes_implemented(void)
194f73f678cSIgor Opaniuk {
195f73f678cSIgor Opaniuk #ifdef ARM32
196f73f678cSIgor Opaniuk 	return read_id_isar5() & ID_ISAR5_AES;
197f73f678cSIgor Opaniuk #else
198f73f678cSIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_AES;
199f73f678cSIgor Opaniuk #endif
200f73f678cSIgor Opaniuk }
201f73f678cSIgor Opaniuk 
feat_sha1_implemented(void)202f73f678cSIgor Opaniuk static inline bool feat_sha1_implemented(void)
203f73f678cSIgor Opaniuk {
204f73f678cSIgor Opaniuk #ifdef ARM32
205f73f678cSIgor Opaniuk 	return read_id_isar5() & ID_ISAR5_SHA1;
206f73f678cSIgor Opaniuk #else
207f73f678cSIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_SHA1;
208f73f678cSIgor Opaniuk #endif
209f73f678cSIgor Opaniuk }
210f73f678cSIgor Opaniuk 
feat_sha256_implemented(void)211f73f678cSIgor Opaniuk static inline bool feat_sha256_implemented(void)
212f73f678cSIgor Opaniuk {
213f73f678cSIgor Opaniuk #ifdef ARM32
214f73f678cSIgor Opaniuk 	return read_id_isar5() & ID_ISAR5_SHA2;
215f73f678cSIgor Opaniuk #else
216f73f678cSIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_SHA2;
217f73f678cSIgor Opaniuk #endif
218f73f678cSIgor Opaniuk }
219f73f678cSIgor Opaniuk 
feat_sha512_implemented(void)220f73f678cSIgor Opaniuk static inline bool feat_sha512_implemented(void)
221f73f678cSIgor Opaniuk {
222f73f678cSIgor Opaniuk #ifdef ARM32
223f73f678cSIgor Opaniuk 	return false;
224f73f678cSIgor Opaniuk #else
225f73f678cSIgor Opaniuk 	return ((read_id_aa64isar0_el1() & ID_AA64ISAR0_SHA2) >>
226f73f678cSIgor Opaniuk 		ID_AA64ISAR0_SHA2_SHIFT) == ID_AA64ISAR0_SHA2_FEAT_SHA512;
227f73f678cSIgor Opaniuk #endif
228f73f678cSIgor Opaniuk }
229f73f678cSIgor Opaniuk 
feat_sha3_implemented(void)230f73f678cSIgor Opaniuk static inline bool feat_sha3_implemented(void)
231f73f678cSIgor Opaniuk {
232f73f678cSIgor Opaniuk #ifdef ARM32
233f73f678cSIgor Opaniuk 	return false;
234f73f678cSIgor Opaniuk #else
235f73f678cSIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_SHA3;
236f73f678cSIgor Opaniuk #endif
237f73f678cSIgor Opaniuk }
238f73f678cSIgor Opaniuk 
feat_sm3_implemented(void)239f73f678cSIgor Opaniuk static inline bool feat_sm3_implemented(void)
240f73f678cSIgor Opaniuk {
241f73f678cSIgor Opaniuk #ifdef ARM32
242f73f678cSIgor Opaniuk 	return false;
243f73f678cSIgor Opaniuk #else
244f73f678cSIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_SM3;
245f73f678cSIgor Opaniuk #endif
246f73f678cSIgor Opaniuk }
247f73f678cSIgor Opaniuk 
feat_sm4_implemented(void)248f73f678cSIgor Opaniuk static inline bool feat_sm4_implemented(void)
249f73f678cSIgor Opaniuk {
250f73f678cSIgor Opaniuk #ifdef ARM32
251f73f678cSIgor Opaniuk 	return false;
252f73f678cSIgor Opaniuk #else
253f73f678cSIgor Opaniuk 	return read_id_aa64isar0_el1() & ID_AA64ISAR0_SM4;
254f73f678cSIgor Opaniuk #endif
255f73f678cSIgor Opaniuk }
256f73f678cSIgor Opaniuk 
feat_pauth_is_implemented(void)257e8a5e425SRuchika Gupta static inline bool feat_pauth_is_implemented(void)
258e8a5e425SRuchika Gupta {
259e8a5e425SRuchika Gupta #ifdef ARM32
260e8a5e425SRuchika Gupta 	return false;
261e8a5e425SRuchika Gupta #else
262e8a5e425SRuchika Gupta 	uint64_t mask =
263e8a5e425SRuchika Gupta 		SHIFT_U64(ID_AA64ISAR1_GPI_MASK, ID_AA64ISAR1_GPI_SHIFT) |
264e8a5e425SRuchika Gupta 		SHIFT_U64(ID_AA64ISAR1_GPA_MASK, ID_AA64ISAR1_GPA_SHIFT) |
265e8a5e425SRuchika Gupta 		SHIFT_U64(ID_AA64ISAR1_API_MASK, ID_AA64ISAR1_API_SHIFT) |
266e8a5e425SRuchika Gupta 		SHIFT_U64(ID_AA64ISAR1_APA_MASK, ID_AA64ISAR1_APA_SHIFT);
267e8a5e425SRuchika Gupta 
268e8a5e425SRuchika Gupta 	/* If any of the fields is not zero, PAuth is implemented by arch */
269e8a5e425SRuchika Gupta 	return (read_id_aa64isar1_el1() & mask) != 0U;
270e8a5e425SRuchika Gupta #endif
271e8a5e425SRuchika Gupta }
272e8a5e425SRuchika Gupta 
273e19a75cbSJens Wiklander #endif
274e19a75cbSJens Wiklander 
275d50fee03SEtienne Carriere #endif /*__ARM_H*/
276