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 static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
167 *ib_speed = IB_SPEED_SDR;
168 *ib_width = IB_WIDTH_1X;
171 *ib_speed = IB_SPEED_QDR;
172 *ib_width = IB_WIDTH_1X;
176 *ib_speed = IB_SPEED_DDR;
177 *ib_width = IB_WIDTH_4X;
181 *ib_speed = IB_SPEED_EDR;
182 *ib_width = IB_WIDTH_1X;
186 *ib_speed = IB_SPEED_QDR;
187 *ib_width = IB_WIDTH_4X;
191 *ib_speed = IB_SPEED_HDR;
192 *ib_width = IB_WIDTH_1X;
196 *ib_speed = IB_SPEED_EDR;
197 *ib_width = IB_WIDTH_4X;
202 *ib_speed = IB_SPEED_SDR;
203 *ib_width = IB_WIDTH_1X;
207 int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
209 struct qedr_dev *dev;
210 struct qed_rdma_port *rdma_port;
212 dev = get_qedr_dev(ibdev);
214 if (!dev->rdma_ctx) {
215 DP_ERR(dev, "rdma_ctx is NULL\n");
219 rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
221 /* *attr being zeroed by the caller, avoid zeroing it here */
222 if (rdma_port->port_state == QED_RDMA_PORT_UP) {
223 attr->state = IB_PORT_ACTIVE;
224 attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
226 attr->state = IB_PORT_DOWN;
227 attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;
229 attr->max_mtu = IB_MTU_4096;
230 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
235 attr->ip_gids = true;
236 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
237 attr->gid_tbl_len = 1;
238 attr->pkey_tbl_len = 1;
240 attr->gid_tbl_len = QEDR_MAX_SGID;
241 attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
243 attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
244 attr->qkey_viol_cntr = 0;
245 get_link_speed_and_width(rdma_port->link_speed,
246 &attr->active_speed, &attr->active_width);
247 attr->max_msg_sz = rdma_port->max_msg_size;
248 attr->max_vl_num = 4;
253 int qedr_modify_port(struct ib_device *ibdev, u8 port, int mask,
254 struct ib_port_modify *props)
259 static int qedr_add_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
264 mm = kzalloc(sizeof(*mm), GFP_KERNEL);
268 mm->key.phy_addr = phy_addr;
269 /* This function might be called with a length which is not a multiple
270 * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
271 * forces this granularity by increasing the requested size if needed.
272 * When qedr_mmap is called, it will search the list with the updated
273 * length as a key. To prevent search failures, the length is rounded up
274 * in advance to PAGE_SIZE.
276 mm->key.len = roundup(len, PAGE_SIZE);
277 INIT_LIST_HEAD(&mm->entry);
279 mutex_lock(&uctx->mm_list_lock);
280 list_add(&mm->entry, &uctx->mm_head);
281 mutex_unlock(&uctx->mm_list_lock);
283 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
284 "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
285 (unsigned long long)mm->key.phy_addr,
286 (unsigned long)mm->key.len, uctx);
291 static bool qedr_search_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
297 mutex_lock(&uctx->mm_list_lock);
298 list_for_each_entry(mm, &uctx->mm_head, entry) {
299 if (len != mm->key.len || phy_addr != mm->key.phy_addr)
305 mutex_unlock(&uctx->mm_list_lock);
306 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
307 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, result=%d\n",
308 mm->key.phy_addr, mm->key.len, uctx, found);
313 int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
315 struct ib_device *ibdev = uctx->device;
317 struct qedr_ucontext *ctx = get_qedr_ucontext(uctx);
318 struct qedr_alloc_ucontext_resp uresp = {};
319 struct qedr_dev *dev = get_qedr_dev(ibdev);
320 struct qed_rdma_add_user_out_params oparams;
325 rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
328 "failed to allocate a DPI for a new RoCE application, rc=%d. To overcome this consider to increase the number of DPIs, increase the doorbell BAR size or just close unnecessary RoCE applications. In order to increase the number of DPIs consult the qedr readme\n",
333 ctx->dpi = oparams.dpi;
334 ctx->dpi_addr = oparams.dpi_addr;
335 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
336 ctx->dpi_size = oparams.dpi_size;
337 INIT_LIST_HEAD(&ctx->mm_head);
338 mutex_init(&ctx->mm_list_lock);
340 uresp.dpm_enabled = dev->user_dpm_enabled;
341 uresp.wids_enabled = 1;
342 uresp.wid_count = oparams.wid_count;
343 uresp.db_pa = ctx->dpi_phys_addr;
344 uresp.db_size = ctx->dpi_size;
345 uresp.max_send_wr = dev->attr.max_sqe;
346 uresp.max_recv_wr = dev->attr.max_rqe;
347 uresp.max_srq_wr = dev->attr.max_srq_wr;
348 uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
349 uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
350 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
351 uresp.max_cqes = QEDR_MAX_CQES;
353 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
359 rc = qedr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
363 DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
368 void qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
370 struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
371 struct qedr_mm *mm, *tmp;
373 DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
375 uctx->dev->ops->rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
377 list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
378 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
379 "deleted (addr=0x%llx,len=0x%lx) for ctx=%p\n",
380 mm->key.phy_addr, mm->key.len, uctx);
381 list_del(&mm->entry);
386 int qedr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
388 struct qedr_ucontext *ucontext = get_qedr_ucontext(context);
389 struct qedr_dev *dev = get_qedr_dev(context->device);
390 unsigned long phys_addr = vma->vm_pgoff << PAGE_SHIFT;
391 unsigned long len = (vma->vm_end - vma->vm_start);
392 unsigned long dpi_start;
394 dpi_start = dev->db_phys_addr + (ucontext->dpi * ucontext->dpi_size);
396 DP_DEBUG(dev, QEDR_MSG_INIT,
397 "mmap invoked with vm_start=0x%pK, vm_end=0x%pK,vm_pgoff=0x%pK; dpi_start=0x%pK dpi_size=0x%x\n",
398 (void *)vma->vm_start, (void *)vma->vm_end,
399 (void *)vma->vm_pgoff, (void *)dpi_start, ucontext->dpi_size);
401 if ((vma->vm_start & (PAGE_SIZE - 1)) || (len & (PAGE_SIZE - 1))) {
403 "failed mmap, addresses must be page aligned: start=0x%pK, end=0x%pK\n",
404 (void *)vma->vm_start, (void *)vma->vm_end);
408 if (!qedr_search_mmap(ucontext, phys_addr, len)) {
409 DP_ERR(dev, "failed mmap, vm_pgoff=0x%lx is not authorized\n",
414 if (phys_addr < dpi_start ||
415 ((phys_addr + len) > (dpi_start + ucontext->dpi_size))) {
417 "failed mmap, pages are outside of dpi; page address=0x%pK, dpi_start=0x%pK, dpi_size=0x%x\n",
418 (void *)phys_addr, (void *)dpi_start,
423 if (vma->vm_flags & VM_READ) {
424 DP_ERR(dev, "failed mmap, cannot map doorbell bar for read\n");
428 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
429 return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
433 int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
435 struct ib_device *ibdev = ibpd->device;
436 struct qedr_dev *dev = get_qedr_dev(ibdev);
437 struct qedr_pd *pd = get_qedr_pd(ibpd);
441 DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
442 udata ? "User Lib" : "Kernel");
444 if (!dev->rdma_ctx) {
445 DP_ERR(dev, "invalid RDMA context\n");
449 rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
456 struct qedr_alloc_pd_uresp uresp = {
459 struct qedr_ucontext *context = rdma_udata_to_drv_context(
460 udata, struct qedr_ucontext, ibucontext);
462 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
464 DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
465 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
476 void qedr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
478 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
479 struct qedr_pd *pd = get_qedr_pd(ibpd);
481 DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
482 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
485 static void qedr_free_pbl(struct qedr_dev *dev,
486 struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
488 struct pci_dev *pdev = dev->pdev;
491 for (i = 0; i < pbl_info->num_pbls; i++) {
494 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
495 pbl[i].va, pbl[i].pa);
501 #define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
502 #define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
504 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
505 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
506 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
508 static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
509 struct qedr_pbl_info *pbl_info,
512 struct pci_dev *pdev = dev->pdev;
513 struct qedr_pbl *pbl_table;
514 dma_addr_t *pbl_main_tbl;
519 pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
521 return ERR_PTR(-ENOMEM);
523 for (i = 0; i < pbl_info->num_pbls; i++) {
524 va = dma_alloc_coherent(&pdev->dev, pbl_info->pbl_size, &pa,
529 pbl_table[i].va = va;
530 pbl_table[i].pa = pa;
533 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
534 * the first one with physical pointers to all of the rest
536 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
537 for (i = 0; i < pbl_info->num_pbls - 1; i++)
538 pbl_main_tbl[i] = pbl_table[i + 1].pa;
543 for (i--; i >= 0; i--)
544 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
545 pbl_table[i].va, pbl_table[i].pa);
547 qedr_free_pbl(dev, pbl_info, pbl_table);
549 return ERR_PTR(-ENOMEM);
552 static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
553 struct qedr_pbl_info *pbl_info,
554 u32 num_pbes, int two_layer_capable)
560 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
561 if (num_pbes > MAX_PBES_TWO_LAYER) {
562 DP_ERR(dev, "prepare pbl table: too many pages %d\n",
567 /* calculate required pbl page size */
568 pbl_size = MIN_FW_PBL_PAGE_SIZE;
569 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
570 NUM_PBES_ON_PAGE(pbl_size);
572 while (pbl_capacity < num_pbes) {
574 pbl_capacity = pbl_size / sizeof(u64);
575 pbl_capacity = pbl_capacity * pbl_capacity;
578 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
579 num_pbls++; /* One for the layer0 ( points to the pbls) */
580 pbl_info->two_layered = true;
582 /* One layered PBL */
584 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
585 roundup_pow_of_two((num_pbes * sizeof(u64))));
586 pbl_info->two_layered = false;
589 pbl_info->num_pbls = num_pbls;
590 pbl_info->pbl_size = pbl_size;
591 pbl_info->num_pbes = num_pbes;
593 DP_DEBUG(dev, QEDR_MSG_MR,
594 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
595 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
600 static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
601 struct qedr_pbl *pbl,
602 struct qedr_pbl_info *pbl_info, u32 pg_shift)
604 int pbe_cnt, total_num_pbes = 0;
605 u32 fw_pg_cnt, fw_pg_per_umem_pg;
606 struct qedr_pbl *pbl_tbl;
607 struct sg_dma_page_iter sg_iter;
611 if (!pbl_info->num_pbes)
614 /* If we have a two layered pbl, the first pbl points to the rest
615 * of the pbls and the first entry lays on the second pbl in the table
617 if (pbl_info->two_layered)
622 pbe = (struct regpair *)pbl_tbl->va;
624 DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
630 fw_pg_per_umem_pg = BIT(PAGE_SHIFT - pg_shift);
632 for_each_sg_dma_page (umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
633 pg_addr = sg_page_iter_dma_address(&sg_iter);
634 for (fw_pg_cnt = 0; fw_pg_cnt < fw_pg_per_umem_pg;) {
635 pbe->lo = cpu_to_le32(pg_addr);
636 pbe->hi = cpu_to_le32(upper_32_bits(pg_addr));
638 pg_addr += BIT(pg_shift);
643 if (total_num_pbes == pbl_info->num_pbes)
646 /* If the given pbl is full storing the pbes,
649 if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
651 pbe = (struct regpair *)pbl_tbl->va;
660 static int qedr_copy_cq_uresp(struct qedr_dev *dev,
661 struct qedr_cq *cq, struct ib_udata *udata)
663 struct qedr_create_cq_uresp uresp;
666 memset(&uresp, 0, sizeof(uresp));
668 uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
669 uresp.icid = cq->icid;
671 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
673 DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
678 static void consume_cqe(struct qedr_cq *cq)
680 if (cq->latest_cqe == cq->toggle_cqe)
681 cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
683 cq->latest_cqe = qed_chain_consume(&cq->pbl);
686 static inline int qedr_align_cq_entries(int entries)
688 u64 size, aligned_size;
690 /* We allocate an extra entry that we don't report to the FW. */
691 size = (entries + 1) * QEDR_CQE_SIZE;
692 aligned_size = ALIGN(size, PAGE_SIZE);
694 return aligned_size / QEDR_CQE_SIZE;
697 static inline int qedr_init_user_queue(struct ib_udata *udata,
698 struct qedr_dev *dev,
699 struct qedr_userq *q, u64 buf_addr,
700 size_t buf_len, int access, int dmasync,
706 q->buf_addr = buf_addr;
707 q->buf_len = buf_len;
708 q->umem = ib_umem_get(udata, q->buf_addr, q->buf_len, access, dmasync);
709 if (IS_ERR(q->umem)) {
710 DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
712 return PTR_ERR(q->umem);
715 fw_pages = ib_umem_page_count(q->umem) <<
716 (PAGE_SHIFT - FW_PAGE_SHIFT);
718 rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0);
722 if (alloc_and_init) {
723 q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
724 if (IS_ERR(q->pbl_tbl)) {
725 rc = PTR_ERR(q->pbl_tbl);
728 qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info,
731 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
741 ib_umem_release(q->umem);
747 static inline void qedr_init_cq_params(struct qedr_cq *cq,
748 struct qedr_ucontext *ctx,
749 struct qedr_dev *dev, int vector,
750 int chain_entries, int page_cnt,
752 struct qed_rdma_create_cq_in_params
755 memset(params, 0, sizeof(*params));
756 params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
757 params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
758 params->cnq_id = vector;
759 params->cq_size = chain_entries - 1;
760 params->dpi = (ctx) ? ctx->dpi : dev->dpi;
761 params->pbl_num_pages = page_cnt;
762 params->pbl_ptr = pbl_ptr;
763 params->pbl_two_level = 0;
766 static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
768 cq->db.data.agg_flags = flags;
769 cq->db.data.value = cpu_to_le32(cons);
770 writeq(cq->db.raw, cq->db_addr);
773 int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
775 struct qedr_cq *cq = get_qedr_cq(ibcq);
776 unsigned long sflags;
777 struct qedr_dev *dev;
779 dev = get_qedr_dev(ibcq->device);
783 "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
789 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
792 spin_lock_irqsave(&cq->cq_lock, sflags);
796 if (flags & IB_CQ_SOLICITED)
797 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
799 if (flags & IB_CQ_NEXT_COMP)
800 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
802 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
804 spin_unlock_irqrestore(&cq->cq_lock, sflags);
809 int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
810 struct ib_udata *udata)
812 struct ib_device *ibdev = ibcq->device;
813 struct qedr_ucontext *ctx = rdma_udata_to_drv_context(
814 udata, struct qedr_ucontext, ibucontext);
815 struct qed_rdma_destroy_cq_out_params destroy_oparams;
816 struct qed_rdma_destroy_cq_in_params destroy_iparams;
817 struct qedr_dev *dev = get_qedr_dev(ibdev);
818 struct qed_rdma_create_cq_in_params params;
819 struct qedr_create_cq_ureq ureq = {};
820 int vector = attr->comp_vector;
821 int entries = attr->cqe;
822 struct qedr_cq *cq = get_qedr_cq(ibcq);
829 DP_DEBUG(dev, QEDR_MSG_INIT,
830 "create_cq: called from %s. entries=%d, vector=%d\n",
831 udata ? "User Lib" : "Kernel", entries, vector);
833 if (entries > QEDR_MAX_CQES) {
835 "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
836 entries, QEDR_MAX_CQES);
840 chain_entries = qedr_align_cq_entries(entries);
841 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
844 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
846 "create cq: problem copying data from user space\n");
852 "create cq: cannot create a cq with 0 entries\n");
856 cq->cq_type = QEDR_CQ_TYPE_USER;
858 rc = qedr_init_user_queue(udata, dev, &cq->q, ureq.addr,
859 ureq.len, IB_ACCESS_LOCAL_WRITE, 1,
864 pbl_ptr = cq->q.pbl_tbl->pa;
865 page_cnt = cq->q.pbl_info.num_pbes;
867 cq->ibcq.cqe = chain_entries;
869 cq->cq_type = QEDR_CQ_TYPE_KERNEL;
871 rc = dev->ops->common->chain_alloc(dev->cdev,
872 QED_CHAIN_USE_TO_CONSUME,
874 QED_CHAIN_CNT_TYPE_U32,
876 sizeof(union rdma_cqe),
881 page_cnt = qed_chain_get_page_cnt(&cq->pbl);
882 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
883 cq->ibcq.cqe = cq->pbl.capacity;
886 qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
889 rc = dev->ops->rdma_create_cq(dev->rdma_ctx, ¶ms, &icid);
894 cq->sig = QEDR_CQ_MAGIC_NUMBER;
895 spin_lock_init(&cq->cq_lock);
898 rc = qedr_copy_cq_uresp(dev, cq, udata);
902 /* Generate doorbell address. */
903 cq->db_addr = dev->db_addr +
904 DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
905 cq->db.data.icid = cq->icid;
906 cq->db.data.params = DB_AGG_CMD_SET <<
907 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
909 /* point to the very last element, passing it we will toggle */
910 cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
911 cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
912 cq->latest_cqe = NULL;
914 cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
917 DP_DEBUG(dev, QEDR_MSG_CQ,
918 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
919 cq->icid, cq, params.cq_size);
924 destroy_iparams.icid = cq->icid;
925 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
929 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
931 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
934 ib_umem_release(cq->q.umem);
939 int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
941 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
942 struct qedr_cq *cq = get_qedr_cq(ibcq);
944 DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
949 #define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
950 #define QEDR_DESTROY_CQ_ITER_DURATION (10)
952 void qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
954 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
955 struct qed_rdma_destroy_cq_out_params oparams;
956 struct qed_rdma_destroy_cq_in_params iparams;
957 struct qedr_cq *cq = get_qedr_cq(ibcq);
960 DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
964 /* GSIs CQs are handled by driver, so they don't exist in the FW */
965 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
968 iparams.icid = cq->icid;
969 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
970 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
973 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
974 ib_umem_release(cq->q.umem);
977 /* We don't want the IRQ handler to handle a non-existing CQ so we
978 * wait until all CNQ interrupts, if any, are received. This will always
979 * happen and will always happen very fast. If not, then a serious error
980 * has occured. That is why we can use a long delay.
981 * We spin for a short time so we don’t lose time on context switching
982 * in case all the completions are handled in that span. Otherwise
983 * we sleep for a while and check again. Since the CNQ may be
984 * associated with (only) the current CPU we use msleep to allow the
985 * current CPU to be freed.
986 * The CNQ notification is increased in qedr_irq_handler().
988 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
989 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
990 udelay(QEDR_DESTROY_CQ_ITER_DURATION);
994 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
995 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
996 msleep(QEDR_DESTROY_CQ_ITER_DURATION);
1000 /* Note that we don't need to have explicit code to wait for the
1001 * completion of the event handler because it is invoked from the EQ.
1002 * Since the destroy CQ ramrod has also been received on the EQ we can
1003 * be certain that there's no event handler in process.
1007 static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1008 struct ib_qp_attr *attr,
1010 struct qed_rdma_modify_qp_in_params
1013 const struct ib_gid_attr *gid_attr;
1014 enum rdma_network_type nw_type;
1015 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
1020 gid_attr = grh->sgid_attr;
1021 ret = rdma_read_gid_l2_fields(gid_attr, &qp_params->vlan_id, NULL);
1025 nw_type = rdma_gid_attr_network_type(gid_attr);
1027 case RDMA_NETWORK_IPV6:
1028 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1029 sizeof(qp_params->sgid));
1030 memcpy(&qp_params->dgid.bytes[0],
1032 sizeof(qp_params->dgid));
1033 qp_params->roce_mode = ROCE_V2_IPV6;
1034 SET_FIELD(qp_params->modify_flags,
1035 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1037 case RDMA_NETWORK_IB:
1038 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1039 sizeof(qp_params->sgid));
1040 memcpy(&qp_params->dgid.bytes[0],
1042 sizeof(qp_params->dgid));
1043 qp_params->roce_mode = ROCE_V1;
1045 case RDMA_NETWORK_IPV4:
1046 memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1047 memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
1048 ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw);
1049 qp_params->sgid.ipv4_addr = ipv4_addr;
1051 qedr_get_ipv4_from_gid(grh->dgid.raw);
1052 qp_params->dgid.ipv4_addr = ipv4_addr;
1053 SET_FIELD(qp_params->modify_flags,
1054 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1055 qp_params->roce_mode = ROCE_V2_IPV4;
1059 for (i = 0; i < 4; i++) {
1060 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1061 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1064 if (qp_params->vlan_id >= VLAN_CFI_MASK)
1065 qp_params->vlan_id = 0;
1070 static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
1071 struct ib_qp_init_attr *attrs,
1072 struct ib_udata *udata)
1074 struct qedr_device_attr *qattr = &dev->attr;
1076 /* QP0... attrs->qp_type == IB_QPT_GSI */
1077 if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
1078 DP_DEBUG(dev, QEDR_MSG_QP,
1079 "create qp: unsupported qp type=0x%x requested\n",
1084 if (attrs->cap.max_send_wr > qattr->max_sqe) {
1086 "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1087 attrs->cap.max_send_wr, qattr->max_sqe);
1091 if (attrs->cap.max_inline_data > qattr->max_inline) {
1093 "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1094 attrs->cap.max_inline_data, qattr->max_inline);
1098 if (attrs->cap.max_send_sge > qattr->max_sge) {
1100 "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1101 attrs->cap.max_send_sge, qattr->max_sge);
1105 if (attrs->cap.max_recv_sge > qattr->max_sge) {
1107 "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1108 attrs->cap.max_recv_sge, qattr->max_sge);
1112 /* Unprivileged user space cannot create special QP */
1113 if (udata && attrs->qp_type == IB_QPT_GSI) {
1115 "create qp: userspace can't create special QPs of type=0x%x\n",
1123 static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1124 struct qedr_srq *srq, struct ib_udata *udata)
1126 struct qedr_create_srq_uresp uresp = {};
1129 uresp.srq_id = srq->srq_id;
1131 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1133 DP_ERR(dev, "create srq: problem copying data to user space\n");
1138 static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1139 struct qedr_create_qp_uresp *uresp,
1142 /* iWARP requires two doorbells per RQ. */
1143 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1144 uresp->rq_db_offset =
1145 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1146 uresp->rq_db2_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1148 uresp->rq_db_offset =
1149 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1152 uresp->rq_icid = qp->icid;
1155 static void qedr_copy_sq_uresp(struct qedr_dev *dev,
1156 struct qedr_create_qp_uresp *uresp,
1159 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1161 /* iWARP uses the same cid for rq and sq */
1162 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1163 uresp->sq_icid = qp->icid;
1165 uresp->sq_icid = qp->icid + 1;
1168 static int qedr_copy_qp_uresp(struct qedr_dev *dev,
1169 struct qedr_qp *qp, struct ib_udata *udata)
1171 struct qedr_create_qp_uresp uresp;
1174 memset(&uresp, 0, sizeof(uresp));
1175 qedr_copy_sq_uresp(dev, &uresp, qp);
1176 qedr_copy_rq_uresp(dev, &uresp, qp);
1178 uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1179 uresp.qp_id = qp->qp_id;
1181 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1184 "create qp: failed a copy to user space with qp icid=0x%x.\n",
1190 static void qedr_set_common_qp_params(struct qedr_dev *dev,
1193 struct ib_qp_init_attr *attrs)
1195 spin_lock_init(&qp->q_lock);
1196 atomic_set(&qp->refcnt, 1);
1198 qp->qp_type = attrs->qp_type;
1199 qp->max_inline_data = attrs->cap.max_inline_data;
1200 qp->sq.max_sges = attrs->cap.max_send_sge;
1201 qp->state = QED_ROCE_QP_STATE_RESET;
1202 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
1203 qp->sq_cq = get_qedr_cq(attrs->send_cq);
1207 qp->srq = get_qedr_srq(attrs->srq);
1209 qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1210 qp->rq.max_sges = attrs->cap.max_recv_sge;
1211 DP_DEBUG(dev, QEDR_MSG_QP,
1212 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1213 qp->rq.max_sges, qp->rq_cq->icid);
1216 DP_DEBUG(dev, QEDR_MSG_QP,
1217 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1218 pd->pd_id, qp->qp_type, qp->max_inline_data,
1219 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1220 DP_DEBUG(dev, QEDR_MSG_QP,
1221 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1222 qp->sq.max_sges, qp->sq_cq->icid);
1225 static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1227 qp->sq.db = dev->db_addr +
1228 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1229 qp->sq.db_data.data.icid = qp->icid + 1;
1231 qp->rq.db = dev->db_addr +
1232 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1233 qp->rq.db_data.data.icid = qp->icid;
1237 static int qedr_check_srq_params(struct qedr_dev *dev,
1238 struct ib_srq_init_attr *attrs,
1239 struct ib_udata *udata)
1241 struct qedr_device_attr *qattr = &dev->attr;
1243 if (attrs->attr.max_wr > qattr->max_srq_wr) {
1245 "create srq: unsupported srq_wr=0x%x requested (max_srq_wr=0x%x)\n",
1246 attrs->attr.max_wr, qattr->max_srq_wr);
1250 if (attrs->attr.max_sge > qattr->max_sge) {
1252 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1253 attrs->attr.max_sge, qattr->max_sge);
1260 static void qedr_free_srq_user_params(struct qedr_srq *srq)
1262 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1263 ib_umem_release(srq->usrq.umem);
1264 ib_umem_release(srq->prod_umem);
1267 static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1269 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1270 struct qedr_dev *dev = srq->dev;
1272 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1274 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1275 hw_srq->virt_prod_pair_addr,
1276 hw_srq->phy_prod_pair_addr);
1279 static int qedr_init_srq_user_params(struct ib_udata *udata,
1280 struct qedr_srq *srq,
1281 struct qedr_create_srq_ureq *ureq,
1282 int access, int dmasync)
1284 struct scatterlist *sg;
1287 rc = qedr_init_user_queue(udata, srq->dev, &srq->usrq, ureq->srq_addr,
1288 ureq->srq_len, access, dmasync, 1);
1293 ib_umem_get(udata, ureq->prod_pair_addr,
1294 sizeof(struct rdma_srq_producers), access, dmasync);
1295 if (IS_ERR(srq->prod_umem)) {
1296 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1297 ib_umem_release(srq->usrq.umem);
1299 "create srq: failed ib_umem_get for producer, got %ld\n",
1300 PTR_ERR(srq->prod_umem));
1301 return PTR_ERR(srq->prod_umem);
1304 sg = srq->prod_umem->sg_head.sgl;
1305 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1310 static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1311 struct qedr_dev *dev,
1312 struct ib_srq_init_attr *init_attr)
1314 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1315 dma_addr_t phy_prod_pair_addr;
1320 va = dma_alloc_coherent(&dev->pdev->dev,
1321 sizeof(struct rdma_srq_producers),
1322 &phy_prod_pair_addr, GFP_KERNEL);
1325 "create srq: failed to allocate dma memory for producer\n");
1329 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
1330 hw_srq->virt_prod_pair_addr = va;
1332 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
1333 rc = dev->ops->common->chain_alloc(dev->cdev,
1334 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1336 QED_CHAIN_CNT_TYPE_U32,
1338 QEDR_SRQ_WQE_ELEM_SIZE,
1339 &hw_srq->pbl, NULL);
1343 hw_srq->num_elems = num_elems;
1348 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1349 va, phy_prod_pair_addr);
1353 int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
1354 struct ib_udata *udata)
1356 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1357 struct qed_rdma_create_srq_in_params in_params = {};
1358 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1359 struct qed_rdma_create_srq_out_params out_params;
1360 struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
1361 struct qedr_create_srq_ureq ureq = {};
1362 u64 pbl_base_addr, phy_prod_pair_addr;
1363 struct qedr_srq_hwq_info *hw_srq;
1364 u32 page_cnt, page_size;
1365 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1368 DP_DEBUG(dev, QEDR_MSG_QP,
1369 "create SRQ called from %s (pd %p)\n",
1370 (udata) ? "User lib" : "kernel", pd);
1372 rc = qedr_check_srq_params(dev, init_attr, udata);
1377 hw_srq = &srq->hw_srq;
1378 spin_lock_init(&srq->lock);
1380 hw_srq->max_wr = init_attr->attr.max_wr;
1381 hw_srq->max_sges = init_attr->attr.max_sge;
1384 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
1386 "create srq: problem copying data from user space\n");
1390 rc = qedr_init_srq_user_params(udata, srq, &ureq, 0, 0);
1394 page_cnt = srq->usrq.pbl_info.num_pbes;
1395 pbl_base_addr = srq->usrq.pbl_tbl->pa;
1396 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1397 page_size = PAGE_SIZE;
1399 struct qed_chain *pbl;
1401 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1406 page_cnt = qed_chain_get_page_cnt(pbl);
1407 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1408 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1409 page_size = QED_CHAIN_PAGE_SIZE;
1412 in_params.pd_id = pd->pd_id;
1413 in_params.pbl_base_addr = pbl_base_addr;
1414 in_params.prod_pair_addr = phy_prod_pair_addr;
1415 in_params.num_pages = page_cnt;
1416 in_params.page_size = page_size;
1418 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1422 srq->srq_id = out_params.srq_id;
1425 rc = qedr_copy_srq_uresp(dev, srq, udata);
1430 rc = xa_insert_irq(&dev->srqs, srq->srq_id, srq, GFP_KERNEL);
1434 DP_DEBUG(dev, QEDR_MSG_SRQ,
1435 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1439 destroy_in_params.srq_id = srq->srq_id;
1441 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1444 qedr_free_srq_user_params(srq);
1446 qedr_free_srq_kernel_params(srq);
1451 void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
1453 struct qed_rdma_destroy_srq_in_params in_params = {};
1454 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1455 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1457 xa_erase_irq(&dev->srqs, srq->srq_id);
1458 in_params.srq_id = srq->srq_id;
1459 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1462 qedr_free_srq_user_params(srq);
1464 qedr_free_srq_kernel_params(srq);
1466 DP_DEBUG(dev, QEDR_MSG_SRQ,
1467 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1471 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
1472 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
1474 struct qed_rdma_modify_srq_in_params in_params = {};
1475 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1476 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1479 if (attr_mask & IB_SRQ_MAX_WR) {
1481 "modify srq: invalid attribute mask=0x%x specified for %p\n",
1486 if (attr_mask & IB_SRQ_LIMIT) {
1487 if (attr->srq_limit >= srq->hw_srq.max_wr) {
1489 "modify srq: invalid srq_limit=0x%x (max_srq_limit=0x%x)\n",
1490 attr->srq_limit, srq->hw_srq.max_wr);
1494 in_params.srq_id = srq->srq_id;
1495 in_params.wqe_limit = attr->srq_limit;
1496 rc = dev->ops->rdma_modify_srq(dev->rdma_ctx, &in_params);
1501 srq->srq_limit = attr->srq_limit;
1503 DP_DEBUG(dev, QEDR_MSG_SRQ,
1504 "modify srq: modified srq with srq_id=0x%0x\n", srq->srq_id);
1510 qedr_init_common_qp_in_params(struct qedr_dev *dev,
1513 struct ib_qp_init_attr *attrs,
1514 bool fmr_and_reserved_lkey,
1515 struct qed_rdma_create_qp_in_params *params)
1517 /* QP handle to be written in an async event */
1518 params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1519 params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
1521 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1522 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
1523 params->pd = pd->pd_id;
1524 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1525 params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1526 params->stats_queue = 0;
1528 params->use_srq = false;
1531 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1534 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1535 params->srq_id = qp->srq->srq_id;
1536 params->use_srq = true;
1540 static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
1542 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1551 qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
1555 qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
1557 struct qed_rdma_create_qp_out_params *out_params)
1559 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1560 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1562 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1563 &qp->usq.pbl_info, FW_PAGE_SHIFT);
1565 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1566 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1569 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1570 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1573 static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1575 ib_umem_release(qp->usq.umem);
1576 qp->usq.umem = NULL;
1578 ib_umem_release(qp->urq.umem);
1579 qp->urq.umem = NULL;
1582 static int qedr_create_user_qp(struct qedr_dev *dev,
1585 struct ib_udata *udata,
1586 struct ib_qp_init_attr *attrs)
1588 struct qed_rdma_create_qp_in_params in_params;
1589 struct qed_rdma_create_qp_out_params out_params;
1590 struct qedr_pd *pd = get_qedr_pd(ibpd);
1591 struct qedr_create_qp_ureq ureq;
1592 int alloc_and_init = rdma_protocol_roce(&dev->ibdev, 1);
1595 memset(&ureq, 0, sizeof(ureq));
1596 rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
1598 DP_ERR(dev, "Problem copying data from user space\n");
1602 /* SQ - read access only (0), dma sync not required (0) */
1603 rc = qedr_init_user_queue(udata, dev, &qp->usq, ureq.sq_addr,
1604 ureq.sq_len, 0, 0, alloc_and_init);
1609 /* RQ - read access only (0), dma sync not required (0) */
1610 rc = qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr,
1611 ureq.rq_len, 0, 0, alloc_and_init);
1616 memset(&in_params, 0, sizeof(in_params));
1617 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1618 in_params.qp_handle_lo = ureq.qp_handle_lo;
1619 in_params.qp_handle_hi = ureq.qp_handle_hi;
1620 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1621 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1623 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1624 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1627 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1628 &in_params, &out_params);
1635 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1636 qedr_iwarp_populate_user_qp(dev, qp, &out_params);
1638 qp->qp_id = out_params.qp_id;
1639 qp->icid = out_params.icid;
1641 rc = qedr_copy_qp_uresp(dev, qp, udata);
1645 qedr_qp_user_print(dev, qp);
1649 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1651 DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1654 qedr_cleanup_user(dev, qp);
1658 static void qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1660 qp->sq.db = dev->db_addr +
1661 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1662 qp->sq.db_data.data.icid = qp->icid;
1664 qp->rq.db = dev->db_addr +
1665 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1666 qp->rq.db_data.data.icid = qp->icid;
1667 qp->rq.iwarp_db2 = dev->db_addr +
1668 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1669 qp->rq.iwarp_db2_data.data.icid = qp->icid;
1670 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
1674 qedr_roce_create_kernel_qp(struct qedr_dev *dev,
1676 struct qed_rdma_create_qp_in_params *in_params,
1677 u32 n_sq_elems, u32 n_rq_elems)
1679 struct qed_rdma_create_qp_out_params out_params;
1682 rc = dev->ops->common->chain_alloc(dev->cdev,
1683 QED_CHAIN_USE_TO_PRODUCE,
1685 QED_CHAIN_CNT_TYPE_U32,
1687 QEDR_SQE_ELEMENT_SIZE,
1693 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
1694 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
1696 rc = dev->ops->common->chain_alloc(dev->cdev,
1697 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1699 QED_CHAIN_CNT_TYPE_U32,
1701 QEDR_RQE_ELEMENT_SIZE,
1706 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
1707 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
1709 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1710 in_params, &out_params);
1715 qp->qp_id = out_params.qp_id;
1716 qp->icid = out_params.icid;
1718 qedr_set_roce_db_info(dev, qp);
1723 qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
1725 struct qed_rdma_create_qp_in_params *in_params,
1726 u32 n_sq_elems, u32 n_rq_elems)
1728 struct qed_rdma_create_qp_out_params out_params;
1729 struct qed_chain_ext_pbl ext_pbl;
1732 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
1733 QEDR_SQE_ELEMENT_SIZE,
1734 QED_CHAIN_MODE_PBL);
1735 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
1736 QEDR_RQE_ELEMENT_SIZE,
1737 QED_CHAIN_MODE_PBL);
1739 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1740 in_params, &out_params);
1745 /* Now we allocate the chain */
1746 ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
1747 ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
1749 rc = dev->ops->common->chain_alloc(dev->cdev,
1750 QED_CHAIN_USE_TO_PRODUCE,
1752 QED_CHAIN_CNT_TYPE_U32,
1754 QEDR_SQE_ELEMENT_SIZE,
1755 &qp->sq.pbl, &ext_pbl);
1760 ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
1761 ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
1763 rc = dev->ops->common->chain_alloc(dev->cdev,
1764 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1766 QED_CHAIN_CNT_TYPE_U32,
1768 QEDR_RQE_ELEMENT_SIZE,
1769 &qp->rq.pbl, &ext_pbl);
1774 qp->qp_id = out_params.qp_id;
1775 qp->icid = out_params.icid;
1777 qedr_set_iwarp_db_info(dev, qp);
1781 dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1786 static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
1788 dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
1789 kfree(qp->wqe_wr_id);
1791 dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
1792 kfree(qp->rqe_wr_id);
1795 static int qedr_create_kernel_qp(struct qedr_dev *dev,
1798 struct ib_qp_init_attr *attrs)
1800 struct qed_rdma_create_qp_in_params in_params;
1801 struct qedr_pd *pd = get_qedr_pd(ibpd);
1807 memset(&in_params, 0, sizeof(in_params));
1809 /* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
1810 * the ring. The ring should allow at least a single WR, even if the
1811 * user requested none, due to allocation issues.
1812 * We should add an extra WR since the prod and cons indices of
1813 * wqe_wr_id are managed in such a way that the WQ is considered full
1814 * when (prod+1)%max_wr==cons. We currently don't do that because we
1815 * double the number of entries due an iSER issue that pushes far more
1816 * WRs than indicated. If we decline its ib_post_send() then we get
1817 * error prints in the dmesg we'd like to avoid.
1819 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
1822 qp->wqe_wr_id = kcalloc(qp->sq.max_wr, sizeof(*qp->wqe_wr_id),
1824 if (!qp->wqe_wr_id) {
1825 DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
1829 /* QP handle to be written in CQE */
1830 in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
1831 in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
1833 /* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
1834 * the ring. There ring should allow at least a single WR, even if the
1835 * user requested none, due to allocation issues.
1837 qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
1839 /* Allocate driver internal RQ array */
1840 qp->rqe_wr_id = kcalloc(qp->rq.max_wr, sizeof(*qp->rqe_wr_id),
1842 if (!qp->rqe_wr_id) {
1844 "create qp: failed RQ shadow memory allocation\n");
1845 kfree(qp->wqe_wr_id);
1849 qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
1851 n_sq_entries = attrs->cap.max_send_wr;
1852 n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
1853 n_sq_entries = max_t(u32, n_sq_entries, 1);
1854 n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
1856 n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
1858 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1859 rc = qedr_iwarp_create_kernel_qp(dev, qp, &in_params,
1860 n_sq_elems, n_rq_elems);
1862 rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
1863 n_sq_elems, n_rq_elems);
1865 qedr_cleanup_kernel(dev, qp);
1870 struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
1871 struct ib_qp_init_attr *attrs,
1872 struct ib_udata *udata)
1874 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
1875 struct qedr_pd *pd = get_qedr_pd(ibpd);
1880 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
1881 udata ? "user library" : "kernel", pd);
1883 rc = qedr_check_qp_attrs(ibpd, dev, attrs, udata);
1887 DP_DEBUG(dev, QEDR_MSG_QP,
1888 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
1889 udata ? "user library" : "kernel", attrs->event_handler, pd,
1890 get_qedr_cq(attrs->send_cq),
1891 get_qedr_cq(attrs->send_cq)->icid,
1892 get_qedr_cq(attrs->recv_cq),
1893 attrs->recv_cq ? get_qedr_cq(attrs->recv_cq)->icid : 0);
1895 qp = kzalloc(sizeof(*qp), GFP_KERNEL);
1897 DP_ERR(dev, "create qp: failed allocating memory\n");
1898 return ERR_PTR(-ENOMEM);
1901 qedr_set_common_qp_params(dev, qp, pd, attrs);
1903 if (attrs->qp_type == IB_QPT_GSI) {
1904 ibqp = qedr_create_gsi_qp(dev, attrs, qp);
1911 rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
1913 rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
1918 qp->ibqp.qp_num = qp->qp_id;
1920 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1921 rc = xa_insert_irq(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
1931 return ERR_PTR(-EFAULT);
1934 static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
1937 case QED_ROCE_QP_STATE_RESET:
1938 return IB_QPS_RESET;
1939 case QED_ROCE_QP_STATE_INIT:
1941 case QED_ROCE_QP_STATE_RTR:
1943 case QED_ROCE_QP_STATE_RTS:
1945 case QED_ROCE_QP_STATE_SQD:
1947 case QED_ROCE_QP_STATE_ERR:
1949 case QED_ROCE_QP_STATE_SQE:
1955 static enum qed_roce_qp_state qedr_get_state_from_ibqp(
1956 enum ib_qp_state qp_state)
1960 return QED_ROCE_QP_STATE_RESET;
1962 return QED_ROCE_QP_STATE_INIT;
1964 return QED_ROCE_QP_STATE_RTR;
1966 return QED_ROCE_QP_STATE_RTS;
1968 return QED_ROCE_QP_STATE_SQD;
1970 return QED_ROCE_QP_STATE_ERR;
1972 return QED_ROCE_QP_STATE_ERR;
1976 static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
1978 qed_chain_reset(&qph->pbl);
1982 qph->db_data.data.value = cpu_to_le16(0);
1985 static int qedr_update_qp_state(struct qedr_dev *dev,
1987 enum qed_roce_qp_state cur_state,
1988 enum qed_roce_qp_state new_state)
1992 if (new_state == cur_state)
1995 switch (cur_state) {
1996 case QED_ROCE_QP_STATE_RESET:
1997 switch (new_state) {
1998 case QED_ROCE_QP_STATE_INIT:
1999 qp->prev_wqe_size = 0;
2000 qedr_reset_qp_hwq_info(&qp->sq);
2001 qedr_reset_qp_hwq_info(&qp->rq);
2008 case QED_ROCE_QP_STATE_INIT:
2009 switch (new_state) {
2010 case QED_ROCE_QP_STATE_RTR:
2011 /* Update doorbell (in case post_recv was
2012 * done before move to RTR)
2015 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2016 writel(qp->rq.db_data.raw, qp->rq.db);
2019 case QED_ROCE_QP_STATE_ERR:
2022 /* Invalid state change. */
2027 case QED_ROCE_QP_STATE_RTR:
2029 switch (new_state) {
2030 case QED_ROCE_QP_STATE_RTS:
2032 case QED_ROCE_QP_STATE_ERR:
2035 /* Invalid state change. */
2040 case QED_ROCE_QP_STATE_RTS:
2042 switch (new_state) {
2043 case QED_ROCE_QP_STATE_SQD:
2045 case QED_ROCE_QP_STATE_ERR:
2048 /* Invalid state change. */
2053 case QED_ROCE_QP_STATE_SQD:
2055 switch (new_state) {
2056 case QED_ROCE_QP_STATE_RTS:
2057 case QED_ROCE_QP_STATE_ERR:
2060 /* Invalid state change. */
2065 case QED_ROCE_QP_STATE_ERR:
2067 switch (new_state) {
2068 case QED_ROCE_QP_STATE_RESET:
2069 if ((qp->rq.prod != qp->rq.cons) ||
2070 (qp->sq.prod != qp->sq.cons)) {
2072 "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
2073 qp->rq.prod, qp->rq.cons, qp->sq.prod,
2091 int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2092 int attr_mask, struct ib_udata *udata)
2094 struct qedr_qp *qp = get_qedr_qp(ibqp);
2095 struct qed_rdma_modify_qp_in_params qp_params = { 0 };
2096 struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
2097 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
2098 enum ib_qp_state old_qp_state, new_qp_state;
2099 enum qed_roce_qp_state cur_state;
2102 DP_DEBUG(dev, QEDR_MSG_QP,
2103 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
2106 old_qp_state = qedr_get_ibqp_state(qp->state);
2107 if (attr_mask & IB_QP_STATE)
2108 new_qp_state = attr->qp_state;
2110 new_qp_state = old_qp_state;
2112 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2113 if (!ib_modify_qp_is_ok(old_qp_state, new_qp_state,
2114 ibqp->qp_type, attr_mask)) {
2116 "modify qp: invalid attribute mask=0x%x specified for\n"
2117 "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
2118 attr_mask, qp->qp_id, ibqp->qp_type,
2119 old_qp_state, new_qp_state);
2125 /* Translate the masks... */
2126 if (attr_mask & IB_QP_STATE) {
2127 SET_FIELD(qp_params.modify_flags,
2128 QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
2129 qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
2132 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
2133 qp_params.sqd_async = true;
2135 if (attr_mask & IB_QP_PKEY_INDEX) {
2136 SET_FIELD(qp_params.modify_flags,
2137 QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
2138 if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
2143 qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
2146 if (attr_mask & IB_QP_QKEY)
2147 qp->qkey = attr->qkey;
2149 if (attr_mask & IB_QP_ACCESS_FLAGS) {
2150 SET_FIELD(qp_params.modify_flags,
2151 QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
2152 qp_params.incoming_rdma_read_en = attr->qp_access_flags &
2153 IB_ACCESS_REMOTE_READ;
2154 qp_params.incoming_rdma_write_en = attr->qp_access_flags &
2155 IB_ACCESS_REMOTE_WRITE;
2156 qp_params.incoming_atomic_en = attr->qp_access_flags &
2157 IB_ACCESS_REMOTE_ATOMIC;
2160 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
2161 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2164 if (attr_mask & IB_QP_PATH_MTU) {
2165 if (attr->path_mtu < IB_MTU_256 ||
2166 attr->path_mtu > IB_MTU_4096) {
2167 pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
2171 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
2172 ib_mtu_enum_to_int(iboe_get_mtu
2178 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2179 pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
2182 SET_FIELD(qp_params.modify_flags,
2183 QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
2185 qp_params.traffic_class_tos = grh->traffic_class;
2186 qp_params.flow_label = grh->flow_label;
2187 qp_params.hop_limit_ttl = grh->hop_limit;
2189 qp->sgid_idx = grh->sgid_index;
2191 rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
2194 "modify qp: problems with GID index %d (rc=%d)\n",
2195 grh->sgid_index, rc);
2199 rc = qedr_get_dmac(dev, &attr->ah_attr,
2200 qp_params.remote_mac_addr);
2204 qp_params.use_local_mac = true;
2205 ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
2207 DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
2208 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
2209 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
2210 DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
2211 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
2212 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
2213 DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
2214 qp_params.remote_mac_addr);
2216 qp_params.mtu = qp->mtu;
2217 qp_params.lb_indication = false;
2220 if (!qp_params.mtu) {
2221 /* Stay with current MTU */
2223 qp_params.mtu = qp->mtu;
2226 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2229 if (attr_mask & IB_QP_TIMEOUT) {
2230 SET_FIELD(qp_params.modify_flags,
2231 QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
2233 /* The received timeout value is an exponent used like this:
2234 * "12.7.34 LOCAL ACK TIMEOUT
2235 * Value representing the transport (ACK) timeout for use by
2236 * the remote, expressed as: 4.096 * 2^timeout [usec]"
2237 * The FW expects timeout in msec so we need to divide the usec
2238 * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
2239 * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
2240 * The value of zero means infinite so we use a 'max_t' to make
2241 * sure that sub 1 msec values will be configured as 1 msec.
2244 qp_params.ack_timeout =
2245 1 << max_t(int, attr->timeout - 8, 0);
2247 qp_params.ack_timeout = 0;
2250 if (attr_mask & IB_QP_RETRY_CNT) {
2251 SET_FIELD(qp_params.modify_flags,
2252 QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
2253 qp_params.retry_cnt = attr->retry_cnt;
2256 if (attr_mask & IB_QP_RNR_RETRY) {
2257 SET_FIELD(qp_params.modify_flags,
2258 QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
2259 qp_params.rnr_retry_cnt = attr->rnr_retry;
2262 if (attr_mask & IB_QP_RQ_PSN) {
2263 SET_FIELD(qp_params.modify_flags,
2264 QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
2265 qp_params.rq_psn = attr->rq_psn;
2266 qp->rq_psn = attr->rq_psn;
2269 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2270 if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
2273 "unsupported max_rd_atomic=%d, supported=%d\n",
2274 attr->max_rd_atomic,
2275 dev->attr.max_qp_req_rd_atomic_resc);
2279 SET_FIELD(qp_params.modify_flags,
2280 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
2281 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
2284 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
2285 SET_FIELD(qp_params.modify_flags,
2286 QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
2287 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
2290 if (attr_mask & IB_QP_SQ_PSN) {
2291 SET_FIELD(qp_params.modify_flags,
2292 QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
2293 qp_params.sq_psn = attr->sq_psn;
2294 qp->sq_psn = attr->sq_psn;
2297 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2298 if (attr->max_dest_rd_atomic >
2299 dev->attr.max_qp_resp_rd_atomic_resc) {
2301 "unsupported max_dest_rd_atomic=%d, supported=%d\n",
2302 attr->max_dest_rd_atomic,
2303 dev->attr.max_qp_resp_rd_atomic_resc);
2309 SET_FIELD(qp_params.modify_flags,
2310 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
2311 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
2314 if (attr_mask & IB_QP_DEST_QPN) {
2315 SET_FIELD(qp_params.modify_flags,
2316 QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
2318 qp_params.dest_qp = attr->dest_qp_num;
2319 qp->dest_qp_num = attr->dest_qp_num;
2322 cur_state = qp->state;
2324 /* Update the QP state before the actual ramrod to prevent a race with
2325 * fast path. Modifying the QP state to error will cause the device to
2326 * flush the CQEs and while polling the flushed CQEs will considered as
2327 * a potential issue if the QP isn't in error state.
2329 if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
2330 !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
2331 qp->state = QED_ROCE_QP_STATE_ERR;
2333 if (qp->qp_type != IB_QPT_GSI)
2334 rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
2335 qp->qed_qp, &qp_params);
2337 if (attr_mask & IB_QP_STATE) {
2338 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
2339 rc = qedr_update_qp_state(dev, qp, cur_state,
2340 qp_params.new_state);
2341 qp->state = qp_params.new_state;
2348 static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
2350 int ib_qp_acc_flags = 0;
2352 if (params->incoming_rdma_write_en)
2353 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
2354 if (params->incoming_rdma_read_en)
2355 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
2356 if (params->incoming_atomic_en)
2357 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
2358 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
2359 return ib_qp_acc_flags;
2362 int qedr_query_qp(struct ib_qp *ibqp,
2363 struct ib_qp_attr *qp_attr,
2364 int attr_mask, struct ib_qp_init_attr *qp_init_attr)
2366 struct qed_rdma_query_qp_out_params params;
2367 struct qedr_qp *qp = get_qedr_qp(ibqp);
2368 struct qedr_dev *dev = qp->dev;
2371 memset(¶ms, 0, sizeof(params));
2373 rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, ¶ms);
2377 memset(qp_attr, 0, sizeof(*qp_attr));
2378 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2380 qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2381 qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
2382 qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
2383 qp_attr->path_mig_state = IB_MIG_MIGRATED;
2384 qp_attr->rq_psn = params.rq_psn;
2385 qp_attr->sq_psn = params.sq_psn;
2386 qp_attr->dest_qp_num = params.dest_qp;
2388 qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(¶ms);
2390 qp_attr->cap.max_send_wr = qp->sq.max_wr;
2391 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2392 qp_attr->cap.max_send_sge = qp->sq.max_sges;
2393 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
2394 qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
2395 qp_init_attr->cap = qp_attr->cap;
2397 qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
2398 rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
2399 params.flow_label, qp->sgid_idx,
2400 params.hop_limit_ttl, params.traffic_class_tos);
2401 rdma_ah_set_dgid_raw(&qp_attr->ah_attr, ¶ms.dgid.bytes[0]);
2402 rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
2403 rdma_ah_set_sl(&qp_attr->ah_attr, 0);
2404 qp_attr->timeout = params.timeout;
2405 qp_attr->rnr_retry = params.rnr_retry;
2406 qp_attr->retry_cnt = params.retry_cnt;
2407 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2408 qp_attr->pkey_index = params.pkey_index;
2409 qp_attr->port_num = 1;
2410 rdma_ah_set_path_bits(&qp_attr->ah_attr, 0);
2411 rdma_ah_set_static_rate(&qp_attr->ah_attr, 0);
2412 qp_attr->alt_pkey_index = 0;
2413 qp_attr->alt_port_num = 0;
2414 qp_attr->alt_timeout = 0;
2415 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2417 qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2418 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2419 qp_attr->max_rd_atomic = params.max_rd_atomic;
2420 qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2422 DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2423 qp_attr->cap.max_inline_data);
2429 static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
2430 struct ib_udata *udata)
2434 if (qp->qp_type != IB_QPT_GSI) {
2435 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2441 qedr_cleanup_user(dev, qp);
2443 qedr_cleanup_kernel(dev, qp);
2448 int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
2450 struct qedr_qp *qp = get_qedr_qp(ibqp);
2451 struct qedr_dev *dev = qp->dev;
2452 struct ib_qp_attr attr;
2455 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2458 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2459 if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2460 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2461 (qp->state != QED_ROCE_QP_STATE_INIT)) {
2463 attr.qp_state = IB_QPS_ERR;
2464 attr_mask |= IB_QP_STATE;
2466 /* Change the QP state to ERROR */
2467 qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2470 /* Wait for the connect/accept to complete */
2474 while (qp->ep->during_connect) {
2475 DP_DEBUG(dev, QEDR_MSG_QP,
2476 "Still in during connect/accept\n");
2479 if (wait_count++ > 200) {
2481 "during connect timeout\n");
2488 if (qp->qp_type == IB_QPT_GSI)
2489 qedr_destroy_gsi_qp(dev);
2491 qedr_free_qp_resources(dev, qp, udata);
2493 if (atomic_dec_and_test(&qp->refcnt) &&
2494 rdma_protocol_iwarp(&dev->ibdev, 1)) {
2495 xa_erase_irq(&dev->qps, qp->qp_id);
2501 int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
2502 struct ib_udata *udata)
2504 struct qedr_ah *ah = get_qedr_ah(ibah);
2506 rdma_copy_ah_attr(&ah->attr, attr);
2511 void qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
2513 struct qedr_ah *ah = get_qedr_ah(ibah);
2515 rdma_destroy_ah_attr(&ah->attr);
2518 static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2520 struct qedr_pbl *pbl, *tmp;
2522 if (info->pbl_table)
2523 list_add_tail(&info->pbl_table->list_entry,
2524 &info->free_pbl_list);
2526 if (!list_empty(&info->inuse_pbl_list))
2527 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2529 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2530 list_del(&pbl->list_entry);
2531 qedr_free_pbl(dev, &info->pbl_info, pbl);
2535 static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2536 size_t page_list_len, bool two_layered)
2538 struct qedr_pbl *tmp;
2541 INIT_LIST_HEAD(&info->free_pbl_list);
2542 INIT_LIST_HEAD(&info->inuse_pbl_list);
2544 rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2545 page_list_len, two_layered);
2549 info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2550 if (IS_ERR(info->pbl_table)) {
2551 rc = PTR_ERR(info->pbl_table);
2555 DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2556 &info->pbl_table->pa);
2558 /* in usual case we use 2 PBLs, so we add one to free
2559 * list and allocating another one
2561 tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2563 DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2567 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2569 DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2573 free_mr_info(dev, info);
2578 struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2579 u64 usr_addr, int acc, struct ib_udata *udata)
2581 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2586 pd = get_qedr_pd(ibpd);
2587 DP_DEBUG(dev, QEDR_MSG_MR,
2588 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2589 pd->pd_id, start, len, usr_addr, acc);
2591 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2592 return ERR_PTR(-EINVAL);
2594 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2598 mr->type = QEDR_MR_USER;
2600 mr->umem = ib_umem_get(udata, start, len, acc, 0);
2601 if (IS_ERR(mr->umem)) {
2606 rc = init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
2610 qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
2611 &mr->info.pbl_info, PAGE_SHIFT);
2613 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2615 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2619 /* Index only, 18 bit long, lkey = itid << 8 | key */
2620 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2622 mr->hw_mr.pd = pd->pd_id;
2623 mr->hw_mr.local_read = 1;
2624 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2625 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2626 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2627 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2628 mr->hw_mr.mw_bind = false;
2629 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2630 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2631 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2632 mr->hw_mr.page_size_log = PAGE_SHIFT;
2633 mr->hw_mr.fbo = ib_umem_offset(mr->umem);
2634 mr->hw_mr.length = len;
2635 mr->hw_mr.vaddr = usr_addr;
2636 mr->hw_mr.zbva = false;
2637 mr->hw_mr.phy_mr = false;
2638 mr->hw_mr.dma_mr = false;
2640 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2642 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2646 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2647 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2648 mr->hw_mr.remote_atomic)
2649 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2651 DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
2656 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2658 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2664 int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
2666 struct qedr_mr *mr = get_qedr_mr(ib_mr);
2667 struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
2670 rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
2674 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2676 if ((mr->type != QEDR_MR_DMA) && (mr->type != QEDR_MR_FRMR))
2677 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2679 /* it could be user registered memory. */
2680 ib_umem_release(mr->umem);
2687 static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
2688 int max_page_list_len)
2690 struct qedr_pd *pd = get_qedr_pd(ibpd);
2691 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2695 DP_DEBUG(dev, QEDR_MSG_MR,
2696 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
2699 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2704 mr->type = QEDR_MR_FRMR;
2706 rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
2710 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2712 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2716 /* Index only, 18 bit long, lkey = itid << 8 | key */
2717 mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
2719 mr->hw_mr.pd = pd->pd_id;
2720 mr->hw_mr.local_read = 1;
2721 mr->hw_mr.local_write = 0;
2722 mr->hw_mr.remote_read = 0;
2723 mr->hw_mr.remote_write = 0;
2724 mr->hw_mr.remote_atomic = 0;
2725 mr->hw_mr.mw_bind = false;
2726 mr->hw_mr.pbl_ptr = 0;
2727 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2728 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2730 mr->hw_mr.length = 0;
2731 mr->hw_mr.vaddr = 0;
2732 mr->hw_mr.zbva = false;
2733 mr->hw_mr.phy_mr = true;
2734 mr->hw_mr.dma_mr = false;
2736 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2738 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2742 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2743 mr->ibmr.rkey = mr->ibmr.lkey;
2745 DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
2749 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2755 struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
2756 u32 max_num_sg, struct ib_udata *udata)
2760 if (mr_type != IB_MR_TYPE_MEM_REG)
2761 return ERR_PTR(-EINVAL);
2763 mr = __qedr_alloc_mr(ibpd, max_num_sg);
2766 return ERR_PTR(-EINVAL);
2771 static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
2773 struct qedr_mr *mr = get_qedr_mr(ibmr);
2774 struct qedr_pbl *pbl_table;
2775 struct regpair *pbe;
2778 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
2779 DP_ERR(mr->dev, "qedr_set_page fails when %d\n", mr->npages);
2783 DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
2786 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
2787 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
2788 pbe = (struct regpair *)pbl_table->va;
2789 pbe += mr->npages % pbes_in_page;
2790 pbe->lo = cpu_to_le32((u32)addr);
2791 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
2798 static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
2800 int work = info->completed - info->completed_handled - 1;
2802 DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
2803 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
2804 struct qedr_pbl *pbl;
2806 /* Free all the page list that are possible to be freed
2807 * (all the ones that were invalidated), under the assumption
2808 * that if an FMR was completed successfully that means that
2809 * if there was an invalidate operation before it also ended
2811 pbl = list_first_entry(&info->inuse_pbl_list,
2812 struct qedr_pbl, list_entry);
2813 list_move_tail(&pbl->list_entry, &info->free_pbl_list);
2814 info->completed_handled++;
2818 int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
2819 int sg_nents, unsigned int *sg_offset)
2821 struct qedr_mr *mr = get_qedr_mr(ibmr);
2825 handle_completed_mrs(mr->dev, &mr->info);
2826 return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
2829 struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
2831 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2832 struct qedr_pd *pd = get_qedr_pd(ibpd);
2836 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2838 return ERR_PTR(-ENOMEM);
2840 mr->type = QEDR_MR_DMA;
2842 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2844 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2848 /* index only, 18 bit long, lkey = itid << 8 | key */
2849 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2850 mr->hw_mr.pd = pd->pd_id;
2851 mr->hw_mr.local_read = 1;
2852 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2853 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2854 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2855 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2856 mr->hw_mr.dma_mr = true;
2858 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2860 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2864 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2865 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2866 mr->hw_mr.remote_atomic)
2867 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2869 DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
2873 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2879 static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
2881 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
2884 static int sge_data_len(struct ib_sge *sg_list, int num_sge)
2888 for (i = 0; i < num_sge; i++)
2889 len += sg_list[i].length;
2894 static void swap_wqe_data64(u64 *p)
2898 for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
2899 *p = cpu_to_be64(cpu_to_le64(*p));
2902 static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
2903 struct qedr_qp *qp, u8 *wqe_size,
2904 const struct ib_send_wr *wr,
2905 const struct ib_send_wr **bad_wr,
2908 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
2909 char *seg_prt, *wqe;
2912 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
2913 DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
2927 /* Copy data inline */
2928 for (i = 0; i < wr->num_sge; i++) {
2929 u32 len = wr->sg_list[i].length;
2930 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
2935 /* New segment required */
2937 wqe = (char *)qed_chain_produce(&qp->sq.pbl);
2939 seg_siz = sizeof(struct rdma_sq_common_wqe);
2943 /* Calculate currently allowed length */
2944 cur = min_t(u32, len, seg_siz);
2945 memcpy(seg_prt, src, cur);
2947 /* Update segment variables */
2951 /* Update sge variables */
2955 /* Swap fully-completed segments */
2957 swap_wqe_data64((u64 *)wqe);
2961 /* swap last not completed segment */
2963 swap_wqe_data64((u64 *)wqe);
2968 #define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
2970 DMA_REGPAIR_LE(sge->addr, vaddr); \
2971 (sge)->length = cpu_to_le32(vlength); \
2972 (sge)->flags = cpu_to_le32(vflags); \
2975 #define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
2977 DMA_REGPAIR_LE(hdr->wr_id, vwr_id); \
2978 (hdr)->num_sges = num_sge; \
2981 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
2983 DMA_REGPAIR_LE(sge->addr, vaddr); \
2984 (sge)->length = cpu_to_le32(vlength); \
2985 (sge)->l_key = cpu_to_le32(vlkey); \
2988 static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
2989 const struct ib_send_wr *wr)
2994 for (i = 0; i < wr->num_sge; i++) {
2995 struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
2997 DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
2998 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
2999 sge->length = cpu_to_le32(wr->sg_list[i].length);
3000 data_size += wr->sg_list[i].length;
3004 *wqe_size += wr->num_sge;
3009 static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
3011 struct rdma_sq_rdma_wqe_1st *rwqe,
3012 struct rdma_sq_rdma_wqe_2nd *rwqe2,
3013 const struct ib_send_wr *wr,
3014 const struct ib_send_wr **bad_wr)
3016 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
3017 DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
3019 if (wr->send_flags & IB_SEND_INLINE &&
3020 (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
3021 wr->opcode == IB_WR_RDMA_WRITE)) {
3024 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
3025 return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
3026 bad_wr, &rwqe->flags, flags);
3029 return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
3032 static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
3034 struct rdma_sq_send_wqe_1st *swqe,
3035 struct rdma_sq_send_wqe_2st *swqe2,
3036 const struct ib_send_wr *wr,
3037 const struct ib_send_wr **bad_wr)
3039 memset(swqe2, 0, sizeof(*swqe2));
3040 if (wr->send_flags & IB_SEND_INLINE) {
3043 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
3044 return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
3045 bad_wr, &swqe->flags, flags);
3048 return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
3051 static int qedr_prepare_reg(struct qedr_qp *qp,
3052 struct rdma_sq_fmr_wqe_1st *fwqe1,
3053 const struct ib_reg_wr *wr)
3055 struct qedr_mr *mr = get_qedr_mr(wr->mr);
3056 struct rdma_sq_fmr_wqe_2nd *fwqe2;
3058 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
3059 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
3060 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
3061 fwqe1->l_key = wr->key;
3063 fwqe2->access_ctrl = 0;
3065 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
3066 !!(wr->access & IB_ACCESS_REMOTE_READ));
3067 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
3068 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
3069 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
3070 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
3071 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
3072 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
3073 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
3074 fwqe2->fmr_ctrl = 0;
3076 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
3077 ilog2(mr->ibmr.page_size) - 12);
3079 fwqe2->length_hi = 0;
3080 fwqe2->length_lo = mr->ibmr.length;
3081 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
3082 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
3084 qp->wqe_wr_id[qp->sq.prod].mr = mr;
3089 static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
3092 case IB_WR_RDMA_WRITE:
3093 case IB_WR_RDMA_WRITE_WITH_IMM:
3094 return IB_WC_RDMA_WRITE;
3095 case IB_WR_SEND_WITH_IMM:
3097 case IB_WR_SEND_WITH_INV:
3099 case IB_WR_RDMA_READ:
3100 case IB_WR_RDMA_READ_WITH_INV:
3101 return IB_WC_RDMA_READ;
3102 case IB_WR_ATOMIC_CMP_AND_SWP:
3103 return IB_WC_COMP_SWAP;
3104 case IB_WR_ATOMIC_FETCH_AND_ADD:
3105 return IB_WC_FETCH_ADD;
3107 return IB_WC_REG_MR;
3108 case IB_WR_LOCAL_INV:
3109 return IB_WC_LOCAL_INV;
3115 static inline bool qedr_can_post_send(struct qedr_qp *qp,
3116 const struct ib_send_wr *wr)
3118 int wq_is_full, err_wr, pbl_is_full;
3119 struct qedr_dev *dev = qp->dev;
3121 /* prevent SQ overflow and/or processing of a bad WR */
3122 err_wr = wr->num_sge > qp->sq.max_sges;
3123 wq_is_full = qedr_wq_is_full(&qp->sq);
3124 pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
3125 QEDR_MAX_SQE_ELEMENTS_PER_SQE;
3126 if (wq_is_full || err_wr || pbl_is_full) {
3127 if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
3129 "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
3131 qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
3134 if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
3136 "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
3138 qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
3142 !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
3144 "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
3146 qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
3153 static int __qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3154 const struct ib_send_wr **bad_wr)
3156 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3157 struct qedr_qp *qp = get_qedr_qp(ibqp);
3158 struct rdma_sq_atomic_wqe_1st *awqe1;
3159 struct rdma_sq_atomic_wqe_2nd *awqe2;
3160 struct rdma_sq_atomic_wqe_3rd *awqe3;
3161 struct rdma_sq_send_wqe_2st *swqe2;
3162 struct rdma_sq_local_inv_wqe *iwqe;
3163 struct rdma_sq_rdma_wqe_2nd *rwqe2;
3164 struct rdma_sq_send_wqe_1st *swqe;
3165 struct rdma_sq_rdma_wqe_1st *rwqe;
3166 struct rdma_sq_fmr_wqe_1st *fwqe1;
3167 struct rdma_sq_common_wqe *wqe;
3172 if (!qedr_can_post_send(qp, wr)) {
3177 wqe = qed_chain_produce(&qp->sq.pbl);
3178 qp->wqe_wr_id[qp->sq.prod].signaled =
3179 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
3182 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
3183 !!(wr->send_flags & IB_SEND_SOLICITED));
3184 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
3185 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
3186 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
3187 !!(wr->send_flags & IB_SEND_FENCE));
3188 wqe->prev_wqe_size = qp->prev_wqe_size;
3190 qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
3192 switch (wr->opcode) {
3193 case IB_WR_SEND_WITH_IMM:
3194 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3199 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
3200 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3202 swqe2 = qed_chain_produce(&qp->sq.pbl);
3204 swqe->inv_key_or_imm_data = cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
3205 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3207 swqe->length = cpu_to_le32(length);
3208 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3209 qp->prev_wqe_size = swqe->wqe_size;
3210 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3213 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
3214 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3217 swqe2 = qed_chain_produce(&qp->sq.pbl);
3218 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3220 swqe->length = cpu_to_le32(length);
3221 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3222 qp->prev_wqe_size = swqe->wqe_size;
3223 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3225 case IB_WR_SEND_WITH_INV:
3226 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
3227 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3228 swqe2 = qed_chain_produce(&qp->sq.pbl);
3230 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
3231 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3233 swqe->length = cpu_to_le32(length);
3234 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3235 qp->prev_wqe_size = swqe->wqe_size;
3236 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3239 case IB_WR_RDMA_WRITE_WITH_IMM:
3240 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3245 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
3246 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3249 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
3250 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3251 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3253 rwqe->length = cpu_to_le32(length);
3254 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3255 qp->prev_wqe_size = rwqe->wqe_size;
3256 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3258 case IB_WR_RDMA_WRITE:
3259 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
3260 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3263 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3264 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3266 rwqe->length = cpu_to_le32(length);
3267 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3268 qp->prev_wqe_size = rwqe->wqe_size;
3269 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3271 case IB_WR_RDMA_READ_WITH_INV:
3272 SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
3273 /* fallthrough -- same is identical to RDMA READ */
3275 case IB_WR_RDMA_READ:
3276 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
3277 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3280 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3281 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3283 rwqe->length = cpu_to_le32(length);
3284 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3285 qp->prev_wqe_size = rwqe->wqe_size;
3286 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3289 case IB_WR_ATOMIC_CMP_AND_SWP:
3290 case IB_WR_ATOMIC_FETCH_AND_ADD:
3291 awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
3292 awqe1->wqe_size = 4;
3294 awqe2 = qed_chain_produce(&qp->sq.pbl);
3295 DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
3296 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
3298 awqe3 = qed_chain_produce(&qp->sq.pbl);
3300 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
3301 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
3302 DMA_REGPAIR_LE(awqe3->swap_data,
3303 atomic_wr(wr)->compare_add);
3305 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
3306 DMA_REGPAIR_LE(awqe3->swap_data,
3307 atomic_wr(wr)->swap);
3308 DMA_REGPAIR_LE(awqe3->cmp_data,
3309 atomic_wr(wr)->compare_add);
3312 qedr_prepare_sq_sges(qp, NULL, wr);
3314 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
3315 qp->prev_wqe_size = awqe1->wqe_size;
3318 case IB_WR_LOCAL_INV:
3319 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
3322 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
3323 iwqe->inv_l_key = wr->ex.invalidate_rkey;
3324 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
3325 qp->prev_wqe_size = iwqe->wqe_size;
3328 DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
3329 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
3330 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
3331 fwqe1->wqe_size = 2;
3333 rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
3335 DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
3340 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
3341 qp->prev_wqe_size = fwqe1->wqe_size;
3344 DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
3353 /* Restore prod to its position before
3354 * this WR was processed
3356 value = le16_to_cpu(qp->sq.db_data.data.value);
3357 qed_chain_set_prod(&qp->sq.pbl, value, wqe);
3359 /* Restore prev_wqe_size */
3360 qp->prev_wqe_size = wqe->prev_wqe_size;
3362 DP_ERR(dev, "POST SEND FAILED\n");
3368 int qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3369 const struct ib_send_wr **bad_wr)
3371 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3372 struct qedr_qp *qp = get_qedr_qp(ibqp);
3373 unsigned long flags;
3378 if (qp->qp_type == IB_QPT_GSI)
3379 return qedr_gsi_post_send(ibqp, wr, bad_wr);
3381 spin_lock_irqsave(&qp->q_lock, flags);
3383 if (rdma_protocol_roce(&dev->ibdev, 1)) {
3384 if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
3385 (qp->state != QED_ROCE_QP_STATE_ERR) &&
3386 (qp->state != QED_ROCE_QP_STATE_SQD)) {
3387 spin_unlock_irqrestore(&qp->q_lock, flags);
3389 DP_DEBUG(dev, QEDR_MSG_CQ,
3390 "QP in wrong state! QP icid=0x%x state %d\n",
3391 qp->icid, qp->state);
3397 rc = __qedr_post_send(ibqp, wr, bad_wr);
3401 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3403 qedr_inc_sw_prod(&qp->sq);
3405 qp->sq.db_data.data.value++;
3411 * If there was a failure in the first WR then it will be triggered in
3412 * vane. However this is not harmful (as long as the producer value is
3413 * unchanged). For performance reasons we avoid checking for this
3414 * redundant doorbell.
3416 * qp->wqe_wr_id is accessed during qedr_poll_cq, as
3417 * soon as we give the doorbell, we could get a completion
3418 * for this wr, therefore we need to make sure that the
3419 * memory is updated before giving the doorbell.
3420 * During qedr_poll_cq, rmb is called before accessing the
3421 * cqe. This covers for the smp_rmb as well.
3424 writel(qp->sq.db_data.raw, qp->sq.db);
3426 spin_unlock_irqrestore(&qp->q_lock, flags);
3431 static u32 qedr_srq_elem_left(struct qedr_srq_hwq_info *hw_srq)
3435 /* Calculate number of elements used based on producer
3436 * count and consumer count and subtract it from max
3437 * work request supported so that we get elements left.
3439 used = hw_srq->wr_prod_cnt - hw_srq->wr_cons_cnt;
3441 return hw_srq->max_wr - used;
3444 int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
3445 const struct ib_recv_wr **bad_wr)
3447 struct qedr_srq *srq = get_qedr_srq(ibsrq);
3448 struct qedr_srq_hwq_info *hw_srq;
3449 struct qedr_dev *dev = srq->dev;
3450 struct qed_chain *pbl;
3451 unsigned long flags;
3456 spin_lock_irqsave(&srq->lock, flags);
3458 hw_srq = &srq->hw_srq;
3459 pbl = &srq->hw_srq.pbl;
3461 struct rdma_srq_wqe_header *hdr;
3464 if (!qedr_srq_elem_left(hw_srq) ||
3465 wr->num_sge > srq->hw_srq.max_sges) {
3466 DP_ERR(dev, "Can't post WR (%d,%d) || (%d > %d)\n",
3467 hw_srq->wr_prod_cnt, hw_srq->wr_cons_cnt,
3468 wr->num_sge, srq->hw_srq.max_sges);
3474 hdr = qed_chain_produce(pbl);
3475 num_sge = wr->num_sge;
3476 /* Set number of sge and work request id in header */
3477 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
3479 srq->hw_srq.wr_prod_cnt++;
3483 DP_DEBUG(dev, QEDR_MSG_SRQ,
3484 "SRQ WR: SGEs: %d with wr_id[%d] = %llx\n",
3485 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
3487 for (i = 0; i < wr->num_sge; i++) {
3488 struct rdma_srq_sge *srq_sge = qed_chain_produce(pbl);
3490 /* Set SGE length, lkey and address */
3491 SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
3492 wr->sg_list[i].length, wr->sg_list[i].lkey);
3494 DP_DEBUG(dev, QEDR_MSG_SRQ,
3495 "[%d]: len %d key %x addr %x:%x\n",
3496 i, srq_sge->length, srq_sge->l_key,
3497 srq_sge->addr.hi, srq_sge->addr.lo);
3501 /* Flush WQE and SGE information before
3502 * updating producer.
3506 /* SRQ producer is 8 bytes. Need to update SGE producer index
3507 * in first 4 bytes and need to update WQE producer in
3510 *srq->hw_srq.virt_prod_pair_addr = hw_srq->sge_prod;
3511 offset = offsetof(struct rdma_srq_producers, wqe_prod);
3512 *((u8 *)srq->hw_srq.virt_prod_pair_addr + offset) =
3515 /* Flush producer after updating it. */
3520 DP_DEBUG(dev, QEDR_MSG_SRQ, "POST: Elements in S-RQ: %d\n",
3521 qed_chain_get_elem_left(pbl));
3522 spin_unlock_irqrestore(&srq->lock, flags);
3527 int qedr_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
3528 const struct ib_recv_wr **bad_wr)
3530 struct qedr_qp *qp = get_qedr_qp(ibqp);
3531 struct qedr_dev *dev = qp->dev;
3532 unsigned long flags;
3535 if (qp->qp_type == IB_QPT_GSI)
3536 return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3538 spin_lock_irqsave(&qp->q_lock, flags);
3540 if (qp->state == QED_ROCE_QP_STATE_RESET) {
3541 spin_unlock_irqrestore(&qp->q_lock, flags);
3549 if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3550 QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3551 wr->num_sge > qp->rq.max_sges) {
3552 DP_ERR(dev, "Can't post WR (%d < %d) || (%d > %d)\n",
3553 qed_chain_get_elem_left_u32(&qp->rq.pbl),
3554 QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3560 for (i = 0; i < wr->num_sge; i++) {
3562 struct rdma_rq_sge *rqe =
3563 qed_chain_produce(&qp->rq.pbl);
3565 /* First one must include the number
3566 * of SGE in the list
3569 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3572 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO,
3573 wr->sg_list[i].lkey);
3575 RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3576 wr->sg_list[i].length, flags);
3579 /* Special case of no sges. FW requires between 1-4 sges...
3580 * in this case we need to post 1 sge with length zero. this is
3581 * because rdma write with immediate consumes an RQ.
3585 struct rdma_rq_sge *rqe =
3586 qed_chain_produce(&qp->rq.pbl);
3588 /* First one must include the number
3589 * of SGE in the list
3591 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO, 0);
3592 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3594 RQ_SGE_SET(rqe, 0, 0, flags);
3598 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3599 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3601 qedr_inc_sw_prod(&qp->rq);
3603 /* qp->rqe_wr_id is accessed during qedr_poll_cq, as
3604 * soon as we give the doorbell, we could get a completion
3605 * for this wr, therefore we need to make sure that the
3606 * memory is update before giving the doorbell.
3607 * During qedr_poll_cq, rmb is called before accessing the
3608 * cqe. This covers for the smp_rmb as well.
3612 qp->rq.db_data.data.value++;
3614 writel(qp->rq.db_data.raw, qp->rq.db);
3616 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
3617 writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
3623 spin_unlock_irqrestore(&qp->q_lock, flags);
3628 static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3630 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3632 return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3636 static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3638 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3641 qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
3642 resp_cqe->qp_handle.lo,
3647 static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
3649 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3651 return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
3654 /* Return latest CQE (needs processing) */
3655 static union rdma_cqe *get_cqe(struct qedr_cq *cq)
3657 return cq->latest_cqe;
3660 /* In fmr we need to increase the number of fmr completed counter for the fmr
3661 * algorithm determining whether we can free a pbl or not.
3662 * we need to perform this whether the work request was signaled or not. for
3663 * this purpose we call this function from the condition that checks if a wr
3664 * should be skipped, to make sure we don't miss it ( possibly this fmr
3665 * operation was not signalted)
3667 static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
3669 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
3670 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3673 static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
3674 struct qedr_cq *cq, int num_entries,
3675 struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
3680 while (num_entries && qp->sq.wqe_cons != hw_cons) {
3681 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
3682 qedr_chk_if_fmr(qp);
3688 wc->status = status;
3691 wc->src_qp = qp->id;
3694 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
3695 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
3697 switch (wc->opcode) {
3698 case IB_WC_RDMA_WRITE:
3699 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3701 case IB_WC_COMP_SWAP:
3702 case IB_WC_FETCH_ADD:
3706 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3708 case IB_WC_RDMA_READ:
3710 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3720 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
3721 qed_chain_consume(&qp->sq.pbl);
3722 qedr_inc_sw_cons(&qp->sq);
3728 static int qedr_poll_cq_req(struct qedr_dev *dev,
3729 struct qedr_qp *qp, struct qedr_cq *cq,
3730 int num_entries, struct ib_wc *wc,
3731 struct rdma_cqe_requester *req)
3735 switch (req->status) {
3736 case RDMA_CQE_REQ_STS_OK:
3737 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3740 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
3741 if (qp->state != QED_ROCE_QP_STATE_ERR)
3742 DP_DEBUG(dev, QEDR_MSG_CQ,
3743 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3744 cq->icid, qp->icid);
3745 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3746 IB_WC_WR_FLUSH_ERR, 1);
3749 /* process all WQE before the cosumer */
3750 qp->state = QED_ROCE_QP_STATE_ERR;
3751 cnt = process_req(dev, qp, cq, num_entries, wc,
3752 req->sq_cons - 1, IB_WC_SUCCESS, 0);
3754 /* if we have extra WC fill it with actual error info */
3755 if (cnt < num_entries) {
3756 enum ib_wc_status wc_status;
3758 switch (req->status) {
3759 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
3761 "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3762 cq->icid, qp->icid);
3763 wc_status = IB_WC_BAD_RESP_ERR;
3765 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
3767 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3768 cq->icid, qp->icid);
3769 wc_status = IB_WC_LOC_LEN_ERR;
3771 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
3773 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3774 cq->icid, qp->icid);
3775 wc_status = IB_WC_LOC_QP_OP_ERR;
3777 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
3779 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3780 cq->icid, qp->icid);
3781 wc_status = IB_WC_LOC_PROT_ERR;
3783 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
3785 "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3786 cq->icid, qp->icid);
3787 wc_status = IB_WC_MW_BIND_ERR;
3789 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
3791 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3792 cq->icid, qp->icid);
3793 wc_status = IB_WC_REM_INV_REQ_ERR;
3795 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
3797 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3798 cq->icid, qp->icid);
3799 wc_status = IB_WC_REM_ACCESS_ERR;
3801 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
3803 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3804 cq->icid, qp->icid);
3805 wc_status = IB_WC_REM_OP_ERR;
3807 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
3809 "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3810 cq->icid, qp->icid);
3811 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
3813 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
3815 "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3816 cq->icid, qp->icid);
3817 wc_status = IB_WC_RETRY_EXC_ERR;
3821 "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3822 cq->icid, qp->icid);
3823 wc_status = IB_WC_GENERAL_ERR;
3825 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
3833 static inline int qedr_cqe_resp_status_to_ib(u8 status)
3836 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
3837 return IB_WC_LOC_ACCESS_ERR;
3838 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
3839 return IB_WC_LOC_LEN_ERR;
3840 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
3841 return IB_WC_LOC_QP_OP_ERR;
3842 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
3843 return IB_WC_LOC_PROT_ERR;
3844 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
3845 return IB_WC_MW_BIND_ERR;
3846 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
3847 return IB_WC_REM_INV_RD_REQ_ERR;
3848 case RDMA_CQE_RESP_STS_OK:
3849 return IB_WC_SUCCESS;
3851 return IB_WC_GENERAL_ERR;
3855 static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
3858 wc->status = IB_WC_SUCCESS;
3859 wc->byte_len = le32_to_cpu(resp->length);
3861 if (resp->flags & QEDR_RESP_IMM) {
3862 wc->ex.imm_data = cpu_to_be32(le32_to_cpu(resp->imm_data_or_inv_r_Key));
3863 wc->wc_flags |= IB_WC_WITH_IMM;
3865 if (resp->flags & QEDR_RESP_RDMA)
3866 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
3868 if (resp->flags & QEDR_RESP_INV)
3871 } else if (resp->flags & QEDR_RESP_INV) {
3872 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
3873 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
3875 if (resp->flags & QEDR_RESP_RDMA)
3878 } else if (resp->flags & QEDR_RESP_RDMA) {
3885 static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3886 struct qedr_cq *cq, struct ib_wc *wc,
3887 struct rdma_cqe_responder *resp, u64 wr_id)
3889 /* Must fill fields before qedr_set_ok_cqe_resp_wc() */
3890 wc->opcode = IB_WC_RECV;
3893 if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
3894 if (qedr_set_ok_cqe_resp_wc(resp, wc))
3896 "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
3897 cq, cq->icid, resp->flags);
3900 wc->status = qedr_cqe_resp_status_to_ib(resp->status);
3901 if (wc->status == IB_WC_GENERAL_ERR)
3903 "CQ %p (icid=%d) contains an invalid CQE status %d\n",
3904 cq, cq->icid, resp->status);
3907 /* Fill the rest of the WC */
3909 wc->src_qp = qp->id;
3914 static int process_resp_one_srq(struct qedr_dev *dev, struct qedr_qp *qp,
3915 struct qedr_cq *cq, struct ib_wc *wc,
3916 struct rdma_cqe_responder *resp)
3918 struct qedr_srq *srq = qp->srq;
3921 wr_id = HILO_GEN(le32_to_cpu(resp->srq_wr_id.hi),
3922 le32_to_cpu(resp->srq_wr_id.lo), u64);
3924 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
3925 wc->status = IB_WC_WR_FLUSH_ERR;
3929 wc->src_qp = qp->id;
3933 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
3935 srq->hw_srq.wr_cons_cnt++;
3939 static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3940 struct qedr_cq *cq, struct ib_wc *wc,
3941 struct rdma_cqe_responder *resp)
3943 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3945 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
3947 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3948 qed_chain_consume(&qp->rq.pbl);
3949 qedr_inc_sw_cons(&qp->rq);
3954 static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
3955 int num_entries, struct ib_wc *wc, u16 hw_cons)
3959 while (num_entries && qp->rq.wqe_cons != hw_cons) {
3961 wc->status = IB_WC_WR_FLUSH_ERR;
3964 wc->src_qp = qp->id;
3966 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3971 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3972 qed_chain_consume(&qp->rq.pbl);
3973 qedr_inc_sw_cons(&qp->rq);
3979 static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
3980 struct rdma_cqe_responder *resp, int *update)
3982 if (le16_to_cpu(resp->rq_cons_or_srq_id) == qp->rq.wqe_cons) {
3988 static int qedr_poll_cq_resp_srq(struct qedr_dev *dev, struct qedr_qp *qp,
3989 struct qedr_cq *cq, int num_entries,
3991 struct rdma_cqe_responder *resp)
3995 cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
4001 static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
4002 struct qedr_cq *cq, int num_entries,
4003 struct ib_wc *wc, struct rdma_cqe_responder *resp,
4008 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4009 cnt = process_resp_flush(qp, cq, num_entries, wc,
4010 resp->rq_cons_or_srq_id);
4011 try_consume_resp_cqe(cq, qp, resp, update);
4013 cnt = process_resp_one(dev, qp, cq, wc, resp);
4021 static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4022 struct rdma_cqe_requester *req, int *update)
4024 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
4030 int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
4032 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
4033 struct qedr_cq *cq = get_qedr_cq(ibcq);
4034 union rdma_cqe *cqe;
4035 u32 old_cons, new_cons;
4036 unsigned long flags;
4040 if (cq->destroyed) {
4042 "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
4047 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
4048 return qedr_gsi_poll_cq(ibcq, num_entries, wc);
4050 spin_lock_irqsave(&cq->cq_lock, flags);
4051 cqe = cq->latest_cqe;
4052 old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4053 while (num_entries && is_valid_cqe(cq, cqe)) {
4057 /* prevent speculative reads of any field of CQE */
4060 qp = cqe_get_qp(cqe);
4062 WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
4068 switch (cqe_get_type(cqe)) {
4069 case RDMA_CQE_TYPE_REQUESTER:
4070 cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
4072 try_consume_req_cqe(cq, qp, &cqe->req, &update);
4074 case RDMA_CQE_TYPE_RESPONDER_RQ:
4075 cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
4076 &cqe->resp, &update);
4078 case RDMA_CQE_TYPE_RESPONDER_SRQ:
4079 cnt = qedr_poll_cq_resp_srq(dev, qp, cq, num_entries,
4083 case RDMA_CQE_TYPE_INVALID:
4085 DP_ERR(dev, "Error: invalid CQE type = %d\n",
4094 new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4096 cq->cq_cons += new_cons - old_cons;
4099 /* doorbell notifies abount latest VALID entry,
4100 * but chain already point to the next INVALID one
4102 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
4104 spin_unlock_irqrestore(&cq->cq_lock, flags);
4108 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
4110 const struct ib_wc *in_wc,
4111 const struct ib_grh *in_grh,
4112 const struct ib_mad_hdr *mad_hdr,
4113 size_t in_mad_size, struct ib_mad_hdr *out_mad,
4114 size_t *out_mad_size, u16 *out_mad_pkey_index)
4116 struct qedr_dev *dev = get_qedr_dev(ibdev);
4118 DP_DEBUG(dev, QEDR_MSG_GSI,
4119 "QEDR_PROCESS_MAD in_mad %x %x %x %x %x %x %x %x\n",
4120 mad_hdr->attr_id, mad_hdr->base_version, mad_hdr->attr_mod,
4121 mad_hdr->class_specific, mad_hdr->class_version,
4122 mad_hdr->method, mad_hdr->mgmt_class, mad_hdr->status);
4123 return IB_MAD_RESULT_SUCCESS;