diff options
Diffstat (limited to 'drivers/infiniband/hw/ipath/ipath_verbs.h')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.h | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.h b/drivers/infiniband/hw/ipath/ipath_verbs.h index c0c8d5b24a7..7c4929f1cb5 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.h +++ b/drivers/infiniband/hw/ipath/ipath_verbs.h | |||
@@ -40,9 +40,12 @@ | |||
40 | #include <linux/interrupt.h> | 40 | #include <linux/interrupt.h> |
41 | #include <linux/kref.h> | 41 | #include <linux/kref.h> |
42 | #include <rdma/ib_pack.h> | 42 | #include <rdma/ib_pack.h> |
43 | #include <rdma/ib_user_verbs.h> | ||
43 | 44 | ||
44 | #include "ipath_layer.h" | 45 | #include "ipath_layer.h" |
45 | 46 | ||
47 | #define IPATH_MAX_RDMA_ATOMIC 4 | ||
48 | |||
46 | #define QPN_MAX (1 << 24) | 49 | #define QPN_MAX (1 << 24) |
47 | #define QPNMAP_ENTRIES (QPN_MAX / PAGE_SIZE / BITS_PER_BYTE) | 50 | #define QPNMAP_ENTRIES (QPN_MAX / PAGE_SIZE / BITS_PER_BYTE) |
48 | 51 | ||
@@ -89,7 +92,7 @@ struct ib_reth { | |||
89 | } __attribute__ ((packed)); | 92 | } __attribute__ ((packed)); |
90 | 93 | ||
91 | struct ib_atomic_eth { | 94 | struct ib_atomic_eth { |
92 | __be64 vaddr; | 95 | __be32 vaddr[2]; /* unaligned so access as 2 32-bit words */ |
93 | __be32 rkey; | 96 | __be32 rkey; |
94 | __be64 swap_data; | 97 | __be64 swap_data; |
95 | __be64 compare_data; | 98 | __be64 compare_data; |
@@ -108,7 +111,7 @@ struct ipath_other_headers { | |||
108 | } rc; | 111 | } rc; |
109 | struct { | 112 | struct { |
110 | __be32 aeth; | 113 | __be32 aeth; |
111 | __be64 atomic_ack_eth; | 114 | __be32 atomic_ack_eth[2]; |
112 | } at; | 115 | } at; |
113 | __be32 imm_data; | 116 | __be32 imm_data; |
114 | __be32 aeth; | 117 | __be32 aeth; |
@@ -186,7 +189,7 @@ struct ipath_mmap_info { | |||
186 | struct ipath_cq_wc { | 189 | struct ipath_cq_wc { |
187 | u32 head; /* index of next entry to fill */ | 190 | u32 head; /* index of next entry to fill */ |
188 | u32 tail; /* index of next ib_poll_cq() entry */ | 191 | u32 tail; /* index of next ib_poll_cq() entry */ |
189 | struct ib_wc queue[1]; /* this is actually size ibcq.cqe + 1 */ | 192 | struct ib_uverbs_wc queue[1]; /* this is actually size ibcq.cqe + 1 */ |
190 | }; | 193 | }; |
191 | 194 | ||
192 | /* | 195 | /* |
@@ -312,6 +315,19 @@ struct ipath_sge_state { | |||
312 | }; | 315 | }; |
313 | 316 | ||
314 | /* | 317 | /* |
318 | * This structure holds the information that the send tasklet needs | ||
319 | * to send a RDMA read response or atomic operation. | ||
320 | */ | ||
321 | struct ipath_ack_entry { | ||
322 | u8 opcode; | ||
323 | u32 psn; | ||
324 | union { | ||
325 | struct ipath_sge_state rdma_sge; | ||
326 | u64 atomic_data; | ||
327 | }; | ||
328 | }; | ||
329 | |||
330 | /* | ||
315 | * Variables prefixed with s_ are for the requester (sender). | 331 | * Variables prefixed with s_ are for the requester (sender). |
316 | * Variables prefixed with r_ are for the responder (receiver). | 332 | * Variables prefixed with r_ are for the responder (receiver). |
317 | * Variables prefixed with ack_ are for responder replies. | 333 | * Variables prefixed with ack_ are for responder replies. |
@@ -333,24 +349,24 @@ struct ipath_qp { | |||
333 | struct ipath_mmap_info *ip; | 349 | struct ipath_mmap_info *ip; |
334 | struct ipath_sge_state *s_cur_sge; | 350 | struct ipath_sge_state *s_cur_sge; |
335 | struct ipath_sge_state s_sge; /* current send request data */ | 351 | struct ipath_sge_state s_sge; /* current send request data */ |
336 | /* current RDMA read send data */ | 352 | struct ipath_ack_entry s_ack_queue[IPATH_MAX_RDMA_ATOMIC + 1]; |
337 | struct ipath_sge_state s_rdma_sge; | 353 | struct ipath_sge_state s_ack_rdma_sge; |
354 | struct ipath_sge_state s_rdma_read_sge; | ||
338 | struct ipath_sge_state r_sge; /* current receive data */ | 355 | struct ipath_sge_state r_sge; /* current receive data */ |
339 | spinlock_t s_lock; | 356 | spinlock_t s_lock; |
340 | unsigned long s_flags; | 357 | unsigned long s_busy; |
341 | u32 s_hdrwords; /* size of s_hdr in 32 bit words */ | 358 | u32 s_hdrwords; /* size of s_hdr in 32 bit words */ |
342 | u32 s_cur_size; /* size of send packet in bytes */ | 359 | u32 s_cur_size; /* size of send packet in bytes */ |
343 | u32 s_len; /* total length of s_sge */ | 360 | u32 s_len; /* total length of s_sge */ |
344 | u32 s_rdma_len; /* total length of s_rdma_sge */ | 361 | u32 s_rdma_read_len; /* total length of s_rdma_read_sge */ |
345 | u32 s_next_psn; /* PSN for next request */ | 362 | u32 s_next_psn; /* PSN for next request */ |
346 | u32 s_last_psn; /* last response PSN processed */ | 363 | u32 s_last_psn; /* last response PSN processed */ |
347 | u32 s_psn; /* current packet sequence number */ | 364 | u32 s_psn; /* current packet sequence number */ |
348 | u32 s_ack_psn; /* PSN for RDMA_READ */ | 365 | u32 s_ack_rdma_psn; /* PSN for sending RDMA read responses */ |
366 | u32 s_ack_psn; /* PSN for acking sends and RDMA writes */ | ||
349 | u32 s_rnr_timeout; /* number of milliseconds for RNR timeout */ | 367 | u32 s_rnr_timeout; /* number of milliseconds for RNR timeout */ |
350 | u32 r_ack_psn; /* PSN for next ACK or atomic ACK */ | 368 | u32 r_ack_psn; /* PSN for next ACK or atomic ACK */ |
351 | u64 r_wr_id; /* ID for current receive WQE */ | 369 | u64 r_wr_id; /* ID for current receive WQE */ |
352 | u64 r_atomic_data; /* data for last atomic op */ | ||
353 | u32 r_atomic_psn; /* PSN of last atomic op */ | ||
354 | u32 r_len; /* total length of r_sge */ | 370 | u32 r_len; /* total length of r_sge */ |
355 | u32 r_rcv_len; /* receive data len processed */ | 371 | u32 r_rcv_len; /* receive data len processed */ |
356 | u32 r_psn; /* expected rcv packet sequence number */ | 372 | u32 r_psn; /* expected rcv packet sequence number */ |
@@ -360,12 +376,13 @@ struct ipath_qp { | |||
360 | u8 s_ack_state; /* opcode of packet to ACK */ | 376 | u8 s_ack_state; /* opcode of packet to ACK */ |
361 | u8 s_nak_state; /* non-zero if NAK is pending */ | 377 | u8 s_nak_state; /* non-zero if NAK is pending */ |
362 | u8 r_state; /* opcode of last packet received */ | 378 | u8 r_state; /* opcode of last packet received */ |
363 | u8 r_ack_state; /* opcode of packet to ACK */ | ||
364 | u8 r_nak_state; /* non-zero if NAK is pending */ | 379 | u8 r_nak_state; /* non-zero if NAK is pending */ |
365 | u8 r_min_rnr_timer; /* retry timeout value for RNR NAKs */ | 380 | u8 r_min_rnr_timer; /* retry timeout value for RNR NAKs */ |
366 | u8 r_reuse_sge; /* for UC receive errors */ | 381 | u8 r_reuse_sge; /* for UC receive errors */ |
367 | u8 r_sge_inx; /* current index into sg_list */ | 382 | u8 r_sge_inx; /* current index into sg_list */ |
368 | u8 r_wrid_valid; /* r_wrid set but CQ entry not yet made */ | 383 | u8 r_wrid_valid; /* r_wrid set but CQ entry not yet made */ |
384 | u8 r_max_rd_atomic; /* max number of RDMA read/atomic to receive */ | ||
385 | u8 r_head_ack_queue; /* index into s_ack_queue[] */ | ||
369 | u8 qp_access_flags; | 386 | u8 qp_access_flags; |
370 | u8 s_max_sge; /* size of s_wq->sg_list */ | 387 | u8 s_max_sge; /* size of s_wq->sg_list */ |
371 | u8 s_retry_cnt; /* number of times to retry */ | 388 | u8 s_retry_cnt; /* number of times to retry */ |
@@ -374,6 +391,10 @@ struct ipath_qp { | |||
374 | u8 s_rnr_retry; /* requester RNR retry counter */ | 391 | u8 s_rnr_retry; /* requester RNR retry counter */ |
375 | u8 s_wait_credit; /* limit number of unacked packets sent */ | 392 | u8 s_wait_credit; /* limit number of unacked packets sent */ |
376 | u8 s_pkey_index; /* PKEY index to use */ | 393 | u8 s_pkey_index; /* PKEY index to use */ |
394 | u8 s_max_rd_atomic; /* max number of RDMA read/atomic to send */ | ||
395 | u8 s_num_rd_atomic; /* number of RDMA read/atomic pending */ | ||
396 | u8 s_tail_ack_queue; /* index into s_ack_queue[] */ | ||
397 | u8 s_flags; | ||
377 | u8 timeout; /* Timeout for this QP */ | 398 | u8 timeout; /* Timeout for this QP */ |
378 | enum ib_mtu path_mtu; | 399 | enum ib_mtu path_mtu; |
379 | u32 remote_qpn; | 400 | u32 remote_qpn; |
@@ -390,11 +411,16 @@ struct ipath_qp { | |||
390 | struct ipath_sge r_sg_list[0]; /* verified SGEs */ | 411 | struct ipath_sge r_sg_list[0]; /* verified SGEs */ |
391 | }; | 412 | }; |
392 | 413 | ||
414 | /* Bit definition for s_busy. */ | ||
415 | #define IPATH_S_BUSY 0 | ||
416 | |||
393 | /* | 417 | /* |
394 | * Bit definitions for s_flags. | 418 | * Bit definitions for s_flags. |
395 | */ | 419 | */ |
396 | #define IPATH_S_BUSY 0 | 420 | #define IPATH_S_SIGNAL_REQ_WR 0x01 |
397 | #define IPATH_S_SIGNAL_REQ_WR 1 | 421 | #define IPATH_S_FENCE_PENDING 0x02 |
422 | #define IPATH_S_RDMAR_PENDING 0x04 | ||
423 | #define IPATH_S_ACK_PENDING 0x08 | ||
398 | 424 | ||
399 | #define IPATH_PSN_CREDIT 2048 | 425 | #define IPATH_PSN_CREDIT 2048 |
400 | 426 | ||
@@ -706,8 +732,6 @@ int ipath_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr); | |||
706 | 732 | ||
707 | int ipath_destroy_srq(struct ib_srq *ibsrq); | 733 | int ipath_destroy_srq(struct ib_srq *ibsrq); |
708 | 734 | ||
709 | void ipath_cq_enter(struct ipath_cq *cq, struct ib_wc *entry, int sig); | ||
710 | |||
711 | int ipath_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry); | 735 | int ipath_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry); |
712 | 736 | ||
713 | struct ib_cq *ipath_create_cq(struct ib_device *ibdev, int entries, | 737 | struct ib_cq *ipath_create_cq(struct ib_device *ibdev, int entries, |
@@ -757,9 +781,6 @@ u32 ipath_make_grh(struct ipath_ibdev *dev, struct ib_grh *hdr, | |||
757 | 781 | ||
758 | void ipath_do_ruc_send(unsigned long data); | 782 | void ipath_do_ruc_send(unsigned long data); |
759 | 783 | ||
760 | u32 ipath_make_rc_ack(struct ipath_qp *qp, struct ipath_other_headers *ohdr, | ||
761 | u32 pmtu); | ||
762 | |||
763 | int ipath_make_rc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr, | 784 | int ipath_make_rc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr, |
764 | u32 pmtu, u32 *bth0p, u32 *bth2p); | 785 | u32 pmtu, u32 *bth0p, u32 *bth2p); |
765 | 786 | ||