1 /* QLogic qedr NIC Driver
2 * Copyright (c) 2015-2016 QLogic Corporation
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and /or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 #include <linux/dma-mapping.h>
33 #include <linux/crc32.h>
37 #include <linux/iommu.h>
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>
47 #include <linux/qed/common_hsi.h>
48 #include "qedr_hsi_rdma.h"
49 #include <linux/qed/qed_if.h>
52 #include <rdma/qedr-abi.h>
53 #include "qedr_roce_cm.h"
55 #define QEDR_SRQ_WQE_ELEM_SIZE sizeof(union rdma_srq_elm)
56 #define RDMA_MAX_SGE_PER_SRQ (4)
57 #define RDMA_MAX_SRQ_WQE_SIZE (RDMA_MAX_SGE_PER_SRQ + 1)
59 #define DB_ADDR_SHIFT(addr) ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
61 static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src,
64 size_t min_len = min_t(size_t, len, udata->outlen);
66 return ib_copy_to_udata(udata, src, min_len);
69 int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
71 if (index >= QEDR_ROCE_PKEY_TABLE_LEN)
74 *pkey = QEDR_ROCE_PKEY_DEFAULT;
78 int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
79 int index, union ib_gid *sgid)
81 struct qedr_dev *dev = get_qedr_dev(ibdev);
83 memset(sgid->raw, 0, sizeof(sgid->raw));
84 ether_addr_copy(sgid->raw, dev->ndev->dev_addr);
86 DP_DEBUG(dev, QEDR_MSG_INIT, "QUERY sgid[%d]=%llx:%llx\n", index,
87 sgid->global.interface_id, sgid->global.subnet_prefix);
92 int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
94 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
95 struct qedr_device_attr *qattr = &dev->attr;
96 struct qedr_srq *srq = get_qedr_srq(ibsrq);
98 srq_attr->srq_limit = srq->srq_limit;
99 srq_attr->max_wr = qattr->max_srq_wr;
100 srq_attr->max_sge = qattr->max_sge;
105 int qedr_query_device(struct ib_device *ibdev,
106 struct ib_device_attr *attr, struct ib_udata *udata)
108 struct qedr_dev *dev = get_qedr_dev(ibdev);
109 struct qedr_device_attr *qattr = &dev->attr;
111 if (!dev->rdma_ctx) {
113 "qedr_query_device called with invalid params rdma_ctx=%p\n",
118 memset(attr, 0, sizeof(*attr));
120 attr->fw_ver = qattr->fw_ver;
121 attr->sys_image_guid = qattr->sys_image_guid;
122 attr->max_mr_size = qattr->max_mr_size;
123 attr->page_size_cap = qattr->page_size_caps;
124 attr->vendor_id = qattr->vendor_id;
125 attr->vendor_part_id = qattr->vendor_part_id;
126 attr->hw_ver = qattr->hw_ver;
127 attr->max_qp = qattr->max_qp;
128 attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
129 attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
130 IB_DEVICE_RC_RNR_NAK_GEN |
131 IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
133 attr->max_send_sge = qattr->max_sge;
134 attr->max_recv_sge = qattr->max_sge;
135 attr->max_sge_rd = qattr->max_sge;
136 attr->max_cq = qattr->max_cq;
137 attr->max_cqe = qattr->max_cqe;
138 attr->max_mr = qattr->max_mr;
139 attr->max_mw = qattr->max_mw;
140 attr->max_pd = qattr->max_pd;
141 attr->atomic_cap = dev->atomic_cap;
142 attr->max_fmr = qattr->max_fmr;
143 attr->max_map_per_fmr = 16;
144 attr->max_qp_init_rd_atom =
145 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
146 attr->max_qp_rd_atom =
147 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
148 attr->max_qp_init_rd_atom);
150 attr->max_srq = qattr->max_srq;
151 attr->max_srq_sge = qattr->max_srq_sge;
152 attr->max_srq_wr = qattr->max_srq_wr;
154 attr->local_ca_ack_delay = qattr->dev_ack_delay;
155 attr->max_fast_reg_page_list_len = qattr->max_mr / 8;
156 attr->max_pkeys = QEDR_ROCE_PKEY_MAX;
157 attr->max_ah = qattr->max_ah;
162 #define QEDR_SPEED_SDR (1)
163 #define QEDR_SPEED_DDR (2)
164 #define QEDR_SPEED_QDR (4)
165 #define QEDR_SPEED_FDR10 (8)
166 #define QEDR_SPEED_FDR (16)
167 #define QEDR_SPEED_EDR (32)
169 static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
174 *ib_speed = QEDR_SPEED_SDR;
175 *ib_width = IB_WIDTH_1X;
178 *ib_speed = QEDR_SPEED_QDR;
179 *ib_width = IB_WIDTH_1X;
183 *ib_speed = QEDR_SPEED_DDR;
184 *ib_width = IB_WIDTH_4X;
188 *ib_speed = QEDR_SPEED_EDR;
189 *ib_width = IB_WIDTH_1X;
193 *ib_speed = QEDR_SPEED_QDR;
194 *ib_width = IB_WIDTH_4X;
198 *ib_speed = QEDR_SPEED_QDR;
199 *ib_width = IB_WIDTH_4X;
203 *ib_speed = QEDR_SPEED_EDR;
204 *ib_width = IB_WIDTH_4X;
209 *ib_speed = QEDR_SPEED_SDR;
210 *ib_width = IB_WIDTH_1X;
214 int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
216 struct qedr_dev *dev;
217 struct qed_rdma_port *rdma_port;
219 dev = get_qedr_dev(ibdev);
221 if (!dev->rdma_ctx) {
222 DP_ERR(dev, "rdma_ctx is NULL\n");
226 rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
228 /* *attr being zeroed by the caller, avoid zeroing it here */
229 if (rdma_port->port_state == QED_RDMA_PORT_UP) {
230 attr->state = IB_PORT_ACTIVE;
231 attr->phys_state = 5;
233 attr->state = IB_PORT_DOWN;
234 attr->phys_state = 3;
236 attr->max_mtu = IB_MTU_4096;
237 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
242 attr->ip_gids = true;
243 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
244 attr->gid_tbl_len = 1;
245 attr->pkey_tbl_len = 1;
247 attr->gid_tbl_len = QEDR_MAX_SGID;
248 attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
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;
260 int qedr_modify_port(struct ib_device *ibdev, u8 port, int mask,
261 struct ib_port_modify *props)
266 static int qedr_add_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
271 mm = kzalloc(sizeof(*mm), GFP_KERNEL);
275 mm->key.phy_addr = phy_addr;
276 /* This function might be called with a length which is not a multiple
277 * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
278 * forces this granularity by increasing the requested size if needed.
279 * When qedr_mmap is called, it will search the list with the updated
280 * length as a key. To prevent search failures, the length is rounded up
281 * in advance to PAGE_SIZE.
283 mm->key.len = roundup(len, PAGE_SIZE);
284 INIT_LIST_HEAD(&mm->entry);
286 mutex_lock(&uctx->mm_list_lock);
287 list_add(&mm->entry, &uctx->mm_head);
288 mutex_unlock(&uctx->mm_list_lock);
290 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
291 "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
292 (unsigned long long)mm->key.phy_addr,
293 (unsigned long)mm->key.len, uctx);
298 static bool qedr_search_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
304 mutex_lock(&uctx->mm_list_lock);
305 list_for_each_entry(mm, &uctx->mm_head, entry) {
306 if (len != mm->key.len || phy_addr != mm->key.phy_addr)
312 mutex_unlock(&uctx->mm_list_lock);
313 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
314 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, result=%d\n",
315 mm->key.phy_addr, mm->key.len, uctx, found);
320 int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
322 struct ib_device *ibdev = uctx->device;
324 struct qedr_ucontext *ctx = get_qedr_ucontext(uctx);
325 struct qedr_alloc_ucontext_resp uresp = {};
326 struct qedr_dev *dev = get_qedr_dev(ibdev);
327 struct qed_rdma_add_user_out_params oparams;
332 rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
335 "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",
340 ctx->dpi = oparams.dpi;
341 ctx->dpi_addr = oparams.dpi_addr;
342 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
343 ctx->dpi_size = oparams.dpi_size;
344 INIT_LIST_HEAD(&ctx->mm_head);
345 mutex_init(&ctx->mm_list_lock);
347 uresp.dpm_enabled = dev->user_dpm_enabled;
348 uresp.wids_enabled = 1;
349 uresp.wid_count = oparams.wid_count;
350 uresp.db_pa = ctx->dpi_phys_addr;
351 uresp.db_size = ctx->dpi_size;
352 uresp.max_send_wr = dev->attr.max_sqe;
353 uresp.max_recv_wr = dev->attr.max_rqe;
354 uresp.max_srq_wr = dev->attr.max_srq_wr;
355 uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
356 uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
357 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
358 uresp.max_cqes = QEDR_MAX_CQES;
360 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
366 rc = qedr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
370 DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
375 void qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
377 struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
378 struct qedr_mm *mm, *tmp;
380 DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
382 uctx->dev->ops->rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
384 list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
385 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
386 "deleted (addr=0x%llx,len=0x%lx) for ctx=%p\n",
387 mm->key.phy_addr, mm->key.len, uctx);
388 list_del(&mm->entry);
393 int qedr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
395 struct qedr_ucontext *ucontext = get_qedr_ucontext(context);
396 struct qedr_dev *dev = get_qedr_dev(context->device);
397 unsigned long phys_addr = vma->vm_pgoff << PAGE_SHIFT;
398 unsigned long len = (vma->vm_end - vma->vm_start);
399 unsigned long dpi_start;
401 dpi_start = dev->db_phys_addr + (ucontext->dpi * ucontext->dpi_size);
403 DP_DEBUG(dev, QEDR_MSG_INIT,
404 "mmap invoked with vm_start=0x%pK, vm_end=0x%pK,vm_pgoff=0x%pK; dpi_start=0x%pK dpi_size=0x%x\n",
405 (void *)vma->vm_start, (void *)vma->vm_end,
406 (void *)vma->vm_pgoff, (void *)dpi_start, ucontext->dpi_size);
408 if ((vma->vm_start & (PAGE_SIZE - 1)) || (len & (PAGE_SIZE - 1))) {
410 "failed mmap, addresses must be page aligned: start=0x%pK, end=0x%pK\n",
411 (void *)vma->vm_start, (void *)vma->vm_end);
415 if (!qedr_search_mmap(ucontext, phys_addr, len)) {
416 DP_ERR(dev, "failed mmap, vm_pgoff=0x%lx is not authorized\n",
421 if (phys_addr < dpi_start ||
422 ((phys_addr + len) > (dpi_start + ucontext->dpi_size))) {
424 "failed mmap, pages are outside of dpi; page address=0x%pK, dpi_start=0x%pK, dpi_size=0x%x\n",
425 (void *)phys_addr, (void *)dpi_start,
430 if (vma->vm_flags & VM_READ) {
431 DP_ERR(dev, "failed mmap, cannot map doorbell bar for read\n");
435 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
436 return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
440 int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
442 struct ib_device *ibdev = ibpd->device;
443 struct qedr_dev *dev = get_qedr_dev(ibdev);
444 struct qedr_pd *pd = get_qedr_pd(ibpd);
448 DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
449 udata ? "User Lib" : "Kernel");
451 if (!dev->rdma_ctx) {
452 DP_ERR(dev, "invalid RDMA context\n");
456 rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
463 struct qedr_alloc_pd_uresp uresp = {
466 struct qedr_ucontext *context = rdma_udata_to_drv_context(
467 udata, struct qedr_ucontext, ibucontext);
469 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
471 DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
472 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
483 void qedr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
485 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
486 struct qedr_pd *pd = get_qedr_pd(ibpd);
488 DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
489 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
492 static void qedr_free_pbl(struct qedr_dev *dev,
493 struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
495 struct pci_dev *pdev = dev->pdev;
498 for (i = 0; i < pbl_info->num_pbls; i++) {
501 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
502 pbl[i].va, pbl[i].pa);
508 #define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
509 #define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
511 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
512 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
513 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
515 static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
516 struct qedr_pbl_info *pbl_info,
519 struct pci_dev *pdev = dev->pdev;
520 struct qedr_pbl *pbl_table;
521 dma_addr_t *pbl_main_tbl;
526 pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
528 return ERR_PTR(-ENOMEM);
530 for (i = 0; i < pbl_info->num_pbls; i++) {
531 va = dma_alloc_coherent(&pdev->dev, pbl_info->pbl_size, &pa,
536 pbl_table[i].va = va;
537 pbl_table[i].pa = pa;
540 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
541 * the first one with physical pointers to all of the rest
543 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
544 for (i = 0; i < pbl_info->num_pbls - 1; i++)
545 pbl_main_tbl[i] = pbl_table[i + 1].pa;
550 for (i--; i >= 0; i--)
551 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
552 pbl_table[i].va, pbl_table[i].pa);
554 qedr_free_pbl(dev, pbl_info, pbl_table);
556 return ERR_PTR(-ENOMEM);
559 static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
560 struct qedr_pbl_info *pbl_info,
561 u32 num_pbes, int two_layer_capable)
567 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
568 if (num_pbes > MAX_PBES_TWO_LAYER) {
569 DP_ERR(dev, "prepare pbl table: too many pages %d\n",
574 /* calculate required pbl page size */
575 pbl_size = MIN_FW_PBL_PAGE_SIZE;
576 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
577 NUM_PBES_ON_PAGE(pbl_size);
579 while (pbl_capacity < num_pbes) {
581 pbl_capacity = pbl_size / sizeof(u64);
582 pbl_capacity = pbl_capacity * pbl_capacity;
585 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
586 num_pbls++; /* One for the layer0 ( points to the pbls) */
587 pbl_info->two_layered = true;
589 /* One layered PBL */
591 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
592 roundup_pow_of_two((num_pbes * sizeof(u64))));
593 pbl_info->two_layered = false;
596 pbl_info->num_pbls = num_pbls;
597 pbl_info->pbl_size = pbl_size;
598 pbl_info->num_pbes = num_pbes;
600 DP_DEBUG(dev, QEDR_MSG_MR,
601 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
602 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
607 static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
608 struct qedr_pbl *pbl,
609 struct qedr_pbl_info *pbl_info, u32 pg_shift)
611 int pbe_cnt, total_num_pbes = 0;
612 u32 fw_pg_cnt, fw_pg_per_umem_pg;
613 struct qedr_pbl *pbl_tbl;
614 struct sg_dma_page_iter sg_iter;
618 if (!pbl_info->num_pbes)
621 /* If we have a two layered pbl, the first pbl points to the rest
622 * of the pbls and the first entry lays on the second pbl in the table
624 if (pbl_info->two_layered)
629 pbe = (struct regpair *)pbl_tbl->va;
631 DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
637 fw_pg_per_umem_pg = BIT(PAGE_SHIFT - pg_shift);
639 for_each_sg_dma_page (umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
640 pg_addr = sg_page_iter_dma_address(&sg_iter);
641 for (fw_pg_cnt = 0; fw_pg_cnt < fw_pg_per_umem_pg;) {
642 pbe->lo = cpu_to_le32(pg_addr);
643 pbe->hi = cpu_to_le32(upper_32_bits(pg_addr));
645 pg_addr += BIT(pg_shift);
650 if (total_num_pbes == pbl_info->num_pbes)
653 /* If the given pbl is full storing the pbes,
656 if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
658 pbe = (struct regpair *)pbl_tbl->va;
667 static int qedr_copy_cq_uresp(struct qedr_dev *dev,
668 struct qedr_cq *cq, struct ib_udata *udata)
670 struct qedr_create_cq_uresp uresp;
673 memset(&uresp, 0, sizeof(uresp));
675 uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
676 uresp.icid = cq->icid;
678 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
680 DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
685 static void consume_cqe(struct qedr_cq *cq)
687 if (cq->latest_cqe == cq->toggle_cqe)
688 cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
690 cq->latest_cqe = qed_chain_consume(&cq->pbl);
693 static inline int qedr_align_cq_entries(int entries)
695 u64 size, aligned_size;
697 /* We allocate an extra entry that we don't report to the FW. */
698 size = (entries + 1) * QEDR_CQE_SIZE;
699 aligned_size = ALIGN(size, PAGE_SIZE);
701 return aligned_size / QEDR_CQE_SIZE;
704 static inline int qedr_init_user_queue(struct ib_udata *udata,
705 struct qedr_dev *dev,
706 struct qedr_userq *q, u64 buf_addr,
707 size_t buf_len, int access, int dmasync,
713 q->buf_addr = buf_addr;
714 q->buf_len = buf_len;
715 q->umem = ib_umem_get(udata, q->buf_addr, q->buf_len, access, dmasync);
716 if (IS_ERR(q->umem)) {
717 DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
719 return PTR_ERR(q->umem);
722 fw_pages = ib_umem_page_count(q->umem) <<
723 (PAGE_SHIFT - FW_PAGE_SHIFT);
725 rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0);
729 if (alloc_and_init) {
730 q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
731 if (IS_ERR(q->pbl_tbl)) {
732 rc = PTR_ERR(q->pbl_tbl);
735 qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info,
738 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
748 ib_umem_release(q->umem);
754 static inline void qedr_init_cq_params(struct qedr_cq *cq,
755 struct qedr_ucontext *ctx,
756 struct qedr_dev *dev, int vector,
757 int chain_entries, int page_cnt,
759 struct qed_rdma_create_cq_in_params
762 memset(params, 0, sizeof(*params));
763 params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
764 params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
765 params->cnq_id = vector;
766 params->cq_size = chain_entries - 1;
767 params->dpi = (ctx) ? ctx->dpi : dev->dpi;
768 params->pbl_num_pages = page_cnt;
769 params->pbl_ptr = pbl_ptr;
770 params->pbl_two_level = 0;
773 static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
775 cq->db.data.agg_flags = flags;
776 cq->db.data.value = cpu_to_le32(cons);
777 writeq(cq->db.raw, cq->db_addr);
779 /* Make sure write would stick */
783 int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
785 struct qedr_cq *cq = get_qedr_cq(ibcq);
786 unsigned long sflags;
787 struct qedr_dev *dev;
789 dev = get_qedr_dev(ibcq->device);
793 "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
799 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
802 spin_lock_irqsave(&cq->cq_lock, sflags);
806 if (flags & IB_CQ_SOLICITED)
807 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
809 if (flags & IB_CQ_NEXT_COMP)
810 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
812 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
814 spin_unlock_irqrestore(&cq->cq_lock, sflags);
819 struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
820 const struct ib_cq_init_attr *attr,
821 struct ib_udata *udata)
823 struct qedr_ucontext *ctx = rdma_udata_to_drv_context(
824 udata, struct qedr_ucontext, ibucontext);
825 struct qed_rdma_destroy_cq_out_params destroy_oparams;
826 struct qed_rdma_destroy_cq_in_params destroy_iparams;
827 struct qedr_dev *dev = get_qedr_dev(ibdev);
828 struct qed_rdma_create_cq_in_params params;
829 struct qedr_create_cq_ureq ureq;
830 int vector = attr->comp_vector;
831 int entries = attr->cqe;
839 DP_DEBUG(dev, QEDR_MSG_INIT,
840 "create_cq: called from %s. entries=%d, vector=%d\n",
841 udata ? "User Lib" : "Kernel", entries, vector);
843 if (entries > QEDR_MAX_CQES) {
845 "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
846 entries, QEDR_MAX_CQES);
847 return ERR_PTR(-EINVAL);
850 chain_entries = qedr_align_cq_entries(entries);
851 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
853 cq = kzalloc(sizeof(*cq), GFP_KERNEL);
855 return ERR_PTR(-ENOMEM);
858 memset(&ureq, 0, sizeof(ureq));
859 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
861 "create cq: problem copying data from user space\n");
867 "create cq: cannot create a cq with 0 entries\n");
871 cq->cq_type = QEDR_CQ_TYPE_USER;
873 rc = qedr_init_user_queue(udata, dev, &cq->q, ureq.addr,
874 ureq.len, IB_ACCESS_LOCAL_WRITE, 1,
879 pbl_ptr = cq->q.pbl_tbl->pa;
880 page_cnt = cq->q.pbl_info.num_pbes;
882 cq->ibcq.cqe = chain_entries;
884 cq->cq_type = QEDR_CQ_TYPE_KERNEL;
886 rc = dev->ops->common->chain_alloc(dev->cdev,
887 QED_CHAIN_USE_TO_CONSUME,
889 QED_CHAIN_CNT_TYPE_U32,
891 sizeof(union rdma_cqe),
896 page_cnt = qed_chain_get_page_cnt(&cq->pbl);
897 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
898 cq->ibcq.cqe = cq->pbl.capacity;
901 qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
904 rc = dev->ops->rdma_create_cq(dev->rdma_ctx, ¶ms, &icid);
909 cq->sig = QEDR_CQ_MAGIC_NUMBER;
910 spin_lock_init(&cq->cq_lock);
913 rc = qedr_copy_cq_uresp(dev, cq, udata);
917 /* Generate doorbell address. */
918 cq->db_addr = dev->db_addr +
919 DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
920 cq->db.data.icid = cq->icid;
921 cq->db.data.params = DB_AGG_CMD_SET <<
922 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
924 /* point to the very last element, passing it we will toggle */
925 cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
926 cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
927 cq->latest_cqe = NULL;
929 cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
932 DP_DEBUG(dev, QEDR_MSG_CQ,
933 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
934 cq->icid, cq, params.cq_size);
939 destroy_iparams.icid = cq->icid;
940 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
944 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
946 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
949 ib_umem_release(cq->q.umem);
952 return ERR_PTR(-EINVAL);
955 int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
957 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
958 struct qedr_cq *cq = get_qedr_cq(ibcq);
960 DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
965 #define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
966 #define QEDR_DESTROY_CQ_ITER_DURATION (10)
968 int qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
970 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
971 struct qed_rdma_destroy_cq_out_params oparams;
972 struct qed_rdma_destroy_cq_in_params iparams;
973 struct qedr_cq *cq = get_qedr_cq(ibcq);
977 DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
981 /* GSIs CQs are handled by driver, so they don't exist in the FW */
982 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
985 iparams.icid = cq->icid;
986 rc = dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
990 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
993 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
994 ib_umem_release(cq->q.umem);
997 /* We don't want the IRQ handler to handle a non-existing CQ so we
998 * wait until all CNQ interrupts, if any, are received. This will always
999 * happen and will always happen very fast. If not, then a serious error
1000 * has occured. That is why we can use a long delay.
1001 * We spin for a short time so we don’t lose time on context switching
1002 * in case all the completions are handled in that span. Otherwise
1003 * we sleep for a while and check again. Since the CNQ may be
1004 * associated with (only) the current CPU we use msleep to allow the
1005 * current CPU to be freed.
1006 * The CNQ notification is increased in qedr_irq_handler().
1008 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1009 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1010 udelay(QEDR_DESTROY_CQ_ITER_DURATION);
1014 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1015 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1016 msleep(QEDR_DESTROY_CQ_ITER_DURATION);
1020 if (oparams.num_cq_notif != cq->cnq_notif)
1023 /* Note that we don't need to have explicit code to wait for the
1024 * completion of the event handler because it is invoked from the EQ.
1025 * Since the destroy CQ ramrod has also been received on the EQ we can
1026 * be certain that there's no event handler in process.
1037 "CQ %p (icid=%d) not freed, expecting %d ints but got %d ints\n",
1038 cq, cq->icid, oparams.num_cq_notif, cq->cnq_notif);
1043 static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1044 struct ib_qp_attr *attr,
1046 struct qed_rdma_modify_qp_in_params
1049 const struct ib_gid_attr *gid_attr;
1050 enum rdma_network_type nw_type;
1051 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
1056 gid_attr = grh->sgid_attr;
1057 ret = rdma_read_gid_l2_fields(gid_attr, &qp_params->vlan_id, NULL);
1061 nw_type = rdma_gid_attr_network_type(gid_attr);
1063 case RDMA_NETWORK_IPV6:
1064 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1065 sizeof(qp_params->sgid));
1066 memcpy(&qp_params->dgid.bytes[0],
1068 sizeof(qp_params->dgid));
1069 qp_params->roce_mode = ROCE_V2_IPV6;
1070 SET_FIELD(qp_params->modify_flags,
1071 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1073 case RDMA_NETWORK_IB:
1074 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1075 sizeof(qp_params->sgid));
1076 memcpy(&qp_params->dgid.bytes[0],
1078 sizeof(qp_params->dgid));
1079 qp_params->roce_mode = ROCE_V1;
1081 case RDMA_NETWORK_IPV4:
1082 memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1083 memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
1084 ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw);
1085 qp_params->sgid.ipv4_addr = ipv4_addr;
1087 qedr_get_ipv4_from_gid(grh->dgid.raw);
1088 qp_params->dgid.ipv4_addr = ipv4_addr;
1089 SET_FIELD(qp_params->modify_flags,
1090 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1091 qp_params->roce_mode = ROCE_V2_IPV4;
1095 for (i = 0; i < 4; i++) {
1096 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1097 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1100 if (qp_params->vlan_id >= VLAN_CFI_MASK)
1101 qp_params->vlan_id = 0;
1106 static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
1107 struct ib_qp_init_attr *attrs,
1108 struct ib_udata *udata)
1110 struct qedr_device_attr *qattr = &dev->attr;
1112 /* QP0... attrs->qp_type == IB_QPT_GSI */
1113 if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
1114 DP_DEBUG(dev, QEDR_MSG_QP,
1115 "create qp: unsupported qp type=0x%x requested\n",
1120 if (attrs->cap.max_send_wr > qattr->max_sqe) {
1122 "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1123 attrs->cap.max_send_wr, qattr->max_sqe);
1127 if (attrs->cap.max_inline_data > qattr->max_inline) {
1129 "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1130 attrs->cap.max_inline_data, qattr->max_inline);
1134 if (attrs->cap.max_send_sge > qattr->max_sge) {
1136 "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1137 attrs->cap.max_send_sge, qattr->max_sge);
1141 if (attrs->cap.max_recv_sge > qattr->max_sge) {
1143 "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1144 attrs->cap.max_recv_sge, qattr->max_sge);
1148 /* Unprivileged user space cannot create special QP */
1149 if (udata && attrs->qp_type == IB_QPT_GSI) {
1151 "create qp: userspace can't create special QPs of type=0x%x\n",
1159 static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1160 struct qedr_srq *srq, struct ib_udata *udata)
1162 struct qedr_create_srq_uresp uresp = {};
1165 uresp.srq_id = srq->srq_id;
1167 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1169 DP_ERR(dev, "create srq: problem copying data to user space\n");
1174 static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1175 struct qedr_create_qp_uresp *uresp,
1178 /* iWARP requires two doorbells per RQ. */
1179 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1180 uresp->rq_db_offset =
1181 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1182 uresp->rq_db2_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1184 uresp->rq_db_offset =
1185 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1188 uresp->rq_icid = qp->icid;
1191 static void qedr_copy_sq_uresp(struct qedr_dev *dev,
1192 struct qedr_create_qp_uresp *uresp,
1195 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1197 /* iWARP uses the same cid for rq and sq */
1198 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1199 uresp->sq_icid = qp->icid;
1201 uresp->sq_icid = qp->icid + 1;
1204 static int qedr_copy_qp_uresp(struct qedr_dev *dev,
1205 struct qedr_qp *qp, struct ib_udata *udata)
1207 struct qedr_create_qp_uresp uresp;
1210 memset(&uresp, 0, sizeof(uresp));
1211 qedr_copy_sq_uresp(dev, &uresp, qp);
1212 qedr_copy_rq_uresp(dev, &uresp, qp);
1214 uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1215 uresp.qp_id = qp->qp_id;
1217 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1220 "create qp: failed a copy to user space with qp icid=0x%x.\n",
1226 static void qedr_set_common_qp_params(struct qedr_dev *dev,
1229 struct ib_qp_init_attr *attrs)
1231 spin_lock_init(&qp->q_lock);
1232 atomic_set(&qp->refcnt, 1);
1234 qp->qp_type = attrs->qp_type;
1235 qp->max_inline_data = attrs->cap.max_inline_data;
1236 qp->sq.max_sges = attrs->cap.max_send_sge;
1237 qp->state = QED_ROCE_QP_STATE_RESET;
1238 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
1239 qp->sq_cq = get_qedr_cq(attrs->send_cq);
1243 qp->srq = get_qedr_srq(attrs->srq);
1245 qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1246 qp->rq.max_sges = attrs->cap.max_recv_sge;
1247 DP_DEBUG(dev, QEDR_MSG_QP,
1248 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1249 qp->rq.max_sges, qp->rq_cq->icid);
1252 DP_DEBUG(dev, QEDR_MSG_QP,
1253 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1254 pd->pd_id, qp->qp_type, qp->max_inline_data,
1255 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1256 DP_DEBUG(dev, QEDR_MSG_QP,
1257 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1258 qp->sq.max_sges, qp->sq_cq->icid);
1261 static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1263 qp->sq.db = dev->db_addr +
1264 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1265 qp->sq.db_data.data.icid = qp->icid + 1;
1267 qp->rq.db = dev->db_addr +
1268 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1269 qp->rq.db_data.data.icid = qp->icid;
1273 static int qedr_check_srq_params(struct qedr_dev *dev,
1274 struct ib_srq_init_attr *attrs,
1275 struct ib_udata *udata)
1277 struct qedr_device_attr *qattr = &dev->attr;
1279 if (attrs->attr.max_wr > qattr->max_srq_wr) {
1281 "create srq: unsupported srq_wr=0x%x requested (max_srq_wr=0x%x)\n",
1282 attrs->attr.max_wr, qattr->max_srq_wr);
1286 if (attrs->attr.max_sge > qattr->max_sge) {
1288 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1289 attrs->attr.max_sge, qattr->max_sge);
1296 static void qedr_free_srq_user_params(struct qedr_srq *srq)
1298 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1299 ib_umem_release(srq->usrq.umem);
1300 ib_umem_release(srq->prod_umem);
1303 static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1305 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1306 struct qedr_dev *dev = srq->dev;
1308 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1310 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1311 hw_srq->virt_prod_pair_addr,
1312 hw_srq->phy_prod_pair_addr);
1315 static int qedr_init_srq_user_params(struct ib_udata *udata,
1316 struct qedr_srq *srq,
1317 struct qedr_create_srq_ureq *ureq,
1318 int access, int dmasync)
1320 struct scatterlist *sg;
1323 rc = qedr_init_user_queue(udata, srq->dev, &srq->usrq, ureq->srq_addr,
1324 ureq->srq_len, access, dmasync, 1);
1329 ib_umem_get(udata, ureq->prod_pair_addr,
1330 sizeof(struct rdma_srq_producers), access, dmasync);
1331 if (IS_ERR(srq->prod_umem)) {
1332 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1333 ib_umem_release(srq->usrq.umem);
1335 "create srq: failed ib_umem_get for producer, got %ld\n",
1336 PTR_ERR(srq->prod_umem));
1337 return PTR_ERR(srq->prod_umem);
1340 sg = srq->prod_umem->sg_head.sgl;
1341 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1346 static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1347 struct qedr_dev *dev,
1348 struct ib_srq_init_attr *init_attr)
1350 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1351 dma_addr_t phy_prod_pair_addr;
1356 va = dma_alloc_coherent(&dev->pdev->dev,
1357 sizeof(struct rdma_srq_producers),
1358 &phy_prod_pair_addr, GFP_KERNEL);
1361 "create srq: failed to allocate dma memory for producer\n");
1365 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
1366 hw_srq->virt_prod_pair_addr = va;
1368 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
1369 rc = dev->ops->common->chain_alloc(dev->cdev,
1370 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1372 QED_CHAIN_CNT_TYPE_U32,
1374 QEDR_SRQ_WQE_ELEM_SIZE,
1375 &hw_srq->pbl, NULL);
1379 hw_srq->num_elems = num_elems;
1384 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1385 va, phy_prod_pair_addr);
1389 int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
1390 struct ib_udata *udata)
1392 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1393 struct qed_rdma_create_srq_in_params in_params = {};
1394 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1395 struct qed_rdma_create_srq_out_params out_params;
1396 struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
1397 struct qedr_create_srq_ureq ureq = {};
1398 u64 pbl_base_addr, phy_prod_pair_addr;
1399 struct qedr_srq_hwq_info *hw_srq;
1400 u32 page_cnt, page_size;
1401 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1404 DP_DEBUG(dev, QEDR_MSG_QP,
1405 "create SRQ called from %s (pd %p)\n",
1406 (udata) ? "User lib" : "kernel", pd);
1408 rc = qedr_check_srq_params(dev, init_attr, udata);
1413 hw_srq = &srq->hw_srq;
1414 spin_lock_init(&srq->lock);
1416 hw_srq->max_wr = init_attr->attr.max_wr;
1417 hw_srq->max_sges = init_attr->attr.max_sge;
1420 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
1422 "create srq: problem copying data from user space\n");
1426 rc = qedr_init_srq_user_params(udata, srq, &ureq, 0, 0);
1430 page_cnt = srq->usrq.pbl_info.num_pbes;
1431 pbl_base_addr = srq->usrq.pbl_tbl->pa;
1432 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1433 page_size = PAGE_SIZE;
1435 struct qed_chain *pbl;
1437 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1442 page_cnt = qed_chain_get_page_cnt(pbl);
1443 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1444 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1445 page_size = QED_CHAIN_PAGE_SIZE;
1448 in_params.pd_id = pd->pd_id;
1449 in_params.pbl_base_addr = pbl_base_addr;
1450 in_params.prod_pair_addr = phy_prod_pair_addr;
1451 in_params.num_pages = page_cnt;
1452 in_params.page_size = page_size;
1454 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1458 srq->srq_id = out_params.srq_id;
1461 rc = qedr_copy_srq_uresp(dev, srq, udata);
1466 rc = xa_insert_irq(&dev->srqs, srq->srq_id, srq, GFP_KERNEL);
1470 DP_DEBUG(dev, QEDR_MSG_SRQ,
1471 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1475 destroy_in_params.srq_id = srq->srq_id;
1477 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1480 qedr_free_srq_user_params(srq);
1482 qedr_free_srq_kernel_params(srq);
1487 void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
1489 struct qed_rdma_destroy_srq_in_params in_params = {};
1490 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1491 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1493 xa_erase_irq(&dev->srqs, srq->srq_id);
1494 in_params.srq_id = srq->srq_id;
1495 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1498 qedr_free_srq_user_params(srq);
1500 qedr_free_srq_kernel_params(srq);
1502 DP_DEBUG(dev, QEDR_MSG_SRQ,
1503 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1507 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
1508 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
1510 struct qed_rdma_modify_srq_in_params in_params = {};
1511 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1512 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1515 if (attr_mask & IB_SRQ_MAX_WR) {
1517 "modify srq: invalid attribute mask=0x%x specified for %p\n",
1522 if (attr_mask & IB_SRQ_LIMIT) {
1523 if (attr->srq_limit >= srq->hw_srq.max_wr) {
1525 "modify srq: invalid srq_limit=0x%x (max_srq_limit=0x%x)\n",
1526 attr->srq_limit, srq->hw_srq.max_wr);
1530 in_params.srq_id = srq->srq_id;
1531 in_params.wqe_limit = attr->srq_limit;
1532 rc = dev->ops->rdma_modify_srq(dev->rdma_ctx, &in_params);
1537 srq->srq_limit = attr->srq_limit;
1539 DP_DEBUG(dev, QEDR_MSG_SRQ,
1540 "modify srq: modified srq with srq_id=0x%0x\n", srq->srq_id);
1546 qedr_init_common_qp_in_params(struct qedr_dev *dev,
1549 struct ib_qp_init_attr *attrs,
1550 bool fmr_and_reserved_lkey,
1551 struct qed_rdma_create_qp_in_params *params)
1553 /* QP handle to be written in an async event */
1554 params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1555 params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
1557 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1558 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
1559 params->pd = pd->pd_id;
1560 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1561 params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1562 params->stats_queue = 0;
1564 params->use_srq = false;
1567 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1570 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1571 params->srq_id = qp->srq->srq_id;
1572 params->use_srq = true;
1576 static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
1578 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1587 qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
1591 qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
1593 struct qed_rdma_create_qp_out_params *out_params)
1595 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1596 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1598 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1599 &qp->usq.pbl_info, FW_PAGE_SHIFT);
1601 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1602 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1605 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1606 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1609 static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1612 ib_umem_release(qp->usq.umem);
1613 qp->usq.umem = NULL;
1616 ib_umem_release(qp->urq.umem);
1617 qp->urq.umem = NULL;
1620 static int qedr_create_user_qp(struct qedr_dev *dev,
1623 struct ib_udata *udata,
1624 struct ib_qp_init_attr *attrs)
1626 struct qed_rdma_create_qp_in_params in_params;
1627 struct qed_rdma_create_qp_out_params out_params;
1628 struct qedr_pd *pd = get_qedr_pd(ibpd);
1629 struct qedr_create_qp_ureq ureq;
1630 int alloc_and_init = rdma_protocol_roce(&dev->ibdev, 1);
1633 memset(&ureq, 0, sizeof(ureq));
1634 rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
1636 DP_ERR(dev, "Problem copying data from user space\n");
1640 /* SQ - read access only (0), dma sync not required (0) */
1641 rc = qedr_init_user_queue(udata, dev, &qp->usq, ureq.sq_addr,
1642 ureq.sq_len, 0, 0, alloc_and_init);
1647 /* RQ - read access only (0), dma sync not required (0) */
1648 rc = qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr,
1649 ureq.rq_len, 0, 0, alloc_and_init);
1654 memset(&in_params, 0, sizeof(in_params));
1655 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1656 in_params.qp_handle_lo = ureq.qp_handle_lo;
1657 in_params.qp_handle_hi = ureq.qp_handle_hi;
1658 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1659 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1661 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1662 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1665 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1666 &in_params, &out_params);
1673 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1674 qedr_iwarp_populate_user_qp(dev, qp, &out_params);
1676 qp->qp_id = out_params.qp_id;
1677 qp->icid = out_params.icid;
1679 rc = qedr_copy_qp_uresp(dev, qp, udata);
1683 qedr_qp_user_print(dev, qp);
1687 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1689 DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1692 qedr_cleanup_user(dev, qp);
1696 static void qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1698 qp->sq.db = dev->db_addr +
1699 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1700 qp->sq.db_data.data.icid = qp->icid;
1702 qp->rq.db = dev->db_addr +
1703 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1704 qp->rq.db_data.data.icid = qp->icid;
1705 qp->rq.iwarp_db2 = dev->db_addr +
1706 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1707 qp->rq.iwarp_db2_data.data.icid = qp->icid;
1708 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
1712 qedr_roce_create_kernel_qp(struct qedr_dev *dev,
1714 struct qed_rdma_create_qp_in_params *in_params,
1715 u32 n_sq_elems, u32 n_rq_elems)
1717 struct qed_rdma_create_qp_out_params out_params;
1720 rc = dev->ops->common->chain_alloc(dev->cdev,
1721 QED_CHAIN_USE_TO_PRODUCE,
1723 QED_CHAIN_CNT_TYPE_U32,
1725 QEDR_SQE_ELEMENT_SIZE,
1731 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
1732 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
1734 rc = dev->ops->common->chain_alloc(dev->cdev,
1735 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1737 QED_CHAIN_CNT_TYPE_U32,
1739 QEDR_RQE_ELEMENT_SIZE,
1744 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
1745 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
1747 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1748 in_params, &out_params);
1753 qp->qp_id = out_params.qp_id;
1754 qp->icid = out_params.icid;
1756 qedr_set_roce_db_info(dev, qp);
1761 qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
1763 struct qed_rdma_create_qp_in_params *in_params,
1764 u32 n_sq_elems, u32 n_rq_elems)
1766 struct qed_rdma_create_qp_out_params out_params;
1767 struct qed_chain_ext_pbl ext_pbl;
1770 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
1771 QEDR_SQE_ELEMENT_SIZE,
1772 QED_CHAIN_MODE_PBL);
1773 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
1774 QEDR_RQE_ELEMENT_SIZE,
1775 QED_CHAIN_MODE_PBL);
1777 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1778 in_params, &out_params);
1783 /* Now we allocate the chain */
1784 ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
1785 ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
1787 rc = dev->ops->common->chain_alloc(dev->cdev,
1788 QED_CHAIN_USE_TO_PRODUCE,
1790 QED_CHAIN_CNT_TYPE_U32,
1792 QEDR_SQE_ELEMENT_SIZE,
1793 &qp->sq.pbl, &ext_pbl);
1798 ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
1799 ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
1801 rc = dev->ops->common->chain_alloc(dev->cdev,
1802 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1804 QED_CHAIN_CNT_TYPE_U32,
1806 QEDR_RQE_ELEMENT_SIZE,
1807 &qp->rq.pbl, &ext_pbl);
1812 qp->qp_id = out_params.qp_id;
1813 qp->icid = out_params.icid;
1815 qedr_set_iwarp_db_info(dev, qp);
1819 dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1824 static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
1826 dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
1827 kfree(qp->wqe_wr_id);
1829 dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
1830 kfree(qp->rqe_wr_id);
1833 static int qedr_create_kernel_qp(struct qedr_dev *dev,
1836 struct ib_qp_init_attr *attrs)
1838 struct qed_rdma_create_qp_in_params in_params;
1839 struct qedr_pd *pd = get_qedr_pd(ibpd);
1845 memset(&in_params, 0, sizeof(in_params));
1847 /* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
1848 * the ring. The ring should allow at least a single WR, even if the
1849 * user requested none, due to allocation issues.
1850 * We should add an extra WR since the prod and cons indices of
1851 * wqe_wr_id are managed in such a way that the WQ is considered full
1852 * when (prod+1)%max_wr==cons. We currently don't do that because we
1853 * double the number of entries due an iSER issue that pushes far more
1854 * WRs than indicated. If we decline its ib_post_send() then we get
1855 * error prints in the dmesg we'd like to avoid.
1857 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
1860 qp->wqe_wr_id = kcalloc(qp->sq.max_wr, sizeof(*qp->wqe_wr_id),
1862 if (!qp->wqe_wr_id) {
1863 DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
1867 /* QP handle to be written in CQE */
1868 in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
1869 in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
1871 /* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
1872 * the ring. There ring should allow at least a single WR, even if the
1873 * user requested none, due to allocation issues.
1875 qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
1877 /* Allocate driver internal RQ array */
1878 qp->rqe_wr_id = kcalloc(qp->rq.max_wr, sizeof(*qp->rqe_wr_id),
1880 if (!qp->rqe_wr_id) {
1882 "create qp: failed RQ shadow memory allocation\n");
1883 kfree(qp->wqe_wr_id);
1887 qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
1889 n_sq_entries = attrs->cap.max_send_wr;
1890 n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
1891 n_sq_entries = max_t(u32, n_sq_entries, 1);
1892 n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
1894 n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
1896 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1897 rc = qedr_iwarp_create_kernel_qp(dev, qp, &in_params,
1898 n_sq_elems, n_rq_elems);
1900 rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
1901 n_sq_elems, n_rq_elems);
1903 qedr_cleanup_kernel(dev, qp);
1908 struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
1909 struct ib_qp_init_attr *attrs,
1910 struct ib_udata *udata)
1912 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
1913 struct qedr_pd *pd = get_qedr_pd(ibpd);
1918 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
1919 udata ? "user library" : "kernel", pd);
1921 rc = qedr_check_qp_attrs(ibpd, dev, attrs, udata);
1925 DP_DEBUG(dev, QEDR_MSG_QP,
1926 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
1927 udata ? "user library" : "kernel", attrs->event_handler, pd,
1928 get_qedr_cq(attrs->send_cq),
1929 get_qedr_cq(attrs->send_cq)->icid,
1930 get_qedr_cq(attrs->recv_cq),
1931 attrs->recv_cq ? get_qedr_cq(attrs->recv_cq)->icid : 0);
1933 qp = kzalloc(sizeof(*qp), GFP_KERNEL);
1935 DP_ERR(dev, "create qp: failed allocating memory\n");
1936 return ERR_PTR(-ENOMEM);
1939 qedr_set_common_qp_params(dev, qp, pd, attrs);
1941 if (attrs->qp_type == IB_QPT_GSI) {
1942 ibqp = qedr_create_gsi_qp(dev, attrs, qp);
1949 rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
1951 rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
1956 qp->ibqp.qp_num = qp->qp_id;
1958 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1959 rc = xa_insert_irq(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
1969 return ERR_PTR(-EFAULT);
1972 static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
1975 case QED_ROCE_QP_STATE_RESET:
1976 return IB_QPS_RESET;
1977 case QED_ROCE_QP_STATE_INIT:
1979 case QED_ROCE_QP_STATE_RTR:
1981 case QED_ROCE_QP_STATE_RTS:
1983 case QED_ROCE_QP_STATE_SQD:
1985 case QED_ROCE_QP_STATE_ERR:
1987 case QED_ROCE_QP_STATE_SQE:
1993 static enum qed_roce_qp_state qedr_get_state_from_ibqp(
1994 enum ib_qp_state qp_state)
1998 return QED_ROCE_QP_STATE_RESET;
2000 return QED_ROCE_QP_STATE_INIT;
2002 return QED_ROCE_QP_STATE_RTR;
2004 return QED_ROCE_QP_STATE_RTS;
2006 return QED_ROCE_QP_STATE_SQD;
2008 return QED_ROCE_QP_STATE_ERR;
2010 return QED_ROCE_QP_STATE_ERR;
2014 static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
2016 qed_chain_reset(&qph->pbl);
2020 qph->db_data.data.value = cpu_to_le16(0);
2023 static int qedr_update_qp_state(struct qedr_dev *dev,
2025 enum qed_roce_qp_state cur_state,
2026 enum qed_roce_qp_state new_state)
2030 if (new_state == cur_state)
2033 switch (cur_state) {
2034 case QED_ROCE_QP_STATE_RESET:
2035 switch (new_state) {
2036 case QED_ROCE_QP_STATE_INIT:
2037 qp->prev_wqe_size = 0;
2038 qedr_reset_qp_hwq_info(&qp->sq);
2039 qedr_reset_qp_hwq_info(&qp->rq);
2046 case QED_ROCE_QP_STATE_INIT:
2047 switch (new_state) {
2048 case QED_ROCE_QP_STATE_RTR:
2049 /* Update doorbell (in case post_recv was
2050 * done before move to RTR)
2053 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2054 writel(qp->rq.db_data.raw, qp->rq.db);
2055 /* Make sure write takes effect */
2059 case QED_ROCE_QP_STATE_ERR:
2062 /* Invalid state change. */
2067 case QED_ROCE_QP_STATE_RTR:
2069 switch (new_state) {
2070 case QED_ROCE_QP_STATE_RTS:
2072 case QED_ROCE_QP_STATE_ERR:
2075 /* Invalid state change. */
2080 case QED_ROCE_QP_STATE_RTS:
2082 switch (new_state) {
2083 case QED_ROCE_QP_STATE_SQD:
2085 case QED_ROCE_QP_STATE_ERR:
2088 /* Invalid state change. */
2093 case QED_ROCE_QP_STATE_SQD:
2095 switch (new_state) {
2096 case QED_ROCE_QP_STATE_RTS:
2097 case QED_ROCE_QP_STATE_ERR:
2100 /* Invalid state change. */
2105 case QED_ROCE_QP_STATE_ERR:
2107 switch (new_state) {
2108 case QED_ROCE_QP_STATE_RESET:
2109 if ((qp->rq.prod != qp->rq.cons) ||
2110 (qp->sq.prod != qp->sq.cons)) {
2112 "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
2113 qp->rq.prod, qp->rq.cons, qp->sq.prod,
2131 int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2132 int attr_mask, struct ib_udata *udata)
2134 struct qedr_qp *qp = get_qedr_qp(ibqp);
2135 struct qed_rdma_modify_qp_in_params qp_params = { 0 };
2136 struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
2137 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
2138 enum ib_qp_state old_qp_state, new_qp_state;
2139 enum qed_roce_qp_state cur_state;
2142 DP_DEBUG(dev, QEDR_MSG_QP,
2143 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
2146 old_qp_state = qedr_get_ibqp_state(qp->state);
2147 if (attr_mask & IB_QP_STATE)
2148 new_qp_state = attr->qp_state;
2150 new_qp_state = old_qp_state;
2152 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2153 if (!ib_modify_qp_is_ok(old_qp_state, new_qp_state,
2154 ibqp->qp_type, attr_mask)) {
2156 "modify qp: invalid attribute mask=0x%x specified for\n"
2157 "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
2158 attr_mask, qp->qp_id, ibqp->qp_type,
2159 old_qp_state, new_qp_state);
2165 /* Translate the masks... */
2166 if (attr_mask & IB_QP_STATE) {
2167 SET_FIELD(qp_params.modify_flags,
2168 QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
2169 qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
2172 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
2173 qp_params.sqd_async = true;
2175 if (attr_mask & IB_QP_PKEY_INDEX) {
2176 SET_FIELD(qp_params.modify_flags,
2177 QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
2178 if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
2183 qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
2186 if (attr_mask & IB_QP_QKEY)
2187 qp->qkey = attr->qkey;
2189 if (attr_mask & IB_QP_ACCESS_FLAGS) {
2190 SET_FIELD(qp_params.modify_flags,
2191 QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
2192 qp_params.incoming_rdma_read_en = attr->qp_access_flags &
2193 IB_ACCESS_REMOTE_READ;
2194 qp_params.incoming_rdma_write_en = attr->qp_access_flags &
2195 IB_ACCESS_REMOTE_WRITE;
2196 qp_params.incoming_atomic_en = attr->qp_access_flags &
2197 IB_ACCESS_REMOTE_ATOMIC;
2200 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
2201 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2204 if (attr_mask & IB_QP_PATH_MTU) {
2205 if (attr->path_mtu < IB_MTU_256 ||
2206 attr->path_mtu > IB_MTU_4096) {
2207 pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
2211 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
2212 ib_mtu_enum_to_int(iboe_get_mtu
2218 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2219 pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
2222 SET_FIELD(qp_params.modify_flags,
2223 QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
2225 qp_params.traffic_class_tos = grh->traffic_class;
2226 qp_params.flow_label = grh->flow_label;
2227 qp_params.hop_limit_ttl = grh->hop_limit;
2229 qp->sgid_idx = grh->sgid_index;
2231 rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
2234 "modify qp: problems with GID index %d (rc=%d)\n",
2235 grh->sgid_index, rc);
2239 rc = qedr_get_dmac(dev, &attr->ah_attr,
2240 qp_params.remote_mac_addr);
2244 qp_params.use_local_mac = true;
2245 ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
2247 DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
2248 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
2249 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
2250 DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
2251 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
2252 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
2253 DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
2254 qp_params.remote_mac_addr);
2256 qp_params.mtu = qp->mtu;
2257 qp_params.lb_indication = false;
2260 if (!qp_params.mtu) {
2261 /* Stay with current MTU */
2263 qp_params.mtu = qp->mtu;
2266 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2269 if (attr_mask & IB_QP_TIMEOUT) {
2270 SET_FIELD(qp_params.modify_flags,
2271 QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
2273 /* The received timeout value is an exponent used like this:
2274 * "12.7.34 LOCAL ACK TIMEOUT
2275 * Value representing the transport (ACK) timeout for use by
2276 * the remote, expressed as: 4.096 * 2^timeout [usec]"
2277 * The FW expects timeout in msec so we need to divide the usec
2278 * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
2279 * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
2280 * The value of zero means infinite so we use a 'max_t' to make
2281 * sure that sub 1 msec values will be configured as 1 msec.
2284 qp_params.ack_timeout =
2285 1 << max_t(int, attr->timeout - 8, 0);
2287 qp_params.ack_timeout = 0;
2290 if (attr_mask & IB_QP_RETRY_CNT) {
2291 SET_FIELD(qp_params.modify_flags,
2292 QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
2293 qp_params.retry_cnt = attr->retry_cnt;
2296 if (attr_mask & IB_QP_RNR_RETRY) {
2297 SET_FIELD(qp_params.modify_flags,
2298 QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
2299 qp_params.rnr_retry_cnt = attr->rnr_retry;
2302 if (attr_mask & IB_QP_RQ_PSN) {
2303 SET_FIELD(qp_params.modify_flags,
2304 QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
2305 qp_params.rq_psn = attr->rq_psn;
2306 qp->rq_psn = attr->rq_psn;
2309 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2310 if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
2313 "unsupported max_rd_atomic=%d, supported=%d\n",
2314 attr->max_rd_atomic,
2315 dev->attr.max_qp_req_rd_atomic_resc);
2319 SET_FIELD(qp_params.modify_flags,
2320 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
2321 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
2324 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
2325 SET_FIELD(qp_params.modify_flags,
2326 QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
2327 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
2330 if (attr_mask & IB_QP_SQ_PSN) {
2331 SET_FIELD(qp_params.modify_flags,
2332 QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
2333 qp_params.sq_psn = attr->sq_psn;
2334 qp->sq_psn = attr->sq_psn;
2337 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2338 if (attr->max_dest_rd_atomic >
2339 dev->attr.max_qp_resp_rd_atomic_resc) {
2341 "unsupported max_dest_rd_atomic=%d, supported=%d\n",
2342 attr->max_dest_rd_atomic,
2343 dev->attr.max_qp_resp_rd_atomic_resc);
2349 SET_FIELD(qp_params.modify_flags,
2350 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
2351 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
2354 if (attr_mask & IB_QP_DEST_QPN) {
2355 SET_FIELD(qp_params.modify_flags,
2356 QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
2358 qp_params.dest_qp = attr->dest_qp_num;
2359 qp->dest_qp_num = attr->dest_qp_num;
2362 cur_state = qp->state;
2364 /* Update the QP state before the actual ramrod to prevent a race with
2365 * fast path. Modifying the QP state to error will cause the device to
2366 * flush the CQEs and while polling the flushed CQEs will considered as
2367 * a potential issue if the QP isn't in error state.
2369 if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
2370 !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
2371 qp->state = QED_ROCE_QP_STATE_ERR;
2373 if (qp->qp_type != IB_QPT_GSI)
2374 rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
2375 qp->qed_qp, &qp_params);
2377 if (attr_mask & IB_QP_STATE) {
2378 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
2379 rc = qedr_update_qp_state(dev, qp, cur_state,
2380 qp_params.new_state);
2381 qp->state = qp_params.new_state;
2388 static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
2390 int ib_qp_acc_flags = 0;
2392 if (params->incoming_rdma_write_en)
2393 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
2394 if (params->incoming_rdma_read_en)
2395 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
2396 if (params->incoming_atomic_en)
2397 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
2398 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
2399 return ib_qp_acc_flags;
2402 int qedr_query_qp(struct ib_qp *ibqp,
2403 struct ib_qp_attr *qp_attr,
2404 int attr_mask, struct ib_qp_init_attr *qp_init_attr)
2406 struct qed_rdma_query_qp_out_params params;
2407 struct qedr_qp *qp = get_qedr_qp(ibqp);
2408 struct qedr_dev *dev = qp->dev;
2411 memset(¶ms, 0, sizeof(params));
2413 rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, ¶ms);
2417 memset(qp_attr, 0, sizeof(*qp_attr));
2418 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2420 qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2421 qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
2422 qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
2423 qp_attr->path_mig_state = IB_MIG_MIGRATED;
2424 qp_attr->rq_psn = params.rq_psn;
2425 qp_attr->sq_psn = params.sq_psn;
2426 qp_attr->dest_qp_num = params.dest_qp;
2428 qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(¶ms);
2430 qp_attr->cap.max_send_wr = qp->sq.max_wr;
2431 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2432 qp_attr->cap.max_send_sge = qp->sq.max_sges;
2433 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
2434 qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
2435 qp_init_attr->cap = qp_attr->cap;
2437 qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
2438 rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
2439 params.flow_label, qp->sgid_idx,
2440 params.hop_limit_ttl, params.traffic_class_tos);
2441 rdma_ah_set_dgid_raw(&qp_attr->ah_attr, ¶ms.dgid.bytes[0]);
2442 rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
2443 rdma_ah_set_sl(&qp_attr->ah_attr, 0);
2444 qp_attr->timeout = params.timeout;
2445 qp_attr->rnr_retry = params.rnr_retry;
2446 qp_attr->retry_cnt = params.retry_cnt;
2447 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2448 qp_attr->pkey_index = params.pkey_index;
2449 qp_attr->port_num = 1;
2450 rdma_ah_set_path_bits(&qp_attr->ah_attr, 0);
2451 rdma_ah_set_static_rate(&qp_attr->ah_attr, 0);
2452 qp_attr->alt_pkey_index = 0;
2453 qp_attr->alt_port_num = 0;
2454 qp_attr->alt_timeout = 0;
2455 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2457 qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2458 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2459 qp_attr->max_rd_atomic = params.max_rd_atomic;
2460 qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2462 DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2463 qp_attr->cap.max_inline_data);
2469 static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
2470 struct ib_udata *udata)
2474 if (qp->qp_type != IB_QPT_GSI) {
2475 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2481 qedr_cleanup_user(dev, qp);
2483 qedr_cleanup_kernel(dev, qp);
2488 int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
2490 struct qedr_qp *qp = get_qedr_qp(ibqp);
2491 struct qedr_dev *dev = qp->dev;
2492 struct ib_qp_attr attr;
2496 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2499 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2500 if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2501 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2502 (qp->state != QED_ROCE_QP_STATE_INIT)) {
2504 attr.qp_state = IB_QPS_ERR;
2505 attr_mask |= IB_QP_STATE;
2507 /* Change the QP state to ERROR */
2508 qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2511 /* Wait for the connect/accept to complete */
2515 while (qp->ep->during_connect) {
2516 DP_DEBUG(dev, QEDR_MSG_QP,
2517 "Still in during connect/accept\n");
2520 if (wait_count++ > 200) {
2522 "during connect timeout\n");
2529 if (qp->qp_type == IB_QPT_GSI)
2530 qedr_destroy_gsi_qp(dev);
2532 qedr_free_qp_resources(dev, qp, udata);
2534 if (atomic_dec_and_test(&qp->refcnt) &&
2535 rdma_protocol_iwarp(&dev->ibdev, 1)) {
2536 xa_erase_irq(&dev->qps, qp->qp_id);
2542 int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
2543 struct ib_udata *udata)
2545 struct qedr_ah *ah = get_qedr_ah(ibah);
2547 rdma_copy_ah_attr(&ah->attr, attr);
2552 void qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
2554 struct qedr_ah *ah = get_qedr_ah(ibah);
2556 rdma_destroy_ah_attr(&ah->attr);
2559 static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2561 struct qedr_pbl *pbl, *tmp;
2563 if (info->pbl_table)
2564 list_add_tail(&info->pbl_table->list_entry,
2565 &info->free_pbl_list);
2567 if (!list_empty(&info->inuse_pbl_list))
2568 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2570 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2571 list_del(&pbl->list_entry);
2572 qedr_free_pbl(dev, &info->pbl_info, pbl);
2576 static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2577 size_t page_list_len, bool two_layered)
2579 struct qedr_pbl *tmp;
2582 INIT_LIST_HEAD(&info->free_pbl_list);
2583 INIT_LIST_HEAD(&info->inuse_pbl_list);
2585 rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2586 page_list_len, two_layered);
2590 info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2591 if (IS_ERR(info->pbl_table)) {
2592 rc = PTR_ERR(info->pbl_table);
2596 DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2597 &info->pbl_table->pa);
2599 /* in usual case we use 2 PBLs, so we add one to free
2600 * list and allocating another one
2602 tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2604 DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2608 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2610 DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2614 free_mr_info(dev, info);
2619 struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2620 u64 usr_addr, int acc, struct ib_udata *udata)
2622 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2627 pd = get_qedr_pd(ibpd);
2628 DP_DEBUG(dev, QEDR_MSG_MR,
2629 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2630 pd->pd_id, start, len, usr_addr, acc);
2632 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2633 return ERR_PTR(-EINVAL);
2635 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2639 mr->type = QEDR_MR_USER;
2641 mr->umem = ib_umem_get(udata, start, len, acc, 0);
2642 if (IS_ERR(mr->umem)) {
2647 rc = init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
2651 qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
2652 &mr->info.pbl_info, PAGE_SHIFT);
2654 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2656 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2660 /* Index only, 18 bit long, lkey = itid << 8 | key */
2661 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2663 mr->hw_mr.pd = pd->pd_id;
2664 mr->hw_mr.local_read = 1;
2665 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2666 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2667 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2668 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2669 mr->hw_mr.mw_bind = false;
2670 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2671 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2672 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2673 mr->hw_mr.page_size_log = PAGE_SHIFT;
2674 mr->hw_mr.fbo = ib_umem_offset(mr->umem);
2675 mr->hw_mr.length = len;
2676 mr->hw_mr.vaddr = usr_addr;
2677 mr->hw_mr.zbva = false;
2678 mr->hw_mr.phy_mr = false;
2679 mr->hw_mr.dma_mr = false;
2681 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2683 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2687 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2688 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2689 mr->hw_mr.remote_atomic)
2690 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2692 DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
2697 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2699 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2705 int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
2707 struct qedr_mr *mr = get_qedr_mr(ib_mr);
2708 struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
2711 rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
2715 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2717 if ((mr->type != QEDR_MR_DMA) && (mr->type != QEDR_MR_FRMR))
2718 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2720 /* it could be user registered memory. */
2722 ib_umem_release(mr->umem);
2729 static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
2730 int max_page_list_len)
2732 struct qedr_pd *pd = get_qedr_pd(ibpd);
2733 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2737 DP_DEBUG(dev, QEDR_MSG_MR,
2738 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
2741 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2746 mr->type = QEDR_MR_FRMR;
2748 rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
2752 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2754 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2758 /* Index only, 18 bit long, lkey = itid << 8 | key */
2759 mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
2761 mr->hw_mr.pd = pd->pd_id;
2762 mr->hw_mr.local_read = 1;
2763 mr->hw_mr.local_write = 0;
2764 mr->hw_mr.remote_read = 0;
2765 mr->hw_mr.remote_write = 0;
2766 mr->hw_mr.remote_atomic = 0;
2767 mr->hw_mr.mw_bind = false;
2768 mr->hw_mr.pbl_ptr = 0;
2769 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2770 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2772 mr->hw_mr.length = 0;
2773 mr->hw_mr.vaddr = 0;
2774 mr->hw_mr.zbva = false;
2775 mr->hw_mr.phy_mr = true;
2776 mr->hw_mr.dma_mr = false;
2778 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2780 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2784 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2785 mr->ibmr.rkey = mr->ibmr.lkey;
2787 DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
2791 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2797 struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
2798 u32 max_num_sg, struct ib_udata *udata)
2802 if (mr_type != IB_MR_TYPE_MEM_REG)
2803 return ERR_PTR(-EINVAL);
2805 mr = __qedr_alloc_mr(ibpd, max_num_sg);
2808 return ERR_PTR(-EINVAL);
2813 static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
2815 struct qedr_mr *mr = get_qedr_mr(ibmr);
2816 struct qedr_pbl *pbl_table;
2817 struct regpair *pbe;
2820 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
2821 DP_ERR(mr->dev, "qedr_set_page fails when %d\n", mr->npages);
2825 DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
2828 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
2829 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
2830 pbe = (struct regpair *)pbl_table->va;
2831 pbe += mr->npages % pbes_in_page;
2832 pbe->lo = cpu_to_le32((u32)addr);
2833 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
2840 static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
2842 int work = info->completed - info->completed_handled - 1;
2844 DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
2845 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
2846 struct qedr_pbl *pbl;
2848 /* Free all the page list that are possible to be freed
2849 * (all the ones that were invalidated), under the assumption
2850 * that if an FMR was completed successfully that means that
2851 * if there was an invalidate operation before it also ended
2853 pbl = list_first_entry(&info->inuse_pbl_list,
2854 struct qedr_pbl, list_entry);
2855 list_move_tail(&pbl->list_entry, &info->free_pbl_list);
2856 info->completed_handled++;
2860 int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
2861 int sg_nents, unsigned int *sg_offset)
2863 struct qedr_mr *mr = get_qedr_mr(ibmr);
2867 handle_completed_mrs(mr->dev, &mr->info);
2868 return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
2871 struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
2873 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2874 struct qedr_pd *pd = get_qedr_pd(ibpd);
2878 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2880 return ERR_PTR(-ENOMEM);
2882 mr->type = QEDR_MR_DMA;
2884 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2886 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2890 /* index only, 18 bit long, lkey = itid << 8 | key */
2891 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2892 mr->hw_mr.pd = pd->pd_id;
2893 mr->hw_mr.local_read = 1;
2894 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2895 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2896 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2897 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2898 mr->hw_mr.dma_mr = true;
2900 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2902 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2906 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2907 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2908 mr->hw_mr.remote_atomic)
2909 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2911 DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
2915 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2921 static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
2923 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
2926 static int sge_data_len(struct ib_sge *sg_list, int num_sge)
2930 for (i = 0; i < num_sge; i++)
2931 len += sg_list[i].length;
2936 static void swap_wqe_data64(u64 *p)
2940 for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
2941 *p = cpu_to_be64(cpu_to_le64(*p));
2944 static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
2945 struct qedr_qp *qp, u8 *wqe_size,
2946 const struct ib_send_wr *wr,
2947 const struct ib_send_wr **bad_wr,
2950 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
2951 char *seg_prt, *wqe;
2954 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
2955 DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
2969 /* Copy data inline */
2970 for (i = 0; i < wr->num_sge; i++) {
2971 u32 len = wr->sg_list[i].length;
2972 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
2977 /* New segment required */
2979 wqe = (char *)qed_chain_produce(&qp->sq.pbl);
2981 seg_siz = sizeof(struct rdma_sq_common_wqe);
2985 /* Calculate currently allowed length */
2986 cur = min_t(u32, len, seg_siz);
2987 memcpy(seg_prt, src, cur);
2989 /* Update segment variables */
2993 /* Update sge variables */
2997 /* Swap fully-completed segments */
2999 swap_wqe_data64((u64 *)wqe);
3003 /* swap last not completed segment */
3005 swap_wqe_data64((u64 *)wqe);
3010 #define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
3012 DMA_REGPAIR_LE(sge->addr, vaddr); \
3013 (sge)->length = cpu_to_le32(vlength); \
3014 (sge)->flags = cpu_to_le32(vflags); \
3017 #define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
3019 DMA_REGPAIR_LE(hdr->wr_id, vwr_id); \
3020 (hdr)->num_sges = num_sge; \
3023 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
3025 DMA_REGPAIR_LE(sge->addr, vaddr); \
3026 (sge)->length = cpu_to_le32(vlength); \
3027 (sge)->l_key = cpu_to_le32(vlkey); \
3030 static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
3031 const struct ib_send_wr *wr)
3036 for (i = 0; i < wr->num_sge; i++) {
3037 struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
3039 DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
3040 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
3041 sge->length = cpu_to_le32(wr->sg_list[i].length);
3042 data_size += wr->sg_list[i].length;
3046 *wqe_size += wr->num_sge;
3051 static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
3053 struct rdma_sq_rdma_wqe_1st *rwqe,
3054 struct rdma_sq_rdma_wqe_2nd *rwqe2,
3055 const struct ib_send_wr *wr,
3056 const struct ib_send_wr **bad_wr)
3058 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
3059 DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
3061 if (wr->send_flags & IB_SEND_INLINE &&
3062 (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
3063 wr->opcode == IB_WR_RDMA_WRITE)) {
3066 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
3067 return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
3068 bad_wr, &rwqe->flags, flags);
3071 return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
3074 static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
3076 struct rdma_sq_send_wqe_1st *swqe,
3077 struct rdma_sq_send_wqe_2st *swqe2,
3078 const struct ib_send_wr *wr,
3079 const struct ib_send_wr **bad_wr)
3081 memset(swqe2, 0, sizeof(*swqe2));
3082 if (wr->send_flags & IB_SEND_INLINE) {
3085 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
3086 return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
3087 bad_wr, &swqe->flags, flags);
3090 return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
3093 static int qedr_prepare_reg(struct qedr_qp *qp,
3094 struct rdma_sq_fmr_wqe_1st *fwqe1,
3095 const struct ib_reg_wr *wr)
3097 struct qedr_mr *mr = get_qedr_mr(wr->mr);
3098 struct rdma_sq_fmr_wqe_2nd *fwqe2;
3100 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
3101 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
3102 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
3103 fwqe1->l_key = wr->key;
3105 fwqe2->access_ctrl = 0;
3107 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
3108 !!(wr->access & IB_ACCESS_REMOTE_READ));
3109 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
3110 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
3111 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
3112 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
3113 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
3114 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
3115 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
3116 fwqe2->fmr_ctrl = 0;
3118 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
3119 ilog2(mr->ibmr.page_size) - 12);
3121 fwqe2->length_hi = 0;
3122 fwqe2->length_lo = mr->ibmr.length;
3123 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
3124 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
3126 qp->wqe_wr_id[qp->sq.prod].mr = mr;
3131 static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
3134 case IB_WR_RDMA_WRITE:
3135 case IB_WR_RDMA_WRITE_WITH_IMM:
3136 return IB_WC_RDMA_WRITE;
3137 case IB_WR_SEND_WITH_IMM:
3139 case IB_WR_SEND_WITH_INV:
3141 case IB_WR_RDMA_READ:
3142 case IB_WR_RDMA_READ_WITH_INV:
3143 return IB_WC_RDMA_READ;
3144 case IB_WR_ATOMIC_CMP_AND_SWP:
3145 return IB_WC_COMP_SWAP;
3146 case IB_WR_ATOMIC_FETCH_AND_ADD:
3147 return IB_WC_FETCH_ADD;
3149 return IB_WC_REG_MR;
3150 case IB_WR_LOCAL_INV:
3151 return IB_WC_LOCAL_INV;
3157 static inline bool qedr_can_post_send(struct qedr_qp *qp,
3158 const struct ib_send_wr *wr)
3160 int wq_is_full, err_wr, pbl_is_full;
3161 struct qedr_dev *dev = qp->dev;
3163 /* prevent SQ overflow and/or processing of a bad WR */
3164 err_wr = wr->num_sge > qp->sq.max_sges;
3165 wq_is_full = qedr_wq_is_full(&qp->sq);
3166 pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
3167 QEDR_MAX_SQE_ELEMENTS_PER_SQE;
3168 if (wq_is_full || err_wr || pbl_is_full) {
3169 if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
3171 "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
3173 qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
3176 if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
3178 "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
3180 qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
3184 !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
3186 "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
3188 qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
3195 static int __qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3196 const struct ib_send_wr **bad_wr)
3198 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3199 struct qedr_qp *qp = get_qedr_qp(ibqp);
3200 struct rdma_sq_atomic_wqe_1st *awqe1;
3201 struct rdma_sq_atomic_wqe_2nd *awqe2;
3202 struct rdma_sq_atomic_wqe_3rd *awqe3;
3203 struct rdma_sq_send_wqe_2st *swqe2;
3204 struct rdma_sq_local_inv_wqe *iwqe;
3205 struct rdma_sq_rdma_wqe_2nd *rwqe2;
3206 struct rdma_sq_send_wqe_1st *swqe;
3207 struct rdma_sq_rdma_wqe_1st *rwqe;
3208 struct rdma_sq_fmr_wqe_1st *fwqe1;
3209 struct rdma_sq_common_wqe *wqe;
3214 if (!qedr_can_post_send(qp, wr)) {
3219 wqe = qed_chain_produce(&qp->sq.pbl);
3220 qp->wqe_wr_id[qp->sq.prod].signaled =
3221 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
3224 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
3225 !!(wr->send_flags & IB_SEND_SOLICITED));
3226 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
3227 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
3228 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
3229 !!(wr->send_flags & IB_SEND_FENCE));
3230 wqe->prev_wqe_size = qp->prev_wqe_size;
3232 qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
3234 switch (wr->opcode) {
3235 case IB_WR_SEND_WITH_IMM:
3236 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3241 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
3242 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3244 swqe2 = qed_chain_produce(&qp->sq.pbl);
3246 swqe->inv_key_or_imm_data = cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
3247 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3249 swqe->length = cpu_to_le32(length);
3250 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3251 qp->prev_wqe_size = swqe->wqe_size;
3252 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3255 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
3256 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3259 swqe2 = qed_chain_produce(&qp->sq.pbl);
3260 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3262 swqe->length = cpu_to_le32(length);
3263 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3264 qp->prev_wqe_size = swqe->wqe_size;
3265 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3267 case IB_WR_SEND_WITH_INV:
3268 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
3269 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3270 swqe2 = qed_chain_produce(&qp->sq.pbl);
3272 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
3273 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3275 swqe->length = cpu_to_le32(length);
3276 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3277 qp->prev_wqe_size = swqe->wqe_size;
3278 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3281 case IB_WR_RDMA_WRITE_WITH_IMM:
3282 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3287 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
3288 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3291 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
3292 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3293 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3295 rwqe->length = cpu_to_le32(length);
3296 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3297 qp->prev_wqe_size = rwqe->wqe_size;
3298 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3300 case IB_WR_RDMA_WRITE:
3301 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
3302 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3305 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3306 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3308 rwqe->length = cpu_to_le32(length);
3309 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3310 qp->prev_wqe_size = rwqe->wqe_size;
3311 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3313 case IB_WR_RDMA_READ_WITH_INV:
3314 SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
3315 /* fallthrough -- same is identical to RDMA READ */
3317 case IB_WR_RDMA_READ:
3318 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
3319 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3322 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3323 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3325 rwqe->length = cpu_to_le32(length);
3326 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3327 qp->prev_wqe_size = rwqe->wqe_size;
3328 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3331 case IB_WR_ATOMIC_CMP_AND_SWP:
3332 case IB_WR_ATOMIC_FETCH_AND_ADD:
3333 awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
3334 awqe1->wqe_size = 4;
3336 awqe2 = qed_chain_produce(&qp->sq.pbl);
3337 DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
3338 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
3340 awqe3 = qed_chain_produce(&qp->sq.pbl);
3342 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
3343 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
3344 DMA_REGPAIR_LE(awqe3->swap_data,
3345 atomic_wr(wr)->compare_add);
3347 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
3348 DMA_REGPAIR_LE(awqe3->swap_data,
3349 atomic_wr(wr)->swap);
3350 DMA_REGPAIR_LE(awqe3->cmp_data,
3351 atomic_wr(wr)->compare_add);
3354 qedr_prepare_sq_sges(qp, NULL, wr);
3356 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
3357 qp->prev_wqe_size = awqe1->wqe_size;
3360 case IB_WR_LOCAL_INV:
3361 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
3364 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
3365 iwqe->inv_l_key = wr->ex.invalidate_rkey;
3366 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
3367 qp->prev_wqe_size = iwqe->wqe_size;
3370 DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
3371 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
3372 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
3373 fwqe1->wqe_size = 2;
3375 rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
3377 DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
3382 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
3383 qp->prev_wqe_size = fwqe1->wqe_size;
3386 DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
3395 /* Restore prod to its position before
3396 * this WR was processed
3398 value = le16_to_cpu(qp->sq.db_data.data.value);
3399 qed_chain_set_prod(&qp->sq.pbl, value, wqe);
3401 /* Restore prev_wqe_size */
3402 qp->prev_wqe_size = wqe->prev_wqe_size;
3404 DP_ERR(dev, "POST SEND FAILED\n");
3410 int qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3411 const struct ib_send_wr **bad_wr)
3413 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3414 struct qedr_qp *qp = get_qedr_qp(ibqp);
3415 unsigned long flags;
3420 if (qp->qp_type == IB_QPT_GSI)
3421 return qedr_gsi_post_send(ibqp, wr, bad_wr);
3423 spin_lock_irqsave(&qp->q_lock, flags);
3425 if (rdma_protocol_roce(&dev->ibdev, 1)) {
3426 if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
3427 (qp->state != QED_ROCE_QP_STATE_ERR) &&
3428 (qp->state != QED_ROCE_QP_STATE_SQD)) {
3429 spin_unlock_irqrestore(&qp->q_lock, flags);
3431 DP_DEBUG(dev, QEDR_MSG_CQ,
3432 "QP in wrong state! QP icid=0x%x state %d\n",
3433 qp->icid, qp->state);
3439 rc = __qedr_post_send(ibqp, wr, bad_wr);
3443 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3445 qedr_inc_sw_prod(&qp->sq);
3447 qp->sq.db_data.data.value++;
3453 * If there was a failure in the first WR then it will be triggered in
3454 * vane. However this is not harmful (as long as the producer value is
3455 * unchanged). For performance reasons we avoid checking for this
3456 * redundant doorbell.
3458 * qp->wqe_wr_id is accessed during qedr_poll_cq, as
3459 * soon as we give the doorbell, we could get a completion
3460 * for this wr, therefore we need to make sure that the
3461 * memory is updated before giving the doorbell.
3462 * During qedr_poll_cq, rmb is called before accessing the
3463 * cqe. This covers for the smp_rmb as well.
3466 writel(qp->sq.db_data.raw, qp->sq.db);
3468 /* Make sure write sticks */
3471 spin_unlock_irqrestore(&qp->q_lock, flags);
3476 static u32 qedr_srq_elem_left(struct qedr_srq_hwq_info *hw_srq)
3480 /* Calculate number of elements used based on producer
3481 * count and consumer count and subtract it from max
3482 * work request supported so that we get elements left.
3484 used = hw_srq->wr_prod_cnt - hw_srq->wr_cons_cnt;
3486 return hw_srq->max_wr - used;
3489 int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
3490 const struct ib_recv_wr **bad_wr)
3492 struct qedr_srq *srq = get_qedr_srq(ibsrq);
3493 struct qedr_srq_hwq_info *hw_srq;
3494 struct qedr_dev *dev = srq->dev;
3495 struct qed_chain *pbl;
3496 unsigned long flags;
3501 spin_lock_irqsave(&srq->lock, flags);
3503 hw_srq = &srq->hw_srq;
3504 pbl = &srq->hw_srq.pbl;
3506 struct rdma_srq_wqe_header *hdr;
3509 if (!qedr_srq_elem_left(hw_srq) ||
3510 wr->num_sge > srq->hw_srq.max_sges) {
3511 DP_ERR(dev, "Can't post WR (%d,%d) || (%d > %d)\n",
3512 hw_srq->wr_prod_cnt, hw_srq->wr_cons_cnt,
3513 wr->num_sge, srq->hw_srq.max_sges);
3519 hdr = qed_chain_produce(pbl);
3520 num_sge = wr->num_sge;
3521 /* Set number of sge and work request id in header */
3522 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
3524 srq->hw_srq.wr_prod_cnt++;
3528 DP_DEBUG(dev, QEDR_MSG_SRQ,
3529 "SRQ WR: SGEs: %d with wr_id[%d] = %llx\n",
3530 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
3532 for (i = 0; i < wr->num_sge; i++) {
3533 struct rdma_srq_sge *srq_sge = qed_chain_produce(pbl);
3535 /* Set SGE length, lkey and address */
3536 SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
3537 wr->sg_list[i].length, wr->sg_list[i].lkey);
3539 DP_DEBUG(dev, QEDR_MSG_SRQ,
3540 "[%d]: len %d key %x addr %x:%x\n",
3541 i, srq_sge->length, srq_sge->l_key,
3542 srq_sge->addr.hi, srq_sge->addr.lo);
3546 /* Flush WQE and SGE information before
3547 * updating producer.
3551 /* SRQ producer is 8 bytes. Need to update SGE producer index
3552 * in first 4 bytes and need to update WQE producer in
3555 *srq->hw_srq.virt_prod_pair_addr = hw_srq->sge_prod;
3556 offset = offsetof(struct rdma_srq_producers, wqe_prod);
3557 *((u8 *)srq->hw_srq.virt_prod_pair_addr + offset) =
3560 /* Flush producer after updating it. */
3565 DP_DEBUG(dev, QEDR_MSG_SRQ, "POST: Elements in S-RQ: %d\n",
3566 qed_chain_get_elem_left(pbl));
3567 spin_unlock_irqrestore(&srq->lock, flags);
3572 int qedr_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
3573 const struct ib_recv_wr **bad_wr)
3575 struct qedr_qp *qp = get_qedr_qp(ibqp);
3576 struct qedr_dev *dev = qp->dev;
3577 unsigned long flags;
3580 if (qp->qp_type == IB_QPT_GSI)
3581 return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3583 spin_lock_irqsave(&qp->q_lock, flags);
3585 if (qp->state == QED_ROCE_QP_STATE_RESET) {
3586 spin_unlock_irqrestore(&qp->q_lock, flags);
3594 if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3595 QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3596 wr->num_sge > qp->rq.max_sges) {
3597 DP_ERR(dev, "Can't post WR (%d < %d) || (%d > %d)\n",
3598 qed_chain_get_elem_left_u32(&qp->rq.pbl),
3599 QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3605 for (i = 0; i < wr->num_sge; i++) {
3607 struct rdma_rq_sge *rqe =
3608 qed_chain_produce(&qp->rq.pbl);
3610 /* First one must include the number
3611 * of SGE in the list
3614 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3617 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO,
3618 wr->sg_list[i].lkey);
3620 RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3621 wr->sg_list[i].length, flags);
3624 /* Special case of no sges. FW requires between 1-4 sges...
3625 * in this case we need to post 1 sge with length zero. this is
3626 * because rdma write with immediate consumes an RQ.
3630 struct rdma_rq_sge *rqe =
3631 qed_chain_produce(&qp->rq.pbl);
3633 /* First one must include the number
3634 * of SGE in the list
3636 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO, 0);
3637 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3639 RQ_SGE_SET(rqe, 0, 0, flags);
3643 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3644 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3646 qedr_inc_sw_prod(&qp->rq);
3648 /* qp->rqe_wr_id is accessed during qedr_poll_cq, as
3649 * soon as we give the doorbell, we could get a completion
3650 * for this wr, therefore we need to make sure that the
3651 * memory is update before giving the doorbell.
3652 * During qedr_poll_cq, rmb is called before accessing the
3653 * cqe. This covers for the smp_rmb as well.
3657 qp->rq.db_data.data.value++;
3659 writel(qp->rq.db_data.raw, qp->rq.db);
3661 /* Make sure write sticks */
3664 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
3665 writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
3666 mmiowb(); /* for second doorbell */
3672 spin_unlock_irqrestore(&qp->q_lock, flags);
3677 static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3679 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3681 return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3685 static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3687 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3690 qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
3691 resp_cqe->qp_handle.lo,
3696 static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
3698 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3700 return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
3703 /* Return latest CQE (needs processing) */
3704 static union rdma_cqe *get_cqe(struct qedr_cq *cq)
3706 return cq->latest_cqe;
3709 /* In fmr we need to increase the number of fmr completed counter for the fmr
3710 * algorithm determining whether we can free a pbl or not.
3711 * we need to perform this whether the work request was signaled or not. for
3712 * this purpose we call this function from the condition that checks if a wr
3713 * should be skipped, to make sure we don't miss it ( possibly this fmr
3714 * operation was not signalted)
3716 static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
3718 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
3719 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3722 static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
3723 struct qedr_cq *cq, int num_entries,
3724 struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
3729 while (num_entries && qp->sq.wqe_cons != hw_cons) {
3730 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
3731 qedr_chk_if_fmr(qp);
3737 wc->status = status;
3740 wc->src_qp = qp->id;
3743 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
3744 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
3746 switch (wc->opcode) {
3747 case IB_WC_RDMA_WRITE:
3748 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3750 case IB_WC_COMP_SWAP:
3751 case IB_WC_FETCH_ADD:
3755 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3757 case IB_WC_RDMA_READ:
3759 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3769 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
3770 qed_chain_consume(&qp->sq.pbl);
3771 qedr_inc_sw_cons(&qp->sq);
3777 static int qedr_poll_cq_req(struct qedr_dev *dev,
3778 struct qedr_qp *qp, struct qedr_cq *cq,
3779 int num_entries, struct ib_wc *wc,
3780 struct rdma_cqe_requester *req)
3784 switch (req->status) {
3785 case RDMA_CQE_REQ_STS_OK:
3786 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3789 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
3790 if (qp->state != QED_ROCE_QP_STATE_ERR)
3791 DP_DEBUG(dev, QEDR_MSG_CQ,
3792 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3793 cq->icid, qp->icid);
3794 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3795 IB_WC_WR_FLUSH_ERR, 1);
3798 /* process all WQE before the cosumer */
3799 qp->state = QED_ROCE_QP_STATE_ERR;
3800 cnt = process_req(dev, qp, cq, num_entries, wc,
3801 req->sq_cons - 1, IB_WC_SUCCESS, 0);
3803 /* if we have extra WC fill it with actual error info */
3804 if (cnt < num_entries) {
3805 enum ib_wc_status wc_status;
3807 switch (req->status) {
3808 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
3810 "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3811 cq->icid, qp->icid);
3812 wc_status = IB_WC_BAD_RESP_ERR;
3814 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
3816 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3817 cq->icid, qp->icid);
3818 wc_status = IB_WC_LOC_LEN_ERR;
3820 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
3822 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3823 cq->icid, qp->icid);
3824 wc_status = IB_WC_LOC_QP_OP_ERR;
3826 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
3828 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3829 cq->icid, qp->icid);
3830 wc_status = IB_WC_LOC_PROT_ERR;
3832 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
3834 "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3835 cq->icid, qp->icid);
3836 wc_status = IB_WC_MW_BIND_ERR;
3838 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
3840 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3841 cq->icid, qp->icid);
3842 wc_status = IB_WC_REM_INV_REQ_ERR;
3844 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
3846 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3847 cq->icid, qp->icid);
3848 wc_status = IB_WC_REM_ACCESS_ERR;
3850 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
3852 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3853 cq->icid, qp->icid);
3854 wc_status = IB_WC_REM_OP_ERR;
3856 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
3858 "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3859 cq->icid, qp->icid);
3860 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
3862 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
3864 "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3865 cq->icid, qp->icid);
3866 wc_status = IB_WC_RETRY_EXC_ERR;
3870 "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3871 cq->icid, qp->icid);
3872 wc_status = IB_WC_GENERAL_ERR;
3874 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
3882 static inline int qedr_cqe_resp_status_to_ib(u8 status)
3885 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
3886 return IB_WC_LOC_ACCESS_ERR;
3887 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
3888 return IB_WC_LOC_LEN_ERR;
3889 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
3890 return IB_WC_LOC_QP_OP_ERR;
3891 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
3892 return IB_WC_LOC_PROT_ERR;
3893 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
3894 return IB_WC_MW_BIND_ERR;
3895 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
3896 return IB_WC_REM_INV_RD_REQ_ERR;
3897 case RDMA_CQE_RESP_STS_OK:
3898 return IB_WC_SUCCESS;
3900 return IB_WC_GENERAL_ERR;
3904 static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
3907 wc->status = IB_WC_SUCCESS;
3908 wc->byte_len = le32_to_cpu(resp->length);
3910 if (resp->flags & QEDR_RESP_IMM) {
3911 wc->ex.imm_data = cpu_to_be32(le32_to_cpu(resp->imm_data_or_inv_r_Key));
3912 wc->wc_flags |= IB_WC_WITH_IMM;
3914 if (resp->flags & QEDR_RESP_RDMA)
3915 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
3917 if (resp->flags & QEDR_RESP_INV)
3920 } else if (resp->flags & QEDR_RESP_INV) {
3921 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
3922 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
3924 if (resp->flags & QEDR_RESP_RDMA)
3927 } else if (resp->flags & QEDR_RESP_RDMA) {
3934 static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3935 struct qedr_cq *cq, struct ib_wc *wc,
3936 struct rdma_cqe_responder *resp, u64 wr_id)
3938 /* Must fill fields before qedr_set_ok_cqe_resp_wc() */
3939 wc->opcode = IB_WC_RECV;
3942 if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
3943 if (qedr_set_ok_cqe_resp_wc(resp, wc))
3945 "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
3946 cq, cq->icid, resp->flags);
3949 wc->status = qedr_cqe_resp_status_to_ib(resp->status);
3950 if (wc->status == IB_WC_GENERAL_ERR)
3952 "CQ %p (icid=%d) contains an invalid CQE status %d\n",
3953 cq, cq->icid, resp->status);
3956 /* Fill the rest of the WC */
3958 wc->src_qp = qp->id;
3963 static int process_resp_one_srq(struct qedr_dev *dev, struct qedr_qp *qp,
3964 struct qedr_cq *cq, struct ib_wc *wc,
3965 struct rdma_cqe_responder *resp)
3967 struct qedr_srq *srq = qp->srq;
3970 wr_id = HILO_GEN(le32_to_cpu(resp->srq_wr_id.hi),
3971 le32_to_cpu(resp->srq_wr_id.lo), u64);
3973 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
3974 wc->status = IB_WC_WR_FLUSH_ERR;
3978 wc->src_qp = qp->id;
3982 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
3984 srq->hw_srq.wr_cons_cnt++;
3988 static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3989 struct qedr_cq *cq, struct ib_wc *wc,
3990 struct rdma_cqe_responder *resp)
3992 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3994 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
3996 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3997 qed_chain_consume(&qp->rq.pbl);
3998 qedr_inc_sw_cons(&qp->rq);
4003 static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
4004 int num_entries, struct ib_wc *wc, u16 hw_cons)
4008 while (num_entries && qp->rq.wqe_cons != hw_cons) {
4010 wc->status = IB_WC_WR_FLUSH_ERR;
4013 wc->src_qp = qp->id;
4015 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4020 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4021 qed_chain_consume(&qp->rq.pbl);
4022 qedr_inc_sw_cons(&qp->rq);
4028 static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4029 struct rdma_cqe_responder *resp, int *update)
4031 if (le16_to_cpu(resp->rq_cons_or_srq_id) == qp->rq.wqe_cons) {
4037 static int qedr_poll_cq_resp_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4038 struct qedr_cq *cq, int num_entries,
4040 struct rdma_cqe_responder *resp)
4044 cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
4050 static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
4051 struct qedr_cq *cq, int num_entries,
4052 struct ib_wc *wc, struct rdma_cqe_responder *resp,
4057 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4058 cnt = process_resp_flush(qp, cq, num_entries, wc,
4059 resp->rq_cons_or_srq_id);
4060 try_consume_resp_cqe(cq, qp, resp, update);
4062 cnt = process_resp_one(dev, qp, cq, wc, resp);
4070 static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4071 struct rdma_cqe_requester *req, int *update)
4073 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
4079 int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
4081 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
4082 struct qedr_cq *cq = get_qedr_cq(ibcq);
4083 union rdma_cqe *cqe;
4084 u32 old_cons, new_cons;
4085 unsigned long flags;
4089 if (cq->destroyed) {
4091 "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
4096 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
4097 return qedr_gsi_poll_cq(ibcq, num_entries, wc);
4099 spin_lock_irqsave(&cq->cq_lock, flags);
4100 cqe = cq->latest_cqe;
4101 old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4102 while (num_entries && is_valid_cqe(cq, cqe)) {
4106 /* prevent speculative reads of any field of CQE */
4109 qp = cqe_get_qp(cqe);
4111 WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
4117 switch (cqe_get_type(cqe)) {
4118 case RDMA_CQE_TYPE_REQUESTER:
4119 cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
4121 try_consume_req_cqe(cq, qp, &cqe->req, &update);
4123 case RDMA_CQE_TYPE_RESPONDER_RQ:
4124 cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
4125 &cqe->resp, &update);
4127 case RDMA_CQE_TYPE_RESPONDER_SRQ:
4128 cnt = qedr_poll_cq_resp_srq(dev, qp, cq, num_entries,
4132 case RDMA_CQE_TYPE_INVALID:
4134 DP_ERR(dev, "Error: invalid CQE type = %d\n",
4143 new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4145 cq->cq_cons += new_cons - old_cons;
4148 /* doorbell notifies abount latest VALID entry,
4149 * but chain already point to the next INVALID one
4151 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
4153 spin_unlock_irqrestore(&cq->cq_lock, flags);
4157 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
4159 const struct ib_wc *in_wc,
4160 const struct ib_grh *in_grh,
4161 const struct ib_mad_hdr *mad_hdr,
4162 size_t in_mad_size, struct ib_mad_hdr *out_mad,
4163 size_t *out_mad_size, u16 *out_mad_pkey_index)
4165 struct qedr_dev *dev = get_qedr_dev(ibdev);
4167 DP_DEBUG(dev, QEDR_MSG_GSI,
4168 "QEDR_PROCESS_MAD in_mad %x %x %x %x %x %x %x %x\n",
4169 mad_hdr->attr_id, mad_hdr->base_version, mad_hdr->attr_mod,
4170 mad_hdr->class_specific, mad_hdr->class_version,
4171 mad_hdr->method, mad_hdr->mgmt_class, mad_hdr->status);
4172 return IB_MAD_RESULT_SUCCESS;