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