xref: /openbmc/linux/arch/arm/include/asm/fpstate.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
24baa9922SRussell King /*
34baa9922SRussell King  *  arch/arm/include/asm/fpstate.h
44baa9922SRussell King  *
54baa9922SRussell King  *  Copyright (C) 1995 Russell King
64baa9922SRussell King  */
74baa9922SRussell King 
84baa9922SRussell King #ifndef __ASM_ARM_FPSTATE_H
94baa9922SRussell King #define __ASM_ARM_FPSTATE_H
104baa9922SRussell King 
114baa9922SRussell King 
124baa9922SRussell King #ifndef __ASSEMBLY__
134baa9922SRussell King 
144baa9922SRussell King /*
154baa9922SRussell King  * VFP storage area has:
164baa9922SRussell King  *  - FPEXC, FPSCR, FPINST and FPINST2.
174baa9922SRussell King  *  - 16 or 32 double precision data registers
1825985edcSLucas De Marchi  *  - an implementation-dependent word of state for FLDMX/FSTMX (pre-ARMv6)
194baa9922SRussell King  *
204baa9922SRussell King  *  FPEXC will always be non-zero once the VFP has been used in this process.
214baa9922SRussell King  */
224baa9922SRussell King 
234baa9922SRussell King struct vfp_hard_struct {
244baa9922SRussell King #ifdef CONFIG_VFPv3
254baa9922SRussell King 	__u64 fpregs[32];
264baa9922SRussell King #else
274baa9922SRussell King 	__u64 fpregs[16];
284baa9922SRussell King #endif
294baa9922SRussell King #if __LINUX_ARM_ARCH__ < 6
304baa9922SRussell King 	__u32 fpmx_state;
314baa9922SRussell King #endif
324baa9922SRussell King 	__u32 fpexc;
334baa9922SRussell King 	__u32 fpscr;
344baa9922SRussell King 	/*
354baa9922SRussell King 	 * VFP implementation specific state
364baa9922SRussell King 	 */
374baa9922SRussell King 	__u32 fpinst;
384baa9922SRussell King 	__u32 fpinst2;
394baa9922SRussell King 
404baa9922SRussell King #ifdef CONFIG_SMP
414baa9922SRussell King 	__u32 cpu;
424baa9922SRussell King #endif
434baa9922SRussell King };
444baa9922SRussell King 
454baa9922SRussell King union vfp_state {
464baa9922SRussell King 	struct vfp_hard_struct	hard;
474baa9922SRussell King };
484baa9922SRussell King 
494baa9922SRussell King #define FP_HARD_SIZE 35
504baa9922SRussell King 
514baa9922SRussell King struct fp_hard_struct {
524baa9922SRussell King 	unsigned int save[FP_HARD_SIZE];		/* as yet undefined */
534baa9922SRussell King };
544baa9922SRussell King 
554baa9922SRussell King #define FP_SOFT_SIZE 35
564baa9922SRussell King 
574baa9922SRussell King struct fp_soft_struct {
584baa9922SRussell King 	unsigned int save[FP_SOFT_SIZE];		/* undefined information */
594baa9922SRussell King };
604baa9922SRussell King 
614baa9922SRussell King #define IWMMXT_SIZE	0x98
624baa9922SRussell King 
634baa9922SRussell King struct iwmmxt_struct {
644baa9922SRussell King 	unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)];
654baa9922SRussell King };
664baa9922SRussell King 
674baa9922SRussell King union fp_state {
684baa9922SRussell King 	struct fp_hard_struct	hard;
694baa9922SRussell King 	struct fp_soft_struct	soft;
704baa9922SRussell King #ifdef CONFIG_IWMMXT
714baa9922SRussell King 	struct iwmmxt_struct	iwmmxt;
724baa9922SRussell King #endif
734baa9922SRussell King };
744baa9922SRussell King 
754baa9922SRussell King #define FP_SIZE (sizeof(union fp_state) / sizeof(int))
764baa9922SRussell King 
774baa9922SRussell King #endif
784baa9922SRussell King 
794baa9922SRussell King #endif
80