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>
46 #include <linux/qed/common_hsi.h>
47 #include "qedr_hsi_rdma.h"
48 #include <linux/qed/qed_if.h>
51 #include <rdma/qedr-abi.h>
52 #include "qedr_roce_cm.h"
54 #define QEDR_SRQ_WQE_ELEM_SIZE sizeof(union rdma_srq_elm)
55 #define RDMA_MAX_SGE_PER_SRQ (4)
56 #define RDMA_MAX_SRQ_WQE_SIZE (RDMA_MAX_SGE_PER_SRQ + 1)
58 #define DB_ADDR_SHIFT(addr) ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
60 static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src,
63 size_t min_len = min_t(size_t, len, udata->outlen);
65 return ib_copy_to_udata(udata, src, min_len);
68 int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
70 if (index >= QEDR_ROCE_PKEY_TABLE_LEN)
73 *pkey = QEDR_ROCE_PKEY_DEFAULT;
77 int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
78 int index, union ib_gid *sgid)
80 struct qedr_dev *dev = get_qedr_dev(ibdev);
82 memset(sgid->raw, 0, sizeof(sgid->raw));
83 ether_addr_copy(sgid->raw, dev->ndev->dev_addr);
85 DP_DEBUG(dev, QEDR_MSG_INIT, "QUERY sgid[%d]=%llx:%llx\n", index,
86 sgid->global.interface_id, sgid->global.subnet_prefix);
91 int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
93 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
94 struct qedr_device_attr *qattr = &dev->attr;
95 struct qedr_srq *srq = get_qedr_srq(ibsrq);
97 srq_attr->srq_limit = srq->srq_limit;
98 srq_attr->max_wr = qattr->max_srq_wr;
99 srq_attr->max_sge = qattr->max_sge;
104 int qedr_query_device(struct ib_device *ibdev,
105 struct ib_device_attr *attr, struct ib_udata *udata)
107 struct qedr_dev *dev = get_qedr_dev(ibdev);
108 struct qedr_device_attr *qattr = &dev->attr;
110 if (!dev->rdma_ctx) {
112 "qedr_query_device called with invalid params rdma_ctx=%p\n",
117 memset(attr, 0, sizeof(*attr));
119 attr->fw_ver = qattr->fw_ver;
120 attr->sys_image_guid = qattr->sys_image_guid;
121 attr->max_mr_size = qattr->max_mr_size;
122 attr->page_size_cap = qattr->page_size_caps;
123 attr->vendor_id = qattr->vendor_id;
124 attr->vendor_part_id = qattr->vendor_part_id;
125 attr->hw_ver = qattr->hw_ver;
126 attr->max_qp = qattr->max_qp;
127 attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
128 attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
129 IB_DEVICE_RC_RNR_NAK_GEN |
130 IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
132 attr->max_send_sge = qattr->max_sge;
133 attr->max_recv_sge = qattr->max_sge;
134 attr->max_sge_rd = qattr->max_sge;
135 attr->max_cq = qattr->max_cq;
136 attr->max_cqe = qattr->max_cqe;
137 attr->max_mr = qattr->max_mr;
138 attr->max_mw = qattr->max_mw;
139 attr->max_pd = qattr->max_pd;
140 attr->atomic_cap = dev->atomic_cap;
141 attr->max_fmr = qattr->max_fmr;
142 attr->max_map_per_fmr = 16;
143 attr->max_qp_init_rd_atom =
144 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
145 attr->max_qp_rd_atom =
146 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
147 attr->max_qp_init_rd_atom);
149 attr->max_srq = qattr->max_srq;
150 attr->max_srq_sge = qattr->max_srq_sge;
151 attr->max_srq_wr = qattr->max_srq_wr;
153 attr->local_ca_ack_delay = qattr->dev_ack_delay;
154 attr->max_fast_reg_page_list_len = qattr->max_mr / 8;
155 attr->max_pkeys = QEDR_ROCE_PKEY_MAX;
156 attr->max_ah = qattr->max_ah;
161 static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
166 *ib_speed = IB_SPEED_SDR;
167 *ib_width = IB_WIDTH_1X;
170 *ib_speed = IB_SPEED_QDR;
171 *ib_width = IB_WIDTH_1X;
175 *ib_speed = IB_SPEED_DDR;
176 *ib_width = IB_WIDTH_4X;
180 *ib_speed = IB_SPEED_EDR;
181 *ib_width = IB_WIDTH_1X;
185 *ib_speed = IB_SPEED_QDR;
186 *ib_width = IB_WIDTH_4X;
190 *ib_speed = IB_SPEED_HDR;
191 *ib_width = IB_WIDTH_1X;
195 *ib_speed = IB_SPEED_EDR;
196 *ib_width = IB_WIDTH_4X;
201 *ib_speed = IB_SPEED_SDR;
202 *ib_width = IB_WIDTH_1X;
206 int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
208 struct qedr_dev *dev;
209 struct qed_rdma_port *rdma_port;
211 dev = get_qedr_dev(ibdev);
213 DP_ERR(dev, "invalid_port=0x%x\n", port);
217 if (!dev->rdma_ctx) {
218 DP_ERR(dev, "rdma_ctx is NULL\n");
222 rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
224 /* *attr being zeroed by the caller, avoid zeroing it here */
225 if (rdma_port->port_state == QED_RDMA_PORT_UP) {
226 attr->state = IB_PORT_ACTIVE;
227 attr->phys_state = 5;
229 attr->state = IB_PORT_DOWN;
230 attr->phys_state = 3;
232 attr->max_mtu = IB_MTU_4096;
233 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
238 attr->ip_gids = true;
239 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
240 attr->gid_tbl_len = 1;
241 attr->pkey_tbl_len = 1;
243 attr->gid_tbl_len = QEDR_MAX_SGID;
244 attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
246 attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
247 attr->qkey_viol_cntr = 0;
248 get_link_speed_and_width(rdma_port->link_speed,
249 &attr->active_speed, &attr->active_width);
250 attr->max_msg_sz = rdma_port->max_msg_size;
251 attr->max_vl_num = 4;
256 int qedr_modify_port(struct ib_device *ibdev, u8 port, int mask,
257 struct ib_port_modify *props)
259 struct qedr_dev *dev;
261 dev = get_qedr_dev(ibdev);
263 DP_ERR(dev, "invalid_port=0x%x\n", port);
270 static int qedr_add_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
275 mm = kzalloc(sizeof(*mm), GFP_KERNEL);
279 mm->key.phy_addr = phy_addr;
280 /* This function might be called with a length which is not a multiple
281 * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
282 * forces this granularity by increasing the requested size if needed.
283 * When qedr_mmap is called, it will search the list with the updated
284 * length as a key. To prevent search failures, the length is rounded up
285 * in advance to PAGE_SIZE.
287 mm->key.len = roundup(len, PAGE_SIZE);
288 INIT_LIST_HEAD(&mm->entry);
290 mutex_lock(&uctx->mm_list_lock);
291 list_add(&mm->entry, &uctx->mm_head);
292 mutex_unlock(&uctx->mm_list_lock);
294 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
295 "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
296 (unsigned long long)mm->key.phy_addr,
297 (unsigned long)mm->key.len, uctx);
302 static bool qedr_search_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
308 mutex_lock(&uctx->mm_list_lock);
309 list_for_each_entry(mm, &uctx->mm_head, entry) {
310 if (len != mm->key.len || phy_addr != mm->key.phy_addr)
316 mutex_unlock(&uctx->mm_list_lock);
317 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
318 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, result=%d\n",
319 mm->key.phy_addr, mm->key.len, uctx, found);
324 struct ib_ucontext *qedr_alloc_ucontext(struct ib_device *ibdev,
325 struct ib_udata *udata)
328 struct qedr_ucontext *ctx;
329 struct qedr_alloc_ucontext_resp uresp;
330 struct qedr_dev *dev = get_qedr_dev(ibdev);
331 struct qed_rdma_add_user_out_params oparams;
334 return ERR_PTR(-EFAULT);
336 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
338 return ERR_PTR(-ENOMEM);
340 rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
343 "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",
348 ctx->dpi = oparams.dpi;
349 ctx->dpi_addr = oparams.dpi_addr;
350 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
351 ctx->dpi_size = oparams.dpi_size;
352 INIT_LIST_HEAD(&ctx->mm_head);
353 mutex_init(&ctx->mm_list_lock);
355 memset(&uresp, 0, sizeof(uresp));
357 uresp.dpm_enabled = dev->user_dpm_enabled;
358 uresp.wids_enabled = 1;
359 uresp.wid_count = oparams.wid_count;
360 uresp.db_pa = ctx->dpi_phys_addr;
361 uresp.db_size = ctx->dpi_size;
362 uresp.max_send_wr = dev->attr.max_sqe;
363 uresp.max_recv_wr = dev->attr.max_rqe;
364 uresp.max_srq_wr = dev->attr.max_srq_wr;
365 uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
366 uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
367 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
368 uresp.max_cqes = QEDR_MAX_CQES;
370 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
376 rc = qedr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
380 DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
382 return &ctx->ibucontext;
389 int qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
391 struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
392 struct qedr_mm *mm, *tmp;
395 DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
397 uctx->dev->ops->rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
399 list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
400 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
401 "deleted (addr=0x%llx,len=0x%lx) for ctx=%p\n",
402 mm->key.phy_addr, mm->key.len, uctx);
403 list_del(&mm->entry);
411 int qedr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
413 struct qedr_ucontext *ucontext = get_qedr_ucontext(context);
414 struct qedr_dev *dev = get_qedr_dev(context->device);
415 unsigned long phys_addr = vma->vm_pgoff << PAGE_SHIFT;
416 unsigned long len = (vma->vm_end - vma->vm_start);
417 unsigned long dpi_start;
419 dpi_start = dev->db_phys_addr + (ucontext->dpi * ucontext->dpi_size);
421 DP_DEBUG(dev, QEDR_MSG_INIT,
422 "mmap invoked with vm_start=0x%pK, vm_end=0x%pK,vm_pgoff=0x%pK; dpi_start=0x%pK dpi_size=0x%x\n",
423 (void *)vma->vm_start, (void *)vma->vm_end,
424 (void *)vma->vm_pgoff, (void *)dpi_start, ucontext->dpi_size);
426 if ((vma->vm_start & (PAGE_SIZE - 1)) || (len & (PAGE_SIZE - 1))) {
428 "failed mmap, addresses must be page aligned: start=0x%pK, end=0x%pK\n",
429 (void *)vma->vm_start, (void *)vma->vm_end);
433 if (!qedr_search_mmap(ucontext, phys_addr, len)) {
434 DP_ERR(dev, "failed mmap, vm_pgoff=0x%lx is not authorized\n",
439 if (phys_addr < dpi_start ||
440 ((phys_addr + len) > (dpi_start + ucontext->dpi_size))) {
442 "failed mmap, pages are outside of dpi; page address=0x%pK, dpi_start=0x%pK, dpi_size=0x%x\n",
443 (void *)phys_addr, (void *)dpi_start,
448 if (vma->vm_flags & VM_READ) {
449 DP_ERR(dev, "failed mmap, cannot map doorbell bar for read\n");
453 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
454 return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
458 struct ib_pd *qedr_alloc_pd(struct ib_device *ibdev,
459 struct ib_ucontext *context, struct ib_udata *udata)
461 struct qedr_dev *dev = get_qedr_dev(ibdev);
466 DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
467 (udata && context) ? "User Lib" : "Kernel");
469 if (!dev->rdma_ctx) {
470 DP_ERR(dev, "invalid RDMA context\n");
471 return ERR_PTR(-EINVAL);
474 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
476 return ERR_PTR(-ENOMEM);
478 rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
484 if (udata && context) {
485 struct qedr_alloc_pd_uresp uresp = {
489 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
491 DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
492 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
496 pd->uctx = get_qedr_ucontext(context);
507 int qedr_dealloc_pd(struct ib_pd *ibpd)
509 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
510 struct qedr_pd *pd = get_qedr_pd(ibpd);
513 pr_err("Invalid PD received in dealloc_pd\n");
517 DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
518 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
525 static void qedr_free_pbl(struct qedr_dev *dev,
526 struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
528 struct pci_dev *pdev = dev->pdev;
531 for (i = 0; i < pbl_info->num_pbls; i++) {
534 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
535 pbl[i].va, pbl[i].pa);
541 #define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
542 #define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
544 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
545 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
546 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
548 static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
549 struct qedr_pbl_info *pbl_info,
552 struct pci_dev *pdev = dev->pdev;
553 struct qedr_pbl *pbl_table;
554 dma_addr_t *pbl_main_tbl;
559 pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
561 return ERR_PTR(-ENOMEM);
563 for (i = 0; i < pbl_info->num_pbls; i++) {
564 va = dma_zalloc_coherent(&pdev->dev, pbl_info->pbl_size,
569 pbl_table[i].va = va;
570 pbl_table[i].pa = pa;
573 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
574 * the first one with physical pointers to all of the rest
576 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
577 for (i = 0; i < pbl_info->num_pbls - 1; i++)
578 pbl_main_tbl[i] = pbl_table[i + 1].pa;
583 for (i--; i >= 0; i--)
584 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
585 pbl_table[i].va, pbl_table[i].pa);
587 qedr_free_pbl(dev, pbl_info, pbl_table);
589 return ERR_PTR(-ENOMEM);
592 static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
593 struct qedr_pbl_info *pbl_info,
594 u32 num_pbes, int two_layer_capable)
600 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
601 if (num_pbes > MAX_PBES_TWO_LAYER) {
602 DP_ERR(dev, "prepare pbl table: too many pages %d\n",
607 /* calculate required pbl page size */
608 pbl_size = MIN_FW_PBL_PAGE_SIZE;
609 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
610 NUM_PBES_ON_PAGE(pbl_size);
612 while (pbl_capacity < num_pbes) {
614 pbl_capacity = pbl_size / sizeof(u64);
615 pbl_capacity = pbl_capacity * pbl_capacity;
618 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
619 num_pbls++; /* One for the layer0 ( points to the pbls) */
620 pbl_info->two_layered = true;
622 /* One layered PBL */
624 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
625 roundup_pow_of_two((num_pbes * sizeof(u64))));
626 pbl_info->two_layered = false;
629 pbl_info->num_pbls = num_pbls;
630 pbl_info->pbl_size = pbl_size;
631 pbl_info->num_pbes = num_pbes;
633 DP_DEBUG(dev, QEDR_MSG_MR,
634 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
635 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
640 static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
641 struct qedr_pbl *pbl,
642 struct qedr_pbl_info *pbl_info, u32 pg_shift)
644 int shift, pg_cnt, pages, pbe_cnt, total_num_pbes = 0;
645 u32 fw_pg_cnt, fw_pg_per_umem_pg;
646 struct qedr_pbl *pbl_tbl;
647 struct scatterlist *sg;
652 if (!pbl_info->num_pbes)
655 /* If we have a two layered pbl, the first pbl points to the rest
656 * of the pbls and the first entry lays on the second pbl in the table
658 if (pbl_info->two_layered)
663 pbe = (struct regpair *)pbl_tbl->va;
665 DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
671 shift = umem->page_shift;
673 fw_pg_per_umem_pg = BIT(umem->page_shift - pg_shift);
675 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
676 pages = sg_dma_len(sg) >> shift;
677 pg_addr = sg_dma_address(sg);
678 for (pg_cnt = 0; pg_cnt < pages; pg_cnt++) {
679 for (fw_pg_cnt = 0; fw_pg_cnt < fw_pg_per_umem_pg;) {
680 pbe->lo = cpu_to_le32(pg_addr);
681 pbe->hi = cpu_to_le32(upper_32_bits(pg_addr));
683 pg_addr += BIT(pg_shift);
688 if (total_num_pbes == pbl_info->num_pbes)
691 /* If the given pbl is full storing the pbes,
695 (pbl_info->pbl_size / sizeof(u64))) {
697 pbe = (struct regpair *)pbl_tbl->va;
707 static int qedr_copy_cq_uresp(struct qedr_dev *dev,
708 struct qedr_cq *cq, struct ib_udata *udata)
710 struct qedr_create_cq_uresp uresp;
713 memset(&uresp, 0, sizeof(uresp));
715 uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
716 uresp.icid = cq->icid;
718 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
720 DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
725 static void consume_cqe(struct qedr_cq *cq)
727 if (cq->latest_cqe == cq->toggle_cqe)
728 cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
730 cq->latest_cqe = qed_chain_consume(&cq->pbl);
733 static inline int qedr_align_cq_entries(int entries)
735 u64 size, aligned_size;
737 /* We allocate an extra entry that we don't report to the FW. */
738 size = (entries + 1) * QEDR_CQE_SIZE;
739 aligned_size = ALIGN(size, PAGE_SIZE);
741 return aligned_size / QEDR_CQE_SIZE;
744 static inline int qedr_init_user_queue(struct ib_ucontext *ib_ctx,
745 struct qedr_dev *dev,
746 struct qedr_userq *q,
747 u64 buf_addr, size_t buf_len,
748 int access, int dmasync,
754 q->buf_addr = buf_addr;
755 q->buf_len = buf_len;
756 q->umem = ib_umem_get(ib_ctx, q->buf_addr, q->buf_len, access, dmasync);
757 if (IS_ERR(q->umem)) {
758 DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
760 return PTR_ERR(q->umem);
763 fw_pages = ib_umem_page_count(q->umem) <<
764 (q->umem->page_shift - FW_PAGE_SHIFT);
766 rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0);
770 if (alloc_and_init) {
771 q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
772 if (IS_ERR(q->pbl_tbl)) {
773 rc = PTR_ERR(q->pbl_tbl);
776 qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info,
779 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
789 ib_umem_release(q->umem);
795 static inline void qedr_init_cq_params(struct qedr_cq *cq,
796 struct qedr_ucontext *ctx,
797 struct qedr_dev *dev, int vector,
798 int chain_entries, int page_cnt,
800 struct qed_rdma_create_cq_in_params
803 memset(params, 0, sizeof(*params));
804 params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
805 params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
806 params->cnq_id = vector;
807 params->cq_size = chain_entries - 1;
808 params->dpi = (ctx) ? ctx->dpi : dev->dpi;
809 params->pbl_num_pages = page_cnt;
810 params->pbl_ptr = pbl_ptr;
811 params->pbl_two_level = 0;
814 static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
816 cq->db.data.agg_flags = flags;
817 cq->db.data.value = cpu_to_le32(cons);
818 writeq(cq->db.raw, cq->db_addr);
820 /* Make sure write would stick */
824 int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
826 struct qedr_cq *cq = get_qedr_cq(ibcq);
827 unsigned long sflags;
828 struct qedr_dev *dev;
830 dev = get_qedr_dev(ibcq->device);
834 "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
840 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
843 spin_lock_irqsave(&cq->cq_lock, sflags);
847 if (flags & IB_CQ_SOLICITED)
848 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
850 if (flags & IB_CQ_NEXT_COMP)
851 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
853 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
855 spin_unlock_irqrestore(&cq->cq_lock, sflags);
860 struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
861 const struct ib_cq_init_attr *attr,
862 struct ib_ucontext *ib_ctx, struct ib_udata *udata)
864 struct qedr_ucontext *ctx = get_qedr_ucontext(ib_ctx);
865 struct qed_rdma_destroy_cq_out_params destroy_oparams;
866 struct qed_rdma_destroy_cq_in_params destroy_iparams;
867 struct qedr_dev *dev = get_qedr_dev(ibdev);
868 struct qed_rdma_create_cq_in_params params;
869 struct qedr_create_cq_ureq ureq;
870 int vector = attr->comp_vector;
871 int entries = attr->cqe;
879 DP_DEBUG(dev, QEDR_MSG_INIT,
880 "create_cq: called from %s. entries=%d, vector=%d\n",
881 udata ? "User Lib" : "Kernel", entries, vector);
883 if (entries > QEDR_MAX_CQES) {
885 "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
886 entries, QEDR_MAX_CQES);
887 return ERR_PTR(-EINVAL);
890 chain_entries = qedr_align_cq_entries(entries);
891 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
893 cq = kzalloc(sizeof(*cq), GFP_KERNEL);
895 return ERR_PTR(-ENOMEM);
898 memset(&ureq, 0, sizeof(ureq));
899 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
901 "create cq: problem copying data from user space\n");
907 "create cq: cannot create a cq with 0 entries\n");
911 cq->cq_type = QEDR_CQ_TYPE_USER;
913 rc = qedr_init_user_queue(ib_ctx, dev, &cq->q, ureq.addr,
914 ureq.len, IB_ACCESS_LOCAL_WRITE,
919 pbl_ptr = cq->q.pbl_tbl->pa;
920 page_cnt = cq->q.pbl_info.num_pbes;
922 cq->ibcq.cqe = chain_entries;
924 cq->cq_type = QEDR_CQ_TYPE_KERNEL;
926 rc = dev->ops->common->chain_alloc(dev->cdev,
927 QED_CHAIN_USE_TO_CONSUME,
929 QED_CHAIN_CNT_TYPE_U32,
931 sizeof(union rdma_cqe),
936 page_cnt = qed_chain_get_page_cnt(&cq->pbl);
937 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
938 cq->ibcq.cqe = cq->pbl.capacity;
941 qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
944 rc = dev->ops->rdma_create_cq(dev->rdma_ctx, ¶ms, &icid);
949 cq->sig = QEDR_CQ_MAGIC_NUMBER;
950 spin_lock_init(&cq->cq_lock);
953 rc = qedr_copy_cq_uresp(dev, cq, udata);
957 /* Generate doorbell address. */
958 cq->db_addr = dev->db_addr +
959 DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
960 cq->db.data.icid = cq->icid;
961 cq->db.data.params = DB_AGG_CMD_SET <<
962 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
964 /* point to the very last element, passing it we will toggle */
965 cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
966 cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
967 cq->latest_cqe = NULL;
969 cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
972 DP_DEBUG(dev, QEDR_MSG_CQ,
973 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
974 cq->icid, cq, params.cq_size);
979 destroy_iparams.icid = cq->icid;
980 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
984 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
986 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
989 ib_umem_release(cq->q.umem);
992 return ERR_PTR(-EINVAL);
995 int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
997 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
998 struct qedr_cq *cq = get_qedr_cq(ibcq);
1000 DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
1005 #define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
1006 #define QEDR_DESTROY_CQ_ITER_DURATION (10)
1008 int qedr_destroy_cq(struct ib_cq *ibcq)
1010 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
1011 struct qed_rdma_destroy_cq_out_params oparams;
1012 struct qed_rdma_destroy_cq_in_params iparams;
1013 struct qedr_cq *cq = get_qedr_cq(ibcq);
1017 DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
1021 /* GSIs CQs are handled by driver, so they don't exist in the FW */
1022 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
1025 iparams.icid = cq->icid;
1026 rc = dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
1030 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
1032 if (ibcq->uobject && ibcq->uobject->context) {
1033 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
1034 ib_umem_release(cq->q.umem);
1037 /* We don't want the IRQ handler to handle a non-existing CQ so we
1038 * wait until all CNQ interrupts, if any, are received. This will always
1039 * happen and will always happen very fast. If not, then a serious error
1040 * has occured. That is why we can use a long delay.
1041 * We spin for a short time so we don’t lose time on context switching
1042 * in case all the completions are handled in that span. Otherwise
1043 * we sleep for a while and check again. Since the CNQ may be
1044 * associated with (only) the current CPU we use msleep to allow the
1045 * current CPU to be freed.
1046 * The CNQ notification is increased in qedr_irq_handler().
1048 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1049 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1050 udelay(QEDR_DESTROY_CQ_ITER_DURATION);
1054 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1055 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1056 msleep(QEDR_DESTROY_CQ_ITER_DURATION);
1060 if (oparams.num_cq_notif != cq->cnq_notif)
1063 /* Note that we don't need to have explicit code to wait for the
1064 * completion of the event handler because it is invoked from the EQ.
1065 * Since the destroy CQ ramrod has also been received on the EQ we can
1066 * be certain that there's no event handler in process.
1077 "CQ %p (icid=%d) not freed, expecting %d ints but got %d ints\n",
1078 cq, cq->icid, oparams.num_cq_notif, cq->cnq_notif);
1083 static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1084 struct ib_qp_attr *attr,
1086 struct qed_rdma_modify_qp_in_params
1089 const struct ib_gid_attr *gid_attr;
1090 enum rdma_network_type nw_type;
1091 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
1095 gid_attr = grh->sgid_attr;
1096 qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr->ndev);
1098 nw_type = rdma_gid_attr_network_type(gid_attr);
1100 case RDMA_NETWORK_IPV6:
1101 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1102 sizeof(qp_params->sgid));
1103 memcpy(&qp_params->dgid.bytes[0],
1105 sizeof(qp_params->dgid));
1106 qp_params->roce_mode = ROCE_V2_IPV6;
1107 SET_FIELD(qp_params->modify_flags,
1108 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1110 case RDMA_NETWORK_IB:
1111 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1112 sizeof(qp_params->sgid));
1113 memcpy(&qp_params->dgid.bytes[0],
1115 sizeof(qp_params->dgid));
1116 qp_params->roce_mode = ROCE_V1;
1118 case RDMA_NETWORK_IPV4:
1119 memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1120 memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
1121 ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw);
1122 qp_params->sgid.ipv4_addr = ipv4_addr;
1124 qedr_get_ipv4_from_gid(grh->dgid.raw);
1125 qp_params->dgid.ipv4_addr = ipv4_addr;
1126 SET_FIELD(qp_params->modify_flags,
1127 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1128 qp_params->roce_mode = ROCE_V2_IPV4;
1132 for (i = 0; i < 4; i++) {
1133 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1134 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1137 if (qp_params->vlan_id >= VLAN_CFI_MASK)
1138 qp_params->vlan_id = 0;
1143 static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
1144 struct ib_qp_init_attr *attrs)
1146 struct qedr_device_attr *qattr = &dev->attr;
1148 /* QP0... attrs->qp_type == IB_QPT_GSI */
1149 if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
1150 DP_DEBUG(dev, QEDR_MSG_QP,
1151 "create qp: unsupported qp type=0x%x requested\n",
1156 if (attrs->cap.max_send_wr > qattr->max_sqe) {
1158 "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1159 attrs->cap.max_send_wr, qattr->max_sqe);
1163 if (attrs->cap.max_inline_data > qattr->max_inline) {
1165 "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1166 attrs->cap.max_inline_data, qattr->max_inline);
1170 if (attrs->cap.max_send_sge > qattr->max_sge) {
1172 "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1173 attrs->cap.max_send_sge, qattr->max_sge);
1177 if (attrs->cap.max_recv_sge > qattr->max_sge) {
1179 "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1180 attrs->cap.max_recv_sge, qattr->max_sge);
1184 /* Unprivileged user space cannot create special QP */
1185 if (ibpd->uobject && attrs->qp_type == IB_QPT_GSI) {
1187 "create qp: userspace can't create special QPs of type=0x%x\n",
1195 static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1196 struct qedr_srq *srq, struct ib_udata *udata)
1198 struct qedr_create_srq_uresp uresp = {};
1201 uresp.srq_id = srq->srq_id;
1203 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1205 DP_ERR(dev, "create srq: problem copying data to user space\n");
1210 static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1211 struct qedr_create_qp_uresp *uresp,
1214 /* iWARP requires two doorbells per RQ. */
1215 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1216 uresp->rq_db_offset =
1217 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1218 uresp->rq_db2_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1220 uresp->rq_db_offset =
1221 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1224 uresp->rq_icid = qp->icid;
1227 static void qedr_copy_sq_uresp(struct qedr_dev *dev,
1228 struct qedr_create_qp_uresp *uresp,
1231 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1233 /* iWARP uses the same cid for rq and sq */
1234 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1235 uresp->sq_icid = qp->icid;
1237 uresp->sq_icid = qp->icid + 1;
1240 static int qedr_copy_qp_uresp(struct qedr_dev *dev,
1241 struct qedr_qp *qp, struct ib_udata *udata)
1243 struct qedr_create_qp_uresp uresp;
1246 memset(&uresp, 0, sizeof(uresp));
1247 qedr_copy_sq_uresp(dev, &uresp, qp);
1248 qedr_copy_rq_uresp(dev, &uresp, qp);
1250 uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1251 uresp.qp_id = qp->qp_id;
1253 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1256 "create qp: failed a copy to user space with qp icid=0x%x.\n",
1262 static void qedr_set_common_qp_params(struct qedr_dev *dev,
1265 struct ib_qp_init_attr *attrs)
1267 spin_lock_init(&qp->q_lock);
1268 atomic_set(&qp->refcnt, 1);
1270 qp->qp_type = attrs->qp_type;
1271 qp->max_inline_data = attrs->cap.max_inline_data;
1272 qp->sq.max_sges = attrs->cap.max_send_sge;
1273 qp->state = QED_ROCE_QP_STATE_RESET;
1274 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
1275 qp->sq_cq = get_qedr_cq(attrs->send_cq);
1279 qp->srq = get_qedr_srq(attrs->srq);
1281 qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1282 qp->rq.max_sges = attrs->cap.max_recv_sge;
1283 DP_DEBUG(dev, QEDR_MSG_QP,
1284 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1285 qp->rq.max_sges, qp->rq_cq->icid);
1288 DP_DEBUG(dev, QEDR_MSG_QP,
1289 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1290 pd->pd_id, qp->qp_type, qp->max_inline_data,
1291 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1292 DP_DEBUG(dev, QEDR_MSG_QP,
1293 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1294 qp->sq.max_sges, qp->sq_cq->icid);
1297 static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1299 qp->sq.db = dev->db_addr +
1300 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1301 qp->sq.db_data.data.icid = qp->icid + 1;
1303 qp->rq.db = dev->db_addr +
1304 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1305 qp->rq.db_data.data.icid = qp->icid;
1309 static int qedr_check_srq_params(struct ib_pd *ibpd, struct qedr_dev *dev,
1310 struct ib_srq_init_attr *attrs,
1311 struct ib_udata *udata)
1313 struct qedr_device_attr *qattr = &dev->attr;
1315 if (attrs->attr.max_wr > qattr->max_srq_wr) {
1317 "create srq: unsupported srq_wr=0x%x requested (max_srq_wr=0x%x)\n",
1318 attrs->attr.max_wr, qattr->max_srq_wr);
1322 if (attrs->attr.max_sge > qattr->max_sge) {
1324 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1325 attrs->attr.max_sge, qattr->max_sge);
1332 static void qedr_free_srq_user_params(struct qedr_srq *srq)
1334 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1335 ib_umem_release(srq->usrq.umem);
1336 ib_umem_release(srq->prod_umem);
1339 static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1341 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1342 struct qedr_dev *dev = srq->dev;
1344 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1346 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1347 hw_srq->virt_prod_pair_addr,
1348 hw_srq->phy_prod_pair_addr);
1351 static int qedr_init_srq_user_params(struct ib_ucontext *ib_ctx,
1352 struct qedr_srq *srq,
1353 struct qedr_create_srq_ureq *ureq,
1354 int access, int dmasync)
1356 struct scatterlist *sg;
1359 rc = qedr_init_user_queue(ib_ctx, srq->dev, &srq->usrq, ureq->srq_addr,
1360 ureq->srq_len, access, dmasync, 1);
1364 srq->prod_umem = ib_umem_get(ib_ctx, ureq->prod_pair_addr,
1365 sizeof(struct rdma_srq_producers),
1367 if (IS_ERR(srq->prod_umem)) {
1368 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1369 ib_umem_release(srq->usrq.umem);
1371 "create srq: failed ib_umem_get for producer, got %ld\n",
1372 PTR_ERR(srq->prod_umem));
1373 return PTR_ERR(srq->prod_umem);
1376 sg = srq->prod_umem->sg_head.sgl;
1377 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1382 static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1383 struct qedr_dev *dev,
1384 struct ib_srq_init_attr *init_attr)
1386 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1387 dma_addr_t phy_prod_pair_addr;
1392 va = dma_alloc_coherent(&dev->pdev->dev,
1393 sizeof(struct rdma_srq_producers),
1394 &phy_prod_pair_addr, GFP_KERNEL);
1397 "create srq: failed to allocate dma memory for producer\n");
1401 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
1402 hw_srq->virt_prod_pair_addr = va;
1404 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
1405 rc = dev->ops->common->chain_alloc(dev->cdev,
1406 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1408 QED_CHAIN_CNT_TYPE_U32,
1410 QEDR_SRQ_WQE_ELEM_SIZE,
1411 &hw_srq->pbl, NULL);
1415 hw_srq->num_elems = num_elems;
1420 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1421 va, phy_prod_pair_addr);
1425 static int qedr_idr_add(struct qedr_dev *dev, struct qedr_idr *qidr,
1427 static void qedr_idr_remove(struct qedr_dev *dev,
1428 struct qedr_idr *qidr, u32 id);
1430 struct ib_srq *qedr_create_srq(struct ib_pd *ibpd,
1431 struct ib_srq_init_attr *init_attr,
1432 struct ib_udata *udata)
1434 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1435 struct qed_rdma_create_srq_in_params in_params = {};
1436 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
1437 struct qed_rdma_create_srq_out_params out_params;
1438 struct qedr_pd *pd = get_qedr_pd(ibpd);
1439 struct qedr_create_srq_ureq ureq = {};
1440 u64 pbl_base_addr, phy_prod_pair_addr;
1441 struct ib_ucontext *ib_ctx = NULL;
1442 struct qedr_srq_hwq_info *hw_srq;
1443 struct qedr_ucontext *ctx = NULL;
1444 u32 page_cnt, page_size;
1445 struct qedr_srq *srq;
1448 DP_DEBUG(dev, QEDR_MSG_QP,
1449 "create SRQ called from %s (pd %p)\n",
1450 (udata) ? "User lib" : "kernel", pd);
1452 rc = qedr_check_srq_params(ibpd, dev, init_attr, udata);
1454 return ERR_PTR(-EINVAL);
1456 srq = kzalloc(sizeof(*srq), GFP_KERNEL);
1458 return ERR_PTR(-ENOMEM);
1461 hw_srq = &srq->hw_srq;
1462 spin_lock_init(&srq->lock);
1464 hw_srq->max_wr = init_attr->attr.max_wr;
1465 hw_srq->max_sges = init_attr->attr.max_sge;
1467 if (udata && ibpd->uobject && ibpd->uobject->context) {
1468 ib_ctx = ibpd->uobject->context;
1469 ctx = get_qedr_ucontext(ib_ctx);
1471 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
1473 "create srq: problem copying data from user space\n");
1477 rc = qedr_init_srq_user_params(ib_ctx, srq, &ureq, 0, 0);
1481 page_cnt = srq->usrq.pbl_info.num_pbes;
1482 pbl_base_addr = srq->usrq.pbl_tbl->pa;
1483 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1484 page_size = BIT(srq->usrq.umem->page_shift);
1486 struct qed_chain *pbl;
1488 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1493 page_cnt = qed_chain_get_page_cnt(pbl);
1494 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1495 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1496 page_size = QED_CHAIN_PAGE_SIZE;
1499 in_params.pd_id = pd->pd_id;
1500 in_params.pbl_base_addr = pbl_base_addr;
1501 in_params.prod_pair_addr = phy_prod_pair_addr;
1502 in_params.num_pages = page_cnt;
1503 in_params.page_size = page_size;
1505 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1509 srq->srq_id = out_params.srq_id;
1512 rc = qedr_copy_srq_uresp(dev, srq, udata);
1517 rc = qedr_idr_add(dev, &dev->srqidr, srq, srq->srq_id);
1521 DP_DEBUG(dev, QEDR_MSG_SRQ,
1522 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1526 destroy_in_params.srq_id = srq->srq_id;
1528 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1531 qedr_free_srq_user_params(srq);
1533 qedr_free_srq_kernel_params(srq);
1537 return ERR_PTR(-EFAULT);
1540 int qedr_destroy_srq(struct ib_srq *ibsrq)
1542 struct qed_rdma_destroy_srq_in_params in_params = {};
1543 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1544 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1546 qedr_idr_remove(dev, &dev->srqidr, srq->srq_id);
1547 in_params.srq_id = srq->srq_id;
1548 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1550 if (ibsrq->pd->uobject)
1551 qedr_free_srq_user_params(srq);
1553 qedr_free_srq_kernel_params(srq);
1555 DP_DEBUG(dev, QEDR_MSG_SRQ,
1556 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1563 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
1564 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
1566 struct qed_rdma_modify_srq_in_params in_params = {};
1567 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1568 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1571 if (attr_mask & IB_SRQ_MAX_WR) {
1573 "modify srq: invalid attribute mask=0x%x specified for %p\n",
1578 if (attr_mask & IB_SRQ_LIMIT) {
1579 if (attr->srq_limit >= srq->hw_srq.max_wr) {
1581 "modify srq: invalid srq_limit=0x%x (max_srq_limit=0x%x)\n",
1582 attr->srq_limit, srq->hw_srq.max_wr);
1586 in_params.srq_id = srq->srq_id;
1587 in_params.wqe_limit = attr->srq_limit;
1588 rc = dev->ops->rdma_modify_srq(dev->rdma_ctx, &in_params);
1593 srq->srq_limit = attr->srq_limit;
1595 DP_DEBUG(dev, QEDR_MSG_SRQ,
1596 "modify srq: modified srq with srq_id=0x%0x\n", srq->srq_id);
1602 qedr_init_common_qp_in_params(struct qedr_dev *dev,
1605 struct ib_qp_init_attr *attrs,
1606 bool fmr_and_reserved_lkey,
1607 struct qed_rdma_create_qp_in_params *params)
1609 /* QP handle to be written in an async event */
1610 params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1611 params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
1613 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1614 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
1615 params->pd = pd->pd_id;
1616 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1617 params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1618 params->stats_queue = 0;
1620 params->use_srq = false;
1623 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1626 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1627 params->srq_id = qp->srq->srq_id;
1628 params->use_srq = true;
1632 static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
1634 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1643 qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
1646 static int qedr_idr_add(struct qedr_dev *dev, struct qedr_idr *qidr,
1651 idr_preload(GFP_KERNEL);
1652 spin_lock_irq(&qidr->idr_lock);
1654 rc = idr_alloc(&qidr->idr, ptr, id, id + 1, GFP_ATOMIC);
1656 spin_unlock_irq(&qidr->idr_lock);
1659 return rc < 0 ? rc : 0;
1662 static void qedr_idr_remove(struct qedr_dev *dev, struct qedr_idr *qidr, u32 id)
1664 spin_lock_irq(&qidr->idr_lock);
1665 idr_remove(&qidr->idr, id);
1666 spin_unlock_irq(&qidr->idr_lock);
1670 qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
1672 struct qed_rdma_create_qp_out_params *out_params)
1674 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1675 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1677 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1678 &qp->usq.pbl_info, FW_PAGE_SHIFT);
1680 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1681 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1684 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1685 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1688 static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1691 ib_umem_release(qp->usq.umem);
1692 qp->usq.umem = NULL;
1695 ib_umem_release(qp->urq.umem);
1696 qp->urq.umem = NULL;
1698 if (rdma_protocol_roce(&dev->ibdev, 1)) {
1699 qedr_free_pbl(dev, &qp->usq.pbl_info, qp->usq.pbl_tbl);
1700 qedr_free_pbl(dev, &qp->urq.pbl_info, qp->urq.pbl_tbl);
1702 kfree(qp->usq.pbl_tbl);
1703 kfree(qp->urq.pbl_tbl);
1707 static int qedr_create_user_qp(struct qedr_dev *dev,
1710 struct ib_udata *udata,
1711 struct ib_qp_init_attr *attrs)
1713 struct qed_rdma_create_qp_in_params in_params;
1714 struct qed_rdma_create_qp_out_params out_params;
1715 struct qedr_pd *pd = get_qedr_pd(ibpd);
1716 struct ib_ucontext *ib_ctx = NULL;
1717 struct qedr_create_qp_ureq ureq;
1718 int alloc_and_init = rdma_protocol_roce(&dev->ibdev, 1);
1721 ib_ctx = ibpd->uobject->context;
1723 memset(&ureq, 0, sizeof(ureq));
1724 rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
1726 DP_ERR(dev, "Problem copying data from user space\n");
1730 /* SQ - read access only (0), dma sync not required (0) */
1731 rc = qedr_init_user_queue(ib_ctx, dev, &qp->usq, ureq.sq_addr,
1732 ureq.sq_len, 0, 0, alloc_and_init);
1737 /* RQ - read access only (0), dma sync not required (0) */
1738 rc = qedr_init_user_queue(ib_ctx, dev, &qp->urq, ureq.rq_addr,
1739 ureq.rq_len, 0, 0, alloc_and_init);
1744 memset(&in_params, 0, sizeof(in_params));
1745 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1746 in_params.qp_handle_lo = ureq.qp_handle_lo;
1747 in_params.qp_handle_hi = ureq.qp_handle_hi;
1748 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1749 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1751 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1752 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1755 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1756 &in_params, &out_params);
1763 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1764 qedr_iwarp_populate_user_qp(dev, qp, &out_params);
1766 qp->qp_id = out_params.qp_id;
1767 qp->icid = out_params.icid;
1769 rc = qedr_copy_qp_uresp(dev, qp, udata);
1773 qedr_qp_user_print(dev, qp);
1777 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1779 DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1782 qedr_cleanup_user(dev, qp);
1786 static void qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1788 qp->sq.db = dev->db_addr +
1789 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1790 qp->sq.db_data.data.icid = qp->icid;
1792 qp->rq.db = dev->db_addr +
1793 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1794 qp->rq.db_data.data.icid = qp->icid;
1795 qp->rq.iwarp_db2 = dev->db_addr +
1796 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1797 qp->rq.iwarp_db2_data.data.icid = qp->icid;
1798 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
1802 qedr_roce_create_kernel_qp(struct qedr_dev *dev,
1804 struct qed_rdma_create_qp_in_params *in_params,
1805 u32 n_sq_elems, u32 n_rq_elems)
1807 struct qed_rdma_create_qp_out_params out_params;
1810 rc = dev->ops->common->chain_alloc(dev->cdev,
1811 QED_CHAIN_USE_TO_PRODUCE,
1813 QED_CHAIN_CNT_TYPE_U32,
1815 QEDR_SQE_ELEMENT_SIZE,
1821 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
1822 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
1824 rc = dev->ops->common->chain_alloc(dev->cdev,
1825 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1827 QED_CHAIN_CNT_TYPE_U32,
1829 QEDR_RQE_ELEMENT_SIZE,
1834 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
1835 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
1837 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1838 in_params, &out_params);
1843 qp->qp_id = out_params.qp_id;
1844 qp->icid = out_params.icid;
1846 qedr_set_roce_db_info(dev, qp);
1851 qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
1853 struct qed_rdma_create_qp_in_params *in_params,
1854 u32 n_sq_elems, u32 n_rq_elems)
1856 struct qed_rdma_create_qp_out_params out_params;
1857 struct qed_chain_ext_pbl ext_pbl;
1860 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
1861 QEDR_SQE_ELEMENT_SIZE,
1862 QED_CHAIN_MODE_PBL);
1863 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
1864 QEDR_RQE_ELEMENT_SIZE,
1865 QED_CHAIN_MODE_PBL);
1867 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1868 in_params, &out_params);
1873 /* Now we allocate the chain */
1874 ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
1875 ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
1877 rc = dev->ops->common->chain_alloc(dev->cdev,
1878 QED_CHAIN_USE_TO_PRODUCE,
1880 QED_CHAIN_CNT_TYPE_U32,
1882 QEDR_SQE_ELEMENT_SIZE,
1883 &qp->sq.pbl, &ext_pbl);
1888 ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
1889 ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
1891 rc = dev->ops->common->chain_alloc(dev->cdev,
1892 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1894 QED_CHAIN_CNT_TYPE_U32,
1896 QEDR_RQE_ELEMENT_SIZE,
1897 &qp->rq.pbl, &ext_pbl);
1902 qp->qp_id = out_params.qp_id;
1903 qp->icid = out_params.icid;
1905 qedr_set_iwarp_db_info(dev, qp);
1909 dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1914 static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
1916 dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
1917 kfree(qp->wqe_wr_id);
1919 dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
1920 kfree(qp->rqe_wr_id);
1923 static int qedr_create_kernel_qp(struct qedr_dev *dev,
1926 struct ib_qp_init_attr *attrs)
1928 struct qed_rdma_create_qp_in_params in_params;
1929 struct qedr_pd *pd = get_qedr_pd(ibpd);
1935 memset(&in_params, 0, sizeof(in_params));
1937 /* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
1938 * the ring. The ring should allow at least a single WR, even if the
1939 * user requested none, due to allocation issues.
1940 * We should add an extra WR since the prod and cons indices of
1941 * wqe_wr_id are managed in such a way that the WQ is considered full
1942 * when (prod+1)%max_wr==cons. We currently don't do that because we
1943 * double the number of entries due an iSER issue that pushes far more
1944 * WRs than indicated. If we decline its ib_post_send() then we get
1945 * error prints in the dmesg we'd like to avoid.
1947 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
1950 qp->wqe_wr_id = kcalloc(qp->sq.max_wr, sizeof(*qp->wqe_wr_id),
1952 if (!qp->wqe_wr_id) {
1953 DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
1957 /* QP handle to be written in CQE */
1958 in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
1959 in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
1961 /* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
1962 * the ring. There ring should allow at least a single WR, even if the
1963 * user requested none, due to allocation issues.
1965 qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
1967 /* Allocate driver internal RQ array */
1968 qp->rqe_wr_id = kcalloc(qp->rq.max_wr, sizeof(*qp->rqe_wr_id),
1970 if (!qp->rqe_wr_id) {
1972 "create qp: failed RQ shadow memory allocation\n");
1973 kfree(qp->wqe_wr_id);
1977 qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
1979 n_sq_entries = attrs->cap.max_send_wr;
1980 n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
1981 n_sq_entries = max_t(u32, n_sq_entries, 1);
1982 n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
1984 n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
1986 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1987 rc = qedr_iwarp_create_kernel_qp(dev, qp, &in_params,
1988 n_sq_elems, n_rq_elems);
1990 rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
1991 n_sq_elems, n_rq_elems);
1993 qedr_cleanup_kernel(dev, qp);
1998 struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
1999 struct ib_qp_init_attr *attrs,
2000 struct ib_udata *udata)
2002 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2003 struct qedr_pd *pd = get_qedr_pd(ibpd);
2008 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
2009 udata ? "user library" : "kernel", pd);
2011 rc = qedr_check_qp_attrs(ibpd, dev, attrs);
2015 DP_DEBUG(dev, QEDR_MSG_QP,
2016 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
2017 udata ? "user library" : "kernel", attrs->event_handler, pd,
2018 get_qedr_cq(attrs->send_cq),
2019 get_qedr_cq(attrs->send_cq)->icid,
2020 get_qedr_cq(attrs->recv_cq),
2021 attrs->recv_cq ? get_qedr_cq(attrs->recv_cq)->icid : 0);
2023 qp = kzalloc(sizeof(*qp), GFP_KERNEL);
2025 DP_ERR(dev, "create qp: failed allocating memory\n");
2026 return ERR_PTR(-ENOMEM);
2029 qedr_set_common_qp_params(dev, qp, pd, attrs);
2031 if (attrs->qp_type == IB_QPT_GSI) {
2032 ibqp = qedr_create_gsi_qp(dev, attrs, qp);
2039 rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
2041 rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
2046 qp->ibqp.qp_num = qp->qp_id;
2048 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
2049 rc = qedr_idr_add(dev, &dev->qpidr, qp, qp->qp_id);
2059 return ERR_PTR(-EFAULT);
2062 static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
2065 case QED_ROCE_QP_STATE_RESET:
2066 return IB_QPS_RESET;
2067 case QED_ROCE_QP_STATE_INIT:
2069 case QED_ROCE_QP_STATE_RTR:
2071 case QED_ROCE_QP_STATE_RTS:
2073 case QED_ROCE_QP_STATE_SQD:
2075 case QED_ROCE_QP_STATE_ERR:
2077 case QED_ROCE_QP_STATE_SQE:
2083 static enum qed_roce_qp_state qedr_get_state_from_ibqp(
2084 enum ib_qp_state qp_state)
2088 return QED_ROCE_QP_STATE_RESET;
2090 return QED_ROCE_QP_STATE_INIT;
2092 return QED_ROCE_QP_STATE_RTR;
2094 return QED_ROCE_QP_STATE_RTS;
2096 return QED_ROCE_QP_STATE_SQD;
2098 return QED_ROCE_QP_STATE_ERR;
2100 return QED_ROCE_QP_STATE_ERR;
2104 static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
2106 qed_chain_reset(&qph->pbl);
2110 qph->db_data.data.value = cpu_to_le16(0);
2113 static int qedr_update_qp_state(struct qedr_dev *dev,
2115 enum qed_roce_qp_state cur_state,
2116 enum qed_roce_qp_state new_state)
2120 if (new_state == cur_state)
2123 switch (cur_state) {
2124 case QED_ROCE_QP_STATE_RESET:
2125 switch (new_state) {
2126 case QED_ROCE_QP_STATE_INIT:
2127 qp->prev_wqe_size = 0;
2128 qedr_reset_qp_hwq_info(&qp->sq);
2129 qedr_reset_qp_hwq_info(&qp->rq);
2136 case QED_ROCE_QP_STATE_INIT:
2137 switch (new_state) {
2138 case QED_ROCE_QP_STATE_RTR:
2139 /* Update doorbell (in case post_recv was
2140 * done before move to RTR)
2143 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2144 writel(qp->rq.db_data.raw, qp->rq.db);
2145 /* Make sure write takes effect */
2149 case QED_ROCE_QP_STATE_ERR:
2152 /* Invalid state change. */
2157 case QED_ROCE_QP_STATE_RTR:
2159 switch (new_state) {
2160 case QED_ROCE_QP_STATE_RTS:
2162 case QED_ROCE_QP_STATE_ERR:
2165 /* Invalid state change. */
2170 case QED_ROCE_QP_STATE_RTS:
2172 switch (new_state) {
2173 case QED_ROCE_QP_STATE_SQD:
2175 case QED_ROCE_QP_STATE_ERR:
2178 /* Invalid state change. */
2183 case QED_ROCE_QP_STATE_SQD:
2185 switch (new_state) {
2186 case QED_ROCE_QP_STATE_RTS:
2187 case QED_ROCE_QP_STATE_ERR:
2190 /* Invalid state change. */
2195 case QED_ROCE_QP_STATE_ERR:
2197 switch (new_state) {
2198 case QED_ROCE_QP_STATE_RESET:
2199 if ((qp->rq.prod != qp->rq.cons) ||
2200 (qp->sq.prod != qp->sq.cons)) {
2202 "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
2203 qp->rq.prod, qp->rq.cons, qp->sq.prod,
2221 int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2222 int attr_mask, struct ib_udata *udata)
2224 struct qedr_qp *qp = get_qedr_qp(ibqp);
2225 struct qed_rdma_modify_qp_in_params qp_params = { 0 };
2226 struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
2227 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
2228 enum ib_qp_state old_qp_state, new_qp_state;
2229 enum qed_roce_qp_state cur_state;
2232 DP_DEBUG(dev, QEDR_MSG_QP,
2233 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
2236 old_qp_state = qedr_get_ibqp_state(qp->state);
2237 if (attr_mask & IB_QP_STATE)
2238 new_qp_state = attr->qp_state;
2240 new_qp_state = old_qp_state;
2242 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2243 if (!ib_modify_qp_is_ok(old_qp_state, new_qp_state,
2244 ibqp->qp_type, attr_mask,
2245 IB_LINK_LAYER_ETHERNET)) {
2247 "modify qp: invalid attribute mask=0x%x specified for\n"
2248 "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
2249 attr_mask, qp->qp_id, ibqp->qp_type,
2250 old_qp_state, new_qp_state);
2256 /* Translate the masks... */
2257 if (attr_mask & IB_QP_STATE) {
2258 SET_FIELD(qp_params.modify_flags,
2259 QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
2260 qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
2263 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
2264 qp_params.sqd_async = true;
2266 if (attr_mask & IB_QP_PKEY_INDEX) {
2267 SET_FIELD(qp_params.modify_flags,
2268 QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
2269 if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
2274 qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
2277 if (attr_mask & IB_QP_QKEY)
2278 qp->qkey = attr->qkey;
2280 if (attr_mask & IB_QP_ACCESS_FLAGS) {
2281 SET_FIELD(qp_params.modify_flags,
2282 QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
2283 qp_params.incoming_rdma_read_en = attr->qp_access_flags &
2284 IB_ACCESS_REMOTE_READ;
2285 qp_params.incoming_rdma_write_en = attr->qp_access_flags &
2286 IB_ACCESS_REMOTE_WRITE;
2287 qp_params.incoming_atomic_en = attr->qp_access_flags &
2288 IB_ACCESS_REMOTE_ATOMIC;
2291 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
2292 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2295 if (attr_mask & IB_QP_PATH_MTU) {
2296 if (attr->path_mtu < IB_MTU_256 ||
2297 attr->path_mtu > IB_MTU_4096) {
2298 pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
2302 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
2303 ib_mtu_enum_to_int(iboe_get_mtu
2309 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2310 pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
2313 SET_FIELD(qp_params.modify_flags,
2314 QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
2316 qp_params.traffic_class_tos = grh->traffic_class;
2317 qp_params.flow_label = grh->flow_label;
2318 qp_params.hop_limit_ttl = grh->hop_limit;
2320 qp->sgid_idx = grh->sgid_index;
2322 rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
2325 "modify qp: problems with GID index %d (rc=%d)\n",
2326 grh->sgid_index, rc);
2330 rc = qedr_get_dmac(dev, &attr->ah_attr,
2331 qp_params.remote_mac_addr);
2335 qp_params.use_local_mac = true;
2336 ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
2338 DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
2339 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
2340 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
2341 DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
2342 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
2343 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
2344 DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
2345 qp_params.remote_mac_addr);
2347 qp_params.mtu = qp->mtu;
2348 qp_params.lb_indication = false;
2351 if (!qp_params.mtu) {
2352 /* Stay with current MTU */
2354 qp_params.mtu = qp->mtu;
2357 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2360 if (attr_mask & IB_QP_TIMEOUT) {
2361 SET_FIELD(qp_params.modify_flags,
2362 QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
2364 /* The received timeout value is an exponent used like this:
2365 * "12.7.34 LOCAL ACK TIMEOUT
2366 * Value representing the transport (ACK) timeout for use by
2367 * the remote, expressed as: 4.096 * 2^timeout [usec]"
2368 * The FW expects timeout in msec so we need to divide the usec
2369 * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
2370 * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
2371 * The value of zero means infinite so we use a 'max_t' to make
2372 * sure that sub 1 msec values will be configured as 1 msec.
2375 qp_params.ack_timeout =
2376 1 << max_t(int, attr->timeout - 8, 0);
2378 qp_params.ack_timeout = 0;
2380 qp->timeout = attr->timeout;
2383 if (attr_mask & IB_QP_RETRY_CNT) {
2384 SET_FIELD(qp_params.modify_flags,
2385 QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
2386 qp_params.retry_cnt = attr->retry_cnt;
2389 if (attr_mask & IB_QP_RNR_RETRY) {
2390 SET_FIELD(qp_params.modify_flags,
2391 QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
2392 qp_params.rnr_retry_cnt = attr->rnr_retry;
2395 if (attr_mask & IB_QP_RQ_PSN) {
2396 SET_FIELD(qp_params.modify_flags,
2397 QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
2398 qp_params.rq_psn = attr->rq_psn;
2399 qp->rq_psn = attr->rq_psn;
2402 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2403 if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
2406 "unsupported max_rd_atomic=%d, supported=%d\n",
2407 attr->max_rd_atomic,
2408 dev->attr.max_qp_req_rd_atomic_resc);
2412 SET_FIELD(qp_params.modify_flags,
2413 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
2414 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
2417 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
2418 SET_FIELD(qp_params.modify_flags,
2419 QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
2420 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
2423 if (attr_mask & IB_QP_SQ_PSN) {
2424 SET_FIELD(qp_params.modify_flags,
2425 QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
2426 qp_params.sq_psn = attr->sq_psn;
2427 qp->sq_psn = attr->sq_psn;
2430 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2431 if (attr->max_dest_rd_atomic >
2432 dev->attr.max_qp_resp_rd_atomic_resc) {
2434 "unsupported max_dest_rd_atomic=%d, supported=%d\n",
2435 attr->max_dest_rd_atomic,
2436 dev->attr.max_qp_resp_rd_atomic_resc);
2442 SET_FIELD(qp_params.modify_flags,
2443 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
2444 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
2447 if (attr_mask & IB_QP_DEST_QPN) {
2448 SET_FIELD(qp_params.modify_flags,
2449 QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
2451 qp_params.dest_qp = attr->dest_qp_num;
2452 qp->dest_qp_num = attr->dest_qp_num;
2455 cur_state = qp->state;
2457 /* Update the QP state before the actual ramrod to prevent a race with
2458 * fast path. Modifying the QP state to error will cause the device to
2459 * flush the CQEs and while polling the flushed CQEs will considered as
2460 * a potential issue if the QP isn't in error state.
2462 if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
2463 !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
2464 qp->state = QED_ROCE_QP_STATE_ERR;
2466 if (qp->qp_type != IB_QPT_GSI)
2467 rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
2468 qp->qed_qp, &qp_params);
2470 if (attr_mask & IB_QP_STATE) {
2471 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
2472 rc = qedr_update_qp_state(dev, qp, cur_state,
2473 qp_params.new_state);
2474 qp->state = qp_params.new_state;
2481 static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
2483 int ib_qp_acc_flags = 0;
2485 if (params->incoming_rdma_write_en)
2486 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
2487 if (params->incoming_rdma_read_en)
2488 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
2489 if (params->incoming_atomic_en)
2490 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
2491 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
2492 return ib_qp_acc_flags;
2495 int qedr_query_qp(struct ib_qp *ibqp,
2496 struct ib_qp_attr *qp_attr,
2497 int attr_mask, struct ib_qp_init_attr *qp_init_attr)
2499 struct qed_rdma_query_qp_out_params params;
2500 struct qedr_qp *qp = get_qedr_qp(ibqp);
2501 struct qedr_dev *dev = qp->dev;
2504 memset(¶ms, 0, sizeof(params));
2505 memset(qp_attr, 0, sizeof(*qp_attr));
2506 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2508 if (qp->qp_type != IB_QPT_GSI) {
2509 rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, ¶ms);
2512 qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2514 qp_attr->qp_state = qedr_get_ibqp_state(QED_ROCE_QP_STATE_RTS);
2517 qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
2518 qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
2519 qp_attr->path_mig_state = IB_MIG_MIGRATED;
2520 qp_attr->rq_psn = params.rq_psn;
2521 qp_attr->sq_psn = params.sq_psn;
2522 qp_attr->dest_qp_num = params.dest_qp;
2524 qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(¶ms);
2526 qp_attr->cap.max_send_wr = qp->sq.max_wr;
2527 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2528 qp_attr->cap.max_send_sge = qp->sq.max_sges;
2529 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
2530 qp_attr->cap.max_inline_data = dev->attr.max_inline;
2531 qp_init_attr->cap = qp_attr->cap;
2533 qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
2534 rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
2535 params.flow_label, qp->sgid_idx,
2536 params.hop_limit_ttl, params.traffic_class_tos);
2537 rdma_ah_set_dgid_raw(&qp_attr->ah_attr, ¶ms.dgid.bytes[0]);
2538 rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
2539 rdma_ah_set_sl(&qp_attr->ah_attr, 0);
2540 qp_attr->timeout = qp->timeout;
2541 qp_attr->rnr_retry = params.rnr_retry;
2542 qp_attr->retry_cnt = params.retry_cnt;
2543 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2544 qp_attr->pkey_index = params.pkey_index;
2545 qp_attr->port_num = 1;
2546 rdma_ah_set_path_bits(&qp_attr->ah_attr, 0);
2547 rdma_ah_set_static_rate(&qp_attr->ah_attr, 0);
2548 qp_attr->alt_pkey_index = 0;
2549 qp_attr->alt_port_num = 0;
2550 qp_attr->alt_timeout = 0;
2551 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2553 qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2554 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2555 qp_attr->max_rd_atomic = params.max_rd_atomic;
2556 qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2558 DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2559 qp_attr->cap.max_inline_data);
2565 static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp)
2569 if (qp->qp_type != IB_QPT_GSI) {
2570 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2575 if (qp->ibqp.uobject && qp->ibqp.uobject->context)
2576 qedr_cleanup_user(dev, qp);
2578 qedr_cleanup_kernel(dev, qp);
2583 int qedr_destroy_qp(struct ib_qp *ibqp)
2585 struct qedr_qp *qp = get_qedr_qp(ibqp);
2586 struct qedr_dev *dev = qp->dev;
2587 struct ib_qp_attr attr;
2591 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2594 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2595 if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2596 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2597 (qp->state != QED_ROCE_QP_STATE_INIT)) {
2599 attr.qp_state = IB_QPS_ERR;
2600 attr_mask |= IB_QP_STATE;
2602 /* Change the QP state to ERROR */
2603 qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2606 /* Wait for the connect/accept to complete */
2610 while (qp->ep->during_connect) {
2611 DP_DEBUG(dev, QEDR_MSG_QP,
2612 "Still in during connect/accept\n");
2615 if (wait_count++ > 200) {
2617 "during connect timeout\n");
2624 if (qp->qp_type == IB_QPT_GSI)
2625 qedr_destroy_gsi_qp(dev);
2627 qedr_free_qp_resources(dev, qp);
2629 if (atomic_dec_and_test(&qp->refcnt) &&
2630 rdma_protocol_iwarp(&dev->ibdev, 1)) {
2631 qedr_idr_remove(dev, &dev->qpidr, qp->qp_id);
2637 struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
2638 struct ib_udata *udata)
2642 ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
2644 return ERR_PTR(-ENOMEM);
2646 rdma_copy_ah_attr(&ah->attr, attr);
2651 int qedr_destroy_ah(struct ib_ah *ibah)
2653 struct qedr_ah *ah = get_qedr_ah(ibah);
2655 rdma_destroy_ah_attr(&ah->attr);
2660 static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2662 struct qedr_pbl *pbl, *tmp;
2664 if (info->pbl_table)
2665 list_add_tail(&info->pbl_table->list_entry,
2666 &info->free_pbl_list);
2668 if (!list_empty(&info->inuse_pbl_list))
2669 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2671 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2672 list_del(&pbl->list_entry);
2673 qedr_free_pbl(dev, &info->pbl_info, pbl);
2677 static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2678 size_t page_list_len, bool two_layered)
2680 struct qedr_pbl *tmp;
2683 INIT_LIST_HEAD(&info->free_pbl_list);
2684 INIT_LIST_HEAD(&info->inuse_pbl_list);
2686 rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2687 page_list_len, two_layered);
2691 info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2692 if (IS_ERR(info->pbl_table)) {
2693 rc = PTR_ERR(info->pbl_table);
2697 DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2698 &info->pbl_table->pa);
2700 /* in usual case we use 2 PBLs, so we add one to free
2701 * list and allocating another one
2703 tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2705 DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2709 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2711 DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2715 free_mr_info(dev, info);
2720 struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2721 u64 usr_addr, int acc, struct ib_udata *udata)
2723 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2728 pd = get_qedr_pd(ibpd);
2729 DP_DEBUG(dev, QEDR_MSG_MR,
2730 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2731 pd->pd_id, start, len, usr_addr, acc);
2733 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2734 return ERR_PTR(-EINVAL);
2736 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2740 mr->type = QEDR_MR_USER;
2742 mr->umem = ib_umem_get(ibpd->uobject->context, start, len, acc, 0);
2743 if (IS_ERR(mr->umem)) {
2748 rc = init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
2752 qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
2753 &mr->info.pbl_info, mr->umem->page_shift);
2755 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2757 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2761 /* Index only, 18 bit long, lkey = itid << 8 | key */
2762 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2764 mr->hw_mr.pd = pd->pd_id;
2765 mr->hw_mr.local_read = 1;
2766 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2767 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2768 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2769 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2770 mr->hw_mr.mw_bind = false;
2771 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2772 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2773 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2774 mr->hw_mr.page_size_log = mr->umem->page_shift;
2775 mr->hw_mr.fbo = ib_umem_offset(mr->umem);
2776 mr->hw_mr.length = len;
2777 mr->hw_mr.vaddr = usr_addr;
2778 mr->hw_mr.zbva = false;
2779 mr->hw_mr.phy_mr = false;
2780 mr->hw_mr.dma_mr = false;
2782 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2784 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2788 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2789 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2790 mr->hw_mr.remote_atomic)
2791 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2793 DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
2798 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2800 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2806 int qedr_dereg_mr(struct ib_mr *ib_mr)
2808 struct qedr_mr *mr = get_qedr_mr(ib_mr);
2809 struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
2812 rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
2816 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2818 if (mr->type != QEDR_MR_DMA)
2819 free_mr_info(dev, &mr->info);
2821 /* it could be user registered memory. */
2823 ib_umem_release(mr->umem);
2830 static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
2831 int max_page_list_len)
2833 struct qedr_pd *pd = get_qedr_pd(ibpd);
2834 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2838 DP_DEBUG(dev, QEDR_MSG_MR,
2839 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
2842 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2847 mr->type = QEDR_MR_FRMR;
2849 rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
2853 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2855 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2859 /* Index only, 18 bit long, lkey = itid << 8 | key */
2860 mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
2862 mr->hw_mr.pd = pd->pd_id;
2863 mr->hw_mr.local_read = 1;
2864 mr->hw_mr.local_write = 0;
2865 mr->hw_mr.remote_read = 0;
2866 mr->hw_mr.remote_write = 0;
2867 mr->hw_mr.remote_atomic = 0;
2868 mr->hw_mr.mw_bind = false;
2869 mr->hw_mr.pbl_ptr = 0;
2870 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2871 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2873 mr->hw_mr.length = 0;
2874 mr->hw_mr.vaddr = 0;
2875 mr->hw_mr.zbva = false;
2876 mr->hw_mr.phy_mr = true;
2877 mr->hw_mr.dma_mr = false;
2879 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2881 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2885 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2886 mr->ibmr.rkey = mr->ibmr.lkey;
2888 DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
2892 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2898 struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd,
2899 enum ib_mr_type mr_type, u32 max_num_sg)
2903 if (mr_type != IB_MR_TYPE_MEM_REG)
2904 return ERR_PTR(-EINVAL);
2906 mr = __qedr_alloc_mr(ibpd, max_num_sg);
2909 return ERR_PTR(-EINVAL);
2914 static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
2916 struct qedr_mr *mr = get_qedr_mr(ibmr);
2917 struct qedr_pbl *pbl_table;
2918 struct regpair *pbe;
2921 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
2922 DP_ERR(mr->dev, "qedr_set_page fails when %d\n", mr->npages);
2926 DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
2929 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
2930 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
2931 pbe = (struct regpair *)pbl_table->va;
2932 pbe += mr->npages % pbes_in_page;
2933 pbe->lo = cpu_to_le32((u32)addr);
2934 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
2941 static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
2943 int work = info->completed - info->completed_handled - 1;
2945 DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
2946 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
2947 struct qedr_pbl *pbl;
2949 /* Free all the page list that are possible to be freed
2950 * (all the ones that were invalidated), under the assumption
2951 * that if an FMR was completed successfully that means that
2952 * if there was an invalidate operation before it also ended
2954 pbl = list_first_entry(&info->inuse_pbl_list,
2955 struct qedr_pbl, list_entry);
2956 list_move_tail(&pbl->list_entry, &info->free_pbl_list);
2957 info->completed_handled++;
2961 int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
2962 int sg_nents, unsigned int *sg_offset)
2964 struct qedr_mr *mr = get_qedr_mr(ibmr);
2968 handle_completed_mrs(mr->dev, &mr->info);
2969 return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
2972 struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
2974 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2975 struct qedr_pd *pd = get_qedr_pd(ibpd);
2979 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2981 return ERR_PTR(-ENOMEM);
2983 mr->type = QEDR_MR_DMA;
2985 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2987 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2991 /* index only, 18 bit long, lkey = itid << 8 | key */
2992 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2993 mr->hw_mr.pd = pd->pd_id;
2994 mr->hw_mr.local_read = 1;
2995 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2996 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2997 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2998 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2999 mr->hw_mr.dma_mr = true;
3001 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
3003 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
3007 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3008 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
3009 mr->hw_mr.remote_atomic)
3010 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3012 DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
3016 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
3022 static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
3024 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
3027 static int sge_data_len(struct ib_sge *sg_list, int num_sge)
3031 for (i = 0; i < num_sge; i++)
3032 len += sg_list[i].length;
3037 static void swap_wqe_data64(u64 *p)
3041 for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
3042 *p = cpu_to_be64(cpu_to_le64(*p));
3045 static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
3046 struct qedr_qp *qp, u8 *wqe_size,
3047 const struct ib_send_wr *wr,
3048 const struct ib_send_wr **bad_wr,
3051 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
3052 char *seg_prt, *wqe;
3055 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
3056 DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
3070 /* Copy data inline */
3071 for (i = 0; i < wr->num_sge; i++) {
3072 u32 len = wr->sg_list[i].length;
3073 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
3078 /* New segment required */
3080 wqe = (char *)qed_chain_produce(&qp->sq.pbl);
3082 seg_siz = sizeof(struct rdma_sq_common_wqe);
3086 /* Calculate currently allowed length */
3087 cur = min_t(u32, len, seg_siz);
3088 memcpy(seg_prt, src, cur);
3090 /* Update segment variables */
3094 /* Update sge variables */
3098 /* Swap fully-completed segments */
3100 swap_wqe_data64((u64 *)wqe);
3104 /* swap last not completed segment */
3106 swap_wqe_data64((u64 *)wqe);
3111 #define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
3113 DMA_REGPAIR_LE(sge->addr, vaddr); \
3114 (sge)->length = cpu_to_le32(vlength); \
3115 (sge)->flags = cpu_to_le32(vflags); \
3118 #define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
3120 DMA_REGPAIR_LE(hdr->wr_id, vwr_id); \
3121 (hdr)->num_sges = num_sge; \
3124 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
3126 DMA_REGPAIR_LE(sge->addr, vaddr); \
3127 (sge)->length = cpu_to_le32(vlength); \
3128 (sge)->l_key = cpu_to_le32(vlkey); \
3131 static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
3132 const struct ib_send_wr *wr)
3137 for (i = 0; i < wr->num_sge; i++) {
3138 struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
3140 DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
3141 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
3142 sge->length = cpu_to_le32(wr->sg_list[i].length);
3143 data_size += wr->sg_list[i].length;
3147 *wqe_size += wr->num_sge;
3152 static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
3154 struct rdma_sq_rdma_wqe_1st *rwqe,
3155 struct rdma_sq_rdma_wqe_2nd *rwqe2,
3156 const struct ib_send_wr *wr,
3157 const struct ib_send_wr **bad_wr)
3159 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
3160 DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
3162 if (wr->send_flags & IB_SEND_INLINE &&
3163 (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
3164 wr->opcode == IB_WR_RDMA_WRITE)) {
3167 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
3168 return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
3169 bad_wr, &rwqe->flags, flags);
3172 return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
3175 static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
3177 struct rdma_sq_send_wqe_1st *swqe,
3178 struct rdma_sq_send_wqe_2st *swqe2,
3179 const struct ib_send_wr *wr,
3180 const struct ib_send_wr **bad_wr)
3182 memset(swqe2, 0, sizeof(*swqe2));
3183 if (wr->send_flags & IB_SEND_INLINE) {
3186 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
3187 return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
3188 bad_wr, &swqe->flags, flags);
3191 return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
3194 static int qedr_prepare_reg(struct qedr_qp *qp,
3195 struct rdma_sq_fmr_wqe_1st *fwqe1,
3196 const struct ib_reg_wr *wr)
3198 struct qedr_mr *mr = get_qedr_mr(wr->mr);
3199 struct rdma_sq_fmr_wqe_2nd *fwqe2;
3201 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
3202 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
3203 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
3204 fwqe1->l_key = wr->key;
3206 fwqe2->access_ctrl = 0;
3208 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
3209 !!(wr->access & IB_ACCESS_REMOTE_READ));
3210 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
3211 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
3212 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
3213 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
3214 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
3215 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
3216 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
3217 fwqe2->fmr_ctrl = 0;
3219 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
3220 ilog2(mr->ibmr.page_size) - 12);
3222 fwqe2->length_hi = 0;
3223 fwqe2->length_lo = mr->ibmr.length;
3224 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
3225 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
3227 qp->wqe_wr_id[qp->sq.prod].mr = mr;
3232 static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
3235 case IB_WR_RDMA_WRITE:
3236 case IB_WR_RDMA_WRITE_WITH_IMM:
3237 return IB_WC_RDMA_WRITE;
3238 case IB_WR_SEND_WITH_IMM:
3240 case IB_WR_SEND_WITH_INV:
3242 case IB_WR_RDMA_READ:
3243 case IB_WR_RDMA_READ_WITH_INV:
3244 return IB_WC_RDMA_READ;
3245 case IB_WR_ATOMIC_CMP_AND_SWP:
3246 return IB_WC_COMP_SWAP;
3247 case IB_WR_ATOMIC_FETCH_AND_ADD:
3248 return IB_WC_FETCH_ADD;
3250 return IB_WC_REG_MR;
3251 case IB_WR_LOCAL_INV:
3252 return IB_WC_LOCAL_INV;
3258 static inline bool qedr_can_post_send(struct qedr_qp *qp,
3259 const struct ib_send_wr *wr)
3261 int wq_is_full, err_wr, pbl_is_full;
3262 struct qedr_dev *dev = qp->dev;
3264 /* prevent SQ overflow and/or processing of a bad WR */
3265 err_wr = wr->num_sge > qp->sq.max_sges;
3266 wq_is_full = qedr_wq_is_full(&qp->sq);
3267 pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
3268 QEDR_MAX_SQE_ELEMENTS_PER_SQE;
3269 if (wq_is_full || err_wr || pbl_is_full) {
3270 if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
3272 "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
3274 qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
3277 if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
3279 "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
3281 qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
3285 !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
3287 "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
3289 qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
3296 static int __qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3297 const struct ib_send_wr **bad_wr)
3299 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3300 struct qedr_qp *qp = get_qedr_qp(ibqp);
3301 struct rdma_sq_atomic_wqe_1st *awqe1;
3302 struct rdma_sq_atomic_wqe_2nd *awqe2;
3303 struct rdma_sq_atomic_wqe_3rd *awqe3;
3304 struct rdma_sq_send_wqe_2st *swqe2;
3305 struct rdma_sq_local_inv_wqe *iwqe;
3306 struct rdma_sq_rdma_wqe_2nd *rwqe2;
3307 struct rdma_sq_send_wqe_1st *swqe;
3308 struct rdma_sq_rdma_wqe_1st *rwqe;
3309 struct rdma_sq_fmr_wqe_1st *fwqe1;
3310 struct rdma_sq_common_wqe *wqe;
3315 if (!qedr_can_post_send(qp, wr)) {
3320 wqe = qed_chain_produce(&qp->sq.pbl);
3321 qp->wqe_wr_id[qp->sq.prod].signaled =
3322 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
3325 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
3326 !!(wr->send_flags & IB_SEND_SOLICITED));
3327 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
3328 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
3329 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
3330 !!(wr->send_flags & IB_SEND_FENCE));
3331 wqe->prev_wqe_size = qp->prev_wqe_size;
3333 qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
3335 switch (wr->opcode) {
3336 case IB_WR_SEND_WITH_IMM:
3337 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3342 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
3343 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3345 swqe2 = qed_chain_produce(&qp->sq.pbl);
3347 swqe->inv_key_or_imm_data = cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
3348 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3350 swqe->length = cpu_to_le32(length);
3351 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3352 qp->prev_wqe_size = swqe->wqe_size;
3353 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3356 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
3357 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3360 swqe2 = qed_chain_produce(&qp->sq.pbl);
3361 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3363 swqe->length = cpu_to_le32(length);
3364 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3365 qp->prev_wqe_size = swqe->wqe_size;
3366 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3368 case IB_WR_SEND_WITH_INV:
3369 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
3370 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3371 swqe2 = qed_chain_produce(&qp->sq.pbl);
3373 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
3374 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3376 swqe->length = cpu_to_le32(length);
3377 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3378 qp->prev_wqe_size = swqe->wqe_size;
3379 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3382 case IB_WR_RDMA_WRITE_WITH_IMM:
3383 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3388 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
3389 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3392 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
3393 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3394 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3396 rwqe->length = cpu_to_le32(length);
3397 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3398 qp->prev_wqe_size = rwqe->wqe_size;
3399 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3401 case IB_WR_RDMA_WRITE:
3402 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
3403 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3406 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3407 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3409 rwqe->length = cpu_to_le32(length);
3410 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3411 qp->prev_wqe_size = rwqe->wqe_size;
3412 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3414 case IB_WR_RDMA_READ_WITH_INV:
3415 SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
3416 /* fallthrough -- same is identical to RDMA READ */
3418 case IB_WR_RDMA_READ:
3419 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
3420 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3423 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3424 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3426 rwqe->length = cpu_to_le32(length);
3427 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3428 qp->prev_wqe_size = rwqe->wqe_size;
3429 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3432 case IB_WR_ATOMIC_CMP_AND_SWP:
3433 case IB_WR_ATOMIC_FETCH_AND_ADD:
3434 awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
3435 awqe1->wqe_size = 4;
3437 awqe2 = qed_chain_produce(&qp->sq.pbl);
3438 DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
3439 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
3441 awqe3 = qed_chain_produce(&qp->sq.pbl);
3443 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
3444 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
3445 DMA_REGPAIR_LE(awqe3->swap_data,
3446 atomic_wr(wr)->compare_add);
3448 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
3449 DMA_REGPAIR_LE(awqe3->swap_data,
3450 atomic_wr(wr)->swap);
3451 DMA_REGPAIR_LE(awqe3->cmp_data,
3452 atomic_wr(wr)->compare_add);
3455 qedr_prepare_sq_sges(qp, NULL, wr);
3457 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
3458 qp->prev_wqe_size = awqe1->wqe_size;
3461 case IB_WR_LOCAL_INV:
3462 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
3465 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
3466 iwqe->inv_l_key = wr->ex.invalidate_rkey;
3467 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
3468 qp->prev_wqe_size = iwqe->wqe_size;
3471 DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
3472 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
3473 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
3474 fwqe1->wqe_size = 2;
3476 rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
3478 DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
3483 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
3484 qp->prev_wqe_size = fwqe1->wqe_size;
3487 DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
3496 /* Restore prod to its position before
3497 * this WR was processed
3499 value = le16_to_cpu(qp->sq.db_data.data.value);
3500 qed_chain_set_prod(&qp->sq.pbl, value, wqe);
3502 /* Restore prev_wqe_size */
3503 qp->prev_wqe_size = wqe->prev_wqe_size;
3505 DP_ERR(dev, "POST SEND FAILED\n");
3511 int qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3512 const struct ib_send_wr **bad_wr)
3514 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3515 struct qedr_qp *qp = get_qedr_qp(ibqp);
3516 unsigned long flags;
3521 if (qp->qp_type == IB_QPT_GSI)
3522 return qedr_gsi_post_send(ibqp, wr, bad_wr);
3524 spin_lock_irqsave(&qp->q_lock, flags);
3526 if (rdma_protocol_roce(&dev->ibdev, 1)) {
3527 if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
3528 (qp->state != QED_ROCE_QP_STATE_ERR) &&
3529 (qp->state != QED_ROCE_QP_STATE_SQD)) {
3530 spin_unlock_irqrestore(&qp->q_lock, flags);
3532 DP_DEBUG(dev, QEDR_MSG_CQ,
3533 "QP in wrong state! QP icid=0x%x state %d\n",
3534 qp->icid, qp->state);
3540 rc = __qedr_post_send(ibqp, wr, bad_wr);
3544 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3546 qedr_inc_sw_prod(&qp->sq);
3548 qp->sq.db_data.data.value++;
3554 * If there was a failure in the first WR then it will be triggered in
3555 * vane. However this is not harmful (as long as the producer value is
3556 * unchanged). For performance reasons we avoid checking for this
3557 * redundant doorbell.
3559 * qp->wqe_wr_id is accessed during qedr_poll_cq, as
3560 * soon as we give the doorbell, we could get a completion
3561 * for this wr, therefore we need to make sure that the
3562 * memory is updated before giving the doorbell.
3563 * During qedr_poll_cq, rmb is called before accessing the
3564 * cqe. This covers for the smp_rmb as well.
3567 writel(qp->sq.db_data.raw, qp->sq.db);
3569 /* Make sure write sticks */
3572 spin_unlock_irqrestore(&qp->q_lock, flags);
3577 static u32 qedr_srq_elem_left(struct qedr_srq_hwq_info *hw_srq)
3581 /* Calculate number of elements used based on producer
3582 * count and consumer count and subtract it from max
3583 * work request supported so that we get elements left.
3585 used = hw_srq->wr_prod_cnt - (u32)atomic_read(&hw_srq->wr_cons_cnt);
3587 return hw_srq->max_wr - used;
3590 int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
3591 const struct ib_recv_wr **bad_wr)
3593 struct qedr_srq *srq = get_qedr_srq(ibsrq);
3594 struct qedr_srq_hwq_info *hw_srq;
3595 struct qedr_dev *dev = srq->dev;
3596 struct qed_chain *pbl;
3597 unsigned long flags;
3601 spin_lock_irqsave(&srq->lock, flags);
3603 hw_srq = &srq->hw_srq;
3604 pbl = &srq->hw_srq.pbl;
3606 struct rdma_srq_wqe_header *hdr;
3609 if (!qedr_srq_elem_left(hw_srq) ||
3610 wr->num_sge > srq->hw_srq.max_sges) {
3611 DP_ERR(dev, "Can't post WR (%d,%d) || (%d > %d)\n",
3612 hw_srq->wr_prod_cnt,
3613 atomic_read(&hw_srq->wr_cons_cnt),
3614 wr->num_sge, srq->hw_srq.max_sges);
3620 hdr = qed_chain_produce(pbl);
3621 num_sge = wr->num_sge;
3622 /* Set number of sge and work request id in header */
3623 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
3625 srq->hw_srq.wr_prod_cnt++;
3629 DP_DEBUG(dev, QEDR_MSG_SRQ,
3630 "SRQ WR: SGEs: %d with wr_id[%d] = %llx\n",
3631 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
3633 for (i = 0; i < wr->num_sge; i++) {
3634 struct rdma_srq_sge *srq_sge = qed_chain_produce(pbl);
3636 /* Set SGE length, lkey and address */
3637 SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
3638 wr->sg_list[i].length, wr->sg_list[i].lkey);
3640 DP_DEBUG(dev, QEDR_MSG_SRQ,
3641 "[%d]: len %d key %x addr %x:%x\n",
3642 i, srq_sge->length, srq_sge->l_key,
3643 srq_sge->addr.hi, srq_sge->addr.lo);
3647 /* Update WQE and SGE information before
3648 * updating producer.
3652 /* SRQ producer is 8 bytes. Need to update SGE producer index
3653 * in first 4 bytes and need to update WQE producer in
3656 srq->hw_srq.virt_prod_pair_addr->sge_prod = hw_srq->sge_prod;
3657 /* Make sure sge producer is updated first */
3659 srq->hw_srq.virt_prod_pair_addr->wqe_prod = hw_srq->wqe_prod;
3664 DP_DEBUG(dev, QEDR_MSG_SRQ, "POST: Elements in S-RQ: %d\n",
3665 qed_chain_get_elem_left(pbl));
3666 spin_unlock_irqrestore(&srq->lock, flags);
3671 int qedr_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
3672 const struct ib_recv_wr **bad_wr)
3674 struct qedr_qp *qp = get_qedr_qp(ibqp);
3675 struct qedr_dev *dev = qp->dev;
3676 unsigned long flags;
3679 if (qp->qp_type == IB_QPT_GSI)
3680 return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3682 spin_lock_irqsave(&qp->q_lock, flags);
3684 if (qp->state == QED_ROCE_QP_STATE_RESET) {
3685 spin_unlock_irqrestore(&qp->q_lock, flags);
3693 if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3694 QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3695 wr->num_sge > qp->rq.max_sges) {
3696 DP_ERR(dev, "Can't post WR (%d < %d) || (%d > %d)\n",
3697 qed_chain_get_elem_left_u32(&qp->rq.pbl),
3698 QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3704 for (i = 0; i < wr->num_sge; i++) {
3706 struct rdma_rq_sge *rqe =
3707 qed_chain_produce(&qp->rq.pbl);
3709 /* First one must include the number
3710 * of SGE in the list
3713 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3716 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO,
3717 wr->sg_list[i].lkey);
3719 RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3720 wr->sg_list[i].length, flags);
3723 /* Special case of no sges. FW requires between 1-4 sges...
3724 * in this case we need to post 1 sge with length zero. this is
3725 * because rdma write with immediate consumes an RQ.
3729 struct rdma_rq_sge *rqe =
3730 qed_chain_produce(&qp->rq.pbl);
3732 /* First one must include the number
3733 * of SGE in the list
3735 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO, 0);
3736 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3738 RQ_SGE_SET(rqe, 0, 0, flags);
3742 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3743 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3745 qedr_inc_sw_prod(&qp->rq);
3747 /* qp->rqe_wr_id is accessed during qedr_poll_cq, as
3748 * soon as we give the doorbell, we could get a completion
3749 * for this wr, therefore we need to make sure that the
3750 * memory is update before giving the doorbell.
3751 * During qedr_poll_cq, rmb is called before accessing the
3752 * cqe. This covers for the smp_rmb as well.
3756 qp->rq.db_data.data.value++;
3758 writel(qp->rq.db_data.raw, qp->rq.db);
3760 /* Make sure write sticks */
3763 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
3764 writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
3765 mmiowb(); /* for second doorbell */
3771 spin_unlock_irqrestore(&qp->q_lock, flags);
3776 static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3778 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3780 return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3784 static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3786 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3789 qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
3790 resp_cqe->qp_handle.lo,
3795 static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
3797 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3799 return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
3802 /* Return latest CQE (needs processing) */
3803 static union rdma_cqe *get_cqe(struct qedr_cq *cq)
3805 return cq->latest_cqe;
3808 /* In fmr we need to increase the number of fmr completed counter for the fmr
3809 * algorithm determining whether we can free a pbl or not.
3810 * we need to perform this whether the work request was signaled or not. for
3811 * this purpose we call this function from the condition that checks if a wr
3812 * should be skipped, to make sure we don't miss it ( possibly this fmr
3813 * operation was not signalted)
3815 static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
3817 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
3818 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3821 static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
3822 struct qedr_cq *cq, int num_entries,
3823 struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
3828 while (num_entries && qp->sq.wqe_cons != hw_cons) {
3829 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
3830 qedr_chk_if_fmr(qp);
3836 wc->status = status;
3839 wc->src_qp = qp->id;
3842 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
3843 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
3845 switch (wc->opcode) {
3846 case IB_WC_RDMA_WRITE:
3847 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3849 case IB_WC_COMP_SWAP:
3850 case IB_WC_FETCH_ADD:
3854 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3856 case IB_WC_RDMA_READ:
3858 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3868 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
3869 qed_chain_consume(&qp->sq.pbl);
3870 qedr_inc_sw_cons(&qp->sq);
3876 static int qedr_poll_cq_req(struct qedr_dev *dev,
3877 struct qedr_qp *qp, struct qedr_cq *cq,
3878 int num_entries, struct ib_wc *wc,
3879 struct rdma_cqe_requester *req)
3883 switch (req->status) {
3884 case RDMA_CQE_REQ_STS_OK:
3885 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3888 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
3889 if (qp->state != QED_ROCE_QP_STATE_ERR)
3890 DP_DEBUG(dev, QEDR_MSG_CQ,
3891 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3892 cq->icid, qp->icid);
3893 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3894 IB_WC_WR_FLUSH_ERR, 1);
3897 /* process all WQE before the cosumer */
3898 qp->state = QED_ROCE_QP_STATE_ERR;
3899 cnt = process_req(dev, qp, cq, num_entries, wc,
3900 req->sq_cons - 1, IB_WC_SUCCESS, 0);
3902 /* if we have extra WC fill it with actual error info */
3903 if (cnt < num_entries) {
3904 enum ib_wc_status wc_status;
3906 switch (req->status) {
3907 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
3909 "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3910 cq->icid, qp->icid);
3911 wc_status = IB_WC_BAD_RESP_ERR;
3913 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
3915 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3916 cq->icid, qp->icid);
3917 wc_status = IB_WC_LOC_LEN_ERR;
3919 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
3921 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3922 cq->icid, qp->icid);
3923 wc_status = IB_WC_LOC_QP_OP_ERR;
3925 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
3927 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3928 cq->icid, qp->icid);
3929 wc_status = IB_WC_LOC_PROT_ERR;
3931 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
3933 "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3934 cq->icid, qp->icid);
3935 wc_status = IB_WC_MW_BIND_ERR;
3937 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
3939 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3940 cq->icid, qp->icid);
3941 wc_status = IB_WC_REM_INV_REQ_ERR;
3943 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
3945 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3946 cq->icid, qp->icid);
3947 wc_status = IB_WC_REM_ACCESS_ERR;
3949 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
3951 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3952 cq->icid, qp->icid);
3953 wc_status = IB_WC_REM_OP_ERR;
3955 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
3957 "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3958 cq->icid, qp->icid);
3959 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
3961 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
3963 "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3964 cq->icid, qp->icid);
3965 wc_status = IB_WC_RETRY_EXC_ERR;
3969 "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3970 cq->icid, qp->icid);
3971 wc_status = IB_WC_GENERAL_ERR;
3973 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
3981 static inline int qedr_cqe_resp_status_to_ib(u8 status)
3984 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
3985 return IB_WC_LOC_ACCESS_ERR;
3986 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
3987 return IB_WC_LOC_LEN_ERR;
3988 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
3989 return IB_WC_LOC_QP_OP_ERR;
3990 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
3991 return IB_WC_LOC_PROT_ERR;
3992 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
3993 return IB_WC_MW_BIND_ERR;
3994 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
3995 return IB_WC_REM_INV_RD_REQ_ERR;
3996 case RDMA_CQE_RESP_STS_OK:
3997 return IB_WC_SUCCESS;
3999 return IB_WC_GENERAL_ERR;
4003 static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
4006 wc->status = IB_WC_SUCCESS;
4007 wc->byte_len = le32_to_cpu(resp->length);
4009 if (resp->flags & QEDR_RESP_IMM) {
4010 wc->ex.imm_data = cpu_to_be32(le32_to_cpu(resp->imm_data_or_inv_r_Key));
4011 wc->wc_flags |= IB_WC_WITH_IMM;
4013 if (resp->flags & QEDR_RESP_RDMA)
4014 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
4016 if (resp->flags & QEDR_RESP_INV)
4019 } else if (resp->flags & QEDR_RESP_INV) {
4020 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
4021 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
4023 if (resp->flags & QEDR_RESP_RDMA)
4026 } else if (resp->flags & QEDR_RESP_RDMA) {
4033 static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
4034 struct qedr_cq *cq, struct ib_wc *wc,
4035 struct rdma_cqe_responder *resp, u64 wr_id)
4037 /* Must fill fields before qedr_set_ok_cqe_resp_wc() */
4038 wc->opcode = IB_WC_RECV;
4041 if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
4042 if (qedr_set_ok_cqe_resp_wc(resp, wc))
4044 "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
4045 cq, cq->icid, resp->flags);
4048 wc->status = qedr_cqe_resp_status_to_ib(resp->status);
4049 if (wc->status == IB_WC_GENERAL_ERR)
4051 "CQ %p (icid=%d) contains an invalid CQE status %d\n",
4052 cq, cq->icid, resp->status);
4055 /* Fill the rest of the WC */
4057 wc->src_qp = qp->id;
4062 static int process_resp_one_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4063 struct qedr_cq *cq, struct ib_wc *wc,
4064 struct rdma_cqe_responder *resp)
4066 struct qedr_srq *srq = qp->srq;
4069 wr_id = HILO_GEN(le32_to_cpu(resp->srq_wr_id.hi),
4070 le32_to_cpu(resp->srq_wr_id.lo), u64);
4072 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4073 wc->status = IB_WC_WR_FLUSH_ERR;
4077 wc->src_qp = qp->id;
4081 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
4083 atomic_inc(&srq->hw_srq.wr_cons_cnt);
4087 static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
4088 struct qedr_cq *cq, struct ib_wc *wc,
4089 struct rdma_cqe_responder *resp)
4091 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4093 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
4095 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4096 qed_chain_consume(&qp->rq.pbl);
4097 qedr_inc_sw_cons(&qp->rq);
4102 static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
4103 int num_entries, struct ib_wc *wc, u16 hw_cons)
4107 while (num_entries && qp->rq.wqe_cons != hw_cons) {
4109 wc->status = IB_WC_WR_FLUSH_ERR;
4112 wc->src_qp = qp->id;
4114 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4119 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4120 qed_chain_consume(&qp->rq.pbl);
4121 qedr_inc_sw_cons(&qp->rq);
4127 static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4128 struct rdma_cqe_responder *resp, int *update)
4130 if (le16_to_cpu(resp->rq_cons_or_srq_id) == qp->rq.wqe_cons) {
4136 static int qedr_poll_cq_resp_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4137 struct qedr_cq *cq, int num_entries,
4139 struct rdma_cqe_responder *resp)
4143 cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
4149 static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
4150 struct qedr_cq *cq, int num_entries,
4151 struct ib_wc *wc, struct rdma_cqe_responder *resp,
4156 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4157 cnt = process_resp_flush(qp, cq, num_entries, wc,
4158 resp->rq_cons_or_srq_id);
4159 try_consume_resp_cqe(cq, qp, resp, update);
4161 cnt = process_resp_one(dev, qp, cq, wc, resp);
4169 static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4170 struct rdma_cqe_requester *req, int *update)
4172 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
4178 int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
4180 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
4181 struct qedr_cq *cq = get_qedr_cq(ibcq);
4182 union rdma_cqe *cqe;
4183 u32 old_cons, new_cons;
4184 unsigned long flags;
4188 if (cq->destroyed) {
4190 "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
4195 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
4196 return qedr_gsi_poll_cq(ibcq, num_entries, wc);
4198 spin_lock_irqsave(&cq->cq_lock, flags);
4199 cqe = cq->latest_cqe;
4200 old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4201 while (num_entries && is_valid_cqe(cq, cqe)) {
4205 /* prevent speculative reads of any field of CQE */
4208 qp = cqe_get_qp(cqe);
4210 WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
4216 switch (cqe_get_type(cqe)) {
4217 case RDMA_CQE_TYPE_REQUESTER:
4218 cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
4220 try_consume_req_cqe(cq, qp, &cqe->req, &update);
4222 case RDMA_CQE_TYPE_RESPONDER_RQ:
4223 cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
4224 &cqe->resp, &update);
4226 case RDMA_CQE_TYPE_RESPONDER_SRQ:
4227 cnt = qedr_poll_cq_resp_srq(dev, qp, cq, num_entries,
4231 case RDMA_CQE_TYPE_INVALID:
4233 DP_ERR(dev, "Error: invalid CQE type = %d\n",
4242 new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4244 cq->cq_cons += new_cons - old_cons;
4247 /* doorbell notifies abount latest VALID entry,
4248 * but chain already point to the next INVALID one
4250 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
4252 spin_unlock_irqrestore(&cq->cq_lock, flags);
4256 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
4258 const struct ib_wc *in_wc,
4259 const struct ib_grh *in_grh,
4260 const struct ib_mad_hdr *mad_hdr,
4261 size_t in_mad_size, struct ib_mad_hdr *out_mad,
4262 size_t *out_mad_size, u16 *out_mad_pkey_index)
4264 struct qedr_dev *dev = get_qedr_dev(ibdev);
4266 DP_DEBUG(dev, QEDR_MSG_GSI,
4267 "QEDR_PROCESS_MAD in_mad %x %x %x %x %x %x %x %x\n",
4268 mad_hdr->attr_id, mad_hdr->base_version, mad_hdr->attr_mod,
4269 mad_hdr->class_specific, mad_hdr->class_version,
4270 mad_hdr->method, mad_hdr->mgmt_class, mad_hdr->status);
4271 return IB_MAD_RESULT_SUCCESS;