1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef S390_ISM_H 3 #define S390_ISM_H 4 5 #include <linux/spinlock.h> 6 #include <linux/types.h> 7 #include <linux/pci.h> 8 #include <net/smc.h> 9 #include <asm/pci_insn.h> 10 11 #define UTIL_STR_LEN 16 12 13 /* 14 * Do not use the first word of the DMB bits to ensure 8 byte aligned access. 15 */ 16 #define ISM_DMB_WORD_OFFSET 1 17 #define ISM_DMB_BIT_OFFSET (ISM_DMB_WORD_OFFSET * 32) 18 #define ISM_NR_DMBS 1920 19 20 #define ISM_REG_SBA 0x1 21 #define ISM_REG_IEQ 0x2 22 #define ISM_READ_GID 0x3 23 #define ISM_ADD_VLAN_ID 0x4 24 #define ISM_DEL_VLAN_ID 0x5 25 #define ISM_SET_VLAN 0x6 26 #define ISM_RESET_VLAN 0x7 27 #define ISM_QUERY_INFO 0x8 28 #define ISM_QUERY_RGID 0x9 29 #define ISM_REG_DMB 0xA 30 #define ISM_UNREG_DMB 0xB 31 #define ISM_SIGNAL_IEQ 0xE 32 #define ISM_UNREG_SBA 0x11 33 #define ISM_UNREG_IEQ 0x12 34 35 #define ISM_ERROR 0xFFFF 36 37 struct ism_req_hdr { 38 u32 cmd; 39 u16 : 16; 40 u16 len; 41 }; 42 43 struct ism_resp_hdr { 44 u32 cmd; 45 u16 ret; 46 u16 len; 47 }; 48 49 union ism_reg_sba { 50 struct { 51 struct ism_req_hdr hdr; 52 u64 sba; 53 } request; 54 struct { 55 struct ism_resp_hdr hdr; 56 } response; 57 } __aligned(16); 58 59 union ism_reg_ieq { 60 struct { 61 struct ism_req_hdr hdr; 62 u64 ieq; 63 u64 len; 64 } request; 65 struct { 66 struct ism_resp_hdr hdr; 67 } response; 68 } __aligned(16); 69 70 union ism_read_gid { 71 struct { 72 struct ism_req_hdr hdr; 73 } request; 74 struct { 75 struct ism_resp_hdr hdr; 76 u64 gid; 77 } response; 78 } __aligned(16); 79 80 union ism_qi { 81 struct { 82 struct ism_req_hdr hdr; 83 } request; 84 struct { 85 struct ism_resp_hdr hdr; 86 u32 version; 87 u32 max_len; 88 u64 ism_state; 89 u64 my_gid; 90 u64 sba; 91 u64 ieq; 92 u32 ieq_len; 93 u32 : 32; 94 u32 dmbs_owned; 95 u32 dmbs_used; 96 u32 vlan_required; 97 u32 vlan_nr_ids; 98 u16 vlan_id[64]; 99 } response; 100 } __aligned(64); 101 102 union ism_query_rgid { 103 struct { 104 struct ism_req_hdr hdr; 105 u64 rgid; 106 u32 vlan_valid; 107 u32 vlan_id; 108 } request; 109 struct { 110 struct ism_resp_hdr hdr; 111 } response; 112 } __aligned(16); 113 114 union ism_reg_dmb { 115 struct { 116 struct ism_req_hdr hdr; 117 u64 dmb; 118 u32 dmb_len; 119 u32 sba_idx; 120 u32 vlan_valid; 121 u32 vlan_id; 122 u64 rgid; 123 } request; 124 struct { 125 struct ism_resp_hdr hdr; 126 u64 dmb_tok; 127 } response; 128 } __aligned(32); 129 130 union ism_sig_ieq { 131 struct { 132 struct ism_req_hdr hdr; 133 u64 rgid; 134 u32 trigger_irq; 135 u32 event_code; 136 u64 info; 137 } request; 138 struct { 139 struct ism_resp_hdr hdr; 140 } response; 141 } __aligned(32); 142 143 union ism_unreg_dmb { 144 struct { 145 struct ism_req_hdr hdr; 146 u64 dmb_tok; 147 } request; 148 struct { 149 struct ism_resp_hdr hdr; 150 } response; 151 } __aligned(16); 152 153 union ism_cmd_simple { 154 struct { 155 struct ism_req_hdr hdr; 156 } request; 157 struct { 158 struct ism_resp_hdr hdr; 159 } response; 160 } __aligned(8); 161 162 union ism_set_vlan_id { 163 struct { 164 struct ism_req_hdr hdr; 165 u64 vlan_id; 166 } request; 167 struct { 168 struct ism_resp_hdr hdr; 169 } response; 170 } __aligned(16); 171 172 struct ism_eq_header { 173 u64 idx; 174 u64 ieq_len; 175 u64 entry_len; 176 u64 : 64; 177 }; 178 179 struct ism_eq { 180 struct ism_eq_header header; 181 struct smcd_event entry[15]; 182 }; 183 184 struct ism_sba { 185 u32 s : 1; /* summary bit */ 186 u32 e : 1; /* event bit */ 187 u32 : 30; 188 u32 dmb_bits[ISM_NR_DMBS / 32]; 189 u32 reserved[3]; 190 u16 dmbe_mask[ISM_NR_DMBS]; 191 }; 192 193 struct ism_dev { 194 spinlock_t lock; 195 struct pci_dev *pdev; 196 struct smcd_dev *smcd; 197 198 struct ism_sba *sba; 199 dma_addr_t sba_dma_addr; 200 DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS); 201 202 struct ism_eq *ieq; 203 dma_addr_t ieq_dma_addr; 204 205 int ieq_idx; 206 }; 207 208 #define ISM_CREATE_REQ(dmb, idx, sf, offset) \ 209 ((dmb) | (idx) << 24 | (sf) << 23 | (offset)) 210 211 static inline void __ism_read_cmd(struct ism_dev *ism, void *data, 212 unsigned long offset, unsigned long len) 213 { 214 struct zpci_dev *zdev = to_zpci(ism->pdev); 215 u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, 8); 216 217 while (len > 0) { 218 __zpci_load(data, req, offset); 219 offset += 8; 220 data += 8; 221 len -= 8; 222 } 223 } 224 225 static inline void __ism_write_cmd(struct ism_dev *ism, void *data, 226 unsigned long offset, unsigned long len) 227 { 228 struct zpci_dev *zdev = to_zpci(ism->pdev); 229 u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, len); 230 231 if (len) 232 __zpci_store_block(data, req, offset); 233 } 234 235 static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data, 236 unsigned int size) 237 { 238 struct zpci_dev *zdev = to_zpci(ism->pdev); 239 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size); 240 241 return __zpci_store_block(data, req, dmb_req); 242 } 243 244 #endif /* S390_ISM_H */ 245