diff options
author | Sean Hefty <sean.hefty@intel.com> | 2011-06-02 13:43:26 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2011-10-13 12:43:46 -0400 |
commit | 18abd5ea571608a7c726fc56e21d3e31f9febfd0 (patch) | |
tree | e2694cadf06a995e658ec30f7a3bd22835dcda7a | |
parent | 012a8ff577f95211c6ffd3b77a94c34ebae009b6 (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.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/srq.c | 13 | ||||
-rw-r--r-- | drivers/net/mlx4/srq.c | 20 | ||||
-rw-r--r-- | include/linux/mlx4/device.h | 4 |
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 @@ | |||
40 | struct mlx4_srq_context { | 40 | struct 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 | ||
112 | int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, | 112 | int 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); | |||
543 | int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp); | 543 | int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp); |
544 | void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); | 544 | void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); |
545 | 545 | ||
546 | int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, | 546 | int 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); |
548 | void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq); | 548 | void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq); |
549 | int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark); | 549 | int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark); |
550 | int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark); | 550 | int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark); |