Skip to content

Commit 3491c9e

Browse files
yuvalbasonjgunthorpe
authored andcommitted
qedr: Add support for kernel mode SRQ's
Implement the SRQ specific verbs and update the poll_cq verb to deal with SRQ completions. Signed-off-by: Michal Kalderon <[email protected]> Signed-off-by: Yuval Bason <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 1212767 commit 3491c9e

File tree

5 files changed

+458
-13
lines changed

5 files changed

+458
-13
lines changed

drivers/infiniband/hw/qedr/main.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,11 @@ static int qedr_register_device(struct qedr_dev *dev)
229229
dev->ibdev.query_qp = qedr_query_qp;
230230
dev->ibdev.destroy_qp = qedr_destroy_qp;
231231

232+
dev->ibdev.create_srq = qedr_create_srq;
233+
dev->ibdev.destroy_srq = qedr_destroy_srq;
234+
dev->ibdev.modify_srq = qedr_modify_srq;
235+
dev->ibdev.query_srq = qedr_query_srq;
236+
dev->ibdev.post_srq_recv = qedr_post_srq_recv;
232237
dev->ibdev.query_pkey = qedr_query_pkey;
233238

234239
dev->ibdev.create_ah = qedr_create_ah;

drivers/infiniband/hw/qedr/qedr.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#define QEDR_MSG_RQ " RQ"
5959
#define QEDR_MSG_SQ " SQ"
6060
#define QEDR_MSG_QP " QP"
61+
#define QEDR_MSG_SRQ " SRQ"
6162
#define QEDR_MSG_GSI " GSI"
6263
#define QEDR_MSG_IWARP " IW"
6364

@@ -171,6 +172,7 @@ struct qedr_dev {
171172
struct qedr_qp *gsi_qp;
172173
enum qed_rdma_type rdma_type;
173174
struct qedr_idr qpidr;
175+
struct qedr_idr srqidr;
174176
struct workqueue_struct *iwarp_wq;
175177
u16 iwarp_max_mtu;
176178

@@ -341,6 +343,34 @@ struct qedr_qp_hwq_info {
341343
qed_chain_get_capacity(p_info->pbl) \
342344
} while (0)
343345

346+
struct qedr_srq_hwq_info {
347+
u32 max_sges;
348+
u32 max_wr;
349+
struct qed_chain pbl;
350+
u64 p_phys_addr_tbl;
351+
u32 wqe_prod;
352+
u32 sge_prod;
353+
u32 wr_prod_cnt;
354+
u32 wr_cons_cnt;
355+
u32 num_elems;
356+
357+
u32 *virt_prod_pair_addr;
358+
dma_addr_t phy_prod_pair_addr;
359+
};
360+
361+
struct qedr_srq {
362+
struct ib_srq ibsrq;
363+
struct qedr_dev *dev;
364+
365+
struct qedr_userq usrq;
366+
struct qedr_srq_hwq_info hw_srq;
367+
struct ib_umem *prod_umem;
368+
u16 srq_id;
369+
u32 srq_limit;
370+
/* lock to protect srq recv post */
371+
spinlock_t lock;
372+
};
373+
344374
enum qedr_qp_err_bitmap {
345375
QEDR_QP_ERR_SQ_FULL = 1,
346376
QEDR_QP_ERR_RQ_FULL = 2,
@@ -542,4 +572,9 @@ static inline struct qedr_mr *get_qedr_mr(struct ib_mr *ibmr)
542572
{
543573
return container_of(ibmr, struct qedr_mr, ibmr);
544574
}
575+
576+
static inline struct qedr_srq *get_qedr_srq(struct ib_srq *ibsrq)
577+
{
578+
return container_of(ibsrq, struct qedr_srq, ibsrq);
579+
}
545580
#endif

drivers/infiniband/hw/qedr/qedr_hsi_rdma.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,23 @@ struct rdma_rq_sge {
161161
#define RDMA_RQ_SGE_L_KEY_HI_SHIFT 29
162162
};
163163

164+
struct rdma_srq_wqe_header {
165+
struct regpair wr_id;
166+
u8 num_sges /* number of SGEs in WQE */;
167+
u8 reserved2[7];
168+
};
169+
164170
struct rdma_srq_sge {
165171
struct regpair addr;
166172
__le32 length;
167173
__le32 l_key;
168174
};
169175

176+
union rdma_srq_elm {
177+
struct rdma_srq_wqe_header header;
178+
struct rdma_srq_sge sge;
179+
};
180+
170181
/* Rdma doorbell data for flags update */
171182
struct rdma_pwm_flags_data {
172183
__le16 icid; /* internal CID */

0 commit comments

Comments
 (0)