1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. 4 */ 5 6 #ifndef SVE_H 7 #define SVE_H 8 9 #include <arch.h> 10 #include <utils_def.h> 11 12 /* 13 * SVE vector length in bytes and derived values 14 */ 15 #define SVE_VLA_ZCR_LEN_BITS UL(4) 16 #define SVE_VLA_LEN_MAX (UL(1) << SVE_VLA_ZCR_LEN_BITS) 17 #define SVE_VLA_ZCR_LEN_MAX (SVE_VLA_LEN_MAX - UL(1)) 18 #define SVE_VLA_VL_MIN UL(16) 19 #define SVE_VLA_VL_MAX (SVE_VLA_VL_MIN * SVE_VLA_LEN_MAX) 20 #define SVE_VLA_Z_REGS_MAX UL(32) 21 #define SVE_VLA_P_REGS_MAX UL(16) 22 #define SVE_VLA_FFR_REGS_MAX UL(1) 23 #define SVE_VLA_Z_LEN_MAX (SVE_VLA_VL_MAX * SVE_VLA_Z_REGS_MAX) 24 #define SVE_VLA_P_LEN_MAX ((SVE_VLA_VL_MAX * SVE_VLA_P_REGS_MAX) >> UL(3)) 25 #define SVE_VLA_FFR_LEN_MAX ((SVE_VLA_VL_MAX * SVE_VLA_FFR_REGS_MAX) >> \ 26 UL(3)) 27 #define SVE_ZCR_FP_REGS_NUM UL(4) 28 29 #ifndef __ASSEMBLER__ 30 31 /* 32 * SVE context structure. Align on cache writeback granule to minimise cache line 33 * thashing when allocated as an array for use by each CPU. 34 */ 35 struct sve_state { 36 unsigned long zcr_fpu[SVE_ZCR_FP_REGS_NUM]; 37 unsigned char z[SVE_VLA_Z_LEN_MAX]; 38 unsigned char p_ffr[SVE_VLA_P_LEN_MAX + SVE_VLA_FFR_LEN_MAX]; 39 } __attribute__((aligned(CACHE_WRITEBACK_GRANULE))); 40 41 void save_sve_zcr_fpu_state(unsigned long *data); 42 void save_sve_z_state(unsigned char *data); 43 void save_sve_p_ffr_state(unsigned char *data); 44 45 void restore_sve_zcr_fpu_state(unsigned long *data); 46 void restore_sve_z_state(unsigned char *data); 47 void restore_sve_p_ffr_state(unsigned char *data); 48 49 void save_sve_state(struct sve_state *sve); 50 void restore_sve_state(struct sve_state *sve); 51 52 #endif /* __ASSEMBLER__ */ 53 54 #endif /* __SVE_H_ */ 55