162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  arch/arm/include/asm/fpstate.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1995 Russell King
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __ASM_ARM_FPSTATE_H
962306a36Sopenharmony_ci#define __ASM_ARM_FPSTATE_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef __ASSEMBLY__
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * VFP storage area has:
1662306a36Sopenharmony_ci *  - FPEXC, FPSCR, FPINST and FPINST2.
1762306a36Sopenharmony_ci *  - 16 or 32 double precision data registers
1862306a36Sopenharmony_ci *  - an implementation-dependent word of state for FLDMX/FSTMX (pre-ARMv6)
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci *  FPEXC will always be non-zero once the VFP has been used in this process.
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct vfp_hard_struct {
2462306a36Sopenharmony_ci#ifdef CONFIG_VFPv3
2562306a36Sopenharmony_ci	__u64 fpregs[32];
2662306a36Sopenharmony_ci#else
2762306a36Sopenharmony_ci	__u64 fpregs[16];
2862306a36Sopenharmony_ci#endif
2962306a36Sopenharmony_ci#if __LINUX_ARM_ARCH__ < 6
3062306a36Sopenharmony_ci	__u32 fpmx_state;
3162306a36Sopenharmony_ci#endif
3262306a36Sopenharmony_ci	__u32 fpexc;
3362306a36Sopenharmony_ci	__u32 fpscr;
3462306a36Sopenharmony_ci	/*
3562306a36Sopenharmony_ci	 * VFP implementation specific state
3662306a36Sopenharmony_ci	 */
3762306a36Sopenharmony_ci	__u32 fpinst;
3862306a36Sopenharmony_ci	__u32 fpinst2;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#ifdef CONFIG_SMP
4162306a36Sopenharmony_ci	__u32 cpu;
4262306a36Sopenharmony_ci#endif
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciunion vfp_state {
4662306a36Sopenharmony_ci	struct vfp_hard_struct	hard;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define FP_HARD_SIZE 35
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct fp_hard_struct {
5262306a36Sopenharmony_ci	unsigned int save[FP_HARD_SIZE];		/* as yet undefined */
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define FP_SOFT_SIZE 35
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct fp_soft_struct {
5862306a36Sopenharmony_ci	unsigned int save[FP_SOFT_SIZE];		/* undefined information */
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define IWMMXT_SIZE	0x98
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct iwmmxt_struct {
6462306a36Sopenharmony_ci	unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)];
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciunion fp_state {
6862306a36Sopenharmony_ci	struct fp_hard_struct	hard;
6962306a36Sopenharmony_ci	struct fp_soft_struct	soft;
7062306a36Sopenharmony_ci#ifdef CONFIG_IWMMXT
7162306a36Sopenharmony_ci	struct iwmmxt_struct	iwmmxt;
7262306a36Sopenharmony_ci#endif
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define FP_SIZE (sizeof(union fp_state) / sizeof(int))
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#endif
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#endif
80