xref: /kvmtool/arm/aarch64/include/asm/sve_context.h (revision 85aaadf64649698c3eb2cfbc8df81d0880141744)
166b24a33SWill Deacon /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
266b24a33SWill Deacon /* Copyright (C) 2017-2018 ARM Limited */
366b24a33SWill Deacon 
466b24a33SWill Deacon /*
566b24a33SWill Deacon  * For use by other UAPI headers only.
666b24a33SWill Deacon  * Do not make direct use of header or its definitions.
766b24a33SWill Deacon  */
866b24a33SWill Deacon 
966b24a33SWill Deacon #ifndef _UAPI__ASM_SVE_CONTEXT_H
1066b24a33SWill Deacon #define _UAPI__ASM_SVE_CONTEXT_H
1166b24a33SWill Deacon 
1266b24a33SWill Deacon #include <linux/types.h>
1366b24a33SWill Deacon 
1466b24a33SWill Deacon #define __SVE_VQ_BYTES		16	/* number of bytes per quadword */
1566b24a33SWill Deacon 
16*85aaadf6SAnup Patel /*
17*85aaadf6SAnup Patel  * Yes, __SVE_VQ_MAX is 512 QUADWORDS.
18*85aaadf6SAnup Patel  *
19*85aaadf6SAnup Patel  * To help ensure forward portability, this is much larger than the
20*85aaadf6SAnup Patel  * current maximum value defined by the SVE architecture.  While arrays
21*85aaadf6SAnup Patel  * or static allocations can be sized based on this value, watch out!
22*85aaadf6SAnup Patel  * It will waste a surprisingly large amount of memory.
23*85aaadf6SAnup Patel  *
24*85aaadf6SAnup Patel  * Dynamic sizing based on the actual runtime vector length is likely to
25*85aaadf6SAnup Patel  * be preferable for most purposes.
26*85aaadf6SAnup Patel  */
2766b24a33SWill Deacon #define __SVE_VQ_MIN		1
2866b24a33SWill Deacon #define __SVE_VQ_MAX		512
2966b24a33SWill Deacon 
3066b24a33SWill Deacon #define __SVE_VL_MIN		(__SVE_VQ_MIN * __SVE_VQ_BYTES)
3166b24a33SWill Deacon #define __SVE_VL_MAX		(__SVE_VQ_MAX * __SVE_VQ_BYTES)
3266b24a33SWill Deacon 
3366b24a33SWill Deacon #define __SVE_NUM_ZREGS		32
3466b24a33SWill Deacon #define __SVE_NUM_PREGS		16
3566b24a33SWill Deacon 
3666b24a33SWill Deacon #define __sve_vl_valid(vl)			\
3766b24a33SWill Deacon 	((vl) % __SVE_VQ_BYTES == 0 &&		\
3866b24a33SWill Deacon 	 (vl) >= __SVE_VL_MIN &&		\
3966b24a33SWill Deacon 	 (vl) <= __SVE_VL_MAX)
4066b24a33SWill Deacon 
4166b24a33SWill Deacon #define __sve_vq_from_vl(vl)	((vl) / __SVE_VQ_BYTES)
4266b24a33SWill Deacon #define __sve_vl_from_vq(vq)	((vq) * __SVE_VQ_BYTES)
4366b24a33SWill Deacon 
4466b24a33SWill Deacon #define __SVE_ZREG_SIZE(vq)	((__u32)(vq) * __SVE_VQ_BYTES)
4566b24a33SWill Deacon #define __SVE_PREG_SIZE(vq)	((__u32)(vq) * (__SVE_VQ_BYTES / 8))
4666b24a33SWill Deacon #define __SVE_FFR_SIZE(vq)	__SVE_PREG_SIZE(vq)
4766b24a33SWill Deacon 
4866b24a33SWill Deacon #define __SVE_ZREGS_OFFSET	0
4966b24a33SWill Deacon #define __SVE_ZREG_OFFSET(vq, n) \
5066b24a33SWill Deacon 	(__SVE_ZREGS_OFFSET + __SVE_ZREG_SIZE(vq) * (n))
5166b24a33SWill Deacon #define __SVE_ZREGS_SIZE(vq) \
5266b24a33SWill Deacon 	(__SVE_ZREG_OFFSET(vq, __SVE_NUM_ZREGS) - __SVE_ZREGS_OFFSET)
5366b24a33SWill Deacon 
5466b24a33SWill Deacon #define __SVE_PREGS_OFFSET(vq) \
5566b24a33SWill Deacon 	(__SVE_ZREGS_OFFSET + __SVE_ZREGS_SIZE(vq))
5666b24a33SWill Deacon #define __SVE_PREG_OFFSET(vq, n) \
5766b24a33SWill Deacon 	(__SVE_PREGS_OFFSET(vq) + __SVE_PREG_SIZE(vq) * (n))
5866b24a33SWill Deacon #define __SVE_PREGS_SIZE(vq) \
5966b24a33SWill Deacon 	(__SVE_PREG_OFFSET(vq, __SVE_NUM_PREGS) - __SVE_PREGS_OFFSET(vq))
6066b24a33SWill Deacon 
6166b24a33SWill Deacon #define __SVE_FFR_OFFSET(vq) \
6266b24a33SWill Deacon 	(__SVE_PREGS_OFFSET(vq) + __SVE_PREGS_SIZE(vq))
6366b24a33SWill Deacon 
6466b24a33SWill Deacon #endif /* ! _UAPI__ASM_SVE_CONTEXT_H */
65