1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * spu_csa.h: Definitions for SPU context save area (CSA).
4 *
5 * (C) Copyright IBM 2005
6 *
7 * Author: Mark Nutter <mnutter@us.ibm.com>
8 */
9
10#ifndef _SPU_CSA_H_
11#define _SPU_CSA_H_
12#ifdef __KERNEL__
13
14/*
15 * Total number of 128-bit registers.
16 */
17#define NR_SPU_GPRS         	128
18#define NR_SPU_SPRS         	9
19#define NR_SPU_REGS_PAD	    	7
20#define NR_SPU_SPILL_REGS   	144	/* GPRS + SPRS + PAD */
21#define SIZEOF_SPU_SPILL_REGS	NR_SPU_SPILL_REGS * 16
22
23#define SPU_SAVE_COMPLETE      	0x3FFB
24#define SPU_RESTORE_COMPLETE   	0x3FFC
25
26/*
27 * Definitions for various 'stopped' status conditions,
28 * to be recreated during context restore.
29 */
30#define SPU_STOPPED_STATUS_P    1
31#define SPU_STOPPED_STATUS_I    2
32#define SPU_STOPPED_STATUS_H    3
33#define SPU_STOPPED_STATUS_S    4
34#define SPU_STOPPED_STATUS_S_I  5
35#define SPU_STOPPED_STATUS_S_P  6
36#define SPU_STOPPED_STATUS_P_H  7
37#define SPU_STOPPED_STATUS_P_I  8
38#define SPU_STOPPED_STATUS_R    9
39
40/*
41 * Definitions for software decrementer status flag.
42 */
43#define SPU_DECR_STATUS_RUNNING 0x1
44#define SPU_DECR_STATUS_WRAPPED 0x2
45
46#ifndef  __ASSEMBLY__
47/**
48 * spu_reg128 - generic 128-bit register definition.
49 */
50struct spu_reg128 {
51	u32 slot[4];
52};
53
54/**
55 * struct spu_lscsa - Local Store Context Save Area.
56 * @gprs: Array of saved registers.
57 * @fpcr: Saved floating point status control register.
58 * @decr: Saved decrementer value.
59 * @decr_status: Indicates software decrementer status flags.
60 * @ppu_mb: Saved PPU mailbox data.
61 * @ppuint_mb: Saved PPU interrupting mailbox data.
62 * @tag_mask: Saved tag group mask.
63 * @event_mask: Saved event mask.
64 * @srr0: Saved SRR0.
65 * @stopped_status: Conditions to be recreated by restore.
66 * @ls: Saved contents of Local Storage Area.
67 *
68 * The LSCSA represents state that is primarily saved and
69 * restored by SPU-side code.
70 */
71struct spu_lscsa {
72	struct spu_reg128 gprs[128];
73	struct spu_reg128 fpcr;
74	struct spu_reg128 decr;
75	struct spu_reg128 decr_status;
76	struct spu_reg128 ppu_mb;
77	struct spu_reg128 ppuint_mb;
78	struct spu_reg128 tag_mask;
79	struct spu_reg128 event_mask;
80	struct spu_reg128 srr0;
81	struct spu_reg128 stopped_status;
82
83	/*
84	 * 'ls' must be page-aligned on all configurations.
85	 * Since we don't want to rely on having the spu-gcc
86	 * installed to build the kernel and this structure
87	 * is used in the SPU-side code, make it 64k-page
88	 * aligned for now.
89	 */
90	unsigned char ls[LS_SIZE] __attribute__((aligned(65536)));
91};
92
93#ifndef __SPU__
94/*
95 * struct spu_problem_collapsed - condensed problem state area, w/o pads.
96 */
97struct spu_problem_collapsed {
98	u64 spc_mssync_RW;
99	u32 mfc_lsa_W;
100	u32 unused_pad0;
101	u64 mfc_ea_W;
102	union mfc_tag_size_class_cmd mfc_union_W;
103	u32 dma_qstatus_R;
104	u32 dma_querytype_RW;
105	u32 dma_querymask_RW;
106	u32 dma_tagstatus_R;
107	u32 pu_mb_R;
108	u32 spu_mb_W;
109	u32 mb_stat_R;
110	u32 spu_runcntl_RW;
111	u32 spu_status_R;
112	u32 spu_spc_R;
113	u32 spu_npc_RW;
114	u32 signal_notify1;
115	u32 signal_notify2;
116	u32 unused_pad1;
117};
118
119/*
120 * struct spu_priv1_collapsed - condensed privileged 1 area, w/o pads.
121 */
122struct spu_priv1_collapsed {
123	u64 mfc_sr1_RW;
124	u64 mfc_lpid_RW;
125	u64 spu_idr_RW;
126	u64 mfc_vr_RO;
127	u64 spu_vr_RO;
128	u64 int_mask_class0_RW;
129	u64 int_mask_class1_RW;
130	u64 int_mask_class2_RW;
131	u64 int_stat_class0_RW;
132	u64 int_stat_class1_RW;
133	u64 int_stat_class2_RW;
134	u64 int_route_RW;
135	u64 mfc_atomic_flush_RW;
136	u64 resource_allocation_groupID_RW;
137	u64 resource_allocation_enable_RW;
138	u64 mfc_fir_R;
139	u64 mfc_fir_status_or_W;
140	u64 mfc_fir_status_and_W;
141	u64 mfc_fir_mask_R;
142	u64 mfc_fir_mask_or_W;
143	u64 mfc_fir_mask_and_W;
144	u64 mfc_fir_chkstp_enable_RW;
145	u64 smf_sbi_signal_sel;
146	u64 smf_ato_signal_sel;
147	u64 tlb_index_hint_RO;
148	u64 tlb_index_W;
149	u64 tlb_vpn_RW;
150	u64 tlb_rpn_RW;
151	u64 tlb_invalidate_entry_W;
152	u64 tlb_invalidate_all_W;
153	u64 smm_hid;
154	u64 mfc_accr_RW;
155	u64 mfc_dsisr_RW;
156	u64 mfc_dar_RW;
157	u64 rmt_index_RW;
158	u64 rmt_data1_RW;
159	u64 mfc_dsir_R;
160	u64 mfc_lsacr_RW;
161	u64 mfc_lscrr_R;
162	u64 mfc_tclass_id_RW;
163	u64 mfc_rm_boundary;
164	u64 smf_dma_signal_sel;
165	u64 smm_signal_sel;
166	u64 mfc_cer_R;
167	u64 pu_ecc_cntl_RW;
168	u64 pu_ecc_stat_RW;
169	u64 spu_ecc_addr_RW;
170	u64 spu_err_mask_RW;
171	u64 spu_trig0_sel;
172	u64 spu_trig1_sel;
173	u64 spu_trig2_sel;
174	u64 spu_trig3_sel;
175	u64 spu_trace_sel;
176	u64 spu_event0_sel;
177	u64 spu_event1_sel;
178	u64 spu_event2_sel;
179	u64 spu_event3_sel;
180	u64 spu_trace_cntl;
181};
182
183/*
184 * struct spu_priv2_collapsed - condensed privileged 2 area, w/o pads.
185 */
186struct spu_priv2_collapsed {
187	u64 slb_index_W;
188	u64 slb_esid_RW;
189	u64 slb_vsid_RW;
190	u64 slb_invalidate_entry_W;
191	u64 slb_invalidate_all_W;
192	struct mfc_cq_sr spuq[16];
193	struct mfc_cq_sr puq[8];
194	u64 mfc_control_RW;
195	u64 puint_mb_R;
196	u64 spu_privcntl_RW;
197	u64 spu_lslr_RW;
198	u64 spu_chnlcntptr_RW;
199	u64 spu_chnlcnt_RW;
200	u64 spu_chnldata_RW;
201	u64 spu_cfg_RW;
202	u64 spu_tag_status_query_RW;
203	u64 spu_cmd_buf1_RW;
204	u64 spu_cmd_buf2_RW;
205	u64 spu_atomic_status_RW;
206};
207
208/**
209 * struct spu_state
210 * @lscsa: Local Store Context Save Area.
211 * @prob: Collapsed Problem State Area, w/o pads.
212 * @priv1: Collapsed Privileged 1 Area, w/o pads.
213 * @priv2: Collapsed Privileged 2 Area, w/o pads.
214 * @spu_chnlcnt_RW: Array of saved channel counts.
215 * @spu_chnldata_RW: Array of saved channel data.
216 * @suspend_time: Time stamp when decrementer disabled.
217 *
218 * Structure representing the whole of the SPU
219 * context save area (CSA).  This struct contains
220 * all of the state necessary to suspend and then
221 * later optionally resume execution of an SPU
222 * context.
223 *
224 * The @lscsa region is by far the largest, and is
225 * allocated separately so that it may either be
226 * pinned or mapped to/from application memory, as
227 * appropriate for the OS environment.
228 */
229struct spu_state {
230	struct spu_lscsa *lscsa;
231	struct spu_problem_collapsed prob;
232	struct spu_priv1_collapsed priv1;
233	struct spu_priv2_collapsed priv2;
234	u64 spu_chnlcnt_RW[32];
235	u64 spu_chnldata_RW[32];
236	u32 spu_mailbox_data[4];
237	u32 pu_mailbox_data[1];
238	u64 class_0_dar, class_0_pending;
239	u64 class_1_dar, class_1_dsisr;
240	unsigned long suspend_time;
241	spinlock_t register_lock;
242};
243
244#endif /* !__SPU__ */
245#endif /* __KERNEL__ */
246#endif /* !__ASSEMBLY__ */
247#endif /* _SPU_CSA_H_ */
248