1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#ifndef IPATH_VERBS_H
35#define IPATH_VERBS_H
36
37#include <linux/types.h>
38#include <linux/spinlock.h>
39#include <linux/kernel.h>
40#include <linux/interrupt.h>
41#include <rdma/ib_pack.h>
42
43#include "ipath_layer.h"
44#include "verbs_debug.h"
45
46#define QPN_MAX (1 << 24)
47#define QPNMAP_ENTRIES (QPN_MAX / PAGE_SIZE / BITS_PER_BYTE)
48
49
50
51
52
53#define IPATH_UVERBS_ABI_VERSION 1
54
55
56
57
58
59#define IB_CQ_NONE (IB_CQ_NEXT_COMP + 1)
60
61#define IB_RNR_NAK 0x20
62#define IB_NAK_PSN_ERROR 0x60
63#define IB_NAK_INVALID_REQUEST 0x61
64#define IB_NAK_REMOTE_ACCESS_ERROR 0x62
65#define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x63
66#define IB_NAK_INVALID_RD_REQUEST 0x64
67
68#define IPATH_POST_SEND_OK 0x01
69#define IPATH_POST_RECV_OK 0x02
70#define IPATH_PROCESS_RECV_OK 0x04
71#define IPATH_PROCESS_SEND_OK 0x08
72
73
74#define IB_PMA_SAMPLE_STATUS_DONE 0x00
75#define IB_PMA_SAMPLE_STATUS_STARTED 0x01
76#define IB_PMA_SAMPLE_STATUS_RUNNING 0x02
77
78
79#define IB_PMA_PORT_XMIT_DATA __constant_htons(0x0001)
80#define IB_PMA_PORT_RCV_DATA __constant_htons(0x0002)
81#define IB_PMA_PORT_XMIT_PKTS __constant_htons(0x0003)
82#define IB_PMA_PORT_RCV_PKTS __constant_htons(0x0004)
83#define IB_PMA_PORT_XMIT_WAIT __constant_htons(0x0005)
84
85struct ib_reth {
86 __be64 vaddr;
87 __be32 rkey;
88 __be32 length;
89} __attribute__ ((packed));
90
91struct ib_atomic_eth {
92 __be64 vaddr;
93 __be32 rkey;
94 __be64 swap_data;
95 __be64 compare_data;
96} __attribute__ ((packed));
97
98struct ipath_other_headers {
99 __be32 bth[3];
100 union {
101 struct {
102 __be32 deth[2];
103 __be32 imm_data;
104 } ud;
105 struct {
106 struct ib_reth reth;
107 __be32 imm_data;
108 } rc;
109 struct {
110 __be32 aeth;
111 __be64 atomic_ack_eth;
112 } at;
113 __be32 imm_data;
114 __be32 aeth;
115 struct ib_atomic_eth atomic_eth;
116 } u;
117} __attribute__ ((packed));
118
119
120
121
122
123
124
125struct ipath_ib_header {
126 __be16 lrh[4];
127 union {
128 struct {
129 struct ib_grh grh;
130 struct ipath_other_headers oth;
131 } l;
132 struct ipath_other_headers oth;
133 } u;
134} __attribute__ ((packed));
135
136
137
138
139
140
141struct ipath_mcast_qp {
142 struct list_head list;
143 struct ipath_qp *qp;
144};
145
146struct ipath_mcast {
147 struct rb_node rb_node;
148 union ib_gid mgid;
149 struct list_head qp_list;
150 wait_queue_head_t wait;
151 atomic_t refcount;
152 int n_attached;
153};
154
155
156struct ipath_mr {
157 struct ib_mr ibmr;
158 struct ipath_mregion mr;
159};
160
161
162struct ipath_fmr {
163 struct ib_fmr ibfmr;
164 u8 page_shift;
165 struct ipath_mregion mr;
166};
167
168
169struct ipath_pd {
170 struct ib_pd ibpd;
171 int user;
172};
173
174
175struct ipath_ah {
176 struct ib_ah ibah;
177 struct ib_ah_attr attr;
178};
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224struct ipath_cq {
225 struct ib_cq ibcq;
226 struct tasklet_struct comptask;
227 spinlock_t lock;
228 u8 notify;
229 u8 triggered;
230 u32 head;
231 u32 tail;
232 struct ib_wc *queue;
233};
234
235
236
237
238
239
240struct ipath_swqe {
241 struct ib_send_wr wr;
242 u32 psn;
243 u32 lpsn;
244 u32 ssn;
245 u32 length;
246 struct ipath_sge sg_list[0];
247};
248
249
250
251
252
253
254struct ipath_rwqe {
255 u64 wr_id;
256 u32 length;
257 u8 num_sge;
258 struct ipath_sge sg_list[0];
259};
260
261struct ipath_rq {
262 spinlock_t lock;
263 u32 head;
264 u32 tail;
265 u32 size;
266 u8 max_sge;
267 struct ipath_rwqe *wq;
268};
269
270struct ipath_srq {
271 struct ib_srq ibsrq;
272 struct ipath_rq rq;
273
274 u32 limit;
275};
276
277
278
279
280
281
282
283
284
285struct ipath_qp {
286 struct ib_qp ibqp;
287 struct ipath_qp *next;
288 struct ipath_qp *timer_next;
289 struct list_head piowait;
290 struct list_head timerwait;
291 struct ib_ah_attr remote_ah_attr;
292 struct ipath_ib_header s_hdr;
293 atomic_t refcount;
294 wait_queue_head_t wait;
295 struct tasklet_struct s_task;
296 struct ipath_sge_state *s_cur_sge;
297 struct ipath_sge_state s_sge;
298
299 struct ipath_sge_state s_rdma_sge;
300 struct ipath_sge_state r_sge;
301 spinlock_t s_lock;
302 unsigned long s_flags;
303 u32 s_hdrwords;
304 u32 s_cur_size;
305 u32 s_len;
306 u32 s_rdma_len;
307 u32 s_next_psn;
308 u32 s_last_psn;
309 u32 s_psn;
310 u32 s_ack_psn;
311 u32 s_rnr_timeout;
312 u32 r_ack_psn;
313 u64 r_wr_id;
314 u64 r_atomic_data;
315 u32 r_atomic_psn;
316 u32 r_len;
317 u32 r_rcv_len;
318 u32 r_psn;
319 u32 r_msn;
320 u8 state;
321 u8 s_state;
322 u8 s_ack_state;
323 u8 s_nak_state;
324 u8 r_state;
325 u8 r_ack_state;
326 u8 r_nak_state;
327 u8 r_min_rnr_timer;
328 u8 r_reuse_sge;
329 u8 r_sge_inx;
330 u8 qp_access_flags;
331 u8 s_max_sge;
332 u8 s_retry_cnt;
333 u8 s_rnr_retry_cnt;
334 u8 s_retry;
335 u8 s_rnr_retry;
336 u8 s_pkey_index;
337 enum ib_mtu path_mtu;
338 u32 remote_qpn;
339 u32 qkey;
340 u32 s_size;
341 u32 s_head;
342 u32 s_tail;
343 u32 s_cur;
344 u32 s_last;
345 u32 s_ssn;
346 u32 s_lsn;
347 struct ipath_swqe *s_wq;
348 struct ipath_rq r_rq;
349};
350
351
352
353
354#define IPATH_S_BUSY 0
355#define IPATH_S_SIGNAL_REQ_WR 1
356
357
358
359
360
361static inline struct ipath_swqe *get_swqe_ptr(struct ipath_qp *qp,
362 unsigned n)
363{
364 return (struct ipath_swqe *)((char *)qp->s_wq +
365 (sizeof(struct ipath_swqe) +
366 qp->s_max_sge *
367 sizeof(struct ipath_sge)) * n);
368}
369
370
371
372
373
374static inline struct ipath_rwqe *get_rwqe_ptr(struct ipath_rq *rq,
375 unsigned n)
376{
377 return (struct ipath_rwqe *)
378 ((char *) rq->wq +
379 (sizeof(struct ipath_rwqe) +
380 rq->max_sge * sizeof(struct ipath_sge)) * n);
381}
382
383
384
385
386
387
388struct qpn_map {
389 atomic_t n_free;
390 void *page;
391};
392
393struct ipath_qp_table {
394 spinlock_t lock;
395 u32 last;
396 u32 max;
397 u32 nmaps;
398 struct ipath_qp **table;
399
400 struct qpn_map map[QPNMAP_ENTRIES];
401};
402
403struct ipath_lkey_table {
404 spinlock_t lock;
405 u32 next;
406 u32 gen;
407 u32 max;
408 struct ipath_mregion **table;
409};
410
411struct ipath_opcode_stats {
412 u64 n_packets;
413 u64 n_bytes;
414};
415
416struct ipath_ibdev {
417 struct ib_device ibdev;
418 struct list_head dev_list;
419 struct ipath_devdata *dd;
420 int ib_unit;
421 u16 sm_lid;
422 u8 sm_sl;
423 u8 mkeyprot_resv_lmc;
424
425 unsigned long mkey_lease_timeout;
426
427
428 struct ipath_qp_table qp_table;
429 struct ipath_lkey_table lk_table;
430 struct list_head pending[3];
431 struct list_head piowait;
432
433 struct list_head rnrwait;
434 spinlock_t pending_lock;
435 __be64 sys_image_guid;
436 __be64 gid_prefix;
437 __be64 mkey;
438 u32 n_pds_allocated;
439 u32 n_ahs_allocated;
440 u32 n_cqs_allocated;
441 u32 n_srqs_allocated;
442 u32 n_mcast_grps_allocated;
443 u64 ipath_sword;
444 u64 ipath_rword;
445 u64 ipath_spkts;
446 u64 ipath_rpkts;
447
448 u64 ipath_xmit_wait;
449 u64 rcv_errors;
450 u64 n_unicast_xmit;
451 u64 n_unicast_rcv;
452 u64 n_multicast_xmit;
453 u64 n_multicast_rcv;
454 u64 z_symbol_error_counter;
455 u64 z_link_error_recovery_counter;
456 u64 z_link_downed_counter;
457 u64 z_port_rcv_errors;
458 u64 z_port_rcv_remphys_errors;
459 u64 z_port_xmit_discards;
460 u64 z_port_xmit_data;
461 u64 z_port_rcv_data;
462 u64 z_port_xmit_packets;
463 u64 z_port_rcv_packets;
464 u32 z_pkey_violations;
465 u32 z_local_link_integrity_errors;
466 u32 z_excessive_buffer_overrun_errors;
467 u32 n_rc_resends;
468 u32 n_rc_acks;
469 u32 n_rc_qacks;
470 u32 n_seq_naks;
471 u32 n_rdma_seq;
472 u32 n_rnr_naks;
473 u32 n_other_naks;
474 u32 n_timeouts;
475 u32 n_pkt_drops;
476 u32 n_vl15_dropped;
477 u32 n_wqe_errs;
478 u32 n_rdma_dup_busy;
479 u32 n_piowait;
480 u32 n_no_piobuf;
481 u32 port_cap_flags;
482 u32 pma_sample_start;
483 u32 pma_sample_interval;
484 __be16 pma_counter_select[5];
485 u16 pma_tag;
486 u16 qkey_violations;
487 u16 mkey_violations;
488 u16 mkey_lease_period;
489 u16 pending_index;
490 u8 pma_sample_status;
491 u8 subnet_timeout;
492 u8 link_width_enabled;
493 u8 vl_high_limit;
494 struct ipath_opcode_stats opstats[128];
495};
496
497struct ipath_ucontext {
498 struct ib_ucontext ibucontext;
499};
500
501static inline struct ipath_mr *to_imr(struct ib_mr *ibmr)
502{
503 return container_of(ibmr, struct ipath_mr, ibmr);
504}
505
506static inline struct ipath_fmr *to_ifmr(struct ib_fmr *ibfmr)
507{
508 return container_of(ibfmr, struct ipath_fmr, ibfmr);
509}
510
511static inline struct ipath_pd *to_ipd(struct ib_pd *ibpd)
512{
513 return container_of(ibpd, struct ipath_pd, ibpd);
514}
515
516static inline struct ipath_ah *to_iah(struct ib_ah *ibah)
517{
518 return container_of(ibah, struct ipath_ah, ibah);
519}
520
521static inline struct ipath_cq *to_icq(struct ib_cq *ibcq)
522{
523 return container_of(ibcq, struct ipath_cq, ibcq);
524}
525
526static inline struct ipath_srq *to_isrq(struct ib_srq *ibsrq)
527{
528 return container_of(ibsrq, struct ipath_srq, ibsrq);
529}
530
531static inline struct ipath_qp *to_iqp(struct ib_qp *ibqp)
532{
533 return container_of(ibqp, struct ipath_qp, ibqp);
534}
535
536static inline struct ipath_ibdev *to_idev(struct ib_device *ibdev)
537{
538 return container_of(ibdev, struct ipath_ibdev, ibdev);
539}
540
541int ipath_process_mad(struct ib_device *ibdev,
542 int mad_flags,
543 u8 port_num,
544 struct ib_wc *in_wc,
545 struct ib_grh *in_grh,
546 struct ib_mad *in_mad, struct ib_mad *out_mad);
547
548static inline struct ipath_ucontext *to_iucontext(struct ib_ucontext
549 *ibucontext)
550{
551 return container_of(ibucontext, struct ipath_ucontext, ibucontext);
552}
553
554
555
556
557
558static inline int ipath_cmp24(u32 a, u32 b)
559{
560 return (((int) a) - ((int) b)) << 8;
561}
562
563struct ipath_mcast *ipath_mcast_find(union ib_gid *mgid);
564
565int ipath_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid);
566
567int ipath_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid);
568
569int ipath_mcast_tree_empty(void);
570
571__be32 ipath_compute_aeth(struct ipath_qp *qp);
572
573struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn);
574
575struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
576 struct ib_qp_init_attr *init_attr,
577 struct ib_udata *udata);
578
579int ipath_destroy_qp(struct ib_qp *ibqp);
580
581int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
582 int attr_mask);
583
584int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
585 int attr_mask, struct ib_qp_init_attr *init_attr);
586
587void ipath_free_all_qps(struct ipath_qp_table *qpt);
588
589int ipath_init_qp_table(struct ipath_ibdev *idev, int size);
590
591void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc);
592
593void ipath_get_credit(struct ipath_qp *qp, u32 aeth);
594
595void ipath_cq_enter(struct ipath_cq *cq, struct ib_wc *entry, int sig);
596
597int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
598 u32 len, u64 vaddr, u32 rkey, int acc);
599
600int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge,
601 struct ib_sge *sge, int acc);
602
603void ipath_copy_sge(struct ipath_sge_state *ss, void *data, u32 length);
604
605void ipath_skip_sge(struct ipath_sge_state *ss, u32 length);
606
607int ipath_post_ruc_send(struct ipath_qp *qp, struct ib_send_wr *wr);
608
609void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
610 int has_grh, void *data, u32 tlen, struct ipath_qp *qp);
611
612void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
613 int has_grh, void *data, u32 tlen, struct ipath_qp *qp);
614
615void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc);
616
617int ipath_post_ud_send(struct ipath_qp *qp, struct ib_send_wr *wr);
618
619void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
620 int has_grh, void *data, u32 tlen, struct ipath_qp *qp);
621
622int ipath_alloc_lkey(struct ipath_lkey_table *rkt,
623 struct ipath_mregion *mr);
624
625void ipath_free_lkey(struct ipath_lkey_table *rkt, u32 lkey);
626
627int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge,
628 struct ib_sge *sge, int acc);
629
630int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
631 u32 len, u64 vaddr, u32 rkey, int acc);
632
633int ipath_post_srq_receive(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
634 struct ib_recv_wr **bad_wr);
635
636struct ib_srq *ipath_create_srq(struct ib_pd *ibpd,
637 struct ib_srq_init_attr *srq_init_attr,
638 struct ib_udata *udata);
639
640int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
641 enum ib_srq_attr_mask attr_mask);
642
643int ipath_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr);
644
645int ipath_destroy_srq(struct ib_srq *ibsrq);
646
647void ipath_cq_enter(struct ipath_cq *cq, struct ib_wc *entry, int sig);
648
649int ipath_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry);
650
651struct ib_cq *ipath_create_cq(struct ib_device *ibdev, int entries,
652 struct ib_ucontext *context,
653 struct ib_udata *udata);
654
655int ipath_destroy_cq(struct ib_cq *ibcq);
656
657int ipath_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify notify);
658
659int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata);
660
661struct ib_mr *ipath_get_dma_mr(struct ib_pd *pd, int acc);
662
663struct ib_mr *ipath_reg_phys_mr(struct ib_pd *pd,
664 struct ib_phys_buf *buffer_list,
665 int num_phys_buf, int acc, u64 *iova_start);
666
667struct ib_mr *ipath_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
668 int mr_access_flags,
669 struct ib_udata *udata);
670
671int ipath_dereg_mr(struct ib_mr *ibmr);
672
673struct ib_fmr *ipath_alloc_fmr(struct ib_pd *pd, int mr_access_flags,
674 struct ib_fmr_attr *fmr_attr);
675
676int ipath_map_phys_fmr(struct ib_fmr *ibfmr, u64 * page_list,
677 int list_len, u64 iova);
678
679int ipath_unmap_fmr(struct list_head *fmr_list);
680
681int ipath_dealloc_fmr(struct ib_fmr *ibfmr);
682
683void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev);
684
685void ipath_insert_rnr_queue(struct ipath_qp *qp);
686
687int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only);
688
689u32 ipath_make_grh(struct ipath_ibdev *dev, struct ib_grh *hdr,
690 struct ib_global_route *grh, u32 hwords, u32 nwords);
691
692void ipath_do_ruc_send(unsigned long data);
693
694u32 ipath_make_rc_ack(struct ipath_qp *qp, struct ipath_other_headers *ohdr,
695 u32 pmtu);
696
697int ipath_make_rc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr,
698 u32 pmtu, u32 *bth0p, u32 *bth2p);
699
700int ipath_make_uc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr,
701 u32 pmtu, u32 *bth0p, u32 *bth2p);
702
703extern const enum ib_wc_opcode ib_ipath_wc_opcode[];
704
705extern const u8 ipath_cvt_physportstate[];
706
707extern const int ib_ipath_state_ops[];
708
709extern unsigned int ib_ipath_lkey_table_size;
710
711extern unsigned int ib_ipath_max_cqes;
712
713extern unsigned int ib_ipath_max_cqs;
714
715extern unsigned int ib_ipath_max_qp_wrs;
716
717extern unsigned int ib_ipath_max_sges;
718
719extern unsigned int ib_ipath_max_mcast_grps;
720
721extern unsigned int ib_ipath_max_mcast_qp_attached;
722
723extern unsigned int ib_ipath_max_srqs;
724
725extern unsigned int ib_ipath_max_srq_sges;
726
727extern unsigned int ib_ipath_max_srq_wrs;
728
729extern const u32 ib_ipath_rnr_table[];
730
731#endif
732