aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Hefty <sean.hefty@intel.com>2011-06-02 13:43:26 -0400
committerRoland Dreier <roland@purestorage.com>2011-10-13 12:43:46 -0400
commit18abd5ea571608a7c726fc56e21d3e31f9febfd0 (patch)
treee2694cadf06a995e658ec30f7a3bd22835dcda7a
parent012a8ff577f95211c6ffd3b77a94c34ebae009b6 (diff)
IB/mlx4: Add support for XRC SRQs
Allow the user to create XRC SRQs. This patch is based on a patch from Jack Morgenstrein <jackm@dev.mellanox.co.il>. Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/mlx4/main.c3
-rw-r--r--drivers/infiniband/hw/mlx4/srq.c13
-rw-r--r--drivers/net/mlx4/srq.c20
-rw-r--r--include/linux/mlx4/device.h4
4 files changed, 24 insertions, 16 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index 23e45df9ae36..42a538e5df36 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -1095,7 +1095,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
1095 (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) | 1095 (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) |
1096 (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) | 1096 (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) |
1097 (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | 1097 (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) |
1098 (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ); 1098 (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) |
1099 (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ);
1099 1100
1100 ibdev->ib_dev.query_device = mlx4_ib_query_device; 1101 ibdev->ib_dev.query_device = mlx4_ib_query_device;
1101 ibdev->ib_dev.query_port = mlx4_ib_query_port; 1102 ibdev->ib_dev.query_port = mlx4_ib_query_port;
diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c
index 4f7f7600d27c..39542f3703b8 100644
--- a/drivers/infiniband/hw/mlx4/srq.c
+++ b/drivers/infiniband/hw/mlx4/srq.c
@@ -76,14 +76,13 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
76 struct mlx4_ib_srq *srq; 76 struct mlx4_ib_srq *srq;
77 struct mlx4_wqe_srq_next_seg *next; 77 struct mlx4_wqe_srq_next_seg *next;
78 struct mlx4_wqe_data_seg *scatter; 78 struct mlx4_wqe_data_seg *scatter;
79 u32 cqn;
80 u16 xrcdn;
79 int desc_size; 81 int desc_size;
80 int buf_size; 82 int buf_size;
81 int err; 83 int err;
82 int i; 84 int i;
83 85
84 if (init_attr->srq_type != IB_SRQT_BASIC)
85 return ERR_PTR(-ENOSYS);
86
87 /* Sanity check SRQ size before proceeding */ 86 /* Sanity check SRQ size before proceeding */
88 if (init_attr->attr.max_wr >= dev->dev->caps.max_srq_wqes || 87 if (init_attr->attr.max_wr >= dev->dev->caps.max_srq_wqes ||
89 init_attr->attr.max_sge > dev->dev->caps.max_srq_sge) 88 init_attr->attr.max_sge > dev->dev->caps.max_srq_sge)
@@ -177,12 +176,18 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
177 } 176 }
178 } 177 }
179 178
180 err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, &srq->mtt, 179 cqn = (init_attr->srq_type == IB_SRQT_XRC) ?
180 to_mcq(init_attr->ext.xrc.cq)->mcq.cqn : 0;
181 xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
182 to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn :
183 (u16) dev->dev->caps.reserved_xrcds;
184 err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, cqn, xrcdn, &srq->mtt,
181 srq->db.dma, &srq->msrq); 185 srq->db.dma, &srq->msrq);
182 if (err) 186 if (err)
183 goto err_wrid; 187 goto err_wrid;
184 188
185 srq->msrq.event = mlx4_ib_srq_event; 189 srq->msrq.event = mlx4_ib_srq_event;
190 srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn;
186 191
187 if (pd->uobject) 192 if (pd->uobject)
188 if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) { 193 if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) {
diff --git a/drivers/net/mlx4/srq.c b/drivers/net/mlx4/srq.c
index 3b07b80a0456..a20b141dbb5c 100644
--- a/drivers/net/mlx4/srq.c
+++ b/drivers/net/mlx4/srq.c
@@ -40,20 +40,20 @@
40struct mlx4_srq_context { 40struct mlx4_srq_context {
41 __be32 state_logsize_srqn; 41 __be32 state_logsize_srqn;
42 u8 logstride; 42 u8 logstride;
43 u8 reserved1[3]; 43 u8 reserved1;
44 u8 pg_offset; 44 __be16 xrcd;
45 u8 reserved2[3]; 45 __be32 pg_offset_cqn;
46 u32 reserved3; 46 u32 reserved2;
47 u8 log_page_size; 47 u8 log_page_size;
48 u8 reserved4[2]; 48 u8 reserved3[2];
49 u8 mtt_base_addr_h; 49 u8 mtt_base_addr_h;
50 __be32 mtt_base_addr_l; 50 __be32 mtt_base_addr_l;
51 __be32 pd; 51 __be32 pd;
52 __be16 limit_watermark; 52 __be16 limit_watermark;
53 __be16 wqe_cnt; 53 __be16 wqe_cnt;
54 u16 reserved5; 54 u16 reserved4;
55 __be16 wqe_counter; 55 __be16 wqe_counter;
56 u32 reserved6; 56 u32 reserved5;
57 __be64 db_rec_addr; 57 __be64 db_rec_addr;
58}; 58};
59 59
@@ -109,8 +109,8 @@ static int mlx4_QUERY_SRQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox
109 MLX4_CMD_TIME_CLASS_A); 109 MLX4_CMD_TIME_CLASS_A);
110} 110}
111 111
112int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, 112int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd,
113 u64 db_rec, struct mlx4_srq *srq) 113 struct mlx4_mtt *mtt, u64 db_rec, struct mlx4_srq *srq)
114{ 114{
115 struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table; 115 struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
116 struct mlx4_cmd_mailbox *mailbox; 116 struct mlx4_cmd_mailbox *mailbox;
@@ -148,6 +148,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt,
148 srq_context->state_logsize_srqn = cpu_to_be32((ilog2(srq->max) << 24) | 148 srq_context->state_logsize_srqn = cpu_to_be32((ilog2(srq->max) << 24) |
149 srq->srqn); 149 srq->srqn);
150 srq_context->logstride = srq->wqe_shift - 4; 150 srq_context->logstride = srq->wqe_shift - 4;
151 srq_context->xrcd = cpu_to_be16(xrcd);
152 srq_context->pg_offset_cqn = cpu_to_be32(cqn & 0xffffff);
151 srq_context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; 153 srq_context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT;
152 154
153 mtt_addr = mlx4_mtt_addr(dev, mtt); 155 mtt_addr = mlx4_mtt_addr(dev, mtt);
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 6a3478d0b330..9ab0f6a80d60 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -543,8 +543,8 @@ void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
543int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp); 543int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp);
544void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); 544void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp);
545 545
546int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, 546int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcdn,
547 u64 db_rec, struct mlx4_srq *srq); 547 struct mlx4_mtt *mtt, u64 db_rec, struct mlx4_srq *srq);
548void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq); 548void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq);
549int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark); 549int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark);
550int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark); 550int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark);