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