linux/drivers/s390/net/ism.h
<<
>>
Prefs
   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
  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 smcd_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
 191struct ism_dev {
 192        spinlock_t lock;
 193        struct pci_dev *pdev;
 194        struct smcd_dev *smcd;
 195
 196        struct ism_sba *sba;
 197        dma_addr_t sba_dma_addr;
 198        DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
 199
 200        struct ism_eq *ieq;
 201        dma_addr_t ieq_dma_addr;
 202
 203        int ieq_idx;
 204};
 205
 206#define ISM_CREATE_REQ(dmb, idx, sf, offset)            \
 207        ((dmb) | (idx) << 24 | (sf) << 23 | (offset))
 208
 209static inline void __ism_read_cmd(struct ism_dev *ism, void *data,
 210                                  unsigned long offset, unsigned long len)
 211{
 212        struct zpci_dev *zdev = to_zpci(ism->pdev);
 213        u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, 8);
 214
 215        while (len > 0) {
 216                __zpci_load(data, req, offset);
 217                offset += 8;
 218                data += 8;
 219                len -= 8;
 220        }
 221}
 222
 223static inline void __ism_write_cmd(struct ism_dev *ism, void *data,
 224                                   unsigned long offset, unsigned long len)
 225{
 226        struct zpci_dev *zdev = to_zpci(ism->pdev);
 227        u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, len);
 228
 229        if (len)
 230                __zpci_store_block(data, req, offset);
 231}
 232
 233static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
 234                             unsigned int size)
 235{
 236        struct zpci_dev *zdev = to_zpci(ism->pdev);
 237        u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
 238
 239        return __zpci_store_block(data, req, dmb_req);
 240}
 241
 242#endif /* S390_ISM_H */
 243