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