xref: /rk3399_ARM-atf/include/lib/el3_runtime/simd_ctx.h (revision 46aff6fc60a62ea9b27301f40a835c97c7c6e657)
1841533ddSMadhukar Pappireddy /*
2*34a22a02SBoyan Karatotev  * Copyright (c) 2024-2025, Arm Limited and Contributors. All rights reserved.
3841533ddSMadhukar Pappireddy  * Copyright (c) 2022, Google LLC. All rights reserved.
4841533ddSMadhukar Pappireddy  *
5841533ddSMadhukar Pappireddy  * SPDX-License-Identifier: BSD-3-Clause
6841533ddSMadhukar Pappireddy  */
7841533ddSMadhukar Pappireddy 
8841533ddSMadhukar Pappireddy #ifndef SIMD_CTX_H
9841533ddSMadhukar Pappireddy #define SIMD_CTX_H
10841533ddSMadhukar Pappireddy 
11*34a22a02SBoyan Karatotev #include <stdbool.h>
12*34a22a02SBoyan Karatotev #include <lib/cassert.h>
13*34a22a02SBoyan Karatotev #include <lib/utils_def.h>
14*34a22a02SBoyan Karatotev 
15841533ddSMadhukar Pappireddy /*******************************************************************************
16841533ddSMadhukar Pappireddy  * Constants that allow assembler code to access members of and the 'simd_context'
17841533ddSMadhukar Pappireddy  * structure at their correct offsets.
18841533ddSMadhukar Pappireddy  ******************************************************************************/
19841533ddSMadhukar Pappireddy 
2042422622SMadhukar Pappireddy #if CTX_INCLUDE_FPREGS || CTX_INCLUDE_SVE_REGS
2142422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS
2242422622SMadhukar Pappireddy #define SIMD_VECTOR_LEN_BYTES	(SVE_VECTOR_LEN / 8) /* Length of vector in bytes */
2342422622SMadhukar Pappireddy #elif CTX_INCLUDE_FPREGS
24841533ddSMadhukar Pappireddy #define SIMD_VECTOR_LEN_BYTES	U(16) /* 128 bits fixed vector length for FPU */
2542422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_SVE_REGS */
26841533ddSMadhukar Pappireddy 
27841533ddSMadhukar Pappireddy #define CTX_SIMD_VECTORS	U(0)
28841533ddSMadhukar Pappireddy /* there are 32 vector registers, each of size SIMD_VECTOR_LEN_BYTES */
29841533ddSMadhukar Pappireddy #define CTX_SIMD_FPSR		(CTX_SIMD_VECTORS + (32 * SIMD_VECTOR_LEN_BYTES))
30841533ddSMadhukar Pappireddy #define CTX_SIMD_FPCR		(CTX_SIMD_FPSR + 8)
31841533ddSMadhukar Pappireddy 
3242422622SMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS
33841533ddSMadhukar Pappireddy #define CTX_SIMD_FPEXC32	(CTX_SIMD_FPCR + 8)
3442422622SMadhukar Pappireddy #define CTX_SIMD_PREDICATES	(CTX_SIMD_FPEXC32 + 16)
3542422622SMadhukar Pappireddy #else
3642422622SMadhukar Pappireddy #define CTX_SIMD_PREDICATES      (CTX_SIMD_FPCR + 8)
3742422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS */
3842422622SMadhukar Pappireddy 
3942422622SMadhukar Pappireddy /*
4042422622SMadhukar Pappireddy  * Each predicate register is 1/8th the size of a vector register and there are 16
4142422622SMadhukar Pappireddy  * predicate registers
4242422622SMadhukar Pappireddy  */
4342422622SMadhukar Pappireddy #define CTX_SIMD_FFR		(CTX_SIMD_PREDICATES + (16 * (SIMD_VECTOR_LEN_BYTES / 8)))
44841533ddSMadhukar Pappireddy 
45841533ddSMadhukar Pappireddy #ifndef __ASSEMBLER__
46841533ddSMadhukar Pappireddy 
47841533ddSMadhukar Pappireddy #include <stdint.h>
48841533ddSMadhukar Pappireddy #include <lib/cassert.h>
49841533ddSMadhukar Pappireddy 
50841533ddSMadhukar Pappireddy /*
51841533ddSMadhukar Pappireddy  * Please don't change order of fields in this struct as that may violate
52841533ddSMadhukar Pappireddy  * alignment requirements and affect how assembly code accesses members of this
53841533ddSMadhukar Pappireddy  * struct.
54841533ddSMadhukar Pappireddy  */
55841533ddSMadhukar Pappireddy typedef struct {
56841533ddSMadhukar Pappireddy 	uint8_t vectors[32][SIMD_VECTOR_LEN_BYTES];
57841533ddSMadhukar Pappireddy 	uint8_t fpsr[8];
58841533ddSMadhukar Pappireddy 	uint8_t fpcr[8];
59841533ddSMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS
6042422622SMadhukar Pappireddy 	/* 16 bytes to align to next 16 byte boundary when CTX_INCLUDE_SVE_REGS is 0 */
61841533ddSMadhukar Pappireddy 	uint8_t fpexc32_el2[16];
62841533ddSMadhukar Pappireddy #endif
6342422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS
6442422622SMadhukar Pappireddy 	/* FFR and each of predicates is one-eigth of the SVE vector length */
6542422622SMadhukar Pappireddy 	uint8_t predicates[16][SIMD_VECTOR_LEN_BYTES / 8];
6642422622SMadhukar Pappireddy 	uint8_t ffr[SIMD_VECTOR_LEN_BYTES / 8];
6742422622SMadhukar Pappireddy 	/* SMCCCv1.3 FID[16] hint bit state recorded on EL3 entry */
6842422622SMadhukar Pappireddy 	bool hint;
6942422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_SVE_REGS */
7042422622SMadhukar Pappireddy } __aligned(16) simd_regs_t;
71841533ddSMadhukar Pappireddy 
72841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_VECTORS == __builtin_offsetof(simd_regs_t, vectors),
73841533ddSMadhukar Pappireddy 		assert_vectors_mismatch);
74841533ddSMadhukar Pappireddy 
75841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPSR == __builtin_offsetof(simd_regs_t, fpsr),
76841533ddSMadhukar Pappireddy 		assert_fpsr_mismatch);
77841533ddSMadhukar Pappireddy 
78841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPCR == __builtin_offsetof(simd_regs_t, fpcr),
79841533ddSMadhukar Pappireddy 		assert_fpcr_mismatch);
80841533ddSMadhukar Pappireddy 
81841533ddSMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS
82841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPEXC32 == __builtin_offsetof(simd_regs_t, fpexc32_el2),
83841533ddSMadhukar Pappireddy 		assert_fpex32_mismtatch);
84841533ddSMadhukar Pappireddy #endif
85841533ddSMadhukar Pappireddy 
8642422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS
8742422622SMadhukar Pappireddy CASSERT(CTX_SIMD_PREDICATES == __builtin_offsetof(simd_regs_t, predicates),
8842422622SMadhukar Pappireddy 		assert_predicates_mismatch);
8942422622SMadhukar Pappireddy 
9042422622SMadhukar Pappireddy CASSERT(CTX_SIMD_FFR == __builtin_offsetof(simd_regs_t, ffr),
9142422622SMadhukar Pappireddy 		assert_ffr_mismatch);
9242422622SMadhukar Pappireddy #endif
9342422622SMadhukar Pappireddy 
94841533ddSMadhukar Pappireddy void simd_ctx_save(uint32_t security_state, bool hint_sve);
95841533ddSMadhukar Pappireddy void simd_ctx_restore(uint32_t security_state);
96841533ddSMadhukar Pappireddy 
97841533ddSMadhukar Pappireddy #endif /* __ASSEMBLER__ */
98841533ddSMadhukar Pappireddy 
9942422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_FPREGS || CTX_INCLUDE_SVE_REGS */
100841533ddSMadhukar Pappireddy 
101841533ddSMadhukar Pappireddy #endif /* SIMD_CTX_H */
102