FILE
ism.h
File preview with syntax highlighting.
linux-6.19.14/drivers/s390/net/ism.h
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 <linux/dibs.h> 9#include <asm/pci_insn.h> 10 11#define UTIL_STR_LEN 16 12#define ISM_ERROR 0xFFFF 13 14#define ISM_NR_DMBS 1920 15 16/* 17 * Do not use the first word of the DMB bits to ensure 8 byte aligned access. 18 */ 19#define ISM_DMB_WORD_OFFSET 1 20#define ISM_DMB_BIT_OFFSET (ISM_DMB_WORD_OFFSET * 32) 21 22#define ISM_REG_SBA 0x1 23#define ISM_REG_IEQ 0x2 24#define ISM_READ_GID 0x3 25#define ISM_ADD_VLAN_ID 0x4 26#define ISM_DEL_VLAN_ID 0x5 27#define ISM_SET_VLAN 0x6 28#define ISM_RESET_VLAN 0x7 29#define ISM_QUERY_INFO 0x8 30#define ISM_QUERY_RGID 0x9 31#define ISM_REG_DMB 0xA 32#define ISM_UNREG_DMB 0xB 33#define ISM_SIGNAL_IEQ 0xE 34#define ISM_UNREG_SBA 0x11 35#define ISM_UNREG_IEQ 0x12 36 37enum ism_event_type { 38 ISM_EVENT_BUF = 0x00, 39 ISM_EVENT_DEV = 0x01, 40 ISM_EVENT_SWR = 0x02 41}; 42 43enum ism_event_code { 44 ISM_BUF_DMB_UNREGISTERED = 0x04, 45 ISM_BUF_USING_ISM_DEV_DISABLED = 0x08, 46 ISM_BUF_OWNING_ISM_DEV_IN_ERR_STATE = 0x02, 47 ISM_BUF_USING_ISM_DEV_IN_ERR_STATE = 0x03, 48 ISM_BUF_VLAN_MISMATCH_WITH_OWNER = 0x05, 49 ISM_BUF_VLAN_MISMATCH_WITH_USER = 0x06, 50 ISM_DEV_GID_DISABLED = 0x07, 51 ISM_DEV_GID_ERR_STATE = 0x01 52}; 53 54struct ism_req_hdr { 55 u32 cmd; 56 u16 : 16; 57 u16 len; 58}; 59 60struct ism_resp_hdr { 61 u32 cmd; 62 u16 ret; 63 u16 len; 64}; 65 66union ism_reg_sba { 67 struct { 68 struct ism_req_hdr hdr; 69 u64 sba; 70 } request; 71 struct { 72 struct ism_resp_hdr hdr; 73 } response; 74} __aligned(16); 75 76union ism_reg_ieq { 77 struct { 78 struct ism_req_hdr hdr; 79 u64 ieq; 80 u64 len; 81 } request; 82 struct { 83 struct ism_resp_hdr hdr; 84 } response; 85} __aligned(16); 86 87/* ISM-vPCI devices provide 64 Bit GIDs 88 * Map them to ISM UUID GIDs like this: 89 * _________________________________________ 90 * | 64 Bit ISM-vPCI GID | 00000000_00000000 | 91 * ----------------------------------------- 92 * This will be interpreted as a UIID variant, that is reserved 93 * for NCS backward compatibility. So it will not collide with 94 * proper UUIDs. 95 */ 96union ism_read_gid { 97 struct { 98 struct ism_req_hdr hdr; 99 } request; 100 struct { 101 struct ism_resp_hdr hdr; 102 u64 gid; 103 } response; 104} __aligned(16); 105 106union ism_qi { 107 struct { 108 struct ism_req_hdr hdr; 109 } request; 110 struct { 111 struct ism_resp_hdr hdr; 112 u32 version; 113 u32 max_len; 114 u64 ism_state; 115 u64 my_gid; 116 u64 sba; 117 u64 ieq; 118 u32 ieq_len; 119 u32 : 32; 120 u32 dmbs_owned; 121 u32 dmbs_used; 122 u32 vlan_required; 123 u32 vlan_nr_ids; 124 u16 vlan_id[64]; 125 } response; 126} __aligned(64); 127 128union ism_query_rgid { 129 struct { 130 struct ism_req_hdr hdr; 131 u64 rgid; 132 u32 vlan_valid; 133 u32 vlan_id; 134 } request; 135 struct { 136 struct ism_resp_hdr hdr; 137 } response; 138} __aligned(16); 139 140union ism_reg_dmb { 141 struct { 142 struct ism_req_hdr hdr; 143 u64 dmb; 144 u32 dmb_len; 145 u32 sba_idx; 146 u32 vlan_valid; 147 u32 vlan_id; 148 u64 rgid; 149 } request; 150 struct { 151 struct ism_resp_hdr hdr; 152 u64 dmb_tok; 153 } response; 154} __aligned(32); 155 156union ism_sig_ieq { 157 struct { 158 struct ism_req_hdr hdr; 159 u64 rgid; 160 u32 trigger_irq; 161 u32 event_code; 162 u64 info; 163 } request; 164 struct { 165 struct ism_resp_hdr hdr; 166 } response; 167} __aligned(32); 168 169union ism_unreg_dmb { 170 struct { 171 struct ism_req_hdr hdr; 172 u64 dmb_tok; 173 } request; 174 struct { 175 struct ism_resp_hdr hdr; 176 } response; 177} __aligned(16); 178 179union ism_cmd_simple { 180 struct { 181 struct ism_req_hdr hdr; 182 } request; 183 struct { 184 struct ism_resp_hdr hdr; 185 } response; 186} __aligned(8); 187 188union ism_set_vlan_id { 189 struct { 190 struct ism_req_hdr hdr; 191 u64 vlan_id; 192 } request; 193 struct { 194 struct ism_resp_hdr hdr; 195 } response; 196} __aligned(16); 197 198struct ism_eq_header { 199 u64 idx; 200 u64 ieq_len; 201 u64 entry_len; 202 u64 : 64; 203}; 204 205struct ism_event { 206 u32 type; 207 u32 code; 208 u64 tok; 209 u64 time; 210 u64 info; 211}; 212 213struct ism_eq { 214 struct ism_eq_header header; 215 struct ism_event entry[15]; 216}; 217 218struct ism_sba { 219 u32 s : 1; /* summary bit */ 220 u32 e : 1; /* event bit */ 221 u32 : 30; 222 u32 dmb_bits[ISM_NR_DMBS / 32]; 223 u32 reserved[3]; 224 u16 dmbe_mask[ISM_NR_DMBS]; 225}; 226 227struct ism_dev { 228 spinlock_t cmd_lock; /* serializes cmds */ 229 struct dibs_dev *dibs; 230 struct pci_dev *pdev; 231 struct ism_sba *sba; 232 dma_addr_t sba_dma_addr; 233 DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS); 234 235 struct ism_eq *ieq; 236 dma_addr_t ieq_dma_addr; 237 int ieq_idx; 238}; 239 240#define ISM_CREATE_REQ(dmb, idx, sf, offset) \ 241 ((dmb) | (idx) << 24 | (sf) << 23 | (offset)) 242 243static inline void __ism_read_cmd(struct ism_dev *ism, void *data, 244 unsigned long offset, unsigned long len) 245{ 246 struct zpci_dev *zdev = to_zpci(ism->pdev); 247 u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, 8); 248 249 while (len > 0) { 250 __zpci_load(data, req, offset); 251 offset += 8; 252 data += 8; 253 len -= 8; 254 } 255} 256 257static inline void __ism_write_cmd(struct ism_dev *ism, void *data, 258 unsigned long offset, unsigned long len) 259{ 260 struct zpci_dev *zdev = to_zpci(ism->pdev); 261 u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, len); 262 263 if (len) 264 __zpci_store_block(data, req, offset); 265} 266 267static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data, 268 unsigned int size) 269{ 270 struct zpci_dev *zdev = to_zpci(ism->pdev); 271 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size); 272 273 return __zpci_store_block(data, req, dmb_req); 274} 275 276#endif /* S390_ISM_H */
~/
Read-only file preview.