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