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