1  /*
2   * Copyright (c) 2012 - 2018 Intel Corporation.  All rights reserved.
3   * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved.
4   * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved.
5   *
6   * This software is available to you under a choice of one of two
7   * licenses.  You may choose to be licensed under the terms of the GNU
8   * General Public License (GPL) Version 2, available from the file
9   * COPYING in the main directory of this source tree, or the
10   * OpenIB.org BSD license below:
11   *
12   *     Redistribution and use in source and binary forms, with or
13   *     without modification, are permitted provided that the following
14   *     conditions are met:
15   *
16   *      - Redistributions of source code must retain the above
17   *        copyright notice, this list of conditions and the following
18   *        disclaimer.
19   *
20   *      - Redistributions in binary form must reproduce the above
21   *        copyright notice, this list of conditions and the following
22   *        disclaimer in the documentation and/or other materials
23   *        provided with the distribution.
24   *
25   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32   * SOFTWARE.
33   */
34  
35  #ifndef QIB_VERBS_H
36  #define QIB_VERBS_H
37  
38  #include <linux/types.h>
39  #include <linux/spinlock.h>
40  #include <linux/kernel.h>
41  #include <linux/interrupt.h>
42  #include <linux/kref.h>
43  #include <linux/workqueue.h>
44  #include <linux/kthread.h>
45  #include <linux/completion.h>
46  #include <rdma/ib_pack.h>
47  #include <rdma/ib_user_verbs.h>
48  #include <rdma/ib_hdrs.h>
49  #include <rdma/rdmavt_qp.h>
50  #include <rdma/rdmavt_cq.h>
51  
52  struct qib_ctxtdata;
53  struct qib_pportdata;
54  struct qib_devdata;
55  struct qib_verbs_txreq;
56  
57  #define QIB_MAX_RDMA_ATOMIC     16
58  #define QIB_GUIDS_PER_PORT	5
59  #define QIB_PSN_SHIFT		8
60  
61  /*
62   * Increment this value if any changes that break userspace ABI
63   * compatibility are made.
64   */
65  #define QIB_UVERBS_ABI_VERSION       2
66  
67  /* IB Performance Manager status values */
68  #define IB_PMA_SAMPLE_STATUS_DONE       0x00
69  #define IB_PMA_SAMPLE_STATUS_STARTED    0x01
70  #define IB_PMA_SAMPLE_STATUS_RUNNING    0x02
71  
72  /* Mandatory IB performance counter select values. */
73  #define IB_PMA_PORT_XMIT_DATA   cpu_to_be16(0x0001)
74  #define IB_PMA_PORT_RCV_DATA    cpu_to_be16(0x0002)
75  #define IB_PMA_PORT_XMIT_PKTS   cpu_to_be16(0x0003)
76  #define IB_PMA_PORT_RCV_PKTS    cpu_to_be16(0x0004)
77  #define IB_PMA_PORT_XMIT_WAIT   cpu_to_be16(0x0005)
78  
79  #define QIB_VENDOR_IPG		cpu_to_be16(0xFFA0)
80  
81  #define IB_DEFAULT_GID_PREFIX	cpu_to_be64(0xfe80000000000000ULL)
82  
83  /* Values for set/get portinfo VLCap OperationalVLs */
84  #define IB_VL_VL0       1
85  #define IB_VL_VL0_1     2
86  #define IB_VL_VL0_3     3
87  #define IB_VL_VL0_7     4
88  #define IB_VL_VL0_14    5
89  
qib_num_vls(int vls)90  static inline int qib_num_vls(int vls)
91  {
92  	switch (vls) {
93  	default:
94  	case IB_VL_VL0:
95  		return 1;
96  	case IB_VL_VL0_1:
97  		return 2;
98  	case IB_VL_VL0_3:
99  		return 4;
100  	case IB_VL_VL0_7:
101  		return 8;
102  	case IB_VL_VL0_14:
103  		return 15;
104  	}
105  }
106  
107  struct qib_pio_header {
108  	__le32 pbc[2];
109  	struct ib_header hdr;
110  } __packed;
111  
112  /*
113   * qib specific data structure that will be hidden from rvt after the queue pair
114   * is made common.
115   */
116  struct qib_qp_priv {
117  	struct ib_header *s_hdr;        /* next packet header to send */
118  	struct list_head iowait;        /* link for wait PIO buf */
119  	atomic_t s_dma_busy;
120  	struct qib_verbs_txreq *s_tx;
121  	struct work_struct s_work;
122  	wait_queue_head_t wait_dma;
123  	struct rvt_qp *owner;
124  };
125  
126  #define QIB_PSN_CREDIT  16
127  
128  struct qib_opcode_stats {
129  	u64 n_packets;          /* number of packets */
130  	u64 n_bytes;            /* total number of bytes */
131  };
132  
133  struct qib_opcode_stats_perctx {
134  	struct qib_opcode_stats stats[128];
135  };
136  
137  struct qib_pma_counters {
138  	u64 n_unicast_xmit;     /* total unicast packets sent */
139  	u64 n_unicast_rcv;      /* total unicast packets received */
140  	u64 n_multicast_xmit;   /* total multicast packets sent */
141  	u64 n_multicast_rcv;    /* total multicast packets received */
142  };
143  
144  struct qib_ibport {
145  	struct rvt_ibport rvp;
146  	struct rvt_ah *smi_ah;
147  	__be64 guids[QIB_GUIDS_PER_PORT	- 1];	/* writable GUIDs */
148  	struct qib_pma_counters __percpu *pmastats;
149  	u64 z_unicast_xmit;     /* starting count for PMA */
150  	u64 z_unicast_rcv;      /* starting count for PMA */
151  	u64 z_multicast_xmit;   /* starting count for PMA */
152  	u64 z_multicast_rcv;    /* starting count for PMA */
153  	u64 z_symbol_error_counter;             /* starting count for PMA */
154  	u64 z_link_error_recovery_counter;      /* starting count for PMA */
155  	u64 z_link_downed_counter;              /* starting count for PMA */
156  	u64 z_port_rcv_errors;                  /* starting count for PMA */
157  	u64 z_port_rcv_remphys_errors;          /* starting count for PMA */
158  	u64 z_port_xmit_discards;               /* starting count for PMA */
159  	u64 z_port_xmit_data;                   /* starting count for PMA */
160  	u64 z_port_rcv_data;                    /* starting count for PMA */
161  	u64 z_port_xmit_packets;                /* starting count for PMA */
162  	u64 z_port_rcv_packets;                 /* starting count for PMA */
163  	u32 z_local_link_integrity_errors;      /* starting count for PMA */
164  	u32 z_excessive_buffer_overrun_errors;  /* starting count for PMA */
165  	u32 z_vl15_dropped;                     /* starting count for PMA */
166  	u8 sl_to_vl[16];
167  };
168  
169  struct qib_ibdev {
170  	struct rvt_dev_info rdi;
171  
172  	struct list_head piowait;       /* list for wait PIO buf */
173  	struct list_head dmawait;	/* list for wait DMA */
174  	struct list_head txwait;        /* list for wait qib_verbs_txreq */
175  	struct list_head memwait;       /* list for wait kernel memory */
176  	struct list_head txreq_free;
177  	struct timer_list mem_timer;
178  	struct qib_pio_header *pio_hdrs;
179  	dma_addr_t pio_hdrs_phys;
180  
181  	u32 n_piowait;
182  	u32 n_txwait;
183  
184  #ifdef CONFIG_DEBUG_FS
185  	/* per HCA debugfs */
186  	struct dentry *qib_ibdev_dbg;
187  #endif
188  };
189  
190  struct qib_verbs_counters {
191  	u64 symbol_error_counter;
192  	u64 link_error_recovery_counter;
193  	u64 link_downed_counter;
194  	u64 port_rcv_errors;
195  	u64 port_rcv_remphys_errors;
196  	u64 port_xmit_discards;
197  	u64 port_xmit_data;
198  	u64 port_rcv_data;
199  	u64 port_xmit_packets;
200  	u64 port_rcv_packets;
201  	u32 local_link_integrity_errors;
202  	u32 excessive_buffer_overrun_errors;
203  	u32 vl15_dropped;
204  };
205  
to_idev(struct ib_device * ibdev)206  static inline struct qib_ibdev *to_idev(struct ib_device *ibdev)
207  {
208  	struct rvt_dev_info *rdi;
209  
210  	rdi = container_of(ibdev, struct rvt_dev_info, ibdev);
211  	return container_of(rdi, struct qib_ibdev, rdi);
212  }
213  
214  /*
215   * Send if not busy or waiting for I/O and either
216   * a RC response is pending or we can process send work requests.
217   */
qib_send_ok(struct rvt_qp * qp)218  static inline int qib_send_ok(struct rvt_qp *qp)
219  {
220  	return !(qp->s_flags & (RVT_S_BUSY | RVT_S_ANY_WAIT_IO)) &&
221  		(qp->s_hdrwords || (qp->s_flags & RVT_S_RESP_PENDING) ||
222  		 !(qp->s_flags & RVT_S_ANY_WAIT_SEND));
223  }
224  
225  bool _qib_schedule_send(struct rvt_qp *qp);
226  bool qib_schedule_send(struct rvt_qp *qp);
227  
qib_pkey_ok(u16 pkey1,u16 pkey2)228  static inline int qib_pkey_ok(u16 pkey1, u16 pkey2)
229  {
230  	u16 p1 = pkey1 & 0x7FFF;
231  	u16 p2 = pkey2 & 0x7FFF;
232  
233  	/*
234  	 * Low 15 bits must be non-zero and match, and
235  	 * one of the two must be a full member.
236  	 */
237  	return p1 && p1 == p2 && ((__s16)pkey1 < 0 || (__s16)pkey2 < 0);
238  }
239  
240  void qib_bad_pkey(struct qib_ibport *ibp, u32 key, u32 sl,
241  		  u32 qp1, u32 qp2, __be16 lid1, __be16 lid2);
242  void qib_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num);
243  void qib_sys_guid_chg(struct qib_ibport *ibp);
244  void qib_node_desc_chg(struct qib_ibport *ibp);
245  int qib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
246  		    const struct ib_wc *in_wc, const struct ib_grh *in_grh,
247  		    const struct ib_mad *in, struct ib_mad *out,
248  		    size_t *out_mad_size, u16 *out_mad_pkey_index);
249  void qib_notify_create_mad_agent(struct rvt_dev_info *rdi, int port_idx);
250  void qib_notify_free_mad_agent(struct rvt_dev_info *rdi, int port_idx);
251  
252  /*
253   * Compare the lower 24 bits of the two values.
254   * Returns an integer <, ==, or > than zero.
255   */
qib_cmp24(u32 a,u32 b)256  static inline int qib_cmp24(u32 a, u32 b)
257  {
258  	return (((int) a) - ((int) b)) << 8;
259  }
260  
261  int qib_snapshot_counters(struct qib_pportdata *ppd, u64 *swords,
262  			  u64 *rwords, u64 *spkts, u64 *rpkts,
263  			  u64 *xmit_wait);
264  
265  int qib_get_counters(struct qib_pportdata *ppd,
266  		     struct qib_verbs_counters *cntrs);
267  
268  /*
269   * Functions provided by qib driver for rdmavt to use
270   */
271  unsigned qib_free_all_qps(struct rvt_dev_info *rdi);
272  void *qib_qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp);
273  void qib_qp_priv_free(struct rvt_dev_info *rdi, struct rvt_qp *qp);
274  void qib_notify_qp_reset(struct rvt_qp *qp);
275  int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
276  		  enum ib_qp_type type, u32 port);
277  void qib_restart_rc(struct rvt_qp *qp, u32 psn, int wait);
278  #ifdef CONFIG_DEBUG_FS
279  
280  void qib_qp_iter_print(struct seq_file *s, struct rvt_qp_iter *iter);
281  
282  #endif
283  
284  unsigned qib_pkt_delay(u32 plen, u8 snd_mult, u8 rcv_mult);
285  
286  void qib_verbs_sdma_desc_avail(struct qib_pportdata *ppd, unsigned avail);
287  
288  void qib_put_txreq(struct qib_verbs_txreq *tx);
289  
290  int qib_verbs_send(struct rvt_qp *qp, struct ib_header *hdr,
291  		   u32 hdrwords, struct rvt_sge_state *ss, u32 len);
292  
293  void qib_uc_rcv(struct qib_ibport *ibp, struct ib_header *hdr,
294  		int has_grh, void *data, u32 tlen, struct rvt_qp *qp);
295  
296  void qib_rc_rcv(struct qib_ctxtdata *rcd, struct ib_header *hdr,
297  		int has_grh, void *data, u32 tlen, struct rvt_qp *qp);
298  
299  int qib_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr);
300  
301  int qib_check_send_wqe(struct rvt_qp *qp, struct rvt_swqe *wqe,
302  		       bool *call_send);
303  
304  struct ib_ah *qib_create_qp0_ah(struct qib_ibport *ibp, u16 dlid);
305  
306  void qib_rc_send_complete(struct rvt_qp *qp, struct ib_header *hdr);
307  
308  int qib_post_ud_send(struct rvt_qp *qp, const struct ib_send_wr *wr);
309  
310  void qib_ud_rcv(struct qib_ibport *ibp, struct ib_header *hdr,
311  		int has_grh, void *data, u32 tlen, struct rvt_qp *qp);
312  
313  void qib_migrate_qp(struct rvt_qp *qp);
314  
315  int qib_ruc_check_hdr(struct qib_ibport *ibp, struct ib_header *hdr,
316  		      int has_grh, struct rvt_qp *qp, u32 bth0);
317  
318  u32 qib_make_grh(struct qib_ibport *ibp, struct ib_grh *hdr,
319  		 const struct ib_global_route *grh, u32 hwords, u32 nwords);
320  
321  void qib_make_ruc_header(struct rvt_qp *qp, struct ib_other_headers *ohdr,
322  			 u32 bth0, u32 bth2);
323  
324  void _qib_do_send(struct work_struct *work);
325  
326  void qib_do_send(struct rvt_qp *qp);
327  
328  void qib_send_rc_ack(struct rvt_qp *qp);
329  
330  int qib_make_rc_req(struct rvt_qp *qp, unsigned long *flags);
331  
332  int qib_make_uc_req(struct rvt_qp *qp, unsigned long *flags);
333  
334  int qib_make_ud_req(struct rvt_qp *qp, unsigned long *flags);
335  
336  int qib_register_ib_device(struct qib_devdata *);
337  
338  void qib_unregister_ib_device(struct qib_devdata *);
339  
340  void qib_ib_rcv(struct qib_ctxtdata *, void *, void *, u32);
341  
342  void qib_ib_piobufavail(struct qib_devdata *);
343  
344  unsigned qib_get_npkeys(struct qib_devdata *);
345  
346  unsigned qib_get_pkey(struct qib_ibport *, unsigned);
347  
348  extern const enum ib_wc_opcode ib_qib_wc_opcode[];
349  
350  /*
351   * Below  HCA-independent IB PhysPortState values, returned
352   * by the f_ibphys_portstate() routine.
353   */
354  #define IB_PHYSPORTSTATE_SLEEP 1
355  #define IB_PHYSPORTSTATE_POLL 2
356  #define IB_PHYSPORTSTATE_DISABLED 3
357  #define IB_PHYSPORTSTATE_CFG_TRAIN 4
358  #define IB_PHYSPORTSTATE_LINKUP 5
359  #define IB_PHYSPORTSTATE_LINK_ERR_RECOVER 6
360  #define IB_PHYSPORTSTATE_CFG_DEBOUNCE 8
361  #define IB_PHYSPORTSTATE_CFG_IDLE 0xB
362  #define IB_PHYSPORTSTATE_RECOVERY_RETRAIN 0xC
363  #define IB_PHYSPORTSTATE_RECOVERY_WAITRMT 0xE
364  #define IB_PHYSPORTSTATE_RECOVERY_IDLE 0xF
365  #define IB_PHYSPORTSTATE_CFG_ENH 0x10
366  #define IB_PHYSPORTSTATE_CFG_WAIT_ENH 0x13
367  
368  extern const int ib_rvt_state_ops[];
369  
370  extern __be64 ib_qib_sys_image_guid;    /* in network order */
371  
372  extern unsigned int ib_rvt_lkey_table_size;
373  
374  extern unsigned int ib_qib_max_cqes;
375  
376  extern unsigned int ib_qib_max_cqs;
377  
378  extern unsigned int ib_qib_max_qp_wrs;
379  
380  extern unsigned int ib_qib_max_qps;
381  
382  extern unsigned int ib_qib_max_sges;
383  
384  extern unsigned int ib_qib_max_mcast_grps;
385  
386  extern unsigned int ib_qib_max_mcast_qp_attached;
387  
388  extern unsigned int ib_qib_max_srqs;
389  
390  extern unsigned int ib_qib_max_srq_sges;
391  
392  extern unsigned int ib_qib_max_srq_wrs;
393  
394  extern const u32 ib_qib_rnr_table[];
395  
396  extern const struct rvt_operation_params qib_post_parms[];
397  
398  #endif                          /* QIB_VERBS_H */
399