Skip to content

Commit

Permalink
qedr: Add support for kernel mode SRQ's
Browse files Browse the repository at this point in the history
Implement the SRQ specific verbs and update the poll_cq verb to deal with
SRQ completions.

Signed-off-by: Michal Kalderon <michal.kalderon@cavium.com>
Signed-off-by: Yuval Bason <yuval.bason@cavium.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
  • Loading branch information
Yuval Bason authored and Jason Gunthorpe committed Aug 14, 2018
1 parent 1212767 commit 3491c9e
Show file tree
Hide file tree
Showing 5 changed files with 458 additions and 13 deletions.
5 changes: 5 additions & 0 deletions drivers/infiniband/hw/qedr/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,11 @@ static int qedr_register_device(struct qedr_dev *dev)
dev->ibdev.query_qp = qedr_query_qp;
dev->ibdev.destroy_qp = qedr_destroy_qp;

dev->ibdev.create_srq = qedr_create_srq;
dev->ibdev.destroy_srq = qedr_destroy_srq;
dev->ibdev.modify_srq = qedr_modify_srq;
dev->ibdev.query_srq = qedr_query_srq;
dev->ibdev.post_srq_recv = qedr_post_srq_recv;
dev->ibdev.query_pkey = qedr_query_pkey;

dev->ibdev.create_ah = qedr_create_ah;
Expand Down
35 changes: 35 additions & 0 deletions drivers/infiniband/hw/qedr/qedr.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
#define QEDR_MSG_RQ " RQ"
#define QEDR_MSG_SQ " SQ"
#define QEDR_MSG_QP " QP"
#define QEDR_MSG_SRQ " SRQ"
#define QEDR_MSG_GSI " GSI"
#define QEDR_MSG_IWARP " IW"

Expand Down Expand Up @@ -171,6 +172,7 @@ struct qedr_dev {
struct qedr_qp *gsi_qp;
enum qed_rdma_type rdma_type;
struct qedr_idr qpidr;
struct qedr_idr srqidr;
struct workqueue_struct *iwarp_wq;
u16 iwarp_max_mtu;

Expand Down Expand Up @@ -341,6 +343,34 @@ struct qedr_qp_hwq_info {
qed_chain_get_capacity(p_info->pbl) \
} while (0)

struct qedr_srq_hwq_info {
u32 max_sges;
u32 max_wr;
struct qed_chain pbl;
u64 p_phys_addr_tbl;
u32 wqe_prod;
u32 sge_prod;
u32 wr_prod_cnt;
u32 wr_cons_cnt;
u32 num_elems;

u32 *virt_prod_pair_addr;
dma_addr_t phy_prod_pair_addr;
};

struct qedr_srq {
struct ib_srq ibsrq;
struct qedr_dev *dev;

struct qedr_userq usrq;
struct qedr_srq_hwq_info hw_srq;
struct ib_umem *prod_umem;
u16 srq_id;
u32 srq_limit;
/* lock to protect srq recv post */
spinlock_t lock;
};

enum qedr_qp_err_bitmap {
QEDR_QP_ERR_SQ_FULL = 1,
QEDR_QP_ERR_RQ_FULL = 2,
Expand Down Expand Up @@ -542,4 +572,9 @@ static inline struct qedr_mr *get_qedr_mr(struct ib_mr *ibmr)
{
return container_of(ibmr, struct qedr_mr, ibmr);
}

static inline struct qedr_srq *get_qedr_srq(struct ib_srq *ibsrq)
{
return container_of(ibsrq, struct qedr_srq, ibsrq);
}
#endif
11 changes: 11 additions & 0 deletions drivers/infiniband/hw/qedr/qedr_hsi_rdma.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,23 @@ struct rdma_rq_sge {
#define RDMA_RQ_SGE_L_KEY_HI_SHIFT 29
};

struct rdma_srq_wqe_header {
struct regpair wr_id;
u8 num_sges /* number of SGEs in WQE */;
u8 reserved2[7];
};

struct rdma_srq_sge {
struct regpair addr;
__le32 length;
__le32 l_key;
};

union rdma_srq_elm {
struct rdma_srq_wqe_header header;
struct rdma_srq_sge sge;
};

/* Rdma doorbell data for flags update */
struct rdma_pwm_flags_data {
__le16 icid; /* internal CID */
Expand Down
Loading

0 comments on commit 3491c9e

Please sign in to comment.