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