RDMA: Check attr_mask during modify_qp
[linux-2.6-block.git] / drivers / infiniband / hw / qedr / verbs.c
CommitLineData
ac1b36e5
RA
1/* QLogic qedr NIC Driver
2 * Copyright (c) 2015-2016 QLogic Corporation
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and /or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32#include <linux/dma-mapping.h>
33#include <linux/crc32.h>
34#include <net/ip.h>
35#include <net/ipv6.h>
36#include <net/udp.h>
37#include <linux/iommu.h>
38
39#include <rdma/ib_verbs.h>
40#include <rdma/ib_user_verbs.h>
41#include <rdma/iw_cm.h>
42#include <rdma/ib_umem.h>
43#include <rdma/ib_addr.h>
44#include <rdma/ib_cache.h>
ff23dfa1 45#include <rdma/uverbs_ioctl.h>
ac1b36e5 46
be086e7c
MY
47#include <linux/qed/common_hsi.h>
48#include "qedr_hsi_rdma.h"
ac1b36e5
RA
49#include <linux/qed/qed_if.h>
50#include "qedr.h"
51#include "verbs.h"
52#include <rdma/qedr-abi.h>
99d195cc 53#include "qedr_roce_cm.h"
82af6d19 54#include "qedr_iw_cm.h"
ac1b36e5 55
3491c9e7
YB
56#define QEDR_SRQ_WQE_ELEM_SIZE sizeof(union rdma_srq_elm)
57#define RDMA_MAX_SGE_PER_SRQ (4)
58#define RDMA_MAX_SRQ_WQE_SIZE (RDMA_MAX_SGE_PER_SRQ + 1)
59
a7efd777
RA
60#define DB_ADDR_SHIFT(addr) ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
61
4c6bb02d
MK
62enum {
63 QEDR_USER_MMAP_IO_WC = 0,
97f61250 64 QEDR_USER_MMAP_PHYS_PAGE,
4c6bb02d
MK
65};
66
c75d3ec8
AR
67static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src,
68 size_t len)
69{
70 size_t min_len = min_t(size_t, len, udata->outlen);
71
72 return ib_copy_to_udata(udata, src, min_len);
73}
74
a7efd777
RA
75int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
76{
dbe30dae 77 if (index >= QEDR_ROCE_PKEY_TABLE_LEN)
a7efd777
RA
78 return -EINVAL;
79
80 *pkey = QEDR_ROCE_PKEY_DEFAULT;
81 return 0;
82}
83
e6a38c54
KM
84int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
85 int index, union ib_gid *sgid)
86{
87 struct qedr_dev *dev = get_qedr_dev(ibdev);
88
89 memset(sgid->raw, 0, sizeof(sgid->raw));
90 ether_addr_copy(sgid->raw, dev->ndev->dev_addr);
91
92 DP_DEBUG(dev, QEDR_MSG_INIT, "QUERY sgid[%d]=%llx:%llx\n", index,
93 sgid->global.interface_id, sgid->global.subnet_prefix);
94
95 return 0;
96}
97
3491c9e7
YB
98int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
99{
100 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
101 struct qedr_device_attr *qattr = &dev->attr;
102 struct qedr_srq *srq = get_qedr_srq(ibsrq);
103
104 srq_attr->srq_limit = srq->srq_limit;
105 srq_attr->max_wr = qattr->max_srq_wr;
106 srq_attr->max_sge = qattr->max_sge;
107
108 return 0;
109}
110
ac1b36e5
RA
111int qedr_query_device(struct ib_device *ibdev,
112 struct ib_device_attr *attr, struct ib_udata *udata)
113{
114 struct qedr_dev *dev = get_qedr_dev(ibdev);
115 struct qedr_device_attr *qattr = &dev->attr;
116
117 if (!dev->rdma_ctx) {
118 DP_ERR(dev,
119 "qedr_query_device called with invalid params rdma_ctx=%p\n",
120 dev->rdma_ctx);
121 return -EINVAL;
122 }
123
124 memset(attr, 0, sizeof(*attr));
125
126 attr->fw_ver = qattr->fw_ver;
127 attr->sys_image_guid = qattr->sys_image_guid;
128 attr->max_mr_size = qattr->max_mr_size;
129 attr->page_size_cap = qattr->page_size_caps;
130 attr->vendor_id = qattr->vendor_id;
131 attr->vendor_part_id = qattr->vendor_part_id;
132 attr->hw_ver = qattr->hw_ver;
133 attr->max_qp = qattr->max_qp;
134 attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
135 attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
136 IB_DEVICE_RC_RNR_NAK_GEN |
137 IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
138
06e8d1df
YB
139 if (!rdma_protocol_iwarp(&dev->ibdev, 1))
140 attr->device_cap_flags |= IB_DEVICE_XRC;
33023fb8
SW
141 attr->max_send_sge = qattr->max_sge;
142 attr->max_recv_sge = qattr->max_sge;
ac1b36e5
RA
143 attr->max_sge_rd = qattr->max_sge;
144 attr->max_cq = qattr->max_cq;
145 attr->max_cqe = qattr->max_cqe;
146 attr->max_mr = qattr->max_mr;
147 attr->max_mw = qattr->max_mw;
148 attr->max_pd = qattr->max_pd;
149 attr->atomic_cap = dev->atomic_cap;
ac1b36e5
RA
150 attr->max_qp_init_rd_atom =
151 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
152 attr->max_qp_rd_atom =
153 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
154 attr->max_qp_init_rd_atom);
155
156 attr->max_srq = qattr->max_srq;
157 attr->max_srq_sge = qattr->max_srq_sge;
158 attr->max_srq_wr = qattr->max_srq_wr;
159
160 attr->local_ca_ack_delay = qattr->dev_ack_delay;
161 attr->max_fast_reg_page_list_len = qattr->max_mr / 8;
7d11b478 162 attr->max_pkeys = qattr->max_pkey;
ac1b36e5
RA
163 attr->max_ah = qattr->max_ah;
164
165 return 0;
166}
167
376ceb31 168static inline void get_link_speed_and_width(int speed, u16 *ib_speed,
ac1b36e5
RA
169 u8 *ib_width)
170{
171 switch (speed) {
172 case 1000:
69054666 173 *ib_speed = IB_SPEED_SDR;
ac1b36e5
RA
174 *ib_width = IB_WIDTH_1X;
175 break;
176 case 10000:
69054666 177 *ib_speed = IB_SPEED_QDR;
ac1b36e5
RA
178 *ib_width = IB_WIDTH_1X;
179 break;
180
181 case 20000:
69054666 182 *ib_speed = IB_SPEED_DDR;
ac1b36e5
RA
183 *ib_width = IB_WIDTH_4X;
184 break;
185
186 case 25000:
69054666 187 *ib_speed = IB_SPEED_EDR;
ac1b36e5
RA
188 *ib_width = IB_WIDTH_1X;
189 break;
190
191 case 40000:
69054666 192 *ib_speed = IB_SPEED_QDR;
ac1b36e5
RA
193 *ib_width = IB_WIDTH_4X;
194 break;
195
196 case 50000:
69054666
SO
197 *ib_speed = IB_SPEED_HDR;
198 *ib_width = IB_WIDTH_1X;
ac1b36e5
RA
199 break;
200
201 case 100000:
69054666 202 *ib_speed = IB_SPEED_EDR;
ac1b36e5
RA
203 *ib_width = IB_WIDTH_4X;
204 break;
205
206 default:
207 /* Unsupported */
69054666 208 *ib_speed = IB_SPEED_SDR;
ac1b36e5
RA
209 *ib_width = IB_WIDTH_1X;
210 }
211}
212
213int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
214{
215 struct qedr_dev *dev;
216 struct qed_rdma_port *rdma_port;
217
218 dev = get_qedr_dev(ibdev);
ac1b36e5
RA
219
220 if (!dev->rdma_ctx) {
221 DP_ERR(dev, "rdma_ctx is NULL\n");
222 return -EINVAL;
223 }
224
225 rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
ac1b36e5 226
c4550c63 227 /* *attr being zeroed by the caller, avoid zeroing it here */
ac1b36e5
RA
228 if (rdma_port->port_state == QED_RDMA_PORT_UP) {
229 attr->state = IB_PORT_ACTIVE;
72a7720f 230 attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
ac1b36e5
RA
231 } else {
232 attr->state = IB_PORT_DOWN;
72a7720f 233 attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;
ac1b36e5
RA
234 }
235 attr->max_mtu = IB_MTU_4096;
ac1b36e5
RA
236 attr->lid = 0;
237 attr->lmc = 0;
238 attr->sm_lid = 0;
239 attr->sm_sl = 0;
2f944c0f 240 attr->ip_gids = true;
f5b1b177 241 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
cc293f54 242 attr->active_mtu = iboe_get_mtu(dev->iwarp_max_mtu);
f5b1b177 243 attr->gid_tbl_len = 1;
f5b1b177 244 } else {
cc293f54 245 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
f5b1b177
KM
246 attr->gid_tbl_len = QEDR_MAX_SGID;
247 attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
248 }
ac1b36e5
RA
249 attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
250 attr->qkey_viol_cntr = 0;
251 get_link_speed_and_width(rdma_port->link_speed,
252 &attr->active_speed, &attr->active_width);
253 attr->max_msg_sz = rdma_port->max_msg_size;
254 attr->max_vl_num = 4;
255
256 return 0;
257}
258
a2a074ef 259int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
ac1b36e5 260{
a2a074ef 261 struct ib_device *ibdev = uctx->device;
ac1b36e5 262 int rc;
a2a074ef
LR
263 struct qedr_ucontext *ctx = get_qedr_ucontext(uctx);
264 struct qedr_alloc_ucontext_resp uresp = {};
97f61250 265 struct qedr_alloc_ucontext_req ureq = {};
ac1b36e5
RA
266 struct qedr_dev *dev = get_qedr_dev(ibdev);
267 struct qed_rdma_add_user_out_params oparams;
4c6bb02d 268 struct qedr_user_mmap_entry *entry;
ac1b36e5
RA
269
270 if (!udata)
a2a074ef 271 return -EFAULT;
ac1b36e5 272
97f61250
MK
273 if (udata->inlen) {
274 rc = ib_copy_from_udata(&ureq, udata,
275 min(sizeof(ureq), udata->inlen));
276 if (rc) {
277 DP_ERR(dev, "Problem copying data from user space\n");
278 return -EFAULT;
279 }
bbe4f424
MK
280 ctx->edpm_mode = !!(ureq.context_flags &
281 QEDR_ALLOC_UCTX_EDPM_MODE);
97f61250
MK
282 ctx->db_rec = !!(ureq.context_flags & QEDR_ALLOC_UCTX_DB_REC);
283 }
284
ac1b36e5
RA
285 rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
286 if (rc) {
287 DP_ERR(dev,
288 "failed to allocate a DPI for a new RoCE application, rc=%d. To overcome this consider to increase the number of DPIs, increase the doorbell BAR size or just close unnecessary RoCE applications. In order to increase the number of DPIs consult the qedr readme\n",
289 rc);
a2a074ef 290 return rc;
ac1b36e5
RA
291 }
292
293 ctx->dpi = oparams.dpi;
294 ctx->dpi_addr = oparams.dpi_addr;
295 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
296 ctx->dpi_size = oparams.dpi_size;
4c6bb02d
MK
297 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
298 if (!entry) {
299 rc = -ENOMEM;
300 goto err;
301 }
302
303 entry->io_address = ctx->dpi_phys_addr;
304 entry->length = ctx->dpi_size;
305 entry->mmap_flag = QEDR_USER_MMAP_IO_WC;
306 entry->dpi = ctx->dpi;
307 entry->dev = dev;
308 rc = rdma_user_mmap_entry_insert(uctx, &entry->rdma_entry,
309 ctx->dpi_size);
310 if (rc) {
311 kfree(entry);
312 goto err;
313 }
314 ctx->db_mmap_entry = &entry->rdma_entry;
ac1b36e5 315
93a3d05f
MK
316 if (!dev->user_dpm_enabled)
317 uresp.dpm_flags = 0;
318 else if (rdma_protocol_iwarp(&dev->ibdev, 1))
319 uresp.dpm_flags = QEDR_DPM_TYPE_IWARP_LEGACY;
320 else
321 uresp.dpm_flags = QEDR_DPM_TYPE_ROCE_ENHANCED |
bbe4f424
MK
322 QEDR_DPM_TYPE_ROCE_LEGACY |
323 QEDR_DPM_TYPE_ROCE_EDPM_MODE;
93a3d05f 324
eb7f84e3
MK
325 if (ureq.context_flags & QEDR_SUPPORT_DPM_SIZES) {
326 uresp.dpm_flags |= QEDR_DPM_SIZES_SET;
327 uresp.ldpm_limit_size = QEDR_LDPM_MAX_SIZE;
328 uresp.edpm_trans_size = QEDR_EDPM_TRANS_SIZE;
329 uresp.edpm_limit_size = QEDR_EDPM_MAX_SIZE;
330 }
93a3d05f 331
67cbe353
AR
332 uresp.wids_enabled = 1;
333 uresp.wid_count = oparams.wid_count;
4c6bb02d 334 uresp.db_pa = rdma_user_mmap_get_offset(ctx->db_mmap_entry);
ac1b36e5
RA
335 uresp.db_size = ctx->dpi_size;
336 uresp.max_send_wr = dev->attr.max_sqe;
337 uresp.max_recv_wr = dev->attr.max_rqe;
338 uresp.max_srq_wr = dev->attr.max_srq_wr;
339 uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
340 uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
341 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
342 uresp.max_cqes = QEDR_MAX_CQES;
343
c75d3ec8 344 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
ac1b36e5 345 if (rc)
4c6bb02d 346 goto err;
ac1b36e5
RA
347
348 ctx->dev = dev;
349
ac1b36e5
RA
350 DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
351 &ctx->ibucontext);
a2a074ef 352 return 0;
4c6bb02d
MK
353
354err:
355 if (!ctx->db_mmap_entry)
356 dev->ops->rdma_remove_user(dev->rdma_ctx, ctx->dpi);
357 else
358 rdma_user_mmap_entry_remove(ctx->db_mmap_entry);
359
360 return rc;
ac1b36e5
RA
361}
362
a2a074ef 363void qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
ac1b36e5
RA
364{
365 struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
ac1b36e5
RA
366
367 DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
368 uctx);
4c6bb02d
MK
369
370 rdma_user_mmap_entry_remove(uctx->db_mmap_entry);
ac1b36e5
RA
371}
372
4c6bb02d 373void qedr_mmap_free(struct rdma_user_mmap_entry *rdma_entry)
ac1b36e5 374{
4c6bb02d
MK
375 struct qedr_user_mmap_entry *entry = get_qedr_mmap_entry(rdma_entry);
376 struct qedr_dev *dev = entry->dev;
ac1b36e5 377
97f61250
MK
378 if (entry->mmap_flag == QEDR_USER_MMAP_PHYS_PAGE)
379 free_page((unsigned long)entry->address);
380 else if (entry->mmap_flag == QEDR_USER_MMAP_IO_WC)
4c6bb02d 381 dev->ops->rdma_remove_user(dev->rdma_ctx, entry->dpi);
30bf066c 382
4c6bb02d
MK
383 kfree(entry);
384}
ac1b36e5 385
4c6bb02d
MK
386int qedr_mmap(struct ib_ucontext *ucontext, struct vm_area_struct *vma)
387{
388 struct ib_device *dev = ucontext->device;
389 size_t length = vma->vm_end - vma->vm_start;
390 struct rdma_user_mmap_entry *rdma_entry;
391 struct qedr_user_mmap_entry *entry;
392 int rc = 0;
393 u64 pfn;
394
395 ibdev_dbg(dev,
396 "start %#lx, end %#lx, length = %#zx, pgoff = %#lx\n",
397 vma->vm_start, vma->vm_end, length, vma->vm_pgoff);
398
399 rdma_entry = rdma_user_mmap_entry_get(ucontext, vma);
400 if (!rdma_entry) {
401 ibdev_dbg(dev, "pgoff[%#lx] does not have valid entry\n",
402 vma->vm_pgoff);
ac1b36e5
RA
403 return -EINVAL;
404 }
4c6bb02d
MK
405 entry = get_qedr_mmap_entry(rdma_entry);
406 ibdev_dbg(dev,
407 "Mapping address[%#llx], length[%#zx], mmap_flag[%d]\n",
408 entry->io_address, length, entry->mmap_flag);
409
410 switch (entry->mmap_flag) {
411 case QEDR_USER_MMAP_IO_WC:
412 pfn = entry->io_address >> PAGE_SHIFT;
413 rc = rdma_user_mmap_io(ucontext, vma, pfn, length,
414 pgprot_writecombine(vma->vm_page_prot),
415 rdma_entry);
416 break;
97f61250
MK
417 case QEDR_USER_MMAP_PHYS_PAGE:
418 rc = vm_insert_page(vma, vma->vm_start,
419 virt_to_page(entry->address));
420 break;
4c6bb02d
MK
421 default:
422 rc = -EINVAL;
30bf066c 423 }
ac1b36e5 424
4c6bb02d
MK
425 if (rc)
426 ibdev_dbg(dev,
427 "Couldn't mmap address[%#llx] length[%#zx] mmap_flag[%d] err[%d]\n",
428 entry->io_address, length, entry->mmap_flag, rc);
30bf066c 429
4c6bb02d
MK
430 rdma_user_mmap_entry_put(rdma_entry);
431 return rc;
ac1b36e5 432}
a7efd777 433
ff23dfa1 434int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
a7efd777 435{
21a428a0 436 struct ib_device *ibdev = ibpd->device;
a7efd777 437 struct qedr_dev *dev = get_qedr_dev(ibdev);
21a428a0 438 struct qedr_pd *pd = get_qedr_pd(ibpd);
a7efd777
RA
439 u16 pd_id;
440 int rc;
441
442 DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
ff23dfa1 443 udata ? "User Lib" : "Kernel");
a7efd777
RA
444
445 if (!dev->rdma_ctx) {
847cb1a3 446 DP_ERR(dev, "invalid RDMA context\n");
21a428a0 447 return -EINVAL;
a7efd777
RA
448 }
449
9c1e0228
RA
450 rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
451 if (rc)
21a428a0 452 return rc;
a7efd777 453
a7efd777
RA
454 pd->pd_id = pd_id;
455
ff23dfa1 456 if (udata) {
57939021
JG
457 struct qedr_alloc_pd_uresp uresp = {
458 .pd_id = pd_id,
459 };
ff23dfa1
SR
460 struct qedr_ucontext *context = rdma_udata_to_drv_context(
461 udata, struct qedr_ucontext, ibucontext);
9c1e0228 462
c75d3ec8 463 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
9c1e0228 464 if (rc) {
a7efd777 465 DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
9c1e0228 466 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
21a428a0 467 return rc;
9c1e0228
RA
468 }
469
ff23dfa1 470 pd->uctx = context;
9c1e0228 471 pd->uctx->pd = pd;
a7efd777
RA
472 }
473
21a428a0 474 return 0;
a7efd777
RA
475}
476
91a7c58f 477int qedr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
a7efd777
RA
478{
479 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
480 struct qedr_pd *pd = get_qedr_pd(ibpd);
481
a7efd777
RA
482 DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
483 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
91a7c58f 484 return 0;
a7efd777
RA
485}
486
06e8d1df
YB
487
488int qedr_alloc_xrcd(struct ib_xrcd *ibxrcd, struct ib_udata *udata)
489{
490 struct qedr_dev *dev = get_qedr_dev(ibxrcd->device);
491 struct qedr_xrcd *xrcd = get_qedr_xrcd(ibxrcd);
492
493 return dev->ops->rdma_alloc_xrcd(dev->rdma_ctx, &xrcd->xrcd_id);
494}
495
496int qedr_dealloc_xrcd(struct ib_xrcd *ibxrcd, struct ib_udata *udata)
497{
498 struct qedr_dev *dev = get_qedr_dev(ibxrcd->device);
499 u16 xrcd_id = get_qedr_xrcd(ibxrcd)->xrcd_id;
500
501 dev->ops->rdma_dealloc_xrcd(dev->rdma_ctx, xrcd_id);
502 return 0;
503}
a7efd777
RA
504static void qedr_free_pbl(struct qedr_dev *dev,
505 struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
506{
507 struct pci_dev *pdev = dev->pdev;
508 int i;
509
510 for (i = 0; i < pbl_info->num_pbls; i++) {
511 if (!pbl[i].va)
512 continue;
513 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
514 pbl[i].va, pbl[i].pa);
515 }
516
517 kfree(pbl);
518}
519
520#define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
521#define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
522
523#define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
524#define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
525#define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
526
527static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
528 struct qedr_pbl_info *pbl_info,
529 gfp_t flags)
530{
531 struct pci_dev *pdev = dev->pdev;
532 struct qedr_pbl *pbl_table;
533 dma_addr_t *pbl_main_tbl;
534 dma_addr_t pa;
535 void *va;
536 int i;
537
538 pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
539 if (!pbl_table)
540 return ERR_PTR(-ENOMEM);
541
542 for (i = 0; i < pbl_info->num_pbls; i++) {
750afb08
LC
543 va = dma_alloc_coherent(&pdev->dev, pbl_info->pbl_size, &pa,
544 flags);
a7efd777
RA
545 if (!va)
546 goto err;
547
a7efd777
RA
548 pbl_table[i].va = va;
549 pbl_table[i].pa = pa;
550 }
551
552 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
553 * the first one with physical pointers to all of the rest
554 */
555 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
556 for (i = 0; i < pbl_info->num_pbls - 1; i++)
557 pbl_main_tbl[i] = pbl_table[i + 1].pa;
558
559 return pbl_table;
560
561err:
562 for (i--; i >= 0; i--)
563 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
564 pbl_table[i].va, pbl_table[i].pa);
565
566 qedr_free_pbl(dev, pbl_info, pbl_table);
567
568 return ERR_PTR(-ENOMEM);
569}
570
571static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
572 struct qedr_pbl_info *pbl_info,
573 u32 num_pbes, int two_layer_capable)
574{
575 u32 pbl_capacity;
576 u32 pbl_size;
577 u32 num_pbls;
578
579 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
580 if (num_pbes > MAX_PBES_TWO_LAYER) {
581 DP_ERR(dev, "prepare pbl table: too many pages %d\n",
582 num_pbes);
583 return -EINVAL;
584 }
585
586 /* calculate required pbl page size */
587 pbl_size = MIN_FW_PBL_PAGE_SIZE;
588 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
589 NUM_PBES_ON_PAGE(pbl_size);
590
591 while (pbl_capacity < num_pbes) {
592 pbl_size *= 2;
593 pbl_capacity = pbl_size / sizeof(u64);
594 pbl_capacity = pbl_capacity * pbl_capacity;
595 }
596
597 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
598 num_pbls++; /* One for the layer0 ( points to the pbls) */
599 pbl_info->two_layered = true;
600 } else {
601 /* One layered PBL */
602 num_pbls = 1;
603 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
604 roundup_pow_of_two((num_pbes * sizeof(u64))));
605 pbl_info->two_layered = false;
606 }
607
608 pbl_info->num_pbls = num_pbls;
609 pbl_info->pbl_size = pbl_size;
610 pbl_info->num_pbes = num_pbes;
611
612 DP_DEBUG(dev, QEDR_MSG_MR,
613 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
614 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
615
616 return 0;
617}
618
619static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
620 struct qedr_pbl *pbl,
e57bb6be 621 struct qedr_pbl_info *pbl_info, u32 pg_shift)
a7efd777 622{
95ad233f 623 int pbe_cnt, total_num_pbes = 0;
a7efd777 624 struct qedr_pbl *pbl_tbl;
68363052 625 struct ib_block_iter biter;
a7efd777 626 struct regpair *pbe;
a7efd777
RA
627
628 if (!pbl_info->num_pbes)
629 return;
630
631 /* If we have a two layered pbl, the first pbl points to the rest
632 * of the pbls and the first entry lays on the second pbl in the table
633 */
634 if (pbl_info->two_layered)
635 pbl_tbl = &pbl[1];
636 else
637 pbl_tbl = pbl;
638
639 pbe = (struct regpair *)pbl_tbl->va;
640 if (!pbe) {
641 DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
642 return;
643 }
644
645 pbe_cnt = 0;
646
68363052
JG
647 rdma_umem_for_each_dma_block (umem, &biter, BIT(pg_shift)) {
648 u64 pg_addr = rdma_block_iter_dma_address(&biter);
95ad233f 649
68363052
JG
650 pbe->lo = cpu_to_le32(pg_addr);
651 pbe->hi = cpu_to_le32(upper_32_bits(pg_addr));
95ad233f 652
68363052
JG
653 pbe_cnt++;
654 total_num_pbes++;
655 pbe++;
e57bb6be 656
68363052
JG
657 if (total_num_pbes == pbl_info->num_pbes)
658 return;
95ad233f 659
68363052
JG
660 /* If the given pbl is full storing the pbes, move to next pbl.
661 */
662 if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
663 pbl_tbl++;
664 pbe = (struct regpair *)pbl_tbl->va;
665 pbe_cnt = 0;
a7efd777
RA
666 }
667 }
668}
669
97f61250
MK
670static int qedr_db_recovery_add(struct qedr_dev *dev,
671 void __iomem *db_addr,
672 void *db_data,
673 enum qed_db_rec_width db_width,
674 enum qed_db_rec_space db_space)
675{
676 if (!db_data) {
677 DP_DEBUG(dev, QEDR_MSG_INIT, "avoiding db rec since old lib\n");
678 return 0;
679 }
680
681 return dev->ops->common->db_recovery_add(dev->cdev, db_addr, db_data,
682 db_width, db_space);
683}
684
685static void qedr_db_recovery_del(struct qedr_dev *dev,
686 void __iomem *db_addr,
687 void *db_data)
688{
689 if (!db_data) {
690 DP_DEBUG(dev, QEDR_MSG_INIT, "avoiding db rec since old lib\n");
691 return;
692 }
693
694 /* Ignore return code as there is not much we can do about it. Error
695 * log will be printed inside.
696 */
697 dev->ops->common->db_recovery_del(dev->cdev, db_addr, db_data);
698}
699
a7efd777 700static int qedr_copy_cq_uresp(struct qedr_dev *dev,
97f61250
MK
701 struct qedr_cq *cq, struct ib_udata *udata,
702 u32 db_offset)
a7efd777
RA
703{
704 struct qedr_create_cq_uresp uresp;
705 int rc;
706
707 memset(&uresp, 0, sizeof(uresp));
708
97f61250 709 uresp.db_offset = db_offset;
a7efd777 710 uresp.icid = cq->icid;
a25984f3
MK
711 if (cq->q.db_mmap_entry)
712 uresp.db_rec_addr =
713 rdma_user_mmap_get_offset(cq->q.db_mmap_entry);
a7efd777 714
c75d3ec8 715 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
a7efd777
RA
716 if (rc)
717 DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
718
719 return rc;
720}
721
722static void consume_cqe(struct qedr_cq *cq)
723{
724 if (cq->latest_cqe == cq->toggle_cqe)
725 cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
726
727 cq->latest_cqe = qed_chain_consume(&cq->pbl);
728}
729
730static inline int qedr_align_cq_entries(int entries)
731{
732 u64 size, aligned_size;
733
734 /* We allocate an extra entry that we don't report to the FW. */
735 size = (entries + 1) * QEDR_CQE_SIZE;
736 aligned_size = ALIGN(size, PAGE_SIZE);
737
738 return aligned_size / QEDR_CQE_SIZE;
739}
740
97f61250
MK
741static int qedr_init_user_db_rec(struct ib_udata *udata,
742 struct qedr_dev *dev, struct qedr_userq *q,
743 bool requires_db_rec)
744{
745 struct qedr_ucontext *uctx =
746 rdma_udata_to_drv_context(udata, struct qedr_ucontext,
747 ibucontext);
748 struct qedr_user_mmap_entry *entry;
749 int rc;
750
751 /* Aborting for non doorbell userqueue (SRQ) or non-supporting lib */
752 if (requires_db_rec == 0 || !uctx->db_rec)
753 return 0;
754
755 /* Allocate a page for doorbell recovery, add to mmap */
756 q->db_rec_data = (void *)get_zeroed_page(GFP_USER);
757 if (!q->db_rec_data) {
758 DP_ERR(dev, "get_zeroed_page failed\n");
759 return -ENOMEM;
760 }
761
762 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
763 if (!entry)
764 goto err_free_db_data;
765
766 entry->address = q->db_rec_data;
767 entry->length = PAGE_SIZE;
768 entry->mmap_flag = QEDR_USER_MMAP_PHYS_PAGE;
769 rc = rdma_user_mmap_entry_insert(&uctx->ibucontext,
770 &entry->rdma_entry,
771 PAGE_SIZE);
772 if (rc)
773 goto err_free_entry;
774
775 q->db_mmap_entry = &entry->rdma_entry;
776
777 return 0;
778
779err_free_entry:
780 kfree(entry);
781
782err_free_db_data:
783 free_page((unsigned long)q->db_rec_data);
784 q->db_rec_data = NULL;
785 return -ENOMEM;
786}
787
b0ea0fa5 788static inline int qedr_init_user_queue(struct ib_udata *udata,
a7efd777 789 struct qedr_dev *dev,
b0ea0fa5 790 struct qedr_userq *q, u64 buf_addr,
97f61250 791 size_t buf_len, bool requires_db_rec,
72b894b0 792 int access,
69ad0e7f 793 int alloc_and_init)
a7efd777 794{
e57bb6be 795 u32 fw_pages;
a7efd777
RA
796 int rc;
797
798 q->buf_addr = buf_addr;
799 q->buf_len = buf_len;
c320e527 800 q->umem = ib_umem_get(&dev->ibdev, q->buf_addr, q->buf_len, access);
a7efd777
RA
801 if (IS_ERR(q->umem)) {
802 DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
803 PTR_ERR(q->umem));
804 return PTR_ERR(q->umem);
805 }
806
901bca71 807 fw_pages = ib_umem_num_dma_blocks(q->umem, 1 << FW_PAGE_SHIFT);
e57bb6be 808 rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0);
a7efd777
RA
809 if (rc)
810 goto err0;
811
69ad0e7f
KM
812 if (alloc_and_init) {
813 q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
814 if (IS_ERR(q->pbl_tbl)) {
815 rc = PTR_ERR(q->pbl_tbl);
816 goto err0;
817 }
e57bb6be
RA
818 qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info,
819 FW_PAGE_SHIFT);
69ad0e7f
KM
820 } else {
821 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
89fd2576
DC
822 if (!q->pbl_tbl) {
823 rc = -ENOMEM;
69ad0e7f 824 goto err0;
89fd2576 825 }
69ad0e7f 826 }
a7efd777 827
97f61250
MK
828 /* mmap the user address used to store doorbell data for recovery */
829 return qedr_init_user_db_rec(udata, dev, q, requires_db_rec);
a7efd777
RA
830
831err0:
832 ib_umem_release(q->umem);
69ad0e7f 833 q->umem = NULL;
a7efd777
RA
834
835 return rc;
836}
837
838static inline void qedr_init_cq_params(struct qedr_cq *cq,
839 struct qedr_ucontext *ctx,
840 struct qedr_dev *dev, int vector,
841 int chain_entries, int page_cnt,
842 u64 pbl_ptr,
843 struct qed_rdma_create_cq_in_params
844 *params)
845{
846 memset(params, 0, sizeof(*params));
847 params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
848 params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
849 params->cnq_id = vector;
850 params->cq_size = chain_entries - 1;
851 params->dpi = (ctx) ? ctx->dpi : dev->dpi;
852 params->pbl_num_pages = page_cnt;
853 params->pbl_ptr = pbl_ptr;
854 params->pbl_two_level = 0;
855}
856
857static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
858{
a7efd777
RA
859 cq->db.data.agg_flags = flags;
860 cq->db.data.value = cpu_to_le32(cons);
861 writeq(cq->db.raw, cq->db_addr);
a7efd777
RA
862}
863
864int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
865{
866 struct qedr_cq *cq = get_qedr_cq(ibcq);
867 unsigned long sflags;
4dd72636
AR
868 struct qedr_dev *dev;
869
870 dev = get_qedr_dev(ibcq->device);
871
872 if (cq->destroyed) {
873 DP_ERR(dev,
874 "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
875 cq, cq->icid);
876 return -EINVAL;
877 }
878
a7efd777
RA
879
880 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
881 return 0;
882
883 spin_lock_irqsave(&cq->cq_lock, sflags);
884
885 cq->arm_flags = 0;
886
887 if (flags & IB_CQ_SOLICITED)
888 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
889
890 if (flags & IB_CQ_NEXT_COMP)
891 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
892
893 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
894
895 spin_unlock_irqrestore(&cq->cq_lock, sflags);
896
897 return 0;
898}
899
e39afe3d
LR
900int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
901 struct ib_udata *udata)
a7efd777 902{
e39afe3d 903 struct ib_device *ibdev = ibcq->device;
ff23dfa1
SR
904 struct qedr_ucontext *ctx = rdma_udata_to_drv_context(
905 udata, struct qedr_ucontext, ibucontext);
a7efd777
RA
906 struct qed_rdma_destroy_cq_out_params destroy_oparams;
907 struct qed_rdma_destroy_cq_in_params destroy_iparams;
b6db3f71
AL
908 struct qed_chain_init_params chain_params = {
909 .mode = QED_CHAIN_MODE_PBL,
910 .intended_use = QED_CHAIN_USE_TO_CONSUME,
911 .cnt_type = QED_CHAIN_CNT_TYPE_U32,
912 .elem_size = sizeof(union rdma_cqe),
913 };
a7efd777
RA
914 struct qedr_dev *dev = get_qedr_dev(ibdev);
915 struct qed_rdma_create_cq_in_params params;
e39afe3d 916 struct qedr_create_cq_ureq ureq = {};
a7efd777
RA
917 int vector = attr->comp_vector;
918 int entries = attr->cqe;
e39afe3d 919 struct qedr_cq *cq = get_qedr_cq(ibcq);
a7efd777 920 int chain_entries;
97f61250 921 u32 db_offset;
a7efd777
RA
922 int page_cnt;
923 u64 pbl_ptr;
924 u16 icid;
925 int rc;
926
927 DP_DEBUG(dev, QEDR_MSG_INIT,
928 "create_cq: called from %s. entries=%d, vector=%d\n",
929 udata ? "User Lib" : "Kernel", entries, vector);
930
931 if (entries > QEDR_MAX_CQES) {
932 DP_ERR(dev,
933 "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
934 entries, QEDR_MAX_CQES);
e39afe3d 935 return -EINVAL;
a7efd777
RA
936 }
937
938 chain_entries = qedr_align_cq_entries(entries);
939 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
b6db3f71 940 chain_params.num_elems = chain_entries;
a7efd777 941
97f61250
MK
942 /* calc db offset. user will add DPI base, kernel will add db addr */
943 db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
944
a7efd777 945 if (udata) {
97f61250
MK
946 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
947 udata->inlen))) {
a7efd777
RA
948 DP_ERR(dev,
949 "create cq: problem copying data from user space\n");
950 goto err0;
951 }
952
953 if (!ureq.len) {
954 DP_ERR(dev,
955 "create cq: cannot create a cq with 0 entries\n");
956 goto err0;
957 }
958
959 cq->cq_type = QEDR_CQ_TYPE_USER;
960
b0ea0fa5 961 rc = qedr_init_user_queue(udata, dev, &cq->q, ureq.addr,
72b894b0
CH
962 ureq.len, true, IB_ACCESS_LOCAL_WRITE,
963 1);
a7efd777
RA
964 if (rc)
965 goto err0;
966
967 pbl_ptr = cq->q.pbl_tbl->pa;
968 page_cnt = cq->q.pbl_info.num_pbes;
c7eb3bce
AR
969
970 cq->ibcq.cqe = chain_entries;
97f61250 971 cq->q.db_addr = ctx->dpi_addr + db_offset;
a7efd777
RA
972 } else {
973 cq->cq_type = QEDR_CQ_TYPE_KERNEL;
974
b6db3f71
AL
975 rc = dev->ops->common->chain_alloc(dev->cdev, &cq->pbl,
976 &chain_params);
a7efd777 977 if (rc)
97f61250 978 goto err0;
a7efd777
RA
979
980 page_cnt = qed_chain_get_page_cnt(&cq->pbl);
981 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
c7eb3bce 982 cq->ibcq.cqe = cq->pbl.capacity;
a7efd777
RA
983 }
984
985 qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
986 pbl_ptr, &params);
987
988 rc = dev->ops->rdma_create_cq(dev->rdma_ctx, &params, &icid);
989 if (rc)
97f61250 990 goto err1;
a7efd777
RA
991
992 cq->icid = icid;
993 cq->sig = QEDR_CQ_MAGIC_NUMBER;
994 spin_lock_init(&cq->cq_lock);
995
ff23dfa1 996 if (udata) {
97f61250
MK
997 rc = qedr_copy_cq_uresp(dev, cq, udata, db_offset);
998 if (rc)
999 goto err2;
1000
1001 rc = qedr_db_recovery_add(dev, cq->q.db_addr,
1002 &cq->q.db_rec_data->db_data,
1003 DB_REC_WIDTH_64B,
1004 DB_REC_USER);
a7efd777 1005 if (rc)
97f61250
MK
1006 goto err2;
1007
a7efd777
RA
1008 } else {
1009 /* Generate doorbell address. */
a7efd777 1010 cq->db.data.icid = cq->icid;
97f61250 1011 cq->db_addr = dev->db_addr + db_offset;
0b1eddc1 1012 cq->db.data.params = DB_AGG_CMD_MAX <<
a7efd777
RA
1013 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
1014
1015 /* point to the very last element, passing it we will toggle */
1016 cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
1017 cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
1018 cq->latest_cqe = NULL;
1019 consume_cqe(cq);
1020 cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
97f61250
MK
1021
1022 rc = qedr_db_recovery_add(dev, cq->db_addr, &cq->db.data,
1023 DB_REC_WIDTH_64B, DB_REC_KERNEL);
1024 if (rc)
1025 goto err2;
a7efd777
RA
1026 }
1027
1028 DP_DEBUG(dev, QEDR_MSG_CQ,
1029 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
1030 cq->icid, cq, params.cq_size);
1031
e39afe3d 1032 return 0;
a7efd777 1033
97f61250 1034err2:
a7efd777
RA
1035 destroy_iparams.icid = cq->icid;
1036 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
1037 &destroy_oparams);
a7efd777 1038err1:
97f61250
MK
1039 if (udata) {
1040 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
a7efd777 1041 ib_umem_release(cq->q.umem);
a25984f3 1042 if (cq->q.db_mmap_entry)
97f61250
MK
1043 rdma_user_mmap_entry_remove(cq->q.db_mmap_entry);
1044 } else {
1045 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
1046 }
a7efd777 1047err0:
e39afe3d 1048 return -EINVAL;
a7efd777
RA
1049}
1050
1051int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
1052{
1053 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
1054 struct qedr_cq *cq = get_qedr_cq(ibcq);
1055
1056 DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
1057
1058 return 0;
1059}
1060
4dd72636
AR
1061#define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
1062#define QEDR_DESTROY_CQ_ITER_DURATION (10)
1063
43d781b9 1064int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
a7efd777
RA
1065{
1066 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
1067 struct qed_rdma_destroy_cq_out_params oparams;
1068 struct qed_rdma_destroy_cq_in_params iparams;
1069 struct qedr_cq *cq = get_qedr_cq(ibcq);
4dd72636 1070 int iter;
a7efd777 1071
942b3b2c 1072 DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
a7efd777 1073
4dd72636
AR
1074 cq->destroyed = 1;
1075
a7efd777 1076 /* GSIs CQs are handled by driver, so they don't exist in the FW */
97f61250
MK
1077 if (cq->cq_type == QEDR_CQ_TYPE_GSI) {
1078 qedr_db_recovery_del(dev, cq->db_addr, &cq->db.data);
43d781b9 1079 return 0;
97f61250 1080 }
a1211359 1081
942b3b2c 1082 iparams.icid = cq->icid;
a52c8e24 1083 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
942b3b2c 1084 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
a7efd777 1085
bdeacabd 1086 if (udata) {
a7efd777
RA
1087 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
1088 ib_umem_release(cq->q.umem);
97f61250
MK
1089
1090 if (cq->q.db_rec_data) {
1091 qedr_db_recovery_del(dev, cq->q.db_addr,
1092 &cq->q.db_rec_data->db_data);
1093 rdma_user_mmap_entry_remove(cq->q.db_mmap_entry);
1094 }
1095 } else {
1096 qedr_db_recovery_del(dev, cq->db_addr, &cq->db.data);
a7efd777
RA
1097 }
1098
4dd72636
AR
1099 /* We don't want the IRQ handler to handle a non-existing CQ so we
1100 * wait until all CNQ interrupts, if any, are received. This will always
1101 * happen and will always happen very fast. If not, then a serious error
1102 * has occured. That is why we can use a long delay.
1103 * We spin for a short time so we don’t lose time on context switching
1104 * in case all the completions are handled in that span. Otherwise
1105 * we sleep for a while and check again. Since the CNQ may be
1106 * associated with (only) the current CPU we use msleep to allow the
1107 * current CPU to be freed.
1108 * The CNQ notification is increased in qedr_irq_handler().
1109 */
1110 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1111 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1112 udelay(QEDR_DESTROY_CQ_ITER_DURATION);
1113 iter--;
1114 }
1115
1116 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1117 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1118 msleep(QEDR_DESTROY_CQ_ITER_DURATION);
1119 iter--;
1120 }
1121
4dd72636
AR
1122 /* Note that we don't need to have explicit code to wait for the
1123 * completion of the event handler because it is invoked from the EQ.
1124 * Since the destroy CQ ramrod has also been received on the EQ we can
1125 * be certain that there's no event handler in process.
1126 */
43d781b9 1127 return 0;
a7efd777 1128}
cecbcddf
RA
1129
1130static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1131 struct ib_qp_attr *attr,
1132 int attr_mask,
1133 struct qed_rdma_modify_qp_in_params
1134 *qp_params)
1135{
47ec3866 1136 const struct ib_gid_attr *gid_attr;
cecbcddf 1137 enum rdma_network_type nw_type;
d8966fcd 1138 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
cecbcddf 1139 u32 ipv4_addr;
a70c0739 1140 int ret;
cecbcddf
RA
1141 int i;
1142
47ec3866 1143 gid_attr = grh->sgid_attr;
a70c0739
PP
1144 ret = rdma_read_gid_l2_fields(gid_attr, &qp_params->vlan_id, NULL);
1145 if (ret)
1146 return ret;
3e44e0ee 1147
47ec3866 1148 nw_type = rdma_gid_attr_network_type(gid_attr);
3e44e0ee
PP
1149 switch (nw_type) {
1150 case RDMA_NETWORK_IPV6:
47ec3866 1151 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
3e44e0ee
PP
1152 sizeof(qp_params->sgid));
1153 memcpy(&qp_params->dgid.bytes[0],
1154 &grh->dgid,
1155 sizeof(qp_params->dgid));
1156 qp_params->roce_mode = ROCE_V2_IPV6;
1157 SET_FIELD(qp_params->modify_flags,
1158 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1159 break;
1c15b4f2 1160 case RDMA_NETWORK_ROCE_V1:
47ec3866 1161 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
3e44e0ee
PP
1162 sizeof(qp_params->sgid));
1163 memcpy(&qp_params->dgid.bytes[0],
1164 &grh->dgid,
1165 sizeof(qp_params->dgid));
1166 qp_params->roce_mode = ROCE_V1;
1167 break;
1168 case RDMA_NETWORK_IPV4:
1169 memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1170 memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
47ec3866 1171 ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw);
3e44e0ee
PP
1172 qp_params->sgid.ipv4_addr = ipv4_addr;
1173 ipv4_addr =
1174 qedr_get_ipv4_from_gid(grh->dgid.raw);
1175 qp_params->dgid.ipv4_addr = ipv4_addr;
1176 SET_FIELD(qp_params->modify_flags,
1177 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1178 qp_params->roce_mode = ROCE_V2_IPV4;
1179 break;
1c15b4f2
AH
1180 default:
1181 return -EINVAL;
cecbcddf
RA
1182 }
1183
1184 for (i = 0; i < 4; i++) {
1185 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1186 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1187 }
1188
1189 if (qp_params->vlan_id >= VLAN_CFI_MASK)
1190 qp_params->vlan_id = 0;
1191
1192 return 0;
1193}
1194
cecbcddf 1195static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
e00b64f7
SR
1196 struct ib_qp_init_attr *attrs,
1197 struct ib_udata *udata)
cecbcddf
RA
1198{
1199 struct qedr_device_attr *qattr = &dev->attr;
1200
1201 /* QP0... attrs->qp_type == IB_QPT_GSI */
06e8d1df
YB
1202 if (attrs->qp_type != IB_QPT_RC &&
1203 attrs->qp_type != IB_QPT_GSI &&
1204 attrs->qp_type != IB_QPT_XRC_INI &&
1205 attrs->qp_type != IB_QPT_XRC_TGT) {
cecbcddf
RA
1206 DP_DEBUG(dev, QEDR_MSG_QP,
1207 "create qp: unsupported qp type=0x%x requested\n",
1208 attrs->qp_type);
bb8865f4 1209 return -EOPNOTSUPP;
cecbcddf
RA
1210 }
1211
1212 if (attrs->cap.max_send_wr > qattr->max_sqe) {
1213 DP_ERR(dev,
1214 "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1215 attrs->cap.max_send_wr, qattr->max_sqe);
1216 return -EINVAL;
1217 }
1218
1219 if (attrs->cap.max_inline_data > qattr->max_inline) {
1220 DP_ERR(dev,
1221 "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1222 attrs->cap.max_inline_data, qattr->max_inline);
1223 return -EINVAL;
1224 }
1225
1226 if (attrs->cap.max_send_sge > qattr->max_sge) {
1227 DP_ERR(dev,
1228 "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1229 attrs->cap.max_send_sge, qattr->max_sge);
1230 return -EINVAL;
1231 }
1232
1233 if (attrs->cap.max_recv_sge > qattr->max_sge) {
1234 DP_ERR(dev,
1235 "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1236 attrs->cap.max_recv_sge, qattr->max_sge);
1237 return -EINVAL;
1238 }
1239
06e8d1df
YB
1240 /* verify consumer QPs are not trying to use GSI QP's CQ.
1241 * TGT QP isn't associated with RQ/SQ
1242 */
1243 if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created) &&
1244 (attrs->qp_type != IB_QPT_XRC_TGT)) {
1245 struct qedr_cq *send_cq = get_qedr_cq(attrs->send_cq);
1246 struct qedr_cq *recv_cq = get_qedr_cq(attrs->recv_cq);
1247
1248 if ((send_cq->cq_type == QEDR_CQ_TYPE_GSI) ||
1249 (recv_cq->cq_type == QEDR_CQ_TYPE_GSI)) {
1250 DP_ERR(dev,
1251 "create qp: consumer QP cannot use GSI CQs.\n");
1252 return -EINVAL;
1253 }
1254 }
1255
cecbcddf
RA
1256 return 0;
1257}
1258
40b173dd
YB
1259static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1260 struct qedr_srq *srq, struct ib_udata *udata)
1261{
1262 struct qedr_create_srq_uresp uresp = {};
1263 int rc;
1264
1265 uresp.srq_id = srq->srq_id;
1266
1267 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1268 if (rc)
1269 DP_ERR(dev, "create srq: problem copying data to user space\n");
1270
1271 return rc;
1272}
1273
69ad0e7f 1274static void qedr_copy_rq_uresp(struct qedr_dev *dev,
9e054b13
MK
1275 struct qedr_create_qp_uresp *uresp,
1276 struct qedr_qp *qp)
cecbcddf 1277{
69ad0e7f
KM
1278 /* iWARP requires two doorbells per RQ. */
1279 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1280 uresp->rq_db_offset =
1281 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1282 uresp->rq_db2_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1283 } else {
1284 uresp->rq_db_offset =
1285 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1286 }
1287
cecbcddf 1288 uresp->rq_icid = qp->icid;
a25984f3
MK
1289 if (qp->urq.db_mmap_entry)
1290 uresp->rq_db_rec_addr =
1291 rdma_user_mmap_get_offset(qp->urq.db_mmap_entry);
cecbcddf
RA
1292}
1293
69ad0e7f
KM
1294static void qedr_copy_sq_uresp(struct qedr_dev *dev,
1295 struct qedr_create_qp_uresp *uresp,
cecbcddf
RA
1296 struct qedr_qp *qp)
1297{
1298 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
69ad0e7f
KM
1299
1300 /* iWARP uses the same cid for rq and sq */
1301 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1302 uresp->sq_icid = qp->icid;
1303 else
1304 uresp->sq_icid = qp->icid + 1;
97f61250 1305
a25984f3
MK
1306 if (qp->usq.db_mmap_entry)
1307 uresp->sq_db_rec_addr =
1308 rdma_user_mmap_get_offset(qp->usq.db_mmap_entry);
cecbcddf
RA
1309}
1310
1311static int qedr_copy_qp_uresp(struct qedr_dev *dev,
97f61250
MK
1312 struct qedr_qp *qp, struct ib_udata *udata,
1313 struct qedr_create_qp_uresp *uresp)
cecbcddf 1314{
cecbcddf
RA
1315 int rc;
1316
97f61250 1317 memset(uresp, 0, sizeof(*uresp));
06e8d1df
YB
1318
1319 if (qedr_qp_has_sq(qp))
1320 qedr_copy_sq_uresp(dev, uresp, qp);
1321
1322 if (qedr_qp_has_rq(qp))
1323 qedr_copy_rq_uresp(dev, uresp, qp);
cecbcddf 1324
97f61250
MK
1325 uresp->atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1326 uresp->qp_id = qp->qp_id;
cecbcddf 1327
97f61250 1328 rc = qedr_ib_copy_to_udata(udata, uresp, sizeof(*uresp));
cecbcddf
RA
1329 if (rc)
1330 DP_ERR(dev,
1331 "create qp: failed a copy to user space with qp icid=0x%x.\n",
1332 qp->icid);
1333
1334 return rc;
1335}
1336
df158561
AR
1337static void qedr_set_common_qp_params(struct qedr_dev *dev,
1338 struct qedr_qp *qp,
1339 struct qedr_pd *pd,
1340 struct ib_qp_init_attr *attrs)
cecbcddf 1341{
cecbcddf 1342 spin_lock_init(&qp->q_lock);
82af6d19
MK
1343 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1344 kref_init(&qp->refcnt);
1345 init_completion(&qp->iwarp_cm_comp);
1346 }
06e8d1df 1347
df158561 1348 qp->pd = pd;
cecbcddf
RA
1349 qp->qp_type = attrs->qp_type;
1350 qp->max_inline_data = attrs->cap.max_inline_data;
cecbcddf
RA
1351 qp->state = QED_ROCE_QP_STATE_RESET;
1352 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
cecbcddf 1353 qp->dev = dev;
06e8d1df
YB
1354 if (qedr_qp_has_sq(qp)) {
1355 qp->sq.max_sges = attrs->cap.max_send_sge;
1356 qp->sq_cq = get_qedr_cq(attrs->send_cq);
1357 DP_DEBUG(dev, QEDR_MSG_QP,
1358 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1359 qp->sq.max_sges, qp->sq_cq->icid);
1360 }
cecbcddf 1361
06e8d1df 1362 if (attrs->srq)
3491c9e7 1363 qp->srq = get_qedr_srq(attrs->srq);
06e8d1df
YB
1364
1365 if (qedr_qp_has_rq(qp)) {
3491c9e7
YB
1366 qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1367 qp->rq.max_sges = attrs->cap.max_recv_sge;
1368 DP_DEBUG(dev, QEDR_MSG_QP,
1369 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1370 qp->rq.max_sges, qp->rq_cq->icid);
1371 }
1372
cecbcddf
RA
1373 DP_DEBUG(dev, QEDR_MSG_QP,
1374 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1375 pd->pd_id, qp->qp_type, qp->max_inline_data,
1376 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1377 DP_DEBUG(dev, QEDR_MSG_QP,
1378 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1379 qp->sq.max_sges, qp->sq_cq->icid);
cecbcddf
RA
1380}
1381
97f61250 1382static int qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
cecbcddf 1383{
06e8d1df 1384 int rc = 0;
97f61250 1385
06e8d1df
YB
1386 if (qedr_qp_has_sq(qp)) {
1387 qp->sq.db = dev->db_addr +
1388 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1389 qp->sq.db_data.data.icid = qp->icid + 1;
1390 rc = qedr_db_recovery_add(dev, qp->sq.db, &qp->sq.db_data,
1391 DB_REC_WIDTH_32B, DB_REC_KERNEL);
1392 if (rc)
1393 return rc;
1394 }
97f61250 1395
06e8d1df 1396 if (qedr_qp_has_rq(qp)) {
3491c9e7
YB
1397 qp->rq.db = dev->db_addr +
1398 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1399 qp->rq.db_data.data.icid = qp->icid;
06e8d1df
YB
1400 rc = qedr_db_recovery_add(dev, qp->rq.db, &qp->rq.db_data,
1401 DB_REC_WIDTH_32B, DB_REC_KERNEL);
1402 if (rc && qedr_qp_has_sq(qp))
1403 qedr_db_recovery_del(dev, qp->sq.db, &qp->sq.db_data);
3491c9e7 1404 }
97f61250
MK
1405
1406 return rc;
3491c9e7
YB
1407}
1408
68e326de 1409static int qedr_check_srq_params(struct qedr_dev *dev,
3491c9e7
YB
1410 struct ib_srq_init_attr *attrs,
1411 struct ib_udata *udata)
1412{
1413 struct qedr_device_attr *qattr = &dev->attr;
1414
1415 if (attrs->attr.max_wr > qattr->max_srq_wr) {
1416 DP_ERR(dev,
1417 "create srq: unsupported srq_wr=0x%x requested (max_srq_wr=0x%x)\n",
1418 attrs->attr.max_wr, qattr->max_srq_wr);
1419 return -EINVAL;
1420 }
1421
1422 if (attrs->attr.max_sge > qattr->max_sge) {
1423 DP_ERR(dev,
1424 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1425 attrs->attr.max_sge, qattr->max_sge);
06e8d1df
YB
1426 }
1427
1428 if (!udata && attrs->srq_type == IB_SRQT_XRC) {
1429 DP_ERR(dev, "XRC SRQs are not supported in kernel-space\n");
3491c9e7
YB
1430 return -EINVAL;
1431 }
1432
1433 return 0;
1434}
1435
40b173dd
YB
1436static void qedr_free_srq_user_params(struct qedr_srq *srq)
1437{
1438 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1439 ib_umem_release(srq->usrq.umem);
1440 ib_umem_release(srq->prod_umem);
1441}
1442
3491c9e7
YB
1443static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1444{
1445 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1446 struct qedr_dev *dev = srq->dev;
1447
1448 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1449
1450 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1451 hw_srq->virt_prod_pair_addr,
1452 hw_srq->phy_prod_pair_addr);
1453}
1454
b0ea0fa5 1455static int qedr_init_srq_user_params(struct ib_udata *udata,
40b173dd
YB
1456 struct qedr_srq *srq,
1457 struct qedr_create_srq_ureq *ureq,
72b894b0 1458 int access)
40b173dd
YB
1459{
1460 struct scatterlist *sg;
1461 int rc;
1462
b0ea0fa5 1463 rc = qedr_init_user_queue(udata, srq->dev, &srq->usrq, ureq->srq_addr,
72b894b0 1464 ureq->srq_len, false, access, 1);
40b173dd
YB
1465 if (rc)
1466 return rc;
1467
c320e527
MS
1468 srq->prod_umem = ib_umem_get(srq->ibsrq.device, ureq->prod_pair_addr,
1469 sizeof(struct rdma_srq_producers), access);
40b173dd
YB
1470 if (IS_ERR(srq->prod_umem)) {
1471 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1472 ib_umem_release(srq->usrq.umem);
1473 DP_ERR(srq->dev,
1474 "create srq: failed ib_umem_get for producer, got %ld\n",
1475 PTR_ERR(srq->prod_umem));
1476 return PTR_ERR(srq->prod_umem);
1477 }
1478
1479 sg = srq->prod_umem->sg_head.sgl;
1480 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1481
1482 return 0;
1483}
1484
3491c9e7
YB
1485static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1486 struct qedr_dev *dev,
1487 struct ib_srq_init_attr *init_attr)
1488{
1489 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
b6db3f71
AL
1490 struct qed_chain_init_params params = {
1491 .mode = QED_CHAIN_MODE_PBL,
1492 .intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1493 .cnt_type = QED_CHAIN_CNT_TYPE_U32,
1494 .elem_size = QEDR_SRQ_WQE_ELEM_SIZE,
1495 };
3491c9e7
YB
1496 dma_addr_t phy_prod_pair_addr;
1497 u32 num_elems;
1498 void *va;
1499 int rc;
1500
1501 va = dma_alloc_coherent(&dev->pdev->dev,
1502 sizeof(struct rdma_srq_producers),
1503 &phy_prod_pair_addr, GFP_KERNEL);
1504 if (!va) {
1505 DP_ERR(dev,
1506 "create srq: failed to allocate dma memory for producer\n");
1507 return -ENOMEM;
1508 }
1509
1510 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
1511 hw_srq->virt_prod_pair_addr = va;
1512
1513 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
b6db3f71
AL
1514 params.num_elems = num_elems;
1515
1516 rc = dev->ops->common->chain_alloc(dev->cdev, &hw_srq->pbl, &params);
3491c9e7
YB
1517 if (rc)
1518 goto err0;
1519
1520 hw_srq->num_elems = num_elems;
1521
1522 return 0;
1523
1524err0:
1525 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1526 va, phy_prod_pair_addr);
1527 return rc;
1528}
1529
68e326de
LR
1530int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
1531 struct ib_udata *udata)
3491c9e7
YB
1532{
1533 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1534 struct qed_rdma_create_srq_in_params in_params = {};
68e326de 1535 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
3491c9e7 1536 struct qed_rdma_create_srq_out_params out_params;
68e326de 1537 struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
40b173dd 1538 struct qedr_create_srq_ureq ureq = {};
3491c9e7
YB
1539 u64 pbl_base_addr, phy_prod_pair_addr;
1540 struct qedr_srq_hwq_info *hw_srq;
1541 u32 page_cnt, page_size;
68e326de 1542 struct qedr_srq *srq = get_qedr_srq(ibsrq);
3491c9e7
YB
1543 int rc = 0;
1544
1545 DP_DEBUG(dev, QEDR_MSG_QP,
1546 "create SRQ called from %s (pd %p)\n",
1547 (udata) ? "User lib" : "kernel", pd);
1548
652caba5
JG
1549 if (init_attr->srq_type != IB_SRQT_BASIC &&
1550 init_attr->srq_type != IB_SRQT_XRC)
1551 return -EOPNOTSUPP;
1552
68e326de 1553 rc = qedr_check_srq_params(dev, init_attr, udata);
3491c9e7 1554 if (rc)
68e326de 1555 return -EINVAL;
3491c9e7
YB
1556
1557 srq->dev = dev;
06e8d1df 1558 srq->is_xrc = (init_attr->srq_type == IB_SRQT_XRC);
3491c9e7
YB
1559 hw_srq = &srq->hw_srq;
1560 spin_lock_init(&srq->lock);
1561
1562 hw_srq->max_wr = init_attr->attr.max_wr;
1563 hw_srq->max_sges = init_attr->attr.max_sge;
1564
89944450 1565 if (udata) {
97f61250
MK
1566 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
1567 udata->inlen))) {
40b173dd
YB
1568 DP_ERR(dev,
1569 "create srq: problem copying data from user space\n");
1570 goto err0;
1571 }
1572
72b894b0 1573 rc = qedr_init_srq_user_params(udata, srq, &ureq, 0);
40b173dd
YB
1574 if (rc)
1575 goto err0;
1576
1577 page_cnt = srq->usrq.pbl_info.num_pbes;
1578 pbl_base_addr = srq->usrq.pbl_tbl->pa;
1579 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
95ad233f 1580 page_size = PAGE_SIZE;
40b173dd
YB
1581 } else {
1582 struct qed_chain *pbl;
1583
1584 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1585 if (rc)
1586 goto err0;
1587
1588 pbl = &hw_srq->pbl;
1589 page_cnt = qed_chain_get_page_cnt(pbl);
1590 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1591 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1592 page_size = QED_CHAIN_PAGE_SIZE;
1593 }
3491c9e7 1594
3491c9e7
YB
1595 in_params.pd_id = pd->pd_id;
1596 in_params.pbl_base_addr = pbl_base_addr;
1597 in_params.prod_pair_addr = phy_prod_pair_addr;
1598 in_params.num_pages = page_cnt;
1599 in_params.page_size = page_size;
06e8d1df
YB
1600 if (srq->is_xrc) {
1601 struct qedr_xrcd *xrcd = get_qedr_xrcd(init_attr->ext.xrc.xrcd);
1602 struct qedr_cq *cq = get_qedr_cq(init_attr->ext.cq);
1603
1604 in_params.is_xrc = 1;
1605 in_params.xrcd_id = xrcd->xrcd_id;
1606 in_params.cq_cid = cq->icid;
1607 }
3491c9e7
YB
1608
1609 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1610 if (rc)
1611 goto err1;
1612
1613 srq->srq_id = out_params.srq_id;
1614
40b173dd
YB
1615 if (udata) {
1616 rc = qedr_copy_srq_uresp(dev, srq, udata);
1617 if (rc)
1618 goto err2;
1619 }
1620
9fd15987 1621 rc = xa_insert_irq(&dev->srqs, srq->srq_id, srq, GFP_KERNEL);
3491c9e7
YB
1622 if (rc)
1623 goto err2;
1624
1625 DP_DEBUG(dev, QEDR_MSG_SRQ,
1626 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
68e326de 1627 return 0;
3491c9e7
YB
1628
1629err2:
1630 destroy_in_params.srq_id = srq->srq_id;
1631
1632 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1633err1:
40b173dd
YB
1634 if (udata)
1635 qedr_free_srq_user_params(srq);
1636 else
1637 qedr_free_srq_kernel_params(srq);
3491c9e7 1638err0:
68e326de 1639 return -EFAULT;
3491c9e7
YB
1640}
1641
119181d1 1642int qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
3491c9e7
YB
1643{
1644 struct qed_rdma_destroy_srq_in_params in_params = {};
1645 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1646 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1647
9fd15987 1648 xa_erase_irq(&dev->srqs, srq->srq_id);
3491c9e7 1649 in_params.srq_id = srq->srq_id;
06e8d1df 1650 in_params.is_xrc = srq->is_xrc;
3491c9e7
YB
1651 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1652
e00b64f7 1653 if (ibsrq->uobject)
40b173dd
YB
1654 qedr_free_srq_user_params(srq);
1655 else
1656 qedr_free_srq_kernel_params(srq);
3491c9e7
YB
1657
1658 DP_DEBUG(dev, QEDR_MSG_SRQ,
1659 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1660 srq->srq_id);
119181d1 1661 return 0;
3491c9e7
YB
1662}
1663
1664int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
1665 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
1666{
1667 struct qed_rdma_modify_srq_in_params in_params = {};
1668 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1669 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1670 int rc;
1671
1672 if (attr_mask & IB_SRQ_MAX_WR) {
1673 DP_ERR(dev,
1674 "modify srq: invalid attribute mask=0x%x specified for %p\n",
1675 attr_mask, srq);
1676 return -EINVAL;
1677 }
1678
1679 if (attr_mask & IB_SRQ_LIMIT) {
1680 if (attr->srq_limit >= srq->hw_srq.max_wr) {
1681 DP_ERR(dev,
1682 "modify srq: invalid srq_limit=0x%x (max_srq_limit=0x%x)\n",
1683 attr->srq_limit, srq->hw_srq.max_wr);
1684 return -EINVAL;
1685 }
1686
1687 in_params.srq_id = srq->srq_id;
1688 in_params.wqe_limit = attr->srq_limit;
1689 rc = dev->ops->rdma_modify_srq(dev->rdma_ctx, &in_params);
1690 if (rc)
1691 return rc;
1692 }
1693
1694 srq->srq_limit = attr->srq_limit;
1695
1696 DP_DEBUG(dev, QEDR_MSG_SRQ,
1697 "modify srq: modified srq with srq_id=0x%0x\n", srq->srq_id);
1698
1699 return 0;
cecbcddf
RA
1700}
1701
06e8d1df
YB
1702static enum qed_rdma_qp_type qedr_ib_to_qed_qp_type(enum ib_qp_type ib_qp_type)
1703{
1704 switch (ib_qp_type) {
1705 case IB_QPT_RC:
1706 return QED_RDMA_QP_TYPE_RC;
1707 case IB_QPT_XRC_INI:
1708 return QED_RDMA_QP_TYPE_XRC_INI;
1709 case IB_QPT_XRC_TGT:
1710 return QED_RDMA_QP_TYPE_XRC_TGT;
1711 default:
1712 return QED_RDMA_QP_TYPE_INVAL;
1713 }
1714}
1715
cecbcddf 1716static inline void
df158561
AR
1717qedr_init_common_qp_in_params(struct qedr_dev *dev,
1718 struct qedr_pd *pd,
1719 struct qedr_qp *qp,
1720 struct ib_qp_init_attr *attrs,
1721 bool fmr_and_reserved_lkey,
1722 struct qed_rdma_create_qp_in_params *params)
cecbcddf 1723{
df158561
AR
1724 /* QP handle to be written in an async event */
1725 params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1726 params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
1727
1728 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1729 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
06e8d1df 1730 params->qp_type = qedr_ib_to_qed_qp_type(attrs->qp_type);
df158561 1731 params->stats_queue = 0;
3491c9e7 1732
06e8d1df
YB
1733 if (pd) {
1734 params->pd = pd->pd_id;
1735 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1736 }
1737
1738 if (qedr_qp_has_sq(qp))
1739 params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1740
1741 if (qedr_qp_has_rq(qp))
3491c9e7
YB
1742 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1743
06e8d1df 1744 if (qedr_qp_has_srq(qp)) {
3491c9e7
YB
1745 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1746 params->srq_id = qp->srq->srq_id;
1747 params->use_srq = true;
06e8d1df
YB
1748 } else {
1749 params->srq_id = 0;
1750 params->use_srq = false;
3491c9e7 1751 }
cecbcddf
RA
1752}
1753
df158561 1754static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
cecbcddf 1755{
df158561
AR
1756 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1757 "qp=%p. "
1758 "sq_addr=0x%llx, "
1759 "sq_len=%zd, "
1760 "rq_addr=0x%llx, "
1761 "rq_len=%zd"
1762 "\n",
1763 qp,
06e8d1df
YB
1764 qedr_qp_has_sq(qp) ? qp->usq.buf_addr : 0x0,
1765 qedr_qp_has_sq(qp) ? qp->usq.buf_len : 0,
1766 qedr_qp_has_rq(qp) ? qp->urq.buf_addr : 0x0,
1767 qedr_qp_has_sq(qp) ? qp->urq.buf_len : 0);
df158561 1768}
cecbcddf 1769
69ad0e7f
KM
1770static inline void
1771qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
1772 struct qedr_qp *qp,
1773 struct qed_rdma_create_qp_out_params *out_params)
1774{
1775 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1776 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1777
1778 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1779 &qp->usq.pbl_info, FW_PAGE_SHIFT);
40b173dd
YB
1780 if (!qp->srq) {
1781 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1782 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1783 }
69ad0e7f
KM
1784
1785 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1786 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1787}
1788
97f61250
MK
1789static void qedr_cleanup_user(struct qedr_dev *dev,
1790 struct qedr_ucontext *ctx,
1791 struct qedr_qp *qp)
df158561 1792{
06e8d1df
YB
1793 if (qedr_qp_has_sq(qp)) {
1794 ib_umem_release(qp->usq.umem);
1795 qp->usq.umem = NULL;
1796 }
cecbcddf 1797
06e8d1df
YB
1798 if (qedr_qp_has_rq(qp)) {
1799 ib_umem_release(qp->urq.umem);
1800 qp->urq.umem = NULL;
1801 }
24e412c1
MK
1802
1803 if (rdma_protocol_roce(&dev->ibdev, 1)) {
1804 qedr_free_pbl(dev, &qp->usq.pbl_info, qp->usq.pbl_tbl);
1805 qedr_free_pbl(dev, &qp->urq.pbl_info, qp->urq.pbl_tbl);
1806 } else {
1807 kfree(qp->usq.pbl_tbl);
1808 kfree(qp->urq.pbl_tbl);
1809 }
97f61250
MK
1810
1811 if (qp->usq.db_rec_data) {
1812 qedr_db_recovery_del(dev, qp->usq.db_addr,
1813 &qp->usq.db_rec_data->db_data);
1814 rdma_user_mmap_entry_remove(qp->usq.db_mmap_entry);
1815 }
1816
1817 if (qp->urq.db_rec_data) {
1818 qedr_db_recovery_del(dev, qp->urq.db_addr,
1819 &qp->urq.db_rec_data->db_data);
1820 rdma_user_mmap_entry_remove(qp->urq.db_mmap_entry);
1821 }
b4bc7660
MK
1822
1823 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1824 qedr_db_recovery_del(dev, qp->urq.db_rec_db2_addr,
1825 &qp->urq.db_rec_db2_data);
cecbcddf
RA
1826}
1827
df158561
AR
1828static int qedr_create_user_qp(struct qedr_dev *dev,
1829 struct qedr_qp *qp,
1830 struct ib_pd *ibpd,
1831 struct ib_udata *udata,
1832 struct ib_qp_init_attr *attrs)
cecbcddf 1833{
df158561
AR
1834 struct qed_rdma_create_qp_in_params in_params;
1835 struct qed_rdma_create_qp_out_params out_params;
06e8d1df
YB
1836 struct qedr_create_qp_uresp uresp = {};
1837 struct qedr_create_qp_ureq ureq = {};
69ad0e7f 1838 int alloc_and_init = rdma_protocol_roce(&dev->ibdev, 1);
06e8d1df
YB
1839 struct qedr_ucontext *ctx = NULL;
1840 struct qedr_pd *pd = NULL;
1841 int rc = 0;
cecbcddf 1842
82af6d19 1843 qp->create_type = QEDR_QP_CREATE_USER;
06e8d1df
YB
1844
1845 if (ibpd) {
1846 pd = get_qedr_pd(ibpd);
1847 ctx = pd->uctx;
df158561 1848 }
cecbcddf 1849
06e8d1df
YB
1850 if (udata) {
1851 rc = ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
1852 udata->inlen));
1853 if (rc) {
1854 DP_ERR(dev, "Problem copying data from user space\n");
1855 return rc;
1856 }
1857 }
cecbcddf 1858
06e8d1df
YB
1859 if (qedr_qp_has_sq(qp)) {
1860 /* SQ - read access only (0) */
1861 rc = qedr_init_user_queue(udata, dev, &qp->usq, ureq.sq_addr,
1862 ureq.sq_len, true, 0, alloc_and_init);
1863 if (rc)
1864 return rc;
1865 }
1866
1867 if (qedr_qp_has_rq(qp)) {
72b894b0 1868 /* RQ - read access only (0) */
b0ea0fa5 1869 rc = qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr,
72b894b0 1870 ureq.rq_len, true, 0, alloc_and_init);
40b173dd
YB
1871 if (rc)
1872 return rc;
1873 }
df158561
AR
1874
1875 memset(&in_params, 0, sizeof(in_params));
1876 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1877 in_params.qp_handle_lo = ureq.qp_handle_lo;
1878 in_params.qp_handle_hi = ureq.qp_handle_hi;
06e8d1df
YB
1879
1880 if (qp->qp_type == IB_QPT_XRC_TGT) {
1881 struct qedr_xrcd *xrcd = get_qedr_xrcd(attrs->xrcd);
1882
1883 in_params.xrcd_id = xrcd->xrcd_id;
1884 in_params.qp_handle_lo = qp->qp_id;
1885 in_params.use_srq = 1;
1886 }
1887
1888 if (qedr_qp_has_sq(qp)) {
1889 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1890 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1891 }
1892
1893 if (qedr_qp_has_rq(qp)) {
40b173dd
YB
1894 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1895 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1896 }
df158561 1897
bbe4f424
MK
1898 if (ctx)
1899 SET_FIELD(in_params.flags, QED_ROCE_EDPM_MODE, ctx->edpm_mode);
1900
df158561
AR
1901 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1902 &in_params, &out_params);
1903
1904 if (!qp->qed_qp) {
1905 rc = -ENOMEM;
1906 goto err1;
1907 }
1908
69ad0e7f
KM
1909 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1910 qedr_iwarp_populate_user_qp(dev, qp, &out_params);
1911
df158561
AR
1912 qp->qp_id = out_params.qp_id;
1913 qp->icid = out_params.icid;
1914
06e8d1df
YB
1915 if (udata) {
1916 rc = qedr_copy_qp_uresp(dev, qp, udata, &uresp);
1917 if (rc)
1918 goto err;
1919 }
97f61250
MK
1920
1921 /* db offset was calculated in copy_qp_uresp, now set in the user q */
06e8d1df
YB
1922 if (qedr_qp_has_sq(qp)) {
1923 qp->usq.db_addr = ctx->dpi_addr + uresp.sq_db_offset;
1924 rc = qedr_db_recovery_add(dev, qp->usq.db_addr,
1925 &qp->usq.db_rec_data->db_data,
1926 DB_REC_WIDTH_32B,
1927 DB_REC_USER);
1928 if (rc)
1929 goto err;
b4bc7660
MK
1930 }
1931
06e8d1df
YB
1932 if (qedr_qp_has_rq(qp)) {
1933 qp->urq.db_addr = ctx->dpi_addr + uresp.rq_db_offset;
1934 rc = qedr_db_recovery_add(dev, qp->urq.db_addr,
1935 &qp->urq.db_rec_data->db_data,
1936 DB_REC_WIDTH_32B,
1937 DB_REC_USER);
1938 if (rc)
1939 goto err;
1940 }
df158561 1941
b4bc7660
MK
1942 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1943 rc = qedr_db_recovery_add(dev, qp->urq.db_rec_db2_addr,
1944 &qp->urq.db_rec_db2_data,
1945 DB_REC_WIDTH_32B,
1946 DB_REC_USER);
1947 if (rc)
1948 goto err;
1949 }
df158561 1950 qedr_qp_user_print(dev, qp);
97f61250 1951 return rc;
df158561
AR
1952err:
1953 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1954 if (rc)
1955 DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1956
1957err1:
97f61250 1958 qedr_cleanup_user(dev, ctx, qp);
df158561 1959 return rc;
cecbcddf
RA
1960}
1961
97f61250 1962static int qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
f5b1b177 1963{
97f61250
MK
1964 int rc;
1965
f5b1b177
KM
1966 qp->sq.db = dev->db_addr +
1967 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1968 qp->sq.db_data.data.icid = qp->icid;
1969
97f61250
MK
1970 rc = qedr_db_recovery_add(dev, qp->sq.db,
1971 &qp->sq.db_data,
1972 DB_REC_WIDTH_32B,
1973 DB_REC_KERNEL);
1974 if (rc)
1975 return rc;
1976
f5b1b177
KM
1977 qp->rq.db = dev->db_addr +
1978 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1979 qp->rq.db_data.data.icid = qp->icid;
1980 qp->rq.iwarp_db2 = dev->db_addr +
1981 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1982 qp->rq.iwarp_db2_data.data.icid = qp->icid;
1983 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
97f61250
MK
1984
1985 rc = qedr_db_recovery_add(dev, qp->rq.db,
1986 &qp->rq.db_data,
1987 DB_REC_WIDTH_32B,
1988 DB_REC_KERNEL);
b4bc7660
MK
1989 if (rc)
1990 return rc;
1991
1992 rc = qedr_db_recovery_add(dev, qp->rq.iwarp_db2,
1993 &qp->rq.iwarp_db2_data,
1994 DB_REC_WIDTH_32B,
1995 DB_REC_KERNEL);
97f61250 1996 return rc;
f5b1b177
KM
1997}
1998
df158561
AR
1999static int
2000qedr_roce_create_kernel_qp(struct qedr_dev *dev,
2001 struct qedr_qp *qp,
2002 struct qed_rdma_create_qp_in_params *in_params,
2003 u32 n_sq_elems, u32 n_rq_elems)
cecbcddf 2004{
df158561 2005 struct qed_rdma_create_qp_out_params out_params;
b6db3f71
AL
2006 struct qed_chain_init_params params = {
2007 .mode = QED_CHAIN_MODE_PBL,
2008 .cnt_type = QED_CHAIN_CNT_TYPE_U32,
2009 };
cecbcddf
RA
2010 int rc;
2011
b6db3f71
AL
2012 params.intended_use = QED_CHAIN_USE_TO_PRODUCE;
2013 params.num_elems = n_sq_elems;
2014 params.elem_size = QEDR_SQE_ELEMENT_SIZE;
cecbcddf 2015
b6db3f71 2016 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->sq.pbl, &params);
df158561
AR
2017 if (rc)
2018 return rc;
cecbcddf 2019
df158561
AR
2020 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
2021 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
cecbcddf 2022
b6db3f71 2023 params.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE;
35406697 2024 params.num_elems = n_rq_elems;
b6db3f71
AL
2025 params.elem_size = QEDR_RQE_ELEMENT_SIZE;
2026
2027 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->rq.pbl, &params);
df158561
AR
2028 if (rc)
2029 return rc;
cecbcddf 2030
df158561
AR
2031 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
2032 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
cecbcddf 2033
df158561
AR
2034 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
2035 in_params, &out_params);
cecbcddf 2036
df158561
AR
2037 if (!qp->qed_qp)
2038 return -EINVAL;
cecbcddf 2039
df158561
AR
2040 qp->qp_id = out_params.qp_id;
2041 qp->icid = out_params.icid;
cecbcddf 2042
97f61250 2043 return qedr_set_roce_db_info(dev, qp);
f5b1b177 2044}
cecbcddf 2045
f5b1b177
KM
2046static int
2047qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
2048 struct qedr_qp *qp,
2049 struct qed_rdma_create_qp_in_params *in_params,
2050 u32 n_sq_elems, u32 n_rq_elems)
2051{
2052 struct qed_rdma_create_qp_out_params out_params;
b6db3f71
AL
2053 struct qed_chain_init_params params = {
2054 .mode = QED_CHAIN_MODE_PBL,
2055 .cnt_type = QED_CHAIN_CNT_TYPE_U32,
2056 };
f5b1b177
KM
2057 int rc;
2058
2059 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
2060 QEDR_SQE_ELEMENT_SIZE,
15506586 2061 QED_CHAIN_PAGE_SIZE,
f5b1b177
KM
2062 QED_CHAIN_MODE_PBL);
2063 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
2064 QEDR_RQE_ELEMENT_SIZE,
15506586 2065 QED_CHAIN_PAGE_SIZE,
f5b1b177
KM
2066 QED_CHAIN_MODE_PBL);
2067
2068 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
2069 in_params, &out_params);
2070
2071 if (!qp->qed_qp)
2072 return -EINVAL;
2073
2074 /* Now we allocate the chain */
f5b1b177 2075
b6db3f71
AL
2076 params.intended_use = QED_CHAIN_USE_TO_PRODUCE;
2077 params.num_elems = n_sq_elems;
2078 params.elem_size = QEDR_SQE_ELEMENT_SIZE;
2079 params.ext_pbl_virt = out_params.sq_pbl_virt;
2080 params.ext_pbl_phys = out_params.sq_pbl_phys;
f5b1b177 2081
b6db3f71 2082 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->sq.pbl, &params);
f5b1b177
KM
2083 if (rc)
2084 goto err;
2085
b6db3f71
AL
2086 params.intended_use = QED_CHAIN_USE_TO_CONSUME_PRODUCE;
2087 params.num_elems = n_rq_elems;
2088 params.elem_size = QEDR_RQE_ELEMENT_SIZE;
2089 params.ext_pbl_virt = out_params.rq_pbl_virt;
2090 params.ext_pbl_phys = out_params.rq_pbl_phys;
f5b1b177 2091
b6db3f71 2092 rc = dev->ops->common->chain_alloc(dev->cdev, &qp->rq.pbl, &params);
f5b1b177
KM
2093 if (rc)
2094 goto err;
2095
2096 qp->qp_id = out_params.qp_id;
2097 qp->icid = out_params.icid;
2098
97f61250 2099 return qedr_set_iwarp_db_info(dev, qp);
f5b1b177
KM
2100
2101err:
2102 dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2103
2104 return rc;
cecbcddf
RA
2105}
2106
df158561 2107static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
cecbcddf 2108{
df158561
AR
2109 dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
2110 kfree(qp->wqe_wr_id);
cecbcddf 2111
df158561
AR
2112 dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
2113 kfree(qp->rqe_wr_id);
97f61250
MK
2114
2115 /* GSI qp is not registered to db mechanism so no need to delete */
2116 if (qp->qp_type == IB_QPT_GSI)
2117 return;
2118
2119 qedr_db_recovery_del(dev, qp->sq.db, &qp->sq.db_data);
2120
b4bc7660 2121 if (!qp->srq) {
97f61250 2122 qedr_db_recovery_del(dev, qp->rq.db, &qp->rq.db_data);
b4bc7660
MK
2123
2124 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2125 qedr_db_recovery_del(dev, qp->rq.iwarp_db2,
2126 &qp->rq.iwarp_db2_data);
2127 }
cecbcddf
RA
2128}
2129
df158561
AR
2130static int qedr_create_kernel_qp(struct qedr_dev *dev,
2131 struct qedr_qp *qp,
2132 struct ib_pd *ibpd,
2133 struct ib_qp_init_attr *attrs)
cecbcddf 2134{
df158561
AR
2135 struct qed_rdma_create_qp_in_params in_params;
2136 struct qedr_pd *pd = get_qedr_pd(ibpd);
2137 int rc = -EINVAL;
2138 u32 n_rq_elems;
2139 u32 n_sq_elems;
2140 u32 n_sq_entries;
cecbcddf 2141
df158561 2142 memset(&in_params, 0, sizeof(in_params));
82af6d19 2143 qp->create_type = QEDR_QP_CREATE_KERNEL;
cecbcddf 2144
df158561
AR
2145 /* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
2146 * the ring. The ring should allow at least a single WR, even if the
2147 * user requested none, due to allocation issues.
2148 * We should add an extra WR since the prod and cons indices of
2149 * wqe_wr_id are managed in such a way that the WQ is considered full
2150 * when (prod+1)%max_wr==cons. We currently don't do that because we
2151 * double the number of entries due an iSER issue that pushes far more
2152 * WRs than indicated. If we decline its ib_post_send() then we get
2153 * error prints in the dmesg we'd like to avoid.
2154 */
2155 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
2156 dev->attr.max_sqe);
cecbcddf 2157
6396bb22 2158 qp->wqe_wr_id = kcalloc(qp->sq.max_wr, sizeof(*qp->wqe_wr_id),
df158561
AR
2159 GFP_KERNEL);
2160 if (!qp->wqe_wr_id) {
2161 DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
2162 return -ENOMEM;
2163 }
cecbcddf 2164
df158561
AR
2165 /* QP handle to be written in CQE */
2166 in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
2167 in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
cecbcddf 2168
df158561
AR
2169 /* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
2170 * the ring. There ring should allow at least a single WR, even if the
2171 * user requested none, due to allocation issues.
2172 */
2173 qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
cecbcddf 2174
df158561 2175 /* Allocate driver internal RQ array */
6396bb22 2176 qp->rqe_wr_id = kcalloc(qp->rq.max_wr, sizeof(*qp->rqe_wr_id),
df158561
AR
2177 GFP_KERNEL);
2178 if (!qp->rqe_wr_id) {
2179 DP_ERR(dev,
2180 "create qp: failed RQ shadow memory allocation\n");
2181 kfree(qp->wqe_wr_id);
2182 return -ENOMEM;
cecbcddf
RA
2183 }
2184
df158561 2185 qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
cecbcddf 2186
df158561
AR
2187 n_sq_entries = attrs->cap.max_send_wr;
2188 n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
2189 n_sq_entries = max_t(u32, n_sq_entries, 1);
2190 n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
cecbcddf 2191
df158561
AR
2192 n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
2193
f5b1b177
KM
2194 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2195 rc = qedr_iwarp_create_kernel_qp(dev, qp, &in_params,
2196 n_sq_elems, n_rq_elems);
2197 else
2198 rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
2199 n_sq_elems, n_rq_elems);
df158561
AR
2200 if (rc)
2201 qedr_cleanup_kernel(dev, qp);
cecbcddf
RA
2202
2203 return rc;
2204}
2205
3e45410f
KS
2206static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
2207 struct ib_udata *udata)
2208{
2209 struct qedr_ucontext *ctx =
2210 rdma_udata_to_drv_context(udata, struct qedr_ucontext,
2211 ibucontext);
2212 int rc;
2213
2214 if (qp->qp_type != IB_QPT_GSI) {
2215 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2216 if (rc)
2217 return rc;
2218 }
2219
2220 if (qp->create_type == QEDR_QP_CREATE_USER)
2221 qedr_cleanup_user(dev, ctx, qp);
2222 else
2223 qedr_cleanup_kernel(dev, qp);
2224
2225 return 0;
2226}
2227
cecbcddf
RA
2228struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
2229 struct ib_qp_init_attr *attrs,
2230 struct ib_udata *udata)
2231{
06e8d1df
YB
2232 struct qedr_xrcd *xrcd = NULL;
2233 struct qedr_pd *pd = NULL;
2234 struct qedr_dev *dev;
cecbcddf 2235 struct qedr_qp *qp;
181d8015 2236 struct ib_qp *ibqp;
cecbcddf
RA
2237 int rc = 0;
2238
06e8d1df
YB
2239 if (attrs->qp_type == IB_QPT_XRC_TGT) {
2240 xrcd = get_qedr_xrcd(attrs->xrcd);
2241 dev = get_qedr_dev(xrcd->ibxrcd.device);
2242 } else {
2243 pd = get_qedr_pd(ibpd);
2244 dev = get_qedr_dev(ibpd->device);
2245 }
2246
cecbcddf
RA
2247 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
2248 udata ? "user library" : "kernel", pd);
2249
e00b64f7 2250 rc = qedr_check_qp_attrs(ibpd, dev, attrs, udata);
cecbcddf
RA
2251 if (rc)
2252 return ERR_PTR(rc);
2253
cecbcddf 2254 DP_DEBUG(dev, QEDR_MSG_QP,
df158561
AR
2255 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
2256 udata ? "user library" : "kernel", attrs->event_handler, pd,
cecbcddf
RA
2257 get_qedr_cq(attrs->send_cq),
2258 get_qedr_cq(attrs->send_cq)->icid,
2259 get_qedr_cq(attrs->recv_cq),
3491c9e7 2260 attrs->recv_cq ? get_qedr_cq(attrs->recv_cq)->icid : 0);
cecbcddf 2261
df158561
AR
2262 qp = kzalloc(sizeof(*qp), GFP_KERNEL);
2263 if (!qp) {
2264 DP_ERR(dev, "create qp: failed allocating memory\n");
2265 return ERR_PTR(-ENOMEM);
2266 }
2267
2268 qedr_set_common_qp_params(dev, qp, pd, attrs);
cecbcddf 2269
04886779 2270 if (attrs->qp_type == IB_QPT_GSI) {
181d8015
WY
2271 ibqp = qedr_create_gsi_qp(dev, attrs, qp);
2272 if (IS_ERR(ibqp))
2273 kfree(qp);
2274 return ibqp;
04886779
RA
2275 }
2276
06e8d1df 2277 if (udata || xrcd)
df158561
AR
2278 rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
2279 else
2280 rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
cecbcddf 2281
df158561 2282 if (rc)
3e45410f 2283 goto out_free_qp;
cecbcddf 2284
cecbcddf
RA
2285 qp->ibqp.qp_num = qp->qp_id;
2286
1212767e 2287 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
5fdff18b 2288 rc = xa_insert(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
1212767e 2289 if (rc)
3e45410f 2290 goto out_free_qp_resources;
1212767e 2291 }
de0089e6 2292
cecbcddf
RA
2293 return &qp->ibqp;
2294
3e45410f
KS
2295out_free_qp_resources:
2296 qedr_free_qp_resources(dev, qp, udata);
2297out_free_qp:
cecbcddf
RA
2298 kfree(qp);
2299
2300 return ERR_PTR(-EFAULT);
2301}
2302
27a4b1a6 2303static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
cecbcddf
RA
2304{
2305 switch (qp_state) {
2306 case QED_ROCE_QP_STATE_RESET:
2307 return IB_QPS_RESET;
2308 case QED_ROCE_QP_STATE_INIT:
2309 return IB_QPS_INIT;
2310 case QED_ROCE_QP_STATE_RTR:
2311 return IB_QPS_RTR;
2312 case QED_ROCE_QP_STATE_RTS:
2313 return IB_QPS_RTS;
2314 case QED_ROCE_QP_STATE_SQD:
2315 return IB_QPS_SQD;
2316 case QED_ROCE_QP_STATE_ERR:
2317 return IB_QPS_ERR;
2318 case QED_ROCE_QP_STATE_SQE:
2319 return IB_QPS_SQE;
2320 }
2321 return IB_QPS_ERR;
2322}
2323
27a4b1a6
RA
2324static enum qed_roce_qp_state qedr_get_state_from_ibqp(
2325 enum ib_qp_state qp_state)
cecbcddf
RA
2326{
2327 switch (qp_state) {
2328 case IB_QPS_RESET:
2329 return QED_ROCE_QP_STATE_RESET;
2330 case IB_QPS_INIT:
2331 return QED_ROCE_QP_STATE_INIT;
2332 case IB_QPS_RTR:
2333 return QED_ROCE_QP_STATE_RTR;
2334 case IB_QPS_RTS:
2335 return QED_ROCE_QP_STATE_RTS;
2336 case IB_QPS_SQD:
2337 return QED_ROCE_QP_STATE_SQD;
2338 case IB_QPS_ERR:
2339 return QED_ROCE_QP_STATE_ERR;
2340 default:
2341 return QED_ROCE_QP_STATE_ERR;
2342 }
2343}
2344
2345static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
2346{
2347 qed_chain_reset(&qph->pbl);
2348 qph->prod = 0;
2349 qph->cons = 0;
2350 qph->wqe_cons = 0;
2351 qph->db_data.data.value = cpu_to_le16(0);
2352}
2353
2354static int qedr_update_qp_state(struct qedr_dev *dev,
2355 struct qedr_qp *qp,
caf61b1b 2356 enum qed_roce_qp_state cur_state,
cecbcddf
RA
2357 enum qed_roce_qp_state new_state)
2358{
2359 int status = 0;
2360
caf61b1b 2361 if (new_state == cur_state)
865cea40 2362 return 0;
cecbcddf 2363
caf61b1b 2364 switch (cur_state) {
cecbcddf
RA
2365 case QED_ROCE_QP_STATE_RESET:
2366 switch (new_state) {
2367 case QED_ROCE_QP_STATE_INIT:
2368 qp->prev_wqe_size = 0;
2369 qedr_reset_qp_hwq_info(&qp->sq);
2370 qedr_reset_qp_hwq_info(&qp->rq);
2371 break;
2372 default:
2373 status = -EINVAL;
2374 break;
790b57f6 2375 }
cecbcddf
RA
2376 break;
2377 case QED_ROCE_QP_STATE_INIT:
2378 switch (new_state) {
2379 case QED_ROCE_QP_STATE_RTR:
2380 /* Update doorbell (in case post_recv was
2381 * done before move to RTR)
2382 */
f5b1b177
KM
2383
2384 if (rdma_protocol_roce(&dev->ibdev, 1)) {
f5b1b177 2385 writel(qp->rq.db_data.raw, qp->rq.db);
f5b1b177 2386 }
cecbcddf
RA
2387 break;
2388 case QED_ROCE_QP_STATE_ERR:
2389 break;
2390 default:
2391 /* Invalid state change. */
2392 status = -EINVAL;
2393 break;
790b57f6 2394 }
cecbcddf
RA
2395 break;
2396 case QED_ROCE_QP_STATE_RTR:
2397 /* RTR->XXX */
2398 switch (new_state) {
2399 case QED_ROCE_QP_STATE_RTS:
2400 break;
2401 case QED_ROCE_QP_STATE_ERR:
2402 break;
2403 default:
2404 /* Invalid state change. */
2405 status = -EINVAL;
2406 break;
790b57f6 2407 }
cecbcddf
RA
2408 break;
2409 case QED_ROCE_QP_STATE_RTS:
2410 /* RTS->XXX */
2411 switch (new_state) {
2412 case QED_ROCE_QP_STATE_SQD:
2413 break;
2414 case QED_ROCE_QP_STATE_ERR:
2415 break;
2416 default:
2417 /* Invalid state change. */
2418 status = -EINVAL;
2419 break;
790b57f6 2420 }
cecbcddf
RA
2421 break;
2422 case QED_ROCE_QP_STATE_SQD:
2423 /* SQD->XXX */
2424 switch (new_state) {
2425 case QED_ROCE_QP_STATE_RTS:
2426 case QED_ROCE_QP_STATE_ERR:
2427 break;
2428 default:
2429 /* Invalid state change. */
2430 status = -EINVAL;
2431 break;
790b57f6 2432 }
cecbcddf
RA
2433 break;
2434 case QED_ROCE_QP_STATE_ERR:
2435 /* ERR->XXX */
2436 switch (new_state) {
2437 case QED_ROCE_QP_STATE_RESET:
933e6dca
RA
2438 if ((qp->rq.prod != qp->rq.cons) ||
2439 (qp->sq.prod != qp->sq.cons)) {
2440 DP_NOTICE(dev,
2441 "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
2442 qp->rq.prod, qp->rq.cons, qp->sq.prod,
2443 qp->sq.cons);
2444 status = -EINVAL;
2445 }
cecbcddf
RA
2446 break;
2447 default:
2448 status = -EINVAL;
2449 break;
790b57f6 2450 }
cecbcddf
RA
2451 break;
2452 default:
2453 status = -EINVAL;
2454 break;
790b57f6 2455 }
cecbcddf
RA
2456
2457 return status;
2458}
2459
2460int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2461 int attr_mask, struct ib_udata *udata)
2462{
2463 struct qedr_qp *qp = get_qedr_qp(ibqp);
2464 struct qed_rdma_modify_qp_in_params qp_params = { 0 };
2465 struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
d8966fcd 2466 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
cecbcddf 2467 enum ib_qp_state old_qp_state, new_qp_state;
caf61b1b 2468 enum qed_roce_qp_state cur_state;
cecbcddf
RA
2469 int rc = 0;
2470
2471 DP_DEBUG(dev, QEDR_MSG_QP,
2472 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
2473 attr->qp_state);
2474
26e990ba
JG
2475 if (attr_mask & ~IB_QP_ATTR_STANDARD_BITS)
2476 return -EOPNOTSUPP;
2477
cecbcddf
RA
2478 old_qp_state = qedr_get_ibqp_state(qp->state);
2479 if (attr_mask & IB_QP_STATE)
2480 new_qp_state = attr->qp_state;
2481 else
2482 new_qp_state = old_qp_state;
2483
f5b1b177
KM
2484 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2485 if (!ib_modify_qp_is_ok(old_qp_state, new_qp_state,
d31131bb 2486 ibqp->qp_type, attr_mask)) {
f5b1b177
KM
2487 DP_ERR(dev,
2488 "modify qp: invalid attribute mask=0x%x specified for\n"
2489 "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
2490 attr_mask, qp->qp_id, ibqp->qp_type,
2491 old_qp_state, new_qp_state);
2492 rc = -EINVAL;
2493 goto err;
2494 }
cecbcddf
RA
2495 }
2496
2497 /* Translate the masks... */
2498 if (attr_mask & IB_QP_STATE) {
2499 SET_FIELD(qp_params.modify_flags,
2500 QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
2501 qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
2502 }
2503
2504 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
2505 qp_params.sqd_async = true;
2506
2507 if (attr_mask & IB_QP_PKEY_INDEX) {
2508 SET_FIELD(qp_params.modify_flags,
2509 QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
2510 if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
2511 rc = -EINVAL;
2512 goto err;
2513 }
2514
2515 qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
2516 }
2517
2518 if (attr_mask & IB_QP_QKEY)
2519 qp->qkey = attr->qkey;
2520
2521 if (attr_mask & IB_QP_ACCESS_FLAGS) {
2522 SET_FIELD(qp_params.modify_flags,
2523 QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
2524 qp_params.incoming_rdma_read_en = attr->qp_access_flags &
2525 IB_ACCESS_REMOTE_READ;
2526 qp_params.incoming_rdma_write_en = attr->qp_access_flags &
2527 IB_ACCESS_REMOTE_WRITE;
2528 qp_params.incoming_atomic_en = attr->qp_access_flags &
2529 IB_ACCESS_REMOTE_ATOMIC;
2530 }
2531
2532 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
425cf5c1
KM
2533 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2534 return -EINVAL;
2535
cecbcddf
RA
2536 if (attr_mask & IB_QP_PATH_MTU) {
2537 if (attr->path_mtu < IB_MTU_256 ||
2538 attr->path_mtu > IB_MTU_4096) {
2539 pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
2540 rc = -EINVAL;
2541 goto err;
2542 }
2543 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
2544 ib_mtu_enum_to_int(iboe_get_mtu
2545 (dev->ndev->mtu)));
2546 }
2547
2548 if (!qp->mtu) {
2549 qp->mtu =
2550 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2551 pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
2552 }
2553
2554 SET_FIELD(qp_params.modify_flags,
2555 QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
2556
d8966fcd
DC
2557 qp_params.traffic_class_tos = grh->traffic_class;
2558 qp_params.flow_label = grh->flow_label;
2559 qp_params.hop_limit_ttl = grh->hop_limit;
cecbcddf 2560
d8966fcd 2561 qp->sgid_idx = grh->sgid_index;
cecbcddf
RA
2562
2563 rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
2564 if (rc) {
2565 DP_ERR(dev,
2566 "modify qp: problems with GID index %d (rc=%d)\n",
d8966fcd 2567 grh->sgid_index, rc);
cecbcddf
RA
2568 return rc;
2569 }
2570
2571 rc = qedr_get_dmac(dev, &attr->ah_attr,
2572 qp_params.remote_mac_addr);
2573 if (rc)
2574 return rc;
2575
2576 qp_params.use_local_mac = true;
2577 ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
2578
2579 DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
2580 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
2581 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
2582 DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
2583 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
2584 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
2585 DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
2586 qp_params.remote_mac_addr);
cecbcddf
RA
2587
2588 qp_params.mtu = qp->mtu;
2589 qp_params.lb_indication = false;
2590 }
2591
2592 if (!qp_params.mtu) {
2593 /* Stay with current MTU */
2594 if (qp->mtu)
2595 qp_params.mtu = qp->mtu;
2596 else
2597 qp_params.mtu =
2598 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2599 }
2600
2601 if (attr_mask & IB_QP_TIMEOUT) {
2602 SET_FIELD(qp_params.modify_flags,
2603 QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
2604
c3594f22
KM
2605 /* The received timeout value is an exponent used like this:
2606 * "12.7.34 LOCAL ACK TIMEOUT
2607 * Value representing the transport (ACK) timeout for use by
2608 * the remote, expressed as: 4.096 * 2^timeout [usec]"
2609 * The FW expects timeout in msec so we need to divide the usec
2610 * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
2611 * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
2612 * The value of zero means infinite so we use a 'max_t' to make
2613 * sure that sub 1 msec values will be configured as 1 msec.
2614 */
2615 if (attr->timeout)
2616 qp_params.ack_timeout =
2617 1 << max_t(int, attr->timeout - 8, 0);
2618 else
cecbcddf 2619 qp_params.ack_timeout = 0;
cecbcddf 2620 }
c3594f22 2621
cecbcddf
RA
2622 if (attr_mask & IB_QP_RETRY_CNT) {
2623 SET_FIELD(qp_params.modify_flags,
2624 QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
2625 qp_params.retry_cnt = attr->retry_cnt;
2626 }
2627
2628 if (attr_mask & IB_QP_RNR_RETRY) {
2629 SET_FIELD(qp_params.modify_flags,
2630 QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
2631 qp_params.rnr_retry_cnt = attr->rnr_retry;
2632 }
2633
2634 if (attr_mask & IB_QP_RQ_PSN) {
2635 SET_FIELD(qp_params.modify_flags,
2636 QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
2637 qp_params.rq_psn = attr->rq_psn;
2638 qp->rq_psn = attr->rq_psn;
2639 }
2640
2641 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2642 if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
2643 rc = -EINVAL;
2644 DP_ERR(dev,
2645 "unsupported max_rd_atomic=%d, supported=%d\n",
2646 attr->max_rd_atomic,
2647 dev->attr.max_qp_req_rd_atomic_resc);
2648 goto err;
2649 }
2650
2651 SET_FIELD(qp_params.modify_flags,
2652 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
2653 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
2654 }
2655
2656 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
2657 SET_FIELD(qp_params.modify_flags,
2658 QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
2659 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
2660 }
2661
2662 if (attr_mask & IB_QP_SQ_PSN) {
2663 SET_FIELD(qp_params.modify_flags,
2664 QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
2665 qp_params.sq_psn = attr->sq_psn;
2666 qp->sq_psn = attr->sq_psn;
2667 }
2668
2669 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2670 if (attr->max_dest_rd_atomic >
2671 dev->attr.max_qp_resp_rd_atomic_resc) {
2672 DP_ERR(dev,
2673 "unsupported max_dest_rd_atomic=%d, supported=%d\n",
2674 attr->max_dest_rd_atomic,
2675 dev->attr.max_qp_resp_rd_atomic_resc);
2676
2677 rc = -EINVAL;
2678 goto err;
2679 }
2680
2681 SET_FIELD(qp_params.modify_flags,
2682 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
2683 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
2684 }
2685
2686 if (attr_mask & IB_QP_DEST_QPN) {
2687 SET_FIELD(qp_params.modify_flags,
2688 QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
2689
2690 qp_params.dest_qp = attr->dest_qp_num;
2691 qp->dest_qp_num = attr->dest_qp_num;
2692 }
2693
caf61b1b
KM
2694 cur_state = qp->state;
2695
2696 /* Update the QP state before the actual ramrod to prevent a race with
2697 * fast path. Modifying the QP state to error will cause the device to
2698 * flush the CQEs and while polling the flushed CQEs will considered as
2699 * a potential issue if the QP isn't in error state.
2700 */
2701 if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
2702 !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
2703 qp->state = QED_ROCE_QP_STATE_ERR;
2704
cecbcddf
RA
2705 if (qp->qp_type != IB_QPT_GSI)
2706 rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
2707 qp->qed_qp, &qp_params);
2708
2709 if (attr_mask & IB_QP_STATE) {
2710 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
caf61b1b
KM
2711 rc = qedr_update_qp_state(dev, qp, cur_state,
2712 qp_params.new_state);
cecbcddf
RA
2713 qp->state = qp_params.new_state;
2714 }
2715
2716err:
2717 return rc;
2718}
2719
2720static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
2721{
2722 int ib_qp_acc_flags = 0;
2723
2724 if (params->incoming_rdma_write_en)
2725 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
2726 if (params->incoming_rdma_read_en)
2727 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
2728 if (params->incoming_atomic_en)
2729 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
2730 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
2731 return ib_qp_acc_flags;
2732}
2733
2734int qedr_query_qp(struct ib_qp *ibqp,
2735 struct ib_qp_attr *qp_attr,
2736 int attr_mask, struct ib_qp_init_attr *qp_init_attr)
2737{
2738 struct qed_rdma_query_qp_out_params params;
2739 struct qedr_qp *qp = get_qedr_qp(ibqp);
2740 struct qedr_dev *dev = qp->dev;
2741 int rc = 0;
2742
2743 memset(&params, 0, sizeof(params));
2744
2745 rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, &params);
2746 if (rc)
2747 goto err;
2748
2749 memset(qp_attr, 0, sizeof(*qp_attr));
2750 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2751
2752 qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2753 qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
097b6159 2754 qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
cecbcddf
RA
2755 qp_attr->path_mig_state = IB_MIG_MIGRATED;
2756 qp_attr->rq_psn = params.rq_psn;
2757 qp_attr->sq_psn = params.sq_psn;
2758 qp_attr->dest_qp_num = params.dest_qp;
2759
2760 qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(&params);
2761
2762 qp_attr->cap.max_send_wr = qp->sq.max_wr;
2763 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2764 qp_attr->cap.max_send_sge = qp->sq.max_sges;
2765 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
fbf58026 2766 qp_attr->cap.max_inline_data = dev->attr.max_inline;
cecbcddf
RA
2767 qp_init_attr->cap = qp_attr->cap;
2768
44c58487 2769 qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
d8966fcd
DC
2770 rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
2771 params.flow_label, qp->sgid_idx,
2772 params.hop_limit_ttl, params.traffic_class_tos);
2773 rdma_ah_set_dgid_raw(&qp_attr->ah_attr, &params.dgid.bytes[0]);
2774 rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
2775 rdma_ah_set_sl(&qp_attr->ah_attr, 0);
cecbcddf
RA
2776 qp_attr->timeout = params.timeout;
2777 qp_attr->rnr_retry = params.rnr_retry;
2778 qp_attr->retry_cnt = params.retry_cnt;
2779 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2780 qp_attr->pkey_index = params.pkey_index;
2781 qp_attr->port_num = 1;
d8966fcd
DC
2782 rdma_ah_set_path_bits(&qp_attr->ah_attr, 0);
2783 rdma_ah_set_static_rate(&qp_attr->ah_attr, 0);
cecbcddf
RA
2784 qp_attr->alt_pkey_index = 0;
2785 qp_attr->alt_port_num = 0;
2786 qp_attr->alt_timeout = 0;
2787 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2788
2789 qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2790 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2791 qp_attr->max_rd_atomic = params.max_rd_atomic;
2792 qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2793
2794 DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2795 qp_attr->cap.max_inline_data);
2796
2797err:
2798 return rc;
2799}
2800
c4367a26 2801int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
cecbcddf
RA
2802{
2803 struct qedr_qp *qp = get_qedr_qp(ibqp);
2804 struct qedr_dev *dev = qp->dev;
2805 struct ib_qp_attr attr;
2806 int attr_mask = 0;
cecbcddf
RA
2807
2808 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2809 qp, qp->qp_type);
2810
f5b1b177
KM
2811 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2812 if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2813 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2814 (qp->state != QED_ROCE_QP_STATE_INIT)) {
b4c2cc48 2815
f5b1b177
KM
2816 attr.qp_state = IB_QPS_ERR;
2817 attr_mask |= IB_QP_STATE;
cecbcddf 2818
f5b1b177
KM
2819 /* Change the QP state to ERROR */
2820 qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2821 }
e411e058 2822 } else {
82af6d19
MK
2823 /* If connection establishment started the WAIT_FOR_CONNECT
2824 * bit will be on and we need to Wait for the establishment
2825 * to complete before destroying the qp.
2826 */
2827 if (test_and_set_bit(QEDR_IWARP_CM_WAIT_FOR_CONNECT,
2828 &qp->iwarp_cm_flags))
2829 wait_for_completion(&qp->iwarp_cm_comp);
2830
2831 /* If graceful disconnect started, the WAIT_FOR_DISCONNECT
2832 * bit will be on, and we need to wait for the disconnect to
2833 * complete before continuing. We can use the same completion,
2834 * iwarp_cm_comp, since this is the only place that waits for
2835 * this completion and it is sequential. In addition,
2836 * disconnect can't occur before the connection is fully
2837 * established, therefore if WAIT_FOR_DISCONNECT is on it
2838 * means WAIT_FOR_CONNECT is also on and the completion for
2839 * CONNECT already occurred.
2840 */
2841 if (test_and_set_bit(QEDR_IWARP_CM_WAIT_FOR_DISCONNECT,
2842 &qp->iwarp_cm_flags))
2843 wait_for_completion(&qp->iwarp_cm_comp);
cecbcddf
RA
2844 }
2845
df158561 2846 if (qp->qp_type == IB_QPT_GSI)
04886779 2847 qedr_destroy_gsi_qp(dev);
cecbcddf 2848
82af6d19
MK
2849 /* We need to remove the entry from the xarray before we release the
2850 * qp_id to avoid a race of the qp_id being reallocated and failing
2851 * on xa_insert
2852 */
2853 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2854 xa_erase(&dev->qps, qp->qp_id);
2855
bdeacabd 2856 qedr_free_qp_resources(dev, qp, udata);
cecbcddf 2857
82af6d19
MK
2858 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2859 qedr_iw_qp_rem_ref(&qp->ibqp);
098e345a
MK
2860 else
2861 kfree(qp);
82af6d19 2862
cf167e5e 2863 return 0;
cecbcddf 2864}
e0290cce 2865
fa5d010c 2866int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
d3456914 2867 struct ib_udata *udata)
04886779 2868{
d3456914 2869 struct qedr_ah *ah = get_qedr_ah(ibah);
04886779 2870
fa5d010c 2871 rdma_copy_ah_attr(&ah->attr, init_attr->ah_attr);
04886779 2872
d3456914 2873 return 0;
04886779
RA
2874}
2875
9a9ebf8c 2876int qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
04886779
RA
2877{
2878 struct qedr_ah *ah = get_qedr_ah(ibah);
2879
d97099fe 2880 rdma_destroy_ah_attr(&ah->attr);
9a9ebf8c 2881 return 0;
04886779
RA
2882}
2883
e0290cce
RA
2884static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2885{
2886 struct qedr_pbl *pbl, *tmp;
2887
2888 if (info->pbl_table)
2889 list_add_tail(&info->pbl_table->list_entry,
2890 &info->free_pbl_list);
2891
2892 if (!list_empty(&info->inuse_pbl_list))
2893 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2894
2895 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2896 list_del(&pbl->list_entry);
2897 qedr_free_pbl(dev, &info->pbl_info, pbl);
2898 }
2899}
2900
2901static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2902 size_t page_list_len, bool two_layered)
2903{
2904 struct qedr_pbl *tmp;
2905 int rc;
2906
2907 INIT_LIST_HEAD(&info->free_pbl_list);
2908 INIT_LIST_HEAD(&info->inuse_pbl_list);
2909
2910 rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2911 page_list_len, two_layered);
2912 if (rc)
2913 goto done;
2914
2915 info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
4cd33aaf
CJ
2916 if (IS_ERR(info->pbl_table)) {
2917 rc = PTR_ERR(info->pbl_table);
e0290cce
RA
2918 goto done;
2919 }
2920
2921 DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2922 &info->pbl_table->pa);
2923
2924 /* in usual case we use 2 PBLs, so we add one to free
2925 * list and allocating another one
2926 */
2927 tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
4cd33aaf 2928 if (IS_ERR(tmp)) {
e0290cce
RA
2929 DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2930 goto done;
2931 }
2932
2933 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2934
2935 DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2936
2937done:
2938 if (rc)
2939 free_mr_info(dev, info);
2940
2941 return rc;
2942}
2943
2944struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2945 u64 usr_addr, int acc, struct ib_udata *udata)
2946{
2947 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2948 struct qedr_mr *mr;
2949 struct qedr_pd *pd;
2950 int rc = -ENOMEM;
2951
2952 pd = get_qedr_pd(ibpd);
2953 DP_DEBUG(dev, QEDR_MSG_MR,
2954 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2955 pd->pd_id, start, len, usr_addr, acc);
2956
2957 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2958 return ERR_PTR(-EINVAL);
2959
2960 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2961 if (!mr)
2962 return ERR_PTR(rc);
2963
2964 mr->type = QEDR_MR_USER;
2965
c320e527 2966 mr->umem = ib_umem_get(ibpd->device, start, len, acc);
e0290cce
RA
2967 if (IS_ERR(mr->umem)) {
2968 rc = -EFAULT;
2969 goto err0;
2970 }
2971
901bca71
JG
2972 rc = init_mr_info(dev, &mr->info,
2973 ib_umem_num_dma_blocks(mr->umem, PAGE_SIZE), 1);
e0290cce
RA
2974 if (rc)
2975 goto err1;
2976
2977 qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
95ad233f 2978 &mr->info.pbl_info, PAGE_SHIFT);
e0290cce
RA
2979
2980 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2981 if (rc) {
2982 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2983 goto err1;
2984 }
2985
2986 /* Index only, 18 bit long, lkey = itid << 8 | key */
2987 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2988 mr->hw_mr.key = 0;
2989 mr->hw_mr.pd = pd->pd_id;
2990 mr->hw_mr.local_read = 1;
2991 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2992 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2993 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2994 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2995 mr->hw_mr.mw_bind = false;
2996 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2997 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2998 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
95ad233f 2999 mr->hw_mr.page_size_log = PAGE_SHIFT;
e0290cce
RA
3000 mr->hw_mr.length = len;
3001 mr->hw_mr.vaddr = usr_addr;
e0290cce
RA
3002 mr->hw_mr.phy_mr = false;
3003 mr->hw_mr.dma_mr = false;
3004
3005 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
3006 if (rc) {
3007 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
3008 goto err2;
3009 }
3010
3011 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3012 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
3013 mr->hw_mr.remote_atomic)
3014 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3015
3016 DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
3017 mr->ibmr.lkey);
3018 return &mr->ibmr;
3019
3020err2:
3021 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
3022err1:
3023 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
3024err0:
3025 kfree(mr);
3026 return ERR_PTR(rc);
3027}
3028
c4367a26 3029int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
e0290cce
RA
3030{
3031 struct qedr_mr *mr = get_qedr_mr(ib_mr);
3032 struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
3033 int rc = 0;
3034
3035 rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
3036 if (rc)
3037 return rc;
3038
3039 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
3040
24e412c1
MK
3041 if (mr->type != QEDR_MR_DMA)
3042 free_mr_info(dev, &mr->info);
e0290cce
RA
3043
3044 /* it could be user registered memory. */
836a0fbb 3045 ib_umem_release(mr->umem);
e0290cce
RA
3046
3047 kfree(mr);
3048
3049 return rc;
3050}
3051
27a4b1a6
RA
3052static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
3053 int max_page_list_len)
e0290cce
RA
3054{
3055 struct qedr_pd *pd = get_qedr_pd(ibpd);
3056 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
3057 struct qedr_mr *mr;
3058 int rc = -ENOMEM;
3059
3060 DP_DEBUG(dev, QEDR_MSG_MR,
3061 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
3062 max_page_list_len);
3063
3064 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
3065 if (!mr)
3066 return ERR_PTR(rc);
3067
3068 mr->dev = dev;
3069 mr->type = QEDR_MR_FRMR;
3070
3071 rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
3072 if (rc)
3073 goto err0;
3074
3075 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
3076 if (rc) {
3077 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
3078 goto err0;
3079 }
3080
3081 /* Index only, 18 bit long, lkey = itid << 8 | key */
3082 mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
3083 mr->hw_mr.key = 0;
3084 mr->hw_mr.pd = pd->pd_id;
3085 mr->hw_mr.local_read = 1;
3086 mr->hw_mr.local_write = 0;
3087 mr->hw_mr.remote_read = 0;
3088 mr->hw_mr.remote_write = 0;
3089 mr->hw_mr.remote_atomic = 0;
3090 mr->hw_mr.mw_bind = false;
3091 mr->hw_mr.pbl_ptr = 0;
3092 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
3093 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
e0290cce
RA
3094 mr->hw_mr.length = 0;
3095 mr->hw_mr.vaddr = 0;
e0290cce
RA
3096 mr->hw_mr.phy_mr = true;
3097 mr->hw_mr.dma_mr = false;
3098
3099 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
3100 if (rc) {
3101 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
3102 goto err1;
3103 }
3104
3105 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3106 mr->ibmr.rkey = mr->ibmr.lkey;
3107
3108 DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
3109 return mr;
3110
3111err1:
3112 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
3113err0:
3114 kfree(mr);
3115 return ERR_PTR(rc);
3116}
3117
c4367a26 3118struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
42a3b153 3119 u32 max_num_sg)
e0290cce 3120{
e0290cce
RA
3121 struct qedr_mr *mr;
3122
3123 if (mr_type != IB_MR_TYPE_MEM_REG)
3124 return ERR_PTR(-EINVAL);
3125
3126 mr = __qedr_alloc_mr(ibpd, max_num_sg);
3127
3128 if (IS_ERR(mr))
3129 return ERR_PTR(-EINVAL);
3130
e0290cce
RA
3131 return &mr->ibmr;
3132}
3133
3134static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
3135{
3136 struct qedr_mr *mr = get_qedr_mr(ibmr);
3137 struct qedr_pbl *pbl_table;
3138 struct regpair *pbe;
3139 u32 pbes_in_page;
3140
3141 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
ffab8c89 3142 DP_ERR(mr->dev, "qedr_set_page fails when %d\n", mr->npages);
e0290cce
RA
3143 return -ENOMEM;
3144 }
3145
3146 DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
3147 mr->npages, addr);
3148
3149 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
3150 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
3151 pbe = (struct regpair *)pbl_table->va;
3152 pbe += mr->npages % pbes_in_page;
3153 pbe->lo = cpu_to_le32((u32)addr);
3154 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
3155
3156 mr->npages++;
3157
3158 return 0;
3159}
3160
3161static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
3162{
3163 int work = info->completed - info->completed_handled - 1;
3164
3165 DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
3166 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
3167 struct qedr_pbl *pbl;
3168
3169 /* Free all the page list that are possible to be freed
3170 * (all the ones that were invalidated), under the assumption
3171 * that if an FMR was completed successfully that means that
3172 * if there was an invalidate operation before it also ended
3173 */
3174 pbl = list_first_entry(&info->inuse_pbl_list,
3175 struct qedr_pbl, list_entry);
aafec388 3176 list_move_tail(&pbl->list_entry, &info->free_pbl_list);
e0290cce
RA
3177 info->completed_handled++;
3178 }
3179}
3180
3181int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
3182 int sg_nents, unsigned int *sg_offset)
3183{
3184 struct qedr_mr *mr = get_qedr_mr(ibmr);
3185
3186 mr->npages = 0;
3187
3188 handle_completed_mrs(mr->dev, &mr->info);
3189 return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
3190}
3191
3192struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
3193{
3194 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
3195 struct qedr_pd *pd = get_qedr_pd(ibpd);
3196 struct qedr_mr *mr;
3197 int rc;
3198
3199 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
3200 if (!mr)
3201 return ERR_PTR(-ENOMEM);
3202
3203 mr->type = QEDR_MR_DMA;
3204
3205 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
3206 if (rc) {
3207 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
3208 goto err1;
3209 }
3210
3211 /* index only, 18 bit long, lkey = itid << 8 | key */
3212 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
3213 mr->hw_mr.pd = pd->pd_id;
3214 mr->hw_mr.local_read = 1;
3215 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
3216 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
3217 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
3218 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
3219 mr->hw_mr.dma_mr = true;
3220
3221 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
3222 if (rc) {
3223 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
3224 goto err2;
3225 }
3226
3227 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3228 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
3229 mr->hw_mr.remote_atomic)
3230 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3231
3232 DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
3233 return &mr->ibmr;
3234
3235err2:
3236 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
3237err1:
3238 kfree(mr);
3239 return ERR_PTR(rc);
3240}
afa0e13b
RA
3241
3242static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
3243{
3244 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
3245}
3246
3247static int sge_data_len(struct ib_sge *sg_list, int num_sge)
3248{
3249 int i, len = 0;
3250
3251 for (i = 0; i < num_sge; i++)
3252 len += sg_list[i].length;
3253
3254 return len;
3255}
3256
3257static void swap_wqe_data64(u64 *p)
3258{
3259 int i;
3260
3261 for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
3262 *p = cpu_to_be64(cpu_to_le64(*p));
3263}
3264
3265static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
3266 struct qedr_qp *qp, u8 *wqe_size,
d34ac5cd
BVA
3267 const struct ib_send_wr *wr,
3268 const struct ib_send_wr **bad_wr,
3269 u8 *bits, u8 bit)
afa0e13b
RA
3270{
3271 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
3272 char *seg_prt, *wqe;
3273 int i, seg_siz;
3274
3275 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
3276 DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
3277 *bad_wr = wr;
3278 return 0;
3279 }
3280
3281 if (!data_size)
3282 return data_size;
3283
3284 *bits |= bit;
3285
3286 seg_prt = NULL;
3287 wqe = NULL;
3288 seg_siz = 0;
3289
3290 /* Copy data inline */
3291 for (i = 0; i < wr->num_sge; i++) {
3292 u32 len = wr->sg_list[i].length;
3293 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
3294
3295 while (len > 0) {
3296 u32 cur;
3297
3298 /* New segment required */
3299 if (!seg_siz) {
3300 wqe = (char *)qed_chain_produce(&qp->sq.pbl);
3301 seg_prt = wqe;
3302 seg_siz = sizeof(struct rdma_sq_common_wqe);
3303 (*wqe_size)++;
3304 }
3305
3306 /* Calculate currently allowed length */
3307 cur = min_t(u32, len, seg_siz);
3308 memcpy(seg_prt, src, cur);
3309
3310 /* Update segment variables */
3311 seg_prt += cur;
3312 seg_siz -= cur;
3313
3314 /* Update sge variables */
3315 src += cur;
3316 len -= cur;
3317
3318 /* Swap fully-completed segments */
3319 if (!seg_siz)
3320 swap_wqe_data64((u64 *)wqe);
3321 }
3322 }
3323
3324 /* swap last not completed segment */
3325 if (seg_siz)
3326 swap_wqe_data64((u64 *)wqe);
3327
3328 return data_size;
3329}
3330
3331#define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
3332 do { \
3333 DMA_REGPAIR_LE(sge->addr, vaddr); \
3334 (sge)->length = cpu_to_le32(vlength); \
3335 (sge)->flags = cpu_to_le32(vflags); \
3336 } while (0)
3337
3338#define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
3339 do { \
3340 DMA_REGPAIR_LE(hdr->wr_id, vwr_id); \
3341 (hdr)->num_sges = num_sge; \
3342 } while (0)
3343
3344#define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
3345 do { \
3346 DMA_REGPAIR_LE(sge->addr, vaddr); \
3347 (sge)->length = cpu_to_le32(vlength); \
3348 (sge)->l_key = cpu_to_le32(vlkey); \
3349 } while (0)
3350
3351static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
f696bf6d 3352 const struct ib_send_wr *wr)
afa0e13b
RA
3353{
3354 u32 data_size = 0;
3355 int i;
3356
3357 for (i = 0; i < wr->num_sge; i++) {
3358 struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
3359
3360 DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
3361 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
3362 sge->length = cpu_to_le32(wr->sg_list[i].length);
3363 data_size += wr->sg_list[i].length;
3364 }
3365
3366 if (wqe_size)
3367 *wqe_size += wr->num_sge;
3368
3369 return data_size;
3370}
3371
3372static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
3373 struct qedr_qp *qp,
3374 struct rdma_sq_rdma_wqe_1st *rwqe,
3375 struct rdma_sq_rdma_wqe_2nd *rwqe2,
d34ac5cd
BVA
3376 const struct ib_send_wr *wr,
3377 const struct ib_send_wr **bad_wr)
afa0e13b
RA
3378{
3379 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
3380 DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
3381
8b0cabc6
AR
3382 if (wr->send_flags & IB_SEND_INLINE &&
3383 (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
3384 wr->opcode == IB_WR_RDMA_WRITE)) {
afa0e13b
RA
3385 u8 flags = 0;
3386
3387 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
3388 return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
3389 bad_wr, &rwqe->flags, flags);
3390 }
3391
3392 return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
3393}
3394
3395static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
3396 struct qedr_qp *qp,
3397 struct rdma_sq_send_wqe_1st *swqe,
3398 struct rdma_sq_send_wqe_2st *swqe2,
d34ac5cd
BVA
3399 const struct ib_send_wr *wr,
3400 const struct ib_send_wr **bad_wr)
afa0e13b
RA
3401{
3402 memset(swqe2, 0, sizeof(*swqe2));
3403 if (wr->send_flags & IB_SEND_INLINE) {
3404 u8 flags = 0;
3405
3406 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
3407 return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
3408 bad_wr, &swqe->flags, flags);
3409 }
3410
3411 return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
3412}
3413
3414static int qedr_prepare_reg(struct qedr_qp *qp,
3415 struct rdma_sq_fmr_wqe_1st *fwqe1,
f696bf6d 3416 const struct ib_reg_wr *wr)
afa0e13b
RA
3417{
3418 struct qedr_mr *mr = get_qedr_mr(wr->mr);
3419 struct rdma_sq_fmr_wqe_2nd *fwqe2;
3420
3421 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
3422 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
3423 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
3424 fwqe1->l_key = wr->key;
3425
08c4cf51
AR
3426 fwqe2->access_ctrl = 0;
3427
afa0e13b
RA
3428 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
3429 !!(wr->access & IB_ACCESS_REMOTE_READ));
3430 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
3431 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
3432 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
3433 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
3434 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
3435 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
3436 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
3437 fwqe2->fmr_ctrl = 0;
3438
3439 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
3440 ilog2(mr->ibmr.page_size) - 12);
3441
3442 fwqe2->length_hi = 0;
3443 fwqe2->length_lo = mr->ibmr.length;
3444 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
3445 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
3446
3447 qp->wqe_wr_id[qp->sq.prod].mr = mr;
3448
3449 return 0;
3450}
3451
27a4b1a6 3452static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
afa0e13b
RA
3453{
3454 switch (opcode) {
3455 case IB_WR_RDMA_WRITE:
3456 case IB_WR_RDMA_WRITE_WITH_IMM:
3457 return IB_WC_RDMA_WRITE;
3458 case IB_WR_SEND_WITH_IMM:
3459 case IB_WR_SEND:
3460 case IB_WR_SEND_WITH_INV:
3461 return IB_WC_SEND;
3462 case IB_WR_RDMA_READ:
fb1a22be 3463 case IB_WR_RDMA_READ_WITH_INV:
afa0e13b
RA
3464 return IB_WC_RDMA_READ;
3465 case IB_WR_ATOMIC_CMP_AND_SWP:
3466 return IB_WC_COMP_SWAP;
3467 case IB_WR_ATOMIC_FETCH_AND_ADD:
3468 return IB_WC_FETCH_ADD;
3469 case IB_WR_REG_MR:
3470 return IB_WC_REG_MR;
3471 case IB_WR_LOCAL_INV:
3472 return IB_WC_LOCAL_INV;
3473 default:
3474 return IB_WC_SEND;
3475 }
3476}
3477
f696bf6d
BVA
3478static inline bool qedr_can_post_send(struct qedr_qp *qp,
3479 const struct ib_send_wr *wr)
afa0e13b
RA
3480{
3481 int wq_is_full, err_wr, pbl_is_full;
3482 struct qedr_dev *dev = qp->dev;
3483
3484 /* prevent SQ overflow and/or processing of a bad WR */
3485 err_wr = wr->num_sge > qp->sq.max_sges;
3486 wq_is_full = qedr_wq_is_full(&qp->sq);
3487 pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
3488 QEDR_MAX_SQE_ELEMENTS_PER_SQE;
3489 if (wq_is_full || err_wr || pbl_is_full) {
3490 if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
3491 DP_ERR(dev,
3492 "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
3493 qp);
3494 qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
3495 }
3496
3497 if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
3498 DP_ERR(dev,
3499 "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
3500 qp);
3501 qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
3502 }
3503
3504 if (pbl_is_full &&
3505 !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
3506 DP_ERR(dev,
3507 "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
3508 qp);
3509 qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
3510 }
3511 return false;
3512 }
3513 return true;
3514}
3515
d34ac5cd
BVA
3516static int __qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3517 const struct ib_send_wr **bad_wr)
afa0e13b
RA
3518{
3519 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3520 struct qedr_qp *qp = get_qedr_qp(ibqp);
3521 struct rdma_sq_atomic_wqe_1st *awqe1;
3522 struct rdma_sq_atomic_wqe_2nd *awqe2;
3523 struct rdma_sq_atomic_wqe_3rd *awqe3;
3524 struct rdma_sq_send_wqe_2st *swqe2;
3525 struct rdma_sq_local_inv_wqe *iwqe;
3526 struct rdma_sq_rdma_wqe_2nd *rwqe2;
3527 struct rdma_sq_send_wqe_1st *swqe;
3528 struct rdma_sq_rdma_wqe_1st *rwqe;
3529 struct rdma_sq_fmr_wqe_1st *fwqe1;
3530 struct rdma_sq_common_wqe *wqe;
3531 u32 length;
3532 int rc = 0;
3533 bool comp;
3534
3535 if (!qedr_can_post_send(qp, wr)) {
3536 *bad_wr = wr;
3537 return -ENOMEM;
3538 }
3539
3540 wqe = qed_chain_produce(&qp->sq.pbl);
3541 qp->wqe_wr_id[qp->sq.prod].signaled =
3542 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
3543
3544 wqe->flags = 0;
3545 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
3546 !!(wr->send_flags & IB_SEND_SOLICITED));
3547 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
3548 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
3549 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
3550 !!(wr->send_flags & IB_SEND_FENCE));
3551 wqe->prev_wqe_size = qp->prev_wqe_size;
3552
3553 qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
3554
3555 switch (wr->opcode) {
3556 case IB_WR_SEND_WITH_IMM:
551e1c67
KM
3557 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3558 rc = -EINVAL;
3559 *bad_wr = wr;
3560 break;
3561 }
afa0e13b
RA
3562 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
3563 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3564 swqe->wqe_size = 2;
3565 swqe2 = qed_chain_produce(&qp->sq.pbl);
3566
7bed7ebc 3567 swqe->inv_key_or_imm_data = cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
afa0e13b
RA
3568 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3569 wr, bad_wr);
3570 swqe->length = cpu_to_le32(length);
3571 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3572 qp->prev_wqe_size = swqe->wqe_size;
3573 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3574 break;
3575 case IB_WR_SEND:
3576 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
3577 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3578
3579 swqe->wqe_size = 2;
3580 swqe2 = qed_chain_produce(&qp->sq.pbl);
3581 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3582 wr, bad_wr);
3583 swqe->length = cpu_to_le32(length);
3584 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3585 qp->prev_wqe_size = swqe->wqe_size;
3586 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3587 break;
3588 case IB_WR_SEND_WITH_INV:
3589 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
3590 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3591 swqe2 = qed_chain_produce(&qp->sq.pbl);
3592 swqe->wqe_size = 2;
3593 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
3594 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3595 wr, bad_wr);
3596 swqe->length = cpu_to_le32(length);
3597 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3598 qp->prev_wqe_size = swqe->wqe_size;
3599 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3600 break;
3601
3602 case IB_WR_RDMA_WRITE_WITH_IMM:
551e1c67
KM
3603 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3604 rc = -EINVAL;
3605 *bad_wr = wr;
3606 break;
3607 }
afa0e13b
RA
3608 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
3609 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3610
3611 rwqe->wqe_size = 2;
3612 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
3613 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3614 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3615 wr, bad_wr);
3616 rwqe->length = cpu_to_le32(length);
3617 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3618 qp->prev_wqe_size = rwqe->wqe_size;
3619 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3620 break;
3621 case IB_WR_RDMA_WRITE:
3622 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
3623 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3624
3625 rwqe->wqe_size = 2;
3626 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3627 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3628 wr, bad_wr);
3629 rwqe->length = cpu_to_le32(length);
3630 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3631 qp->prev_wqe_size = rwqe->wqe_size;
3632 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3633 break;
3634 case IB_WR_RDMA_READ_WITH_INV:
fb1a22be 3635 SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
df561f66 3636 fallthrough; /* same is identical to RDMA READ */
afa0e13b
RA
3637
3638 case IB_WR_RDMA_READ:
3639 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
3640 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3641
3642 rwqe->wqe_size = 2;
3643 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3644 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3645 wr, bad_wr);
3646 rwqe->length = cpu_to_le32(length);
3647 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3648 qp->prev_wqe_size = rwqe->wqe_size;
3649 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3650 break;
3651
3652 case IB_WR_ATOMIC_CMP_AND_SWP:
3653 case IB_WR_ATOMIC_FETCH_AND_ADD:
3654 awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
3655 awqe1->wqe_size = 4;
3656
3657 awqe2 = qed_chain_produce(&qp->sq.pbl);
3658 DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
3659 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
3660
3661 awqe3 = qed_chain_produce(&qp->sq.pbl);
3662
3663 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
3664 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
3665 DMA_REGPAIR_LE(awqe3->swap_data,
3666 atomic_wr(wr)->compare_add);
3667 } else {
3668 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
3669 DMA_REGPAIR_LE(awqe3->swap_data,
3670 atomic_wr(wr)->swap);
3671 DMA_REGPAIR_LE(awqe3->cmp_data,
3672 atomic_wr(wr)->compare_add);
3673 }
3674
3675 qedr_prepare_sq_sges(qp, NULL, wr);
3676
3677 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
3678 qp->prev_wqe_size = awqe1->wqe_size;
3679 break;
3680
3681 case IB_WR_LOCAL_INV:
3682 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
3683 iwqe->wqe_size = 1;
3684
3685 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
3686 iwqe->inv_l_key = wr->ex.invalidate_rkey;
3687 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
3688 qp->prev_wqe_size = iwqe->wqe_size;
3689 break;
3690 case IB_WR_REG_MR:
3691 DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
3692 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
3693 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
3694 fwqe1->wqe_size = 2;
3695
3696 rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
3697 if (rc) {
3698 DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
3699 *bad_wr = wr;
3700 break;
3701 }
3702
3703 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
3704 qp->prev_wqe_size = fwqe1->wqe_size;
3705 break;
3706 default:
3707 DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
3708 rc = -EINVAL;
3709 *bad_wr = wr;
3710 break;
3711 }
3712
3713 if (*bad_wr) {
3714 u16 value;
3715
3716 /* Restore prod to its position before
3717 * this WR was processed
3718 */
3719 value = le16_to_cpu(qp->sq.db_data.data.value);
3720 qed_chain_set_prod(&qp->sq.pbl, value, wqe);
3721
3722 /* Restore prev_wqe_size */
3723 qp->prev_wqe_size = wqe->prev_wqe_size;
3724 rc = -EINVAL;
3725 DP_ERR(dev, "POST SEND FAILED\n");
3726 }
3727
3728 return rc;
3729}
3730
d34ac5cd
BVA
3731int qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3732 const struct ib_send_wr **bad_wr)
afa0e13b
RA
3733{
3734 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3735 struct qedr_qp *qp = get_qedr_qp(ibqp);
3736 unsigned long flags;
3737 int rc = 0;
3738
3739 *bad_wr = NULL;
3740
04886779
RA
3741 if (qp->qp_type == IB_QPT_GSI)
3742 return qedr_gsi_post_send(ibqp, wr, bad_wr);
3743
afa0e13b
RA
3744 spin_lock_irqsave(&qp->q_lock, flags);
3745
f5b1b177
KM
3746 if (rdma_protocol_roce(&dev->ibdev, 1)) {
3747 if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
3748 (qp->state != QED_ROCE_QP_STATE_ERR) &&
3749 (qp->state != QED_ROCE_QP_STATE_SQD)) {
3750 spin_unlock_irqrestore(&qp->q_lock, flags);
3751 *bad_wr = wr;
3752 DP_DEBUG(dev, QEDR_MSG_CQ,
3753 "QP in wrong state! QP icid=0x%x state %d\n",
3754 qp->icid, qp->state);
3755 return -EINVAL;
3756 }
afa0e13b
RA
3757 }
3758
afa0e13b
RA
3759 while (wr) {
3760 rc = __qedr_post_send(ibqp, wr, bad_wr);
3761 if (rc)
3762 break;
3763
3764 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3765
3766 qedr_inc_sw_prod(&qp->sq);
3767
3768 qp->sq.db_data.data.value++;
3769
3770 wr = wr->next;
3771 }
3772
3773 /* Trigger doorbell
3774 * If there was a failure in the first WR then it will be triggered in
3775 * vane. However this is not harmful (as long as the producer value is
3776 * unchanged). For performance reasons we avoid checking for this
3777 * redundant doorbell.
09c4854f
KM
3778 *
3779 * qp->wqe_wr_id is accessed during qedr_poll_cq, as
3780 * soon as we give the doorbell, we could get a completion
3781 * for this wr, therefore we need to make sure that the
3782 * memory is updated before giving the doorbell.
3783 * During qedr_poll_cq, rmb is called before accessing the
3784 * cqe. This covers for the smp_rmb as well.
afa0e13b 3785 */
09c4854f 3786 smp_wmb();
afa0e13b
RA
3787 writel(qp->sq.db_data.raw, qp->sq.db);
3788
afa0e13b
RA
3789 spin_unlock_irqrestore(&qp->q_lock, flags);
3790
3791 return rc;
3792}
3793
3491c9e7
YB
3794static u32 qedr_srq_elem_left(struct qedr_srq_hwq_info *hw_srq)
3795{
3796 u32 used;
3797
3798 /* Calculate number of elements used based on producer
3799 * count and consumer count and subtract it from max
3800 * work request supported so that we get elements left.
3801 */
acca72e2 3802 used = hw_srq->wr_prod_cnt - (u32)atomic_read(&hw_srq->wr_cons_cnt);
3491c9e7
YB
3803
3804 return hw_srq->max_wr - used;
3805}
3806
3807int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
3808 const struct ib_recv_wr **bad_wr)
3809{
3810 struct qedr_srq *srq = get_qedr_srq(ibsrq);
3811 struct qedr_srq_hwq_info *hw_srq;
3812 struct qedr_dev *dev = srq->dev;
3813 struct qed_chain *pbl;
3814 unsigned long flags;
3815 int status = 0;
3816 u32 num_sge;
3491c9e7
YB
3817
3818 spin_lock_irqsave(&srq->lock, flags);
3819
3820 hw_srq = &srq->hw_srq;
3821 pbl = &srq->hw_srq.pbl;
3822 while (wr) {
3823 struct rdma_srq_wqe_header *hdr;
3824 int i;
3825
3826 if (!qedr_srq_elem_left(hw_srq) ||
3827 wr->num_sge > srq->hw_srq.max_sges) {
3828 DP_ERR(dev, "Can't post WR (%d,%d) || (%d > %d)\n",
acca72e2
YB
3829 hw_srq->wr_prod_cnt,
3830 atomic_read(&hw_srq->wr_cons_cnt),
3491c9e7
YB
3831 wr->num_sge, srq->hw_srq.max_sges);
3832 status = -ENOMEM;
3833 *bad_wr = wr;
3834 break;
3835 }
3836
3837 hdr = qed_chain_produce(pbl);
3838 num_sge = wr->num_sge;
3839 /* Set number of sge and work request id in header */
3840 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
3841
3842 srq->hw_srq.wr_prod_cnt++;
3843 hw_srq->wqe_prod++;
3844 hw_srq->sge_prod++;
3845
3846 DP_DEBUG(dev, QEDR_MSG_SRQ,
3847 "SRQ WR: SGEs: %d with wr_id[%d] = %llx\n",
3848 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
3849
3850 for (i = 0; i < wr->num_sge; i++) {
3851 struct rdma_srq_sge *srq_sge = qed_chain_produce(pbl);
3852
3853 /* Set SGE length, lkey and address */
3854 SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
3855 wr->sg_list[i].length, wr->sg_list[i].lkey);
3856
3857 DP_DEBUG(dev, QEDR_MSG_SRQ,
3858 "[%d]: len %d key %x addr %x:%x\n",
3859 i, srq_sge->length, srq_sge->l_key,
3860 srq_sge->addr.hi, srq_sge->addr.lo);
3861 hw_srq->sge_prod++;
3862 }
3863
acca72e2 3864 /* Update WQE and SGE information before
3491c9e7
YB
3865 * updating producer.
3866 */
acca72e2 3867 dma_wmb();
3491c9e7
YB
3868
3869 /* SRQ producer is 8 bytes. Need to update SGE producer index
3870 * in first 4 bytes and need to update WQE producer in
3871 * next 4 bytes.
3872 */
f45271ac 3873 srq->hw_srq.virt_prod_pair_addr->sge_prod = cpu_to_le32(hw_srq->sge_prod);
acca72e2
YB
3874 /* Make sure sge producer is updated first */
3875 dma_wmb();
f45271ac 3876 srq->hw_srq.virt_prod_pair_addr->wqe_prod = cpu_to_le32(hw_srq->wqe_prod);
3491c9e7 3877
3491c9e7
YB
3878 wr = wr->next;
3879 }
3880
3881 DP_DEBUG(dev, QEDR_MSG_SRQ, "POST: Elements in S-RQ: %d\n",
3882 qed_chain_get_elem_left(pbl));
3883 spin_unlock_irqrestore(&srq->lock, flags);
3884
3885 return status;
3886}
3887
d34ac5cd
BVA
3888int qedr_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
3889 const struct ib_recv_wr **bad_wr)
afa0e13b
RA
3890{
3891 struct qedr_qp *qp = get_qedr_qp(ibqp);
3892 struct qedr_dev *dev = qp->dev;
3893 unsigned long flags;
3894 int status = 0;
3895
04886779
RA
3896 if (qp->qp_type == IB_QPT_GSI)
3897 return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3898
afa0e13b
RA
3899 spin_lock_irqsave(&qp->q_lock, flags);
3900
922d9a40 3901 if (qp->state == QED_ROCE_QP_STATE_RESET) {
afa0e13b
RA
3902 spin_unlock_irqrestore(&qp->q_lock, flags);
3903 *bad_wr = wr;
3904 return -EINVAL;
3905 }
3906
3907 while (wr) {
3908 int i;
3909
3910 if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3911 QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3912 wr->num_sge > qp->rq.max_sges) {
3913 DP_ERR(dev, "Can't post WR (%d < %d) || (%d > %d)\n",
3914 qed_chain_get_elem_left_u32(&qp->rq.pbl),
3915 QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3916 qp->rq.max_sges);
3917 status = -ENOMEM;
3918 *bad_wr = wr;
3919 break;
3920 }
3921 for (i = 0; i < wr->num_sge; i++) {
3922 u32 flags = 0;
3923 struct rdma_rq_sge *rqe =
3924 qed_chain_produce(&qp->rq.pbl);
3925
3926 /* First one must include the number
3927 * of SGE in the list
3928 */
3929 if (!i)
3930 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3931 wr->num_sge);
3932
d52c89f1 3933 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO,
afa0e13b
RA
3934 wr->sg_list[i].lkey);
3935
3936 RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3937 wr->sg_list[i].length, flags);
3938 }
3939
3940 /* Special case of no sges. FW requires between 1-4 sges...
3941 * in this case we need to post 1 sge with length zero. this is
3942 * because rdma write with immediate consumes an RQ.
3943 */
3944 if (!wr->num_sge) {
3945 u32 flags = 0;
3946 struct rdma_rq_sge *rqe =
3947 qed_chain_produce(&qp->rq.pbl);
3948
3949 /* First one must include the number
3950 * of SGE in the list
3951 */
d52c89f1 3952 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO, 0);
afa0e13b
RA
3953 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3954
3955 RQ_SGE_SET(rqe, 0, 0, flags);
3956 i = 1;
3957 }
3958
3959 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3960 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3961
3962 qedr_inc_sw_prod(&qp->rq);
3963
09c4854f
KM
3964 /* qp->rqe_wr_id is accessed during qedr_poll_cq, as
3965 * soon as we give the doorbell, we could get a completion
3966 * for this wr, therefore we need to make sure that the
3967 * memory is update before giving the doorbell.
3968 * During qedr_poll_cq, rmb is called before accessing the
3969 * cqe. This covers for the smp_rmb as well.
3970 */
3971 smp_wmb();
afa0e13b
RA
3972
3973 qp->rq.db_data.data.value++;
3974
3975 writel(qp->rq.db_data.raw, qp->rq.db);
3976
f5b1b177
KM
3977 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
3978 writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
f5b1b177
KM
3979 }
3980
afa0e13b
RA
3981 wr = wr->next;
3982 }
3983
3984 spin_unlock_irqrestore(&qp->q_lock, flags);
3985
3986 return status;
3987}
3988
3989static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3990{
3991 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3992
3993 return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3994 cq->pbl_toggle;
3995}
3996
3997static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3998{
3999 struct rdma_cqe_requester *resp_cqe = &cqe->req;
4000 struct qedr_qp *qp;
4001
4002 qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
4003 resp_cqe->qp_handle.lo,
4004 u64);
4005 return qp;
4006}
4007
4008static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
4009{
4010 struct rdma_cqe_requester *resp_cqe = &cqe->req;
4011
4012 return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
4013}
4014
4015/* Return latest CQE (needs processing) */
4016static union rdma_cqe *get_cqe(struct qedr_cq *cq)
4017{
4018 return cq->latest_cqe;
4019}
4020
4021/* In fmr we need to increase the number of fmr completed counter for the fmr
4022 * algorithm determining whether we can free a pbl or not.
4023 * we need to perform this whether the work request was signaled or not. for
4024 * this purpose we call this function from the condition that checks if a wr
4025 * should be skipped, to make sure we don't miss it ( possibly this fmr
4026 * operation was not signalted)
4027 */
4028static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
4029{
4030 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
4031 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
4032}
4033
4034static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
4035 struct qedr_cq *cq, int num_entries,
4036 struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
4037 int force)
4038{
4039 u16 cnt = 0;
4040
4041 while (num_entries && qp->sq.wqe_cons != hw_cons) {
4042 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
4043 qedr_chk_if_fmr(qp);
4044 /* skip WC */
4045 goto next_cqe;
4046 }
4047
4048 /* fill WC */
4049 wc->status = status;
27035a1b 4050 wc->vendor_err = 0;
afa0e13b
RA
4051 wc->wc_flags = 0;
4052 wc->src_qp = qp->id;
4053 wc->qp = &qp->ibqp;
4054
4055 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
4056 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
4057
4058 switch (wc->opcode) {
4059 case IB_WC_RDMA_WRITE:
4060 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
4061 break;
4062 case IB_WC_COMP_SWAP:
4063 case IB_WC_FETCH_ADD:
4064 wc->byte_len = 8;
4065 break;
4066 case IB_WC_REG_MR:
4067 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
4068 break;
dac27386
MK
4069 case IB_WC_RDMA_READ:
4070 case IB_WC_SEND:
4071 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
4072 break;
afa0e13b
RA
4073 default:
4074 break;
4075 }
4076
4077 num_entries--;
4078 wc++;
4079 cnt++;
4080next_cqe:
4081 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
4082 qed_chain_consume(&qp->sq.pbl);
4083 qedr_inc_sw_cons(&qp->sq);
4084 }
4085
4086 return cnt;
4087}
4088
4089static int qedr_poll_cq_req(struct qedr_dev *dev,
4090 struct qedr_qp *qp, struct qedr_cq *cq,
4091 int num_entries, struct ib_wc *wc,
4092 struct rdma_cqe_requester *req)
4093{
4094 int cnt = 0;
4095
4096 switch (req->status) {
4097 case RDMA_CQE_REQ_STS_OK:
4098 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
4099 IB_WC_SUCCESS, 0);
4100 break;
4101 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
c78c3149 4102 if (qp->state != QED_ROCE_QP_STATE_ERR)
dc728f77
KM
4103 DP_DEBUG(dev, QEDR_MSG_CQ,
4104 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4105 cq->icid, qp->icid);
afa0e13b 4106 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
74c3875c 4107 IB_WC_WR_FLUSH_ERR, 1);
afa0e13b
RA
4108 break;
4109 default:
4110 /* process all WQE before the cosumer */
4111 qp->state = QED_ROCE_QP_STATE_ERR;
4112 cnt = process_req(dev, qp, cq, num_entries, wc,
4113 req->sq_cons - 1, IB_WC_SUCCESS, 0);
4114 wc += cnt;
4115 /* if we have extra WC fill it with actual error info */
4116 if (cnt < num_entries) {
4117 enum ib_wc_status wc_status;
4118
4119 switch (req->status) {
4120 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
4121 DP_ERR(dev,
4122 "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4123 cq->icid, qp->icid);
4124 wc_status = IB_WC_BAD_RESP_ERR;
4125 break;
4126 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
4127 DP_ERR(dev,
4128 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4129 cq->icid, qp->icid);
4130 wc_status = IB_WC_LOC_LEN_ERR;
4131 break;
4132 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
4133 DP_ERR(dev,
4134 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4135 cq->icid, qp->icid);
4136 wc_status = IB_WC_LOC_QP_OP_ERR;
4137 break;
4138 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
4139 DP_ERR(dev,
4140 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4141 cq->icid, qp->icid);
4142 wc_status = IB_WC_LOC_PROT_ERR;
4143 break;
4144 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
4145 DP_ERR(dev,
4146 "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4147 cq->icid, qp->icid);
4148 wc_status = IB_WC_MW_BIND_ERR;
4149 break;
4150 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
4151 DP_ERR(dev,
4152 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4153 cq->icid, qp->icid);
4154 wc_status = IB_WC_REM_INV_REQ_ERR;
4155 break;
4156 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
4157 DP_ERR(dev,
4158 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4159 cq->icid, qp->icid);
4160 wc_status = IB_WC_REM_ACCESS_ERR;
4161 break;
4162 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
4163 DP_ERR(dev,
4164 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4165 cq->icid, qp->icid);
4166 wc_status = IB_WC_REM_OP_ERR;
4167 break;
4168 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
4169 DP_ERR(dev,
4170 "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4171 cq->icid, qp->icid);
4172 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
4173 break;
4174 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
4175 DP_ERR(dev,
4176 "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4177 cq->icid, qp->icid);
4178 wc_status = IB_WC_RETRY_EXC_ERR;
4179 break;
4180 default:
4181 DP_ERR(dev,
4182 "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4183 cq->icid, qp->icid);
4184 wc_status = IB_WC_GENERAL_ERR;
4185 }
4186 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
4187 wc_status, 1);
4188 }
4189 }
4190
4191 return cnt;
4192}
4193
b6acd71f 4194static inline int qedr_cqe_resp_status_to_ib(u8 status)
afa0e13b 4195{
b6acd71f 4196 switch (status) {
afa0e13b 4197 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
b6acd71f 4198 return IB_WC_LOC_ACCESS_ERR;
afa0e13b 4199 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
b6acd71f 4200 return IB_WC_LOC_LEN_ERR;
afa0e13b 4201 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
b6acd71f 4202 return IB_WC_LOC_QP_OP_ERR;
afa0e13b 4203 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
b6acd71f 4204 return IB_WC_LOC_PROT_ERR;
afa0e13b 4205 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
b6acd71f 4206 return IB_WC_MW_BIND_ERR;
afa0e13b 4207 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
b6acd71f 4208 return IB_WC_REM_INV_RD_REQ_ERR;
afa0e13b 4209 case RDMA_CQE_RESP_STS_OK:
b6acd71f
AR
4210 return IB_WC_SUCCESS;
4211 default:
4212 return IB_WC_GENERAL_ERR;
4213 }
4214}
afa0e13b 4215
b6acd71f
AR
4216static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
4217 struct ib_wc *wc)
4218{
4219 wc->status = IB_WC_SUCCESS;
4220 wc->byte_len = le32_to_cpu(resp->length);
afa0e13b 4221
b6acd71f 4222 if (resp->flags & QEDR_RESP_IMM) {
7bed7ebc 4223 wc->ex.imm_data = cpu_to_be32(le32_to_cpu(resp->imm_data_or_inv_r_Key));
b6acd71f
AR
4224 wc->wc_flags |= IB_WC_WITH_IMM;
4225
4226 if (resp->flags & QEDR_RESP_RDMA)
afa0e13b
RA
4227 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
4228
b6acd71f
AR
4229 if (resp->flags & QEDR_RESP_INV)
4230 return -EINVAL;
4231
4232 } else if (resp->flags & QEDR_RESP_INV) {
4233 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
4234 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
4235
4236 if (resp->flags & QEDR_RESP_RDMA)
4237 return -EINVAL;
4238
4239 } else if (resp->flags & QEDR_RESP_RDMA) {
4240 return -EINVAL;
4241 }
4242
4243 return 0;
4244}
4245
4246static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
4247 struct qedr_cq *cq, struct ib_wc *wc,
4248 struct rdma_cqe_responder *resp, u64 wr_id)
4249{
4250 /* Must fill fields before qedr_set_ok_cqe_resp_wc() */
4251 wc->opcode = IB_WC_RECV;
4252 wc->wc_flags = 0;
4253
4254 if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
4255 if (qedr_set_ok_cqe_resp_wc(resp, wc))
4256 DP_ERR(dev,
4257 "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
4258 cq, cq->icid, resp->flags);
4259
4260 } else {
4261 wc->status = qedr_cqe_resp_status_to_ib(resp->status);
4262 if (wc->status == IB_WC_GENERAL_ERR)
4263 DP_ERR(dev,
4264 "CQ %p (icid=%d) contains an invalid CQE status %d\n",
4265 cq, cq->icid, resp->status);
afa0e13b
RA
4266 }
4267
b6acd71f 4268 /* Fill the rest of the WC */
27035a1b 4269 wc->vendor_err = 0;
afa0e13b
RA
4270 wc->src_qp = qp->id;
4271 wc->qp = &qp->ibqp;
4272 wc->wr_id = wr_id;
4273}
4274
3491c9e7
YB
4275static int process_resp_one_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4276 struct qedr_cq *cq, struct ib_wc *wc,
4277 struct rdma_cqe_responder *resp)
4278{
4279 struct qedr_srq *srq = qp->srq;
4280 u64 wr_id;
4281
4282 wr_id = HILO_GEN(le32_to_cpu(resp->srq_wr_id.hi),
4283 le32_to_cpu(resp->srq_wr_id.lo), u64);
4284
4285 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4286 wc->status = IB_WC_WR_FLUSH_ERR;
4287 wc->vendor_err = 0;
4288 wc->wr_id = wr_id;
4289 wc->byte_len = 0;
4290 wc->src_qp = qp->id;
4291 wc->qp = &qp->ibqp;
4292 wc->wr_id = wr_id;
4293 } else {
4294 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
4295 }
acca72e2 4296 atomic_inc(&srq->hw_srq.wr_cons_cnt);
3491c9e7
YB
4297
4298 return 1;
4299}
afa0e13b
RA
4300static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
4301 struct qedr_cq *cq, struct ib_wc *wc,
4302 struct rdma_cqe_responder *resp)
4303{
4304 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4305
4306 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
4307
4308 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4309 qed_chain_consume(&qp->rq.pbl);
4310 qedr_inc_sw_cons(&qp->rq);
4311
4312 return 1;
4313}
4314
4315static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
4316 int num_entries, struct ib_wc *wc, u16 hw_cons)
4317{
4318 u16 cnt = 0;
4319
4320 while (num_entries && qp->rq.wqe_cons != hw_cons) {
4321 /* fill WC */
4322 wc->status = IB_WC_WR_FLUSH_ERR;
27035a1b 4323 wc->vendor_err = 0;
afa0e13b
RA
4324 wc->wc_flags = 0;
4325 wc->src_qp = qp->id;
4326 wc->byte_len = 0;
4327 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4328 wc->qp = &qp->ibqp;
4329 num_entries--;
4330 wc++;
4331 cnt++;
4332 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4333 qed_chain_consume(&qp->rq.pbl);
4334 qedr_inc_sw_cons(&qp->rq);
4335 }
4336
4337 return cnt;
4338}
4339
4340static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4341 struct rdma_cqe_responder *resp, int *update)
4342{
50bc60cb 4343 if (le16_to_cpu(resp->rq_cons_or_srq_id) == qp->rq.wqe_cons) {
afa0e13b
RA
4344 consume_cqe(cq);
4345 *update |= 1;
4346 }
4347}
4348
3491c9e7
YB
4349static int qedr_poll_cq_resp_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4350 struct qedr_cq *cq, int num_entries,
4351 struct ib_wc *wc,
4352 struct rdma_cqe_responder *resp)
4353{
4354 int cnt;
4355
4356 cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
4357 consume_cqe(cq);
4358
4359 return cnt;
4360}
4361
afa0e13b
RA
4362static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
4363 struct qedr_cq *cq, int num_entries,
4364 struct ib_wc *wc, struct rdma_cqe_responder *resp,
4365 int *update)
4366{
4367 int cnt;
4368
4369 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4370 cnt = process_resp_flush(qp, cq, num_entries, wc,
50bc60cb 4371 resp->rq_cons_or_srq_id);
afa0e13b
RA
4372 try_consume_resp_cqe(cq, qp, resp, update);
4373 } else {
4374 cnt = process_resp_one(dev, qp, cq, wc, resp);
4375 consume_cqe(cq);
4376 *update |= 1;
4377 }
4378
4379 return cnt;
4380}
4381
4382static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4383 struct rdma_cqe_requester *req, int *update)
4384{
4385 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
4386 consume_cqe(cq);
4387 *update |= 1;
4388 }
4389}
4390
4391int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
4392{
4393 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
4394 struct qedr_cq *cq = get_qedr_cq(ibcq);
e3fd112c 4395 union rdma_cqe *cqe;
afa0e13b
RA
4396 u32 old_cons, new_cons;
4397 unsigned long flags;
4398 int update = 0;
4399 int done = 0;
4400
4dd72636
AR
4401 if (cq->destroyed) {
4402 DP_ERR(dev,
4403 "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
4404 cq, cq->icid);
4405 return 0;
4406 }
4407
04886779
RA
4408 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
4409 return qedr_gsi_poll_cq(ibcq, num_entries, wc);
4410
afa0e13b 4411 spin_lock_irqsave(&cq->cq_lock, flags);
e3fd112c 4412 cqe = cq->latest_cqe;
afa0e13b
RA
4413 old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4414 while (num_entries && is_valid_cqe(cq, cqe)) {
4415 struct qedr_qp *qp;
4416 int cnt = 0;
4417
4418 /* prevent speculative reads of any field of CQE */
4419 rmb();
4420
4421 qp = cqe_get_qp(cqe);
4422 if (!qp) {
4423 WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
4424 break;
4425 }
4426
4427 wc->qp = &qp->ibqp;
4428
4429 switch (cqe_get_type(cqe)) {
4430 case RDMA_CQE_TYPE_REQUESTER:
4431 cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
4432 &cqe->req);
4433 try_consume_req_cqe(cq, qp, &cqe->req, &update);
4434 break;
4435 case RDMA_CQE_TYPE_RESPONDER_RQ:
4436 cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
4437 &cqe->resp, &update);
4438 break;
3491c9e7
YB
4439 case RDMA_CQE_TYPE_RESPONDER_SRQ:
4440 cnt = qedr_poll_cq_resp_srq(dev, qp, cq, num_entries,
4441 wc, &cqe->resp);
4442 update = 1;
4443 break;
afa0e13b
RA
4444 case RDMA_CQE_TYPE_INVALID:
4445 default:
4446 DP_ERR(dev, "Error: invalid CQE type = %d\n",
4447 cqe_get_type(cqe));
4448 }
4449 num_entries -= cnt;
4450 wc += cnt;
4451 done += cnt;
4452
4453 cqe = get_cqe(cq);
4454 }
4455 new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4456
4457 cq->cq_cons += new_cons - old_cons;
4458
4459 if (update)
4460 /* doorbell notifies abount latest VALID entry,
4461 * but chain already point to the next INVALID one
4462 */
4463 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
4464
4465 spin_unlock_irqrestore(&cq->cq_lock, flags);
4466 return done;
4467}
993d1b52
RA
4468
4469int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
e26e7b88
LR
4470 u8 port_num, const struct ib_wc *in_wc,
4471 const struct ib_grh *in_grh, const struct ib_mad *in,
4472 struct ib_mad *out_mad, size_t *out_mad_size,
4473 u16 *out_mad_pkey_index)
993d1b52 4474{
993d1b52
RA
4475 return IB_MAD_RESULT_SUCCESS;
4476}