1684b89bcSSebastian Ott /* SPDX-License-Identifier: GPL-2.0 */ 2684b89bcSSebastian Ott #ifndef S390_ISM_H 3684b89bcSSebastian Ott #define S390_ISM_H 4684b89bcSSebastian Ott 5684b89bcSSebastian Ott #include <linux/spinlock.h> 6684b89bcSSebastian Ott #include <linux/types.h> 7684b89bcSSebastian Ott #include <linux/pci.h> 8684b89bcSSebastian Ott #include <net/smc.h> 9684b89bcSSebastian Ott 10684b89bcSSebastian Ott #define UTIL_STR_LEN 16 11684b89bcSSebastian Ott 12684b89bcSSebastian Ott /* 13684b89bcSSebastian Ott * Do not use the first word of the DMB bits to ensure 8 byte aligned access. 14684b89bcSSebastian Ott */ 15684b89bcSSebastian Ott #define ISM_DMB_WORD_OFFSET 1 16684b89bcSSebastian Ott #define ISM_DMB_BIT_OFFSET (ISM_DMB_WORD_OFFSET * 32) 17684b89bcSSebastian Ott #define ISM_NR_DMBS 1920 18684b89bcSSebastian Ott 19684b89bcSSebastian Ott #define ISM_REG_SBA 0x1 20684b89bcSSebastian Ott #define ISM_REG_IEQ 0x2 21684b89bcSSebastian Ott #define ISM_READ_GID 0x3 22684b89bcSSebastian Ott #define ISM_ADD_VLAN_ID 0x4 23684b89bcSSebastian Ott #define ISM_DEL_VLAN_ID 0x5 24684b89bcSSebastian Ott #define ISM_SET_VLAN 0x6 25684b89bcSSebastian Ott #define ISM_RESET_VLAN 0x7 26684b89bcSSebastian Ott #define ISM_QUERY_INFO 0x8 27684b89bcSSebastian Ott #define ISM_QUERY_RGID 0x9 28684b89bcSSebastian Ott #define ISM_REG_DMB 0xA 29684b89bcSSebastian Ott #define ISM_UNREG_DMB 0xB 30684b89bcSSebastian Ott #define ISM_SIGNAL_IEQ 0xE 31684b89bcSSebastian Ott #define ISM_UNREG_SBA 0x11 32684b89bcSSebastian Ott #define ISM_UNREG_IEQ 0x12 33684b89bcSSebastian Ott 34684b89bcSSebastian Ott #define ISM_ERROR 0xFFFF 35684b89bcSSebastian Ott 36684b89bcSSebastian Ott struct ism_req_hdr { 37684b89bcSSebastian Ott u32 cmd; 38684b89bcSSebastian Ott u16 : 16; 39684b89bcSSebastian Ott u16 len; 40684b89bcSSebastian Ott }; 41684b89bcSSebastian Ott 42684b89bcSSebastian Ott struct ism_resp_hdr { 43684b89bcSSebastian Ott u32 cmd; 44684b89bcSSebastian Ott u16 ret; 45684b89bcSSebastian Ott u16 len; 46684b89bcSSebastian Ott }; 47684b89bcSSebastian Ott 48684b89bcSSebastian Ott union ism_reg_sba { 49684b89bcSSebastian Ott struct { 50684b89bcSSebastian Ott struct ism_req_hdr hdr; 51684b89bcSSebastian Ott u64 sba; 52684b89bcSSebastian Ott } request; 53684b89bcSSebastian Ott struct { 54684b89bcSSebastian Ott struct ism_resp_hdr hdr; 55684b89bcSSebastian Ott } response; 56684b89bcSSebastian Ott } __aligned(16); 57684b89bcSSebastian Ott 58684b89bcSSebastian Ott union ism_reg_ieq { 59684b89bcSSebastian Ott struct { 60684b89bcSSebastian Ott struct ism_req_hdr hdr; 61684b89bcSSebastian Ott u64 ieq; 62684b89bcSSebastian Ott u64 len; 63684b89bcSSebastian Ott } request; 64684b89bcSSebastian Ott struct { 65684b89bcSSebastian Ott struct ism_resp_hdr hdr; 66684b89bcSSebastian Ott } response; 67684b89bcSSebastian Ott } __aligned(16); 68684b89bcSSebastian Ott 69684b89bcSSebastian Ott union ism_read_gid { 70684b89bcSSebastian Ott struct { 71684b89bcSSebastian Ott struct ism_req_hdr hdr; 72684b89bcSSebastian Ott } request; 73684b89bcSSebastian Ott struct { 74684b89bcSSebastian Ott struct ism_resp_hdr hdr; 75684b89bcSSebastian Ott u64 gid; 76684b89bcSSebastian Ott } response; 77684b89bcSSebastian Ott } __aligned(16); 78684b89bcSSebastian Ott 79684b89bcSSebastian Ott union ism_qi { 80684b89bcSSebastian Ott struct { 81684b89bcSSebastian Ott struct ism_req_hdr hdr; 82684b89bcSSebastian Ott } request; 83684b89bcSSebastian Ott struct { 84684b89bcSSebastian Ott struct ism_resp_hdr hdr; 85684b89bcSSebastian Ott u32 version; 86684b89bcSSebastian Ott u32 max_len; 87684b89bcSSebastian Ott u64 ism_state; 88684b89bcSSebastian Ott u64 my_gid; 89684b89bcSSebastian Ott u64 sba; 90684b89bcSSebastian Ott u64 ieq; 91684b89bcSSebastian Ott u32 ieq_len; 92684b89bcSSebastian Ott u32 : 32; 93684b89bcSSebastian Ott u32 dmbs_owned; 94684b89bcSSebastian Ott u32 dmbs_used; 95684b89bcSSebastian Ott u32 vlan_required; 96684b89bcSSebastian Ott u32 vlan_nr_ids; 97684b89bcSSebastian Ott u16 vlan_id[64]; 98684b89bcSSebastian Ott } response; 99684b89bcSSebastian Ott } __aligned(64); 100684b89bcSSebastian Ott 101684b89bcSSebastian Ott union ism_query_rgid { 102684b89bcSSebastian Ott struct { 103684b89bcSSebastian Ott struct ism_req_hdr hdr; 104684b89bcSSebastian Ott u64 rgid; 105684b89bcSSebastian Ott u32 vlan_valid; 106684b89bcSSebastian Ott u32 vlan_id; 107684b89bcSSebastian Ott } request; 108684b89bcSSebastian Ott struct { 109684b89bcSSebastian Ott struct ism_resp_hdr hdr; 110684b89bcSSebastian Ott } response; 111684b89bcSSebastian Ott } __aligned(16); 112684b89bcSSebastian Ott 113684b89bcSSebastian Ott union ism_reg_dmb { 114684b89bcSSebastian Ott struct { 115684b89bcSSebastian Ott struct ism_req_hdr hdr; 116684b89bcSSebastian Ott u64 dmb; 117684b89bcSSebastian Ott u32 dmb_len; 118684b89bcSSebastian Ott u32 sba_idx; 119684b89bcSSebastian Ott u32 vlan_valid; 120684b89bcSSebastian Ott u32 vlan_id; 121684b89bcSSebastian Ott u64 rgid; 122684b89bcSSebastian Ott } request; 123684b89bcSSebastian Ott struct { 124684b89bcSSebastian Ott struct ism_resp_hdr hdr; 125684b89bcSSebastian Ott u64 dmb_tok; 126684b89bcSSebastian Ott } response; 127684b89bcSSebastian Ott } __aligned(32); 128684b89bcSSebastian Ott 129684b89bcSSebastian Ott union ism_sig_ieq { 130684b89bcSSebastian Ott struct { 131684b89bcSSebastian Ott struct ism_req_hdr hdr; 132684b89bcSSebastian Ott u64 rgid; 133684b89bcSSebastian Ott u32 trigger_irq; 134684b89bcSSebastian Ott u32 event_code; 135684b89bcSSebastian Ott u64 info; 136684b89bcSSebastian Ott } request; 137684b89bcSSebastian Ott struct { 138684b89bcSSebastian Ott struct ism_resp_hdr hdr; 139684b89bcSSebastian Ott } response; 140684b89bcSSebastian Ott } __aligned(32); 141684b89bcSSebastian Ott 142684b89bcSSebastian Ott union ism_unreg_dmb { 143684b89bcSSebastian Ott struct { 144684b89bcSSebastian Ott struct ism_req_hdr hdr; 145684b89bcSSebastian Ott u64 dmb_tok; 146684b89bcSSebastian Ott } request; 147684b89bcSSebastian Ott struct { 148684b89bcSSebastian Ott struct ism_resp_hdr hdr; 149684b89bcSSebastian Ott } response; 150684b89bcSSebastian Ott } __aligned(16); 151684b89bcSSebastian Ott 152684b89bcSSebastian Ott union ism_cmd_simple { 153684b89bcSSebastian Ott struct { 154684b89bcSSebastian Ott struct ism_req_hdr hdr; 155684b89bcSSebastian Ott } request; 156684b89bcSSebastian Ott struct { 157684b89bcSSebastian Ott struct ism_resp_hdr hdr; 158684b89bcSSebastian Ott } response; 159684b89bcSSebastian Ott } __aligned(8); 160684b89bcSSebastian Ott 161684b89bcSSebastian Ott union ism_set_vlan_id { 162684b89bcSSebastian Ott struct { 163684b89bcSSebastian Ott struct ism_req_hdr hdr; 164684b89bcSSebastian Ott u64 vlan_id; 165684b89bcSSebastian Ott } request; 166684b89bcSSebastian Ott struct { 167684b89bcSSebastian Ott struct ism_resp_hdr hdr; 168684b89bcSSebastian Ott } response; 169684b89bcSSebastian Ott } __aligned(16); 170684b89bcSSebastian Ott 171684b89bcSSebastian Ott struct ism_eq_header { 172684b89bcSSebastian Ott u64 idx; 173684b89bcSSebastian Ott u64 ieq_len; 174684b89bcSSebastian Ott u64 entry_len; 175684b89bcSSebastian Ott u64 : 64; 176684b89bcSSebastian Ott }; 177684b89bcSSebastian Ott 178684b89bcSSebastian Ott struct ism_eq { 179684b89bcSSebastian Ott struct ism_eq_header header; 180684b89bcSSebastian Ott struct smcd_event entry[15]; 181684b89bcSSebastian Ott }; 182684b89bcSSebastian Ott 183684b89bcSSebastian Ott struct ism_sba { 184684b89bcSSebastian Ott u32 s : 1; /* summary bit */ 185684b89bcSSebastian Ott u32 e : 1; /* event bit */ 186684b89bcSSebastian Ott u32 : 30; 187684b89bcSSebastian Ott u32 dmb_bits[ISM_NR_DMBS / 32]; 188684b89bcSSebastian Ott u32 reserved[3]; 189684b89bcSSebastian Ott u16 dmbe_mask[ISM_NR_DMBS]; 190684b89bcSSebastian Ott }; 191684b89bcSSebastian Ott 192684b89bcSSebastian Ott struct ism_dev { 193684b89bcSSebastian Ott spinlock_t lock; 194684b89bcSSebastian Ott struct pci_dev *pdev; 195684b89bcSSebastian Ott struct smcd_dev *smcd; 196684b89bcSSebastian Ott 197684b89bcSSebastian Ott void __iomem *ctl; 198684b89bcSSebastian Ott 199684b89bcSSebastian Ott struct ism_sba *sba; 200684b89bcSSebastian Ott dma_addr_t sba_dma_addr; 201684b89bcSSebastian Ott DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS); 202684b89bcSSebastian Ott 203684b89bcSSebastian Ott struct ism_eq *ieq; 204684b89bcSSebastian Ott dma_addr_t ieq_dma_addr; 205684b89bcSSebastian Ott 206684b89bcSSebastian Ott int ieq_idx; 207684b89bcSSebastian Ott }; 208684b89bcSSebastian Ott 209684b89bcSSebastian Ott #define ISM_CREATE_REQ(dmb, idx, sf, offset) \ 210684b89bcSSebastian Ott ((dmb) | (idx) << 24 | (sf) << 23 | (offset)) 211684b89bcSSebastian Ott 212684b89bcSSebastian Ott static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data, 213684b89bcSSebastian Ott unsigned int size) 214684b89bcSSebastian Ott { 215684b89bcSSebastian Ott struct zpci_dev *zdev = to_zpci(ism->pdev); 216684b89bcSSebastian Ott u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size); 217684b89bcSSebastian Ott 218*81deca12SSebastian Ott return __zpci_store_block(data, req, dmb_req); 219684b89bcSSebastian Ott } 220684b89bcSSebastian Ott 221684b89bcSSebastian Ott #endif /* S390_ISM_H */ 222