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