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