18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * spu_csa.h: Definitions for SPU context save area (CSA).
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * (C) Copyright IBM 2005
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Mark Nutter <mnutter@us.ibm.com>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef _SPU_CSA_H_
118c2ecf20Sopenharmony_ci#define _SPU_CSA_H_
128c2ecf20Sopenharmony_ci#ifdef __KERNEL__
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci/*
158c2ecf20Sopenharmony_ci * Total number of 128-bit registers.
168c2ecf20Sopenharmony_ci */
178c2ecf20Sopenharmony_ci#define NR_SPU_GPRS         	128
188c2ecf20Sopenharmony_ci#define NR_SPU_SPRS         	9
198c2ecf20Sopenharmony_ci#define NR_SPU_REGS_PAD	    	7
208c2ecf20Sopenharmony_ci#define NR_SPU_SPILL_REGS   	144	/* GPRS + SPRS + PAD */
218c2ecf20Sopenharmony_ci#define SIZEOF_SPU_SPILL_REGS	NR_SPU_SPILL_REGS * 16
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#define SPU_SAVE_COMPLETE      	0x3FFB
248c2ecf20Sopenharmony_ci#define SPU_RESTORE_COMPLETE   	0x3FFC
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/*
278c2ecf20Sopenharmony_ci * Definitions for various 'stopped' status conditions,
288c2ecf20Sopenharmony_ci * to be recreated during context restore.
298c2ecf20Sopenharmony_ci */
308c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_P    1
318c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_I    2
328c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_H    3
338c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_S    4
348c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_S_I  5
358c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_S_P  6
368c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_P_H  7
378c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_P_I  8
388c2ecf20Sopenharmony_ci#define SPU_STOPPED_STATUS_R    9
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/*
418c2ecf20Sopenharmony_ci * Definitions for software decrementer status flag.
428c2ecf20Sopenharmony_ci */
438c2ecf20Sopenharmony_ci#define SPU_DECR_STATUS_RUNNING 0x1
448c2ecf20Sopenharmony_ci#define SPU_DECR_STATUS_WRAPPED 0x2
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#ifndef  __ASSEMBLY__
478c2ecf20Sopenharmony_ci/**
488c2ecf20Sopenharmony_ci * spu_reg128 - generic 128-bit register definition.
498c2ecf20Sopenharmony_ci */
508c2ecf20Sopenharmony_cistruct spu_reg128 {
518c2ecf20Sopenharmony_ci	u32 slot[4];
528c2ecf20Sopenharmony_ci};
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci/**
558c2ecf20Sopenharmony_ci * struct spu_lscsa - Local Store Context Save Area.
568c2ecf20Sopenharmony_ci * @gprs: Array of saved registers.
578c2ecf20Sopenharmony_ci * @fpcr: Saved floating point status control register.
588c2ecf20Sopenharmony_ci * @decr: Saved decrementer value.
598c2ecf20Sopenharmony_ci * @decr_status: Indicates software decrementer status flags.
608c2ecf20Sopenharmony_ci * @ppu_mb: Saved PPU mailbox data.
618c2ecf20Sopenharmony_ci * @ppuint_mb: Saved PPU interrupting mailbox data.
628c2ecf20Sopenharmony_ci * @tag_mask: Saved tag group mask.
638c2ecf20Sopenharmony_ci * @event_mask: Saved event mask.
648c2ecf20Sopenharmony_ci * @srr0: Saved SRR0.
658c2ecf20Sopenharmony_ci * @stopped_status: Conditions to be recreated by restore.
668c2ecf20Sopenharmony_ci * @ls: Saved contents of Local Storage Area.
678c2ecf20Sopenharmony_ci *
688c2ecf20Sopenharmony_ci * The LSCSA represents state that is primarily saved and
698c2ecf20Sopenharmony_ci * restored by SPU-side code.
708c2ecf20Sopenharmony_ci */
718c2ecf20Sopenharmony_cistruct spu_lscsa {
728c2ecf20Sopenharmony_ci	struct spu_reg128 gprs[128];
738c2ecf20Sopenharmony_ci	struct spu_reg128 fpcr;
748c2ecf20Sopenharmony_ci	struct spu_reg128 decr;
758c2ecf20Sopenharmony_ci	struct spu_reg128 decr_status;
768c2ecf20Sopenharmony_ci	struct spu_reg128 ppu_mb;
778c2ecf20Sopenharmony_ci	struct spu_reg128 ppuint_mb;
788c2ecf20Sopenharmony_ci	struct spu_reg128 tag_mask;
798c2ecf20Sopenharmony_ci	struct spu_reg128 event_mask;
808c2ecf20Sopenharmony_ci	struct spu_reg128 srr0;
818c2ecf20Sopenharmony_ci	struct spu_reg128 stopped_status;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	/*
848c2ecf20Sopenharmony_ci	 * 'ls' must be page-aligned on all configurations.
858c2ecf20Sopenharmony_ci	 * Since we don't want to rely on having the spu-gcc
868c2ecf20Sopenharmony_ci	 * installed to build the kernel and this structure
878c2ecf20Sopenharmony_ci	 * is used in the SPU-side code, make it 64k-page
888c2ecf20Sopenharmony_ci	 * aligned for now.
898c2ecf20Sopenharmony_ci	 */
908c2ecf20Sopenharmony_ci	unsigned char ls[LS_SIZE] __attribute__((aligned(65536)));
918c2ecf20Sopenharmony_ci};
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci#ifndef __SPU__
948c2ecf20Sopenharmony_ci/*
958c2ecf20Sopenharmony_ci * struct spu_problem_collapsed - condensed problem state area, w/o pads.
968c2ecf20Sopenharmony_ci */
978c2ecf20Sopenharmony_cistruct spu_problem_collapsed {
988c2ecf20Sopenharmony_ci	u64 spc_mssync_RW;
998c2ecf20Sopenharmony_ci	u32 mfc_lsa_W;
1008c2ecf20Sopenharmony_ci	u32 unused_pad0;
1018c2ecf20Sopenharmony_ci	u64 mfc_ea_W;
1028c2ecf20Sopenharmony_ci	union mfc_tag_size_class_cmd mfc_union_W;
1038c2ecf20Sopenharmony_ci	u32 dma_qstatus_R;
1048c2ecf20Sopenharmony_ci	u32 dma_querytype_RW;
1058c2ecf20Sopenharmony_ci	u32 dma_querymask_RW;
1068c2ecf20Sopenharmony_ci	u32 dma_tagstatus_R;
1078c2ecf20Sopenharmony_ci	u32 pu_mb_R;
1088c2ecf20Sopenharmony_ci	u32 spu_mb_W;
1098c2ecf20Sopenharmony_ci	u32 mb_stat_R;
1108c2ecf20Sopenharmony_ci	u32 spu_runcntl_RW;
1118c2ecf20Sopenharmony_ci	u32 spu_status_R;
1128c2ecf20Sopenharmony_ci	u32 spu_spc_R;
1138c2ecf20Sopenharmony_ci	u32 spu_npc_RW;
1148c2ecf20Sopenharmony_ci	u32 signal_notify1;
1158c2ecf20Sopenharmony_ci	u32 signal_notify2;
1168c2ecf20Sopenharmony_ci	u32 unused_pad1;
1178c2ecf20Sopenharmony_ci};
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci/*
1208c2ecf20Sopenharmony_ci * struct spu_priv1_collapsed - condensed privileged 1 area, w/o pads.
1218c2ecf20Sopenharmony_ci */
1228c2ecf20Sopenharmony_cistruct spu_priv1_collapsed {
1238c2ecf20Sopenharmony_ci	u64 mfc_sr1_RW;
1248c2ecf20Sopenharmony_ci	u64 mfc_lpid_RW;
1258c2ecf20Sopenharmony_ci	u64 spu_idr_RW;
1268c2ecf20Sopenharmony_ci	u64 mfc_vr_RO;
1278c2ecf20Sopenharmony_ci	u64 spu_vr_RO;
1288c2ecf20Sopenharmony_ci	u64 int_mask_class0_RW;
1298c2ecf20Sopenharmony_ci	u64 int_mask_class1_RW;
1308c2ecf20Sopenharmony_ci	u64 int_mask_class2_RW;
1318c2ecf20Sopenharmony_ci	u64 int_stat_class0_RW;
1328c2ecf20Sopenharmony_ci	u64 int_stat_class1_RW;
1338c2ecf20Sopenharmony_ci	u64 int_stat_class2_RW;
1348c2ecf20Sopenharmony_ci	u64 int_route_RW;
1358c2ecf20Sopenharmony_ci	u64 mfc_atomic_flush_RW;
1368c2ecf20Sopenharmony_ci	u64 resource_allocation_groupID_RW;
1378c2ecf20Sopenharmony_ci	u64 resource_allocation_enable_RW;
1388c2ecf20Sopenharmony_ci	u64 mfc_fir_R;
1398c2ecf20Sopenharmony_ci	u64 mfc_fir_status_or_W;
1408c2ecf20Sopenharmony_ci	u64 mfc_fir_status_and_W;
1418c2ecf20Sopenharmony_ci	u64 mfc_fir_mask_R;
1428c2ecf20Sopenharmony_ci	u64 mfc_fir_mask_or_W;
1438c2ecf20Sopenharmony_ci	u64 mfc_fir_mask_and_W;
1448c2ecf20Sopenharmony_ci	u64 mfc_fir_chkstp_enable_RW;
1458c2ecf20Sopenharmony_ci	u64 smf_sbi_signal_sel;
1468c2ecf20Sopenharmony_ci	u64 smf_ato_signal_sel;
1478c2ecf20Sopenharmony_ci	u64 tlb_index_hint_RO;
1488c2ecf20Sopenharmony_ci	u64 tlb_index_W;
1498c2ecf20Sopenharmony_ci	u64 tlb_vpn_RW;
1508c2ecf20Sopenharmony_ci	u64 tlb_rpn_RW;
1518c2ecf20Sopenharmony_ci	u64 tlb_invalidate_entry_W;
1528c2ecf20Sopenharmony_ci	u64 tlb_invalidate_all_W;
1538c2ecf20Sopenharmony_ci	u64 smm_hid;
1548c2ecf20Sopenharmony_ci	u64 mfc_accr_RW;
1558c2ecf20Sopenharmony_ci	u64 mfc_dsisr_RW;
1568c2ecf20Sopenharmony_ci	u64 mfc_dar_RW;
1578c2ecf20Sopenharmony_ci	u64 rmt_index_RW;
1588c2ecf20Sopenharmony_ci	u64 rmt_data1_RW;
1598c2ecf20Sopenharmony_ci	u64 mfc_dsir_R;
1608c2ecf20Sopenharmony_ci	u64 mfc_lsacr_RW;
1618c2ecf20Sopenharmony_ci	u64 mfc_lscrr_R;
1628c2ecf20Sopenharmony_ci	u64 mfc_tclass_id_RW;
1638c2ecf20Sopenharmony_ci	u64 mfc_rm_boundary;
1648c2ecf20Sopenharmony_ci	u64 smf_dma_signal_sel;
1658c2ecf20Sopenharmony_ci	u64 smm_signal_sel;
1668c2ecf20Sopenharmony_ci	u64 mfc_cer_R;
1678c2ecf20Sopenharmony_ci	u64 pu_ecc_cntl_RW;
1688c2ecf20Sopenharmony_ci	u64 pu_ecc_stat_RW;
1698c2ecf20Sopenharmony_ci	u64 spu_ecc_addr_RW;
1708c2ecf20Sopenharmony_ci	u64 spu_err_mask_RW;
1718c2ecf20Sopenharmony_ci	u64 spu_trig0_sel;
1728c2ecf20Sopenharmony_ci	u64 spu_trig1_sel;
1738c2ecf20Sopenharmony_ci	u64 spu_trig2_sel;
1748c2ecf20Sopenharmony_ci	u64 spu_trig3_sel;
1758c2ecf20Sopenharmony_ci	u64 spu_trace_sel;
1768c2ecf20Sopenharmony_ci	u64 spu_event0_sel;
1778c2ecf20Sopenharmony_ci	u64 spu_event1_sel;
1788c2ecf20Sopenharmony_ci	u64 spu_event2_sel;
1798c2ecf20Sopenharmony_ci	u64 spu_event3_sel;
1808c2ecf20Sopenharmony_ci	u64 spu_trace_cntl;
1818c2ecf20Sopenharmony_ci};
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci/*
1848c2ecf20Sopenharmony_ci * struct spu_priv2_collapsed - condensed privileged 2 area, w/o pads.
1858c2ecf20Sopenharmony_ci */
1868c2ecf20Sopenharmony_cistruct spu_priv2_collapsed {
1878c2ecf20Sopenharmony_ci	u64 slb_index_W;
1888c2ecf20Sopenharmony_ci	u64 slb_esid_RW;
1898c2ecf20Sopenharmony_ci	u64 slb_vsid_RW;
1908c2ecf20Sopenharmony_ci	u64 slb_invalidate_entry_W;
1918c2ecf20Sopenharmony_ci	u64 slb_invalidate_all_W;
1928c2ecf20Sopenharmony_ci	struct mfc_cq_sr spuq[16];
1938c2ecf20Sopenharmony_ci	struct mfc_cq_sr puq[8];
1948c2ecf20Sopenharmony_ci	u64 mfc_control_RW;
1958c2ecf20Sopenharmony_ci	u64 puint_mb_R;
1968c2ecf20Sopenharmony_ci	u64 spu_privcntl_RW;
1978c2ecf20Sopenharmony_ci	u64 spu_lslr_RW;
1988c2ecf20Sopenharmony_ci	u64 spu_chnlcntptr_RW;
1998c2ecf20Sopenharmony_ci	u64 spu_chnlcnt_RW;
2008c2ecf20Sopenharmony_ci	u64 spu_chnldata_RW;
2018c2ecf20Sopenharmony_ci	u64 spu_cfg_RW;
2028c2ecf20Sopenharmony_ci	u64 spu_tag_status_query_RW;
2038c2ecf20Sopenharmony_ci	u64 spu_cmd_buf1_RW;
2048c2ecf20Sopenharmony_ci	u64 spu_cmd_buf2_RW;
2058c2ecf20Sopenharmony_ci	u64 spu_atomic_status_RW;
2068c2ecf20Sopenharmony_ci};
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci/**
2098c2ecf20Sopenharmony_ci * struct spu_state
2108c2ecf20Sopenharmony_ci * @lscsa: Local Store Context Save Area.
2118c2ecf20Sopenharmony_ci * @prob: Collapsed Problem State Area, w/o pads.
2128c2ecf20Sopenharmony_ci * @priv1: Collapsed Privileged 1 Area, w/o pads.
2138c2ecf20Sopenharmony_ci * @priv2: Collapsed Privileged 2 Area, w/o pads.
2148c2ecf20Sopenharmony_ci * @spu_chnlcnt_RW: Array of saved channel counts.
2158c2ecf20Sopenharmony_ci * @spu_chnldata_RW: Array of saved channel data.
2168c2ecf20Sopenharmony_ci * @suspend_time: Time stamp when decrementer disabled.
2178c2ecf20Sopenharmony_ci *
2188c2ecf20Sopenharmony_ci * Structure representing the whole of the SPU
2198c2ecf20Sopenharmony_ci * context save area (CSA).  This struct contains
2208c2ecf20Sopenharmony_ci * all of the state necessary to suspend and then
2218c2ecf20Sopenharmony_ci * later optionally resume execution of an SPU
2228c2ecf20Sopenharmony_ci * context.
2238c2ecf20Sopenharmony_ci *
2248c2ecf20Sopenharmony_ci * The @lscsa region is by far the largest, and is
2258c2ecf20Sopenharmony_ci * allocated separately so that it may either be
2268c2ecf20Sopenharmony_ci * pinned or mapped to/from application memory, as
2278c2ecf20Sopenharmony_ci * appropriate for the OS environment.
2288c2ecf20Sopenharmony_ci */
2298c2ecf20Sopenharmony_cistruct spu_state {
2308c2ecf20Sopenharmony_ci	struct spu_lscsa *lscsa;
2318c2ecf20Sopenharmony_ci	struct spu_problem_collapsed prob;
2328c2ecf20Sopenharmony_ci	struct spu_priv1_collapsed priv1;
2338c2ecf20Sopenharmony_ci	struct spu_priv2_collapsed priv2;
2348c2ecf20Sopenharmony_ci	u64 spu_chnlcnt_RW[32];
2358c2ecf20Sopenharmony_ci	u64 spu_chnldata_RW[32];
2368c2ecf20Sopenharmony_ci	u32 spu_mailbox_data[4];
2378c2ecf20Sopenharmony_ci	u32 pu_mailbox_data[1];
2388c2ecf20Sopenharmony_ci	u64 class_0_dar, class_0_pending;
2398c2ecf20Sopenharmony_ci	u64 class_1_dar, class_1_dsisr;
2408c2ecf20Sopenharmony_ci	unsigned long suspend_time;
2418c2ecf20Sopenharmony_ci	spinlock_t register_lock;
2428c2ecf20Sopenharmony_ci};
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci#endif /* !__SPU__ */
2458c2ecf20Sopenharmony_ci#endif /* __KERNEL__ */
2468c2ecf20Sopenharmony_ci#endif /* !__ASSEMBLY__ */
2478c2ecf20Sopenharmony_ci#endif /* _SPU_CSA_H_ */
248