1 /* QLogic qedr NIC Driver
2 * Copyright (c) 2015-2016 QLogic Corporation
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and /or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 #include <linux/dma-mapping.h>
33 #include <linux/crc32.h>
37 #include <linux/iommu.h>
39 #include <rdma/ib_verbs.h>
40 #include <rdma/ib_user_verbs.h>
41 #include <rdma/iw_cm.h>
42 #include <rdma/ib_umem.h>
43 #include <rdma/ib_addr.h>
44 #include <rdma/ib_cache.h>
45 #include <rdma/uverbs_ioctl.h>
47 #include <linux/qed/common_hsi.h>
48 #include "qedr_hsi_rdma.h"
49 #include <linux/qed/qed_if.h>
52 #include <rdma/qedr-abi.h>
53 #include "qedr_roce_cm.h"
54 #include "qedr_iw_cm.h"
56 #define QEDR_SRQ_WQE_ELEM_SIZE sizeof(union rdma_srq_elm)
57 #define RDMA_MAX_SGE_PER_SRQ (4)
58 #define RDMA_MAX_SRQ_WQE_SIZE (RDMA_MAX_SGE_PER_SRQ + 1)
60 #define DB_ADDR_SHIFT(addr) ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
63 QEDR_USER_MMAP_IO_WC = 0,
64 QEDR_USER_MMAP_PHYS_PAGE,
67 static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src,
70 size_t min_len = min_t(size_t, len, udata->outlen);
72 return ib_copy_to_udata(udata, src, min_len);
75 int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
77 if (index >= QEDR_ROCE_PKEY_TABLE_LEN)
80 *pkey = QEDR_ROCE_PKEY_DEFAULT;
84 int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
85 int index, union ib_gid *sgid)
87 struct qedr_dev *dev = get_qedr_dev(ibdev);
89 memset(sgid->raw, 0, sizeof(sgid->raw));
90 ether_addr_copy(sgid->raw, dev->ndev->dev_addr);
92 DP_DEBUG(dev, QEDR_MSG_INIT, "QUERY sgid[%d]=%llx:%llx\n", index,
93 sgid->global.interface_id, sgid->global.subnet_prefix);
98 int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
100 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
101 struct qedr_device_attr *qattr = &dev->attr;
102 struct qedr_srq *srq = get_qedr_srq(ibsrq);
104 srq_attr->srq_limit = srq->srq_limit;
105 srq_attr->max_wr = qattr->max_srq_wr;
106 srq_attr->max_sge = qattr->max_sge;
111 int qedr_query_device(struct ib_device *ibdev,
112 struct ib_device_attr *attr, struct ib_udata *udata)
114 struct qedr_dev *dev = get_qedr_dev(ibdev);
115 struct qedr_device_attr *qattr = &dev->attr;
117 if (!dev->rdma_ctx) {
119 "qedr_query_device called with invalid params rdma_ctx=%p\n",
124 memset(attr, 0, sizeof(*attr));
126 attr->fw_ver = qattr->fw_ver;
127 attr->sys_image_guid = qattr->sys_image_guid;
128 attr->max_mr_size = qattr->max_mr_size;
129 attr->page_size_cap = qattr->page_size_caps;
130 attr->vendor_id = qattr->vendor_id;
131 attr->vendor_part_id = qattr->vendor_part_id;
132 attr->hw_ver = qattr->hw_ver;
133 attr->max_qp = qattr->max_qp;
134 attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
135 attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
136 IB_DEVICE_RC_RNR_NAK_GEN |
137 IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
139 attr->max_send_sge = qattr->max_sge;
140 attr->max_recv_sge = qattr->max_sge;
141 attr->max_sge_rd = qattr->max_sge;
142 attr->max_cq = qattr->max_cq;
143 attr->max_cqe = qattr->max_cqe;
144 attr->max_mr = qattr->max_mr;
145 attr->max_mw = qattr->max_mw;
146 attr->max_pd = qattr->max_pd;
147 attr->atomic_cap = dev->atomic_cap;
148 attr->max_fmr = qattr->max_fmr;
149 attr->max_map_per_fmr = 16;
150 attr->max_qp_init_rd_atom =
151 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
152 attr->max_qp_rd_atom =
153 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
154 attr->max_qp_init_rd_atom);
156 attr->max_srq = qattr->max_srq;
157 attr->max_srq_sge = qattr->max_srq_sge;
158 attr->max_srq_wr = qattr->max_srq_wr;
160 attr->local_ca_ack_delay = qattr->dev_ack_delay;
161 attr->max_fast_reg_page_list_len = qattr->max_mr / 8;
162 attr->max_pkeys = QEDR_ROCE_PKEY_MAX;
163 attr->max_ah = qattr->max_ah;
168 static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
173 *ib_speed = IB_SPEED_SDR;
174 *ib_width = IB_WIDTH_1X;
177 *ib_speed = IB_SPEED_QDR;
178 *ib_width = IB_WIDTH_1X;
182 *ib_speed = IB_SPEED_DDR;
183 *ib_width = IB_WIDTH_4X;
187 *ib_speed = IB_SPEED_EDR;
188 *ib_width = IB_WIDTH_1X;
192 *ib_speed = IB_SPEED_QDR;
193 *ib_width = IB_WIDTH_4X;
197 *ib_speed = IB_SPEED_HDR;
198 *ib_width = IB_WIDTH_1X;
202 *ib_speed = IB_SPEED_EDR;
203 *ib_width = IB_WIDTH_4X;
208 *ib_speed = IB_SPEED_SDR;
209 *ib_width = IB_WIDTH_1X;
213 int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
215 struct qedr_dev *dev;
216 struct qed_rdma_port *rdma_port;
218 dev = get_qedr_dev(ibdev);
220 if (!dev->rdma_ctx) {
221 DP_ERR(dev, "rdma_ctx is NULL\n");
225 rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
227 /* *attr being zeroed by the caller, avoid zeroing it here */
228 if (rdma_port->port_state == QED_RDMA_PORT_UP) {
229 attr->state = IB_PORT_ACTIVE;
230 attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
232 attr->state = IB_PORT_DOWN;
233 attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;
235 attr->max_mtu = IB_MTU_4096;
236 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
241 attr->ip_gids = true;
242 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
243 attr->gid_tbl_len = 1;
244 attr->pkey_tbl_len = 1;
246 attr->gid_tbl_len = QEDR_MAX_SGID;
247 attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
249 attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
250 attr->qkey_viol_cntr = 0;
251 get_link_speed_and_width(rdma_port->link_speed,
252 &attr->active_speed, &attr->active_width);
253 attr->max_msg_sz = rdma_port->max_msg_size;
254 attr->max_vl_num = 4;
259 int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
261 struct ib_device *ibdev = uctx->device;
263 struct qedr_ucontext *ctx = get_qedr_ucontext(uctx);
264 struct qedr_alloc_ucontext_resp uresp = {};
265 struct qedr_alloc_ucontext_req ureq = {};
266 struct qedr_dev *dev = get_qedr_dev(ibdev);
267 struct qed_rdma_add_user_out_params oparams;
268 struct qedr_user_mmap_entry *entry;
274 rc = ib_copy_from_udata(&ureq, udata,
275 min(sizeof(ureq), udata->inlen));
277 DP_ERR(dev, "Problem copying data from user space\n");
281 ctx->db_rec = !!(ureq.context_flags & QEDR_ALLOC_UCTX_DB_REC);
284 rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
287 "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",
292 ctx->dpi = oparams.dpi;
293 ctx->dpi_addr = oparams.dpi_addr;
294 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
295 ctx->dpi_size = oparams.dpi_size;
296 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
302 entry->io_address = ctx->dpi_phys_addr;
303 entry->length = ctx->dpi_size;
304 entry->mmap_flag = QEDR_USER_MMAP_IO_WC;
305 entry->dpi = ctx->dpi;
307 rc = rdma_user_mmap_entry_insert(uctx, &entry->rdma_entry,
313 ctx->db_mmap_entry = &entry->rdma_entry;
315 uresp.dpm_enabled = dev->user_dpm_enabled;
316 uresp.wids_enabled = 1;
317 uresp.wid_count = oparams.wid_count;
318 uresp.db_pa = rdma_user_mmap_get_offset(ctx->db_mmap_entry);
319 uresp.db_size = ctx->dpi_size;
320 uresp.max_send_wr = dev->attr.max_sqe;
321 uresp.max_recv_wr = dev->attr.max_rqe;
322 uresp.max_srq_wr = dev->attr.max_srq_wr;
323 uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
324 uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
325 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
326 uresp.max_cqes = QEDR_MAX_CQES;
328 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
334 DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
339 if (!ctx->db_mmap_entry)
340 dev->ops->rdma_remove_user(dev->rdma_ctx, ctx->dpi);
342 rdma_user_mmap_entry_remove(ctx->db_mmap_entry);
347 void qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
349 struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
351 DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
354 rdma_user_mmap_entry_remove(uctx->db_mmap_entry);
357 void qedr_mmap_free(struct rdma_user_mmap_entry *rdma_entry)
359 struct qedr_user_mmap_entry *entry = get_qedr_mmap_entry(rdma_entry);
360 struct qedr_dev *dev = entry->dev;
362 if (entry->mmap_flag == QEDR_USER_MMAP_PHYS_PAGE)
363 free_page((unsigned long)entry->address);
364 else if (entry->mmap_flag == QEDR_USER_MMAP_IO_WC)
365 dev->ops->rdma_remove_user(dev->rdma_ctx, entry->dpi);
370 int qedr_mmap(struct ib_ucontext *ucontext, struct vm_area_struct *vma)
372 struct ib_device *dev = ucontext->device;
373 size_t length = vma->vm_end - vma->vm_start;
374 struct rdma_user_mmap_entry *rdma_entry;
375 struct qedr_user_mmap_entry *entry;
380 "start %#lx, end %#lx, length = %#zx, pgoff = %#lx\n",
381 vma->vm_start, vma->vm_end, length, vma->vm_pgoff);
383 rdma_entry = rdma_user_mmap_entry_get(ucontext, vma);
385 ibdev_dbg(dev, "pgoff[%#lx] does not have valid entry\n",
389 entry = get_qedr_mmap_entry(rdma_entry);
391 "Mapping address[%#llx], length[%#zx], mmap_flag[%d]\n",
392 entry->io_address, length, entry->mmap_flag);
394 switch (entry->mmap_flag) {
395 case QEDR_USER_MMAP_IO_WC:
396 pfn = entry->io_address >> PAGE_SHIFT;
397 rc = rdma_user_mmap_io(ucontext, vma, pfn, length,
398 pgprot_writecombine(vma->vm_page_prot),
401 case QEDR_USER_MMAP_PHYS_PAGE:
402 rc = vm_insert_page(vma, vma->vm_start,
403 virt_to_page(entry->address));
411 "Couldn't mmap address[%#llx] length[%#zx] mmap_flag[%d] err[%d]\n",
412 entry->io_address, length, entry->mmap_flag, rc);
414 rdma_user_mmap_entry_put(rdma_entry);
418 int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
420 struct ib_device *ibdev = ibpd->device;
421 struct qedr_dev *dev = get_qedr_dev(ibdev);
422 struct qedr_pd *pd = get_qedr_pd(ibpd);
426 DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
427 udata ? "User Lib" : "Kernel");
429 if (!dev->rdma_ctx) {
430 DP_ERR(dev, "invalid RDMA context\n");
434 rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
441 struct qedr_alloc_pd_uresp uresp = {
444 struct qedr_ucontext *context = rdma_udata_to_drv_context(
445 udata, struct qedr_ucontext, ibucontext);
447 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
449 DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
450 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
461 void qedr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
463 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
464 struct qedr_pd *pd = get_qedr_pd(ibpd);
466 DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
467 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
470 static void qedr_free_pbl(struct qedr_dev *dev,
471 struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
473 struct pci_dev *pdev = dev->pdev;
476 for (i = 0; i < pbl_info->num_pbls; i++) {
479 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
480 pbl[i].va, pbl[i].pa);
486 #define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
487 #define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
489 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
490 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
491 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
493 static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
494 struct qedr_pbl_info *pbl_info,
497 struct pci_dev *pdev = dev->pdev;
498 struct qedr_pbl *pbl_table;
499 dma_addr_t *pbl_main_tbl;
504 pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
506 return ERR_PTR(-ENOMEM);
508 for (i = 0; i < pbl_info->num_pbls; i++) {
509 va = dma_alloc_coherent(&pdev->dev, pbl_info->pbl_size, &pa,
514 pbl_table[i].va = va;
515 pbl_table[i].pa = pa;
518 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
519 * the first one with physical pointers to all of the rest
521 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
522 for (i = 0; i < pbl_info->num_pbls - 1; i++)
523 pbl_main_tbl[i] = pbl_table[i + 1].pa;
528 for (i--; i >= 0; i--)
529 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
530 pbl_table[i].va, pbl_table[i].pa);
532 qedr_free_pbl(dev, pbl_info, pbl_table);
534 return ERR_PTR(-ENOMEM);
537 static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
538 struct qedr_pbl_info *pbl_info,
539 u32 num_pbes, int two_layer_capable)
545 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
546 if (num_pbes > MAX_PBES_TWO_LAYER) {
547 DP_ERR(dev, "prepare pbl table: too many pages %d\n",
552 /* calculate required pbl page size */
553 pbl_size = MIN_FW_PBL_PAGE_SIZE;
554 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
555 NUM_PBES_ON_PAGE(pbl_size);
557 while (pbl_capacity < num_pbes) {
559 pbl_capacity = pbl_size / sizeof(u64);
560 pbl_capacity = pbl_capacity * pbl_capacity;
563 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
564 num_pbls++; /* One for the layer0 ( points to the pbls) */
565 pbl_info->two_layered = true;
567 /* One layered PBL */
569 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
570 roundup_pow_of_two((num_pbes * sizeof(u64))));
571 pbl_info->two_layered = false;
574 pbl_info->num_pbls = num_pbls;
575 pbl_info->pbl_size = pbl_size;
576 pbl_info->num_pbes = num_pbes;
578 DP_DEBUG(dev, QEDR_MSG_MR,
579 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
580 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
585 static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
586 struct qedr_pbl *pbl,
587 struct qedr_pbl_info *pbl_info, u32 pg_shift)
589 int pbe_cnt, total_num_pbes = 0;
590 u32 fw_pg_cnt, fw_pg_per_umem_pg;
591 struct qedr_pbl *pbl_tbl;
592 struct sg_dma_page_iter sg_iter;
596 if (!pbl_info->num_pbes)
599 /* If we have a two layered pbl, the first pbl points to the rest
600 * of the pbls and the first entry lays on the second pbl in the table
602 if (pbl_info->two_layered)
607 pbe = (struct regpair *)pbl_tbl->va;
609 DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
615 fw_pg_per_umem_pg = BIT(PAGE_SHIFT - pg_shift);
617 for_each_sg_dma_page (umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
618 pg_addr = sg_page_iter_dma_address(&sg_iter);
619 for (fw_pg_cnt = 0; fw_pg_cnt < fw_pg_per_umem_pg;) {
620 pbe->lo = cpu_to_le32(pg_addr);
621 pbe->hi = cpu_to_le32(upper_32_bits(pg_addr));
623 pg_addr += BIT(pg_shift);
628 if (total_num_pbes == pbl_info->num_pbes)
631 /* If the given pbl is full storing the pbes,
634 if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
636 pbe = (struct regpair *)pbl_tbl->va;
645 static int qedr_db_recovery_add(struct qedr_dev *dev,
646 void __iomem *db_addr,
648 enum qed_db_rec_width db_width,
649 enum qed_db_rec_space db_space)
652 DP_DEBUG(dev, QEDR_MSG_INIT, "avoiding db rec since old lib\n");
656 return dev->ops->common->db_recovery_add(dev->cdev, db_addr, db_data,
660 static void qedr_db_recovery_del(struct qedr_dev *dev,
661 void __iomem *db_addr,
665 DP_DEBUG(dev, QEDR_MSG_INIT, "avoiding db rec since old lib\n");
669 /* Ignore return code as there is not much we can do about it. Error
670 * log will be printed inside.
672 dev->ops->common->db_recovery_del(dev->cdev, db_addr, db_data);
675 static int qedr_copy_cq_uresp(struct qedr_dev *dev,
676 struct qedr_cq *cq, struct ib_udata *udata,
679 struct qedr_create_cq_uresp uresp;
682 memset(&uresp, 0, sizeof(uresp));
684 uresp.db_offset = db_offset;
685 uresp.icid = cq->icid;
686 if (cq->q.db_mmap_entry)
688 rdma_user_mmap_get_offset(cq->q.db_mmap_entry);
690 rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
692 DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
697 static void consume_cqe(struct qedr_cq *cq)
699 if (cq->latest_cqe == cq->toggle_cqe)
700 cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
702 cq->latest_cqe = qed_chain_consume(&cq->pbl);
705 static inline int qedr_align_cq_entries(int entries)
707 u64 size, aligned_size;
709 /* We allocate an extra entry that we don't report to the FW. */
710 size = (entries + 1) * QEDR_CQE_SIZE;
711 aligned_size = ALIGN(size, PAGE_SIZE);
713 return aligned_size / QEDR_CQE_SIZE;
716 static int qedr_init_user_db_rec(struct ib_udata *udata,
717 struct qedr_dev *dev, struct qedr_userq *q,
718 bool requires_db_rec)
720 struct qedr_ucontext *uctx =
721 rdma_udata_to_drv_context(udata, struct qedr_ucontext,
723 struct qedr_user_mmap_entry *entry;
726 /* Aborting for non doorbell userqueue (SRQ) or non-supporting lib */
727 if (requires_db_rec == 0 || !uctx->db_rec)
730 /* Allocate a page for doorbell recovery, add to mmap */
731 q->db_rec_data = (void *)get_zeroed_page(GFP_USER);
732 if (!q->db_rec_data) {
733 DP_ERR(dev, "get_zeroed_page failed\n");
737 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
739 goto err_free_db_data;
741 entry->address = q->db_rec_data;
742 entry->length = PAGE_SIZE;
743 entry->mmap_flag = QEDR_USER_MMAP_PHYS_PAGE;
744 rc = rdma_user_mmap_entry_insert(&uctx->ibucontext,
750 q->db_mmap_entry = &entry->rdma_entry;
758 free_page((unsigned long)q->db_rec_data);
759 q->db_rec_data = NULL;
763 static inline int qedr_init_user_queue(struct ib_udata *udata,
764 struct qedr_dev *dev,
765 struct qedr_userq *q, u64 buf_addr,
766 size_t buf_len, bool requires_db_rec,
773 q->buf_addr = buf_addr;
774 q->buf_len = buf_len;
775 q->umem = ib_umem_get(&dev->ibdev, q->buf_addr, q->buf_len, access);
776 if (IS_ERR(q->umem)) {
777 DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
779 return PTR_ERR(q->umem);
782 fw_pages = ib_umem_page_count(q->umem) <<
783 (PAGE_SHIFT - FW_PAGE_SHIFT);
785 rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0);
789 if (alloc_and_init) {
790 q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
791 if (IS_ERR(q->pbl_tbl)) {
792 rc = PTR_ERR(q->pbl_tbl);
795 qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info,
798 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
805 /* mmap the user address used to store doorbell data for recovery */
806 return qedr_init_user_db_rec(udata, dev, q, requires_db_rec);
809 ib_umem_release(q->umem);
815 static inline void qedr_init_cq_params(struct qedr_cq *cq,
816 struct qedr_ucontext *ctx,
817 struct qedr_dev *dev, int vector,
818 int chain_entries, int page_cnt,
820 struct qed_rdma_create_cq_in_params
823 memset(params, 0, sizeof(*params));
824 params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
825 params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
826 params->cnq_id = vector;
827 params->cq_size = chain_entries - 1;
828 params->dpi = (ctx) ? ctx->dpi : dev->dpi;
829 params->pbl_num_pages = page_cnt;
830 params->pbl_ptr = pbl_ptr;
831 params->pbl_two_level = 0;
834 static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
836 cq->db.data.agg_flags = flags;
837 cq->db.data.value = cpu_to_le32(cons);
838 writeq(cq->db.raw, cq->db_addr);
841 int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
843 struct qedr_cq *cq = get_qedr_cq(ibcq);
844 unsigned long sflags;
845 struct qedr_dev *dev;
847 dev = get_qedr_dev(ibcq->device);
851 "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
857 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
860 spin_lock_irqsave(&cq->cq_lock, sflags);
864 if (flags & IB_CQ_SOLICITED)
865 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
867 if (flags & IB_CQ_NEXT_COMP)
868 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
870 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
872 spin_unlock_irqrestore(&cq->cq_lock, sflags);
877 int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
878 struct ib_udata *udata)
880 struct ib_device *ibdev = ibcq->device;
881 struct qedr_ucontext *ctx = rdma_udata_to_drv_context(
882 udata, struct qedr_ucontext, ibucontext);
883 struct qed_rdma_destroy_cq_out_params destroy_oparams;
884 struct qed_rdma_destroy_cq_in_params destroy_iparams;
885 struct qedr_dev *dev = get_qedr_dev(ibdev);
886 struct qed_rdma_create_cq_in_params params;
887 struct qedr_create_cq_ureq ureq = {};
888 int vector = attr->comp_vector;
889 int entries = attr->cqe;
890 struct qedr_cq *cq = get_qedr_cq(ibcq);
898 DP_DEBUG(dev, QEDR_MSG_INIT,
899 "create_cq: called from %s. entries=%d, vector=%d\n",
900 udata ? "User Lib" : "Kernel", entries, vector);
902 if (entries > QEDR_MAX_CQES) {
904 "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
905 entries, QEDR_MAX_CQES);
909 chain_entries = qedr_align_cq_entries(entries);
910 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
912 /* calc db offset. user will add DPI base, kernel will add db addr */
913 db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
916 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
919 "create cq: problem copying data from user space\n");
925 "create cq: cannot create a cq with 0 entries\n");
929 cq->cq_type = QEDR_CQ_TYPE_USER;
931 rc = qedr_init_user_queue(udata, dev, &cq->q, ureq.addr,
932 ureq.len, true, IB_ACCESS_LOCAL_WRITE,
937 pbl_ptr = cq->q.pbl_tbl->pa;
938 page_cnt = cq->q.pbl_info.num_pbes;
940 cq->ibcq.cqe = chain_entries;
941 cq->q.db_addr = ctx->dpi_addr + db_offset;
943 cq->cq_type = QEDR_CQ_TYPE_KERNEL;
945 rc = dev->ops->common->chain_alloc(dev->cdev,
946 QED_CHAIN_USE_TO_CONSUME,
948 QED_CHAIN_CNT_TYPE_U32,
950 sizeof(union rdma_cqe),
955 page_cnt = qed_chain_get_page_cnt(&cq->pbl);
956 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
957 cq->ibcq.cqe = cq->pbl.capacity;
960 qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
963 rc = dev->ops->rdma_create_cq(dev->rdma_ctx, ¶ms, &icid);
968 cq->sig = QEDR_CQ_MAGIC_NUMBER;
969 spin_lock_init(&cq->cq_lock);
972 rc = qedr_copy_cq_uresp(dev, cq, udata, db_offset);
976 rc = qedr_db_recovery_add(dev, cq->q.db_addr,
977 &cq->q.db_rec_data->db_data,
984 /* Generate doorbell address. */
985 cq->db.data.icid = cq->icid;
986 cq->db_addr = dev->db_addr + db_offset;
987 cq->db.data.params = DB_AGG_CMD_SET <<
988 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
990 /* point to the very last element, passing it we will toggle */
991 cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
992 cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
993 cq->latest_cqe = NULL;
995 cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
997 rc = qedr_db_recovery_add(dev, cq->db_addr, &cq->db.data,
998 DB_REC_WIDTH_64B, DB_REC_KERNEL);
1003 DP_DEBUG(dev, QEDR_MSG_CQ,
1004 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
1005 cq->icid, cq, params.cq_size);
1010 destroy_iparams.icid = cq->icid;
1011 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
1015 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
1016 ib_umem_release(cq->q.umem);
1017 if (cq->q.db_mmap_entry)
1018 rdma_user_mmap_entry_remove(cq->q.db_mmap_entry);
1020 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
1026 int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
1028 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
1029 struct qedr_cq *cq = get_qedr_cq(ibcq);
1031 DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
1036 #define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
1037 #define QEDR_DESTROY_CQ_ITER_DURATION (10)
1039 void qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
1041 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
1042 struct qed_rdma_destroy_cq_out_params oparams;
1043 struct qed_rdma_destroy_cq_in_params iparams;
1044 struct qedr_cq *cq = get_qedr_cq(ibcq);
1047 DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
1051 /* GSIs CQs are handled by driver, so they don't exist in the FW */
1052 if (cq->cq_type == QEDR_CQ_TYPE_GSI) {
1053 qedr_db_recovery_del(dev, cq->db_addr, &cq->db.data);
1057 iparams.icid = cq->icid;
1058 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
1059 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
1062 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
1063 ib_umem_release(cq->q.umem);
1065 if (cq->q.db_rec_data) {
1066 qedr_db_recovery_del(dev, cq->q.db_addr,
1067 &cq->q.db_rec_data->db_data);
1068 rdma_user_mmap_entry_remove(cq->q.db_mmap_entry);
1071 qedr_db_recovery_del(dev, cq->db_addr, &cq->db.data);
1074 /* We don't want the IRQ handler to handle a non-existing CQ so we
1075 * wait until all CNQ interrupts, if any, are received. This will always
1076 * happen and will always happen very fast. If not, then a serious error
1077 * has occured. That is why we can use a long delay.
1078 * We spin for a short time so we don’t lose time on context switching
1079 * in case all the completions are handled in that span. Otherwise
1080 * we sleep for a while and check again. Since the CNQ may be
1081 * associated with (only) the current CPU we use msleep to allow the
1082 * current CPU to be freed.
1083 * The CNQ notification is increased in qedr_irq_handler().
1085 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1086 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1087 udelay(QEDR_DESTROY_CQ_ITER_DURATION);
1091 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1092 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1093 msleep(QEDR_DESTROY_CQ_ITER_DURATION);
1097 /* Note that we don't need to have explicit code to wait for the
1098 * completion of the event handler because it is invoked from the EQ.
1099 * Since the destroy CQ ramrod has also been received on the EQ we can
1100 * be certain that there's no event handler in process.
1104 static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1105 struct ib_qp_attr *attr,
1107 struct qed_rdma_modify_qp_in_params
1110 const struct ib_gid_attr *gid_attr;
1111 enum rdma_network_type nw_type;
1112 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
1117 gid_attr = grh->sgid_attr;
1118 ret = rdma_read_gid_l2_fields(gid_attr, &qp_params->vlan_id, NULL);
1122 nw_type = rdma_gid_attr_network_type(gid_attr);
1124 case RDMA_NETWORK_IPV6:
1125 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1126 sizeof(qp_params->sgid));
1127 memcpy(&qp_params->dgid.bytes[0],
1129 sizeof(qp_params->dgid));
1130 qp_params->roce_mode = ROCE_V2_IPV6;
1131 SET_FIELD(qp_params->modify_flags,
1132 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1134 case RDMA_NETWORK_IB:
1135 memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1136 sizeof(qp_params->sgid));
1137 memcpy(&qp_params->dgid.bytes[0],
1139 sizeof(qp_params->dgid));
1140 qp_params->roce_mode = ROCE_V1;
1142 case RDMA_NETWORK_IPV4:
1143 memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1144 memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
1145 ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw);
1146 qp_params->sgid.ipv4_addr = ipv4_addr;
1148 qedr_get_ipv4_from_gid(grh->dgid.raw);
1149 qp_params->dgid.ipv4_addr = ipv4_addr;
1150 SET_FIELD(qp_params->modify_flags,
1151 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1152 qp_params->roce_mode = ROCE_V2_IPV4;
1156 for (i = 0; i < 4; i++) {
1157 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1158 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1161 if (qp_params->vlan_id >= VLAN_CFI_MASK)
1162 qp_params->vlan_id = 0;
1167 static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
1168 struct ib_qp_init_attr *attrs,
1169 struct ib_udata *udata)
1171 struct qedr_device_attr *qattr = &dev->attr;
1173 /* QP0... attrs->qp_type == IB_QPT_GSI */
1174 if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
1175 DP_DEBUG(dev, QEDR_MSG_QP,
1176 "create qp: unsupported qp type=0x%x requested\n",
1181 if (attrs->cap.max_send_wr > qattr->max_sqe) {
1183 "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1184 attrs->cap.max_send_wr, qattr->max_sqe);
1188 if (attrs->cap.max_inline_data > qattr->max_inline) {
1190 "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1191 attrs->cap.max_inline_data, qattr->max_inline);
1195 if (attrs->cap.max_send_sge > qattr->max_sge) {
1197 "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1198 attrs->cap.max_send_sge, qattr->max_sge);
1202 if (attrs->cap.max_recv_sge > qattr->max_sge) {
1204 "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1205 attrs->cap.max_recv_sge, qattr->max_sge);
1209 /* Unprivileged user space cannot create special QP */
1210 if (udata && attrs->qp_type == IB_QPT_GSI) {
1212 "create qp: userspace can't create special QPs of type=0x%x\n",
1220 static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1221 struct qedr_srq *srq, struct ib_udata *udata)
1223 struct qedr_create_srq_uresp uresp = {};
1226 uresp.srq_id = srq->srq_id;
1228 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1230 DP_ERR(dev, "create srq: problem copying data to user space\n");
1235 static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1236 struct qedr_create_qp_uresp *uresp,
1239 /* iWARP requires two doorbells per RQ. */
1240 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1241 uresp->rq_db_offset =
1242 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1243 uresp->rq_db2_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1245 uresp->rq_db_offset =
1246 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1249 uresp->rq_icid = qp->icid;
1250 if (qp->urq.db_mmap_entry)
1251 uresp->rq_db_rec_addr =
1252 rdma_user_mmap_get_offset(qp->urq.db_mmap_entry);
1255 static void qedr_copy_sq_uresp(struct qedr_dev *dev,
1256 struct qedr_create_qp_uresp *uresp,
1259 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1261 /* iWARP uses the same cid for rq and sq */
1262 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1263 uresp->sq_icid = qp->icid;
1265 uresp->sq_icid = qp->icid + 1;
1267 if (qp->usq.db_mmap_entry)
1268 uresp->sq_db_rec_addr =
1269 rdma_user_mmap_get_offset(qp->usq.db_mmap_entry);
1272 static int qedr_copy_qp_uresp(struct qedr_dev *dev,
1273 struct qedr_qp *qp, struct ib_udata *udata,
1274 struct qedr_create_qp_uresp *uresp)
1278 memset(uresp, 0, sizeof(*uresp));
1279 qedr_copy_sq_uresp(dev, uresp, qp);
1280 qedr_copy_rq_uresp(dev, uresp, qp);
1282 uresp->atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1283 uresp->qp_id = qp->qp_id;
1285 rc = qedr_ib_copy_to_udata(udata, uresp, sizeof(*uresp));
1288 "create qp: failed a copy to user space with qp icid=0x%x.\n",
1294 static void qedr_set_common_qp_params(struct qedr_dev *dev,
1297 struct ib_qp_init_attr *attrs)
1299 spin_lock_init(&qp->q_lock);
1300 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1301 kref_init(&qp->refcnt);
1302 init_completion(&qp->iwarp_cm_comp);
1305 qp->qp_type = attrs->qp_type;
1306 qp->max_inline_data = attrs->cap.max_inline_data;
1307 qp->sq.max_sges = attrs->cap.max_send_sge;
1308 qp->state = QED_ROCE_QP_STATE_RESET;
1309 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
1310 qp->sq_cq = get_qedr_cq(attrs->send_cq);
1314 qp->srq = get_qedr_srq(attrs->srq);
1316 qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1317 qp->rq.max_sges = attrs->cap.max_recv_sge;
1318 DP_DEBUG(dev, QEDR_MSG_QP,
1319 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1320 qp->rq.max_sges, qp->rq_cq->icid);
1323 DP_DEBUG(dev, QEDR_MSG_QP,
1324 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1325 pd->pd_id, qp->qp_type, qp->max_inline_data,
1326 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1327 DP_DEBUG(dev, QEDR_MSG_QP,
1328 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1329 qp->sq.max_sges, qp->sq_cq->icid);
1332 static int qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1336 qp->sq.db = dev->db_addr +
1337 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1338 qp->sq.db_data.data.icid = qp->icid + 1;
1339 rc = qedr_db_recovery_add(dev, qp->sq.db,
1347 qp->rq.db = dev->db_addr +
1348 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1349 qp->rq.db_data.data.icid = qp->icid;
1351 rc = qedr_db_recovery_add(dev, qp->rq.db,
1356 qedr_db_recovery_del(dev, qp->sq.db,
1363 static int qedr_check_srq_params(struct qedr_dev *dev,
1364 struct ib_srq_init_attr *attrs,
1365 struct ib_udata *udata)
1367 struct qedr_device_attr *qattr = &dev->attr;
1369 if (attrs->attr.max_wr > qattr->max_srq_wr) {
1371 "create srq: unsupported srq_wr=0x%x requested (max_srq_wr=0x%x)\n",
1372 attrs->attr.max_wr, qattr->max_srq_wr);
1376 if (attrs->attr.max_sge > qattr->max_sge) {
1378 "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1379 attrs->attr.max_sge, qattr->max_sge);
1386 static void qedr_free_srq_user_params(struct qedr_srq *srq)
1388 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1389 ib_umem_release(srq->usrq.umem);
1390 ib_umem_release(srq->prod_umem);
1393 static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1395 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1396 struct qedr_dev *dev = srq->dev;
1398 dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1400 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1401 hw_srq->virt_prod_pair_addr,
1402 hw_srq->phy_prod_pair_addr);
1405 static int qedr_init_srq_user_params(struct ib_udata *udata,
1406 struct qedr_srq *srq,
1407 struct qedr_create_srq_ureq *ureq,
1410 struct scatterlist *sg;
1413 rc = qedr_init_user_queue(udata, srq->dev, &srq->usrq, ureq->srq_addr,
1414 ureq->srq_len, false, access, 1);
1418 srq->prod_umem = ib_umem_get(srq->ibsrq.device, ureq->prod_pair_addr,
1419 sizeof(struct rdma_srq_producers), access);
1420 if (IS_ERR(srq->prod_umem)) {
1421 qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1422 ib_umem_release(srq->usrq.umem);
1424 "create srq: failed ib_umem_get for producer, got %ld\n",
1425 PTR_ERR(srq->prod_umem));
1426 return PTR_ERR(srq->prod_umem);
1429 sg = srq->prod_umem->sg_head.sgl;
1430 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1435 static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1436 struct qedr_dev *dev,
1437 struct ib_srq_init_attr *init_attr)
1439 struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1440 dma_addr_t phy_prod_pair_addr;
1445 va = dma_alloc_coherent(&dev->pdev->dev,
1446 sizeof(struct rdma_srq_producers),
1447 &phy_prod_pair_addr, GFP_KERNEL);
1450 "create srq: failed to allocate dma memory for producer\n");
1454 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
1455 hw_srq->virt_prod_pair_addr = va;
1457 num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
1458 rc = dev->ops->common->chain_alloc(dev->cdev,
1459 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1461 QED_CHAIN_CNT_TYPE_U32,
1463 QEDR_SRQ_WQE_ELEM_SIZE,
1464 &hw_srq->pbl, NULL);
1468 hw_srq->num_elems = num_elems;
1473 dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1474 va, phy_prod_pair_addr);
1478 int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
1479 struct ib_udata *udata)
1481 struct qed_rdma_destroy_srq_in_params destroy_in_params;
1482 struct qed_rdma_create_srq_in_params in_params = {};
1483 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1484 struct qed_rdma_create_srq_out_params out_params;
1485 struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
1486 struct qedr_create_srq_ureq ureq = {};
1487 u64 pbl_base_addr, phy_prod_pair_addr;
1488 struct qedr_srq_hwq_info *hw_srq;
1489 u32 page_cnt, page_size;
1490 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1493 DP_DEBUG(dev, QEDR_MSG_QP,
1494 "create SRQ called from %s (pd %p)\n",
1495 (udata) ? "User lib" : "kernel", pd);
1497 rc = qedr_check_srq_params(dev, init_attr, udata);
1502 hw_srq = &srq->hw_srq;
1503 spin_lock_init(&srq->lock);
1505 hw_srq->max_wr = init_attr->attr.max_wr;
1506 hw_srq->max_sges = init_attr->attr.max_sge;
1509 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
1512 "create srq: problem copying data from user space\n");
1516 rc = qedr_init_srq_user_params(udata, srq, &ureq, 0);
1520 page_cnt = srq->usrq.pbl_info.num_pbes;
1521 pbl_base_addr = srq->usrq.pbl_tbl->pa;
1522 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1523 page_size = PAGE_SIZE;
1525 struct qed_chain *pbl;
1527 rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1532 page_cnt = qed_chain_get_page_cnt(pbl);
1533 pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1534 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1535 page_size = QED_CHAIN_PAGE_SIZE;
1538 in_params.pd_id = pd->pd_id;
1539 in_params.pbl_base_addr = pbl_base_addr;
1540 in_params.prod_pair_addr = phy_prod_pair_addr;
1541 in_params.num_pages = page_cnt;
1542 in_params.page_size = page_size;
1544 rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1548 srq->srq_id = out_params.srq_id;
1551 rc = qedr_copy_srq_uresp(dev, srq, udata);
1556 rc = xa_insert_irq(&dev->srqs, srq->srq_id, srq, GFP_KERNEL);
1560 DP_DEBUG(dev, QEDR_MSG_SRQ,
1561 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1565 destroy_in_params.srq_id = srq->srq_id;
1567 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1570 qedr_free_srq_user_params(srq);
1572 qedr_free_srq_kernel_params(srq);
1577 void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
1579 struct qed_rdma_destroy_srq_in_params in_params = {};
1580 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1581 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1583 xa_erase_irq(&dev->srqs, srq->srq_id);
1584 in_params.srq_id = srq->srq_id;
1585 dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1588 qedr_free_srq_user_params(srq);
1590 qedr_free_srq_kernel_params(srq);
1592 DP_DEBUG(dev, QEDR_MSG_SRQ,
1593 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1597 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
1598 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
1600 struct qed_rdma_modify_srq_in_params in_params = {};
1601 struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1602 struct qedr_srq *srq = get_qedr_srq(ibsrq);
1605 if (attr_mask & IB_SRQ_MAX_WR) {
1607 "modify srq: invalid attribute mask=0x%x specified for %p\n",
1612 if (attr_mask & IB_SRQ_LIMIT) {
1613 if (attr->srq_limit >= srq->hw_srq.max_wr) {
1615 "modify srq: invalid srq_limit=0x%x (max_srq_limit=0x%x)\n",
1616 attr->srq_limit, srq->hw_srq.max_wr);
1620 in_params.srq_id = srq->srq_id;
1621 in_params.wqe_limit = attr->srq_limit;
1622 rc = dev->ops->rdma_modify_srq(dev->rdma_ctx, &in_params);
1627 srq->srq_limit = attr->srq_limit;
1629 DP_DEBUG(dev, QEDR_MSG_SRQ,
1630 "modify srq: modified srq with srq_id=0x%0x\n", srq->srq_id);
1636 qedr_init_common_qp_in_params(struct qedr_dev *dev,
1639 struct ib_qp_init_attr *attrs,
1640 bool fmr_and_reserved_lkey,
1641 struct qed_rdma_create_qp_in_params *params)
1643 /* QP handle to be written in an async event */
1644 params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1645 params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
1647 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1648 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
1649 params->pd = pd->pd_id;
1650 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1651 params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1652 params->stats_queue = 0;
1654 params->use_srq = false;
1657 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1660 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1661 params->srq_id = qp->srq->srq_id;
1662 params->use_srq = true;
1666 static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
1668 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1677 qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
1681 qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
1683 struct qed_rdma_create_qp_out_params *out_params)
1685 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1686 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1688 qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1689 &qp->usq.pbl_info, FW_PAGE_SHIFT);
1691 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1692 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1695 qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1696 &qp->urq.pbl_info, FW_PAGE_SHIFT);
1699 static void qedr_cleanup_user(struct qedr_dev *dev,
1700 struct qedr_ucontext *ctx,
1703 ib_umem_release(qp->usq.umem);
1704 qp->usq.umem = NULL;
1706 ib_umem_release(qp->urq.umem);
1707 qp->urq.umem = NULL;
1709 if (rdma_protocol_roce(&dev->ibdev, 1)) {
1710 qedr_free_pbl(dev, &qp->usq.pbl_info, qp->usq.pbl_tbl);
1711 qedr_free_pbl(dev, &qp->urq.pbl_info, qp->urq.pbl_tbl);
1713 kfree(qp->usq.pbl_tbl);
1714 kfree(qp->urq.pbl_tbl);
1717 if (qp->usq.db_rec_data) {
1718 qedr_db_recovery_del(dev, qp->usq.db_addr,
1719 &qp->usq.db_rec_data->db_data);
1720 rdma_user_mmap_entry_remove(qp->usq.db_mmap_entry);
1723 if (qp->urq.db_rec_data) {
1724 qedr_db_recovery_del(dev, qp->urq.db_addr,
1725 &qp->urq.db_rec_data->db_data);
1726 rdma_user_mmap_entry_remove(qp->urq.db_mmap_entry);
1729 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1730 qedr_db_recovery_del(dev, qp->urq.db_rec_db2_addr,
1731 &qp->urq.db_rec_db2_data);
1734 static int qedr_create_user_qp(struct qedr_dev *dev,
1737 struct ib_udata *udata,
1738 struct ib_qp_init_attr *attrs)
1740 struct qed_rdma_create_qp_in_params in_params;
1741 struct qed_rdma_create_qp_out_params out_params;
1742 struct qedr_pd *pd = get_qedr_pd(ibpd);
1743 struct qedr_create_qp_uresp uresp;
1744 struct qedr_ucontext *ctx = NULL;
1745 struct qedr_create_qp_ureq ureq;
1746 int alloc_and_init = rdma_protocol_roce(&dev->ibdev, 1);
1749 qp->create_type = QEDR_QP_CREATE_USER;
1750 memset(&ureq, 0, sizeof(ureq));
1751 rc = ib_copy_from_udata(&ureq, udata, min(sizeof(ureq), udata->inlen));
1753 DP_ERR(dev, "Problem copying data from user space\n");
1757 /* SQ - read access only (0) */
1758 rc = qedr_init_user_queue(udata, dev, &qp->usq, ureq.sq_addr,
1759 ureq.sq_len, true, 0, alloc_and_init);
1764 /* RQ - read access only (0) */
1765 rc = qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr,
1766 ureq.rq_len, true, 0, alloc_and_init);
1771 memset(&in_params, 0, sizeof(in_params));
1772 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1773 in_params.qp_handle_lo = ureq.qp_handle_lo;
1774 in_params.qp_handle_hi = ureq.qp_handle_hi;
1775 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1776 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1778 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1779 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1782 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1783 &in_params, &out_params);
1790 if (rdma_protocol_iwarp(&dev->ibdev, 1))
1791 qedr_iwarp_populate_user_qp(dev, qp, &out_params);
1793 qp->qp_id = out_params.qp_id;
1794 qp->icid = out_params.icid;
1796 rc = qedr_copy_qp_uresp(dev, qp, udata, &uresp);
1800 /* db offset was calculated in copy_qp_uresp, now set in the user q */
1802 qp->usq.db_addr = ctx->dpi_addr + uresp.sq_db_offset;
1803 qp->urq.db_addr = ctx->dpi_addr + uresp.rq_db_offset;
1805 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1806 qp->urq.db_rec_db2_addr = ctx->dpi_addr + uresp.rq_db2_offset;
1808 /* calculate the db_rec_db2 data since it is constant so no
1809 * need to reflect from user
1811 qp->urq.db_rec_db2_data.data.icid = cpu_to_le16(qp->icid);
1812 qp->urq.db_rec_db2_data.data.value =
1813 cpu_to_le16(DQ_TCM_IWARP_POST_RQ_CF_CMD);
1816 rc = qedr_db_recovery_add(dev, qp->usq.db_addr,
1817 &qp->usq.db_rec_data->db_data,
1823 rc = qedr_db_recovery_add(dev, qp->urq.db_addr,
1824 &qp->urq.db_rec_data->db_data,
1830 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1831 rc = qedr_db_recovery_add(dev, qp->urq.db_rec_db2_addr,
1832 &qp->urq.db_rec_db2_data,
1838 qedr_qp_user_print(dev, qp);
1842 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1844 DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1847 qedr_cleanup_user(dev, ctx, qp);
1851 static int qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1855 qp->sq.db = dev->db_addr +
1856 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1857 qp->sq.db_data.data.icid = qp->icid;
1859 rc = qedr_db_recovery_add(dev, qp->sq.db,
1866 qp->rq.db = dev->db_addr +
1867 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1868 qp->rq.db_data.data.icid = qp->icid;
1869 qp->rq.iwarp_db2 = dev->db_addr +
1870 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1871 qp->rq.iwarp_db2_data.data.icid = qp->icid;
1872 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
1874 rc = qedr_db_recovery_add(dev, qp->rq.db,
1881 rc = qedr_db_recovery_add(dev, qp->rq.iwarp_db2,
1882 &qp->rq.iwarp_db2_data,
1889 qedr_roce_create_kernel_qp(struct qedr_dev *dev,
1891 struct qed_rdma_create_qp_in_params *in_params,
1892 u32 n_sq_elems, u32 n_rq_elems)
1894 struct qed_rdma_create_qp_out_params out_params;
1897 rc = dev->ops->common->chain_alloc(dev->cdev,
1898 QED_CHAIN_USE_TO_PRODUCE,
1900 QED_CHAIN_CNT_TYPE_U32,
1902 QEDR_SQE_ELEMENT_SIZE,
1908 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
1909 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
1911 rc = dev->ops->common->chain_alloc(dev->cdev,
1912 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1914 QED_CHAIN_CNT_TYPE_U32,
1916 QEDR_RQE_ELEMENT_SIZE,
1921 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
1922 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
1924 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1925 in_params, &out_params);
1930 qp->qp_id = out_params.qp_id;
1931 qp->icid = out_params.icid;
1933 return qedr_set_roce_db_info(dev, qp);
1937 qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
1939 struct qed_rdma_create_qp_in_params *in_params,
1940 u32 n_sq_elems, u32 n_rq_elems)
1942 struct qed_rdma_create_qp_out_params out_params;
1943 struct qed_chain_ext_pbl ext_pbl;
1946 in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
1947 QEDR_SQE_ELEMENT_SIZE,
1948 QED_CHAIN_MODE_PBL);
1949 in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
1950 QEDR_RQE_ELEMENT_SIZE,
1951 QED_CHAIN_MODE_PBL);
1953 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1954 in_params, &out_params);
1959 /* Now we allocate the chain */
1960 ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
1961 ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
1963 rc = dev->ops->common->chain_alloc(dev->cdev,
1964 QED_CHAIN_USE_TO_PRODUCE,
1966 QED_CHAIN_CNT_TYPE_U32,
1968 QEDR_SQE_ELEMENT_SIZE,
1969 &qp->sq.pbl, &ext_pbl);
1974 ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
1975 ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
1977 rc = dev->ops->common->chain_alloc(dev->cdev,
1978 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1980 QED_CHAIN_CNT_TYPE_U32,
1982 QEDR_RQE_ELEMENT_SIZE,
1983 &qp->rq.pbl, &ext_pbl);
1988 qp->qp_id = out_params.qp_id;
1989 qp->icid = out_params.icid;
1991 return qedr_set_iwarp_db_info(dev, qp);
1994 dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1999 static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
2001 dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
2002 kfree(qp->wqe_wr_id);
2004 dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
2005 kfree(qp->rqe_wr_id);
2007 /* GSI qp is not registered to db mechanism so no need to delete */
2008 if (qp->qp_type == IB_QPT_GSI)
2011 qedr_db_recovery_del(dev, qp->sq.db, &qp->sq.db_data);
2014 qedr_db_recovery_del(dev, qp->rq.db, &qp->rq.db_data);
2016 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2017 qedr_db_recovery_del(dev, qp->rq.iwarp_db2,
2018 &qp->rq.iwarp_db2_data);
2022 static int qedr_create_kernel_qp(struct qedr_dev *dev,
2025 struct ib_qp_init_attr *attrs)
2027 struct qed_rdma_create_qp_in_params in_params;
2028 struct qedr_pd *pd = get_qedr_pd(ibpd);
2034 memset(&in_params, 0, sizeof(in_params));
2035 qp->create_type = QEDR_QP_CREATE_KERNEL;
2037 /* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
2038 * the ring. The ring should allow at least a single WR, even if the
2039 * user requested none, due to allocation issues.
2040 * We should add an extra WR since the prod and cons indices of
2041 * wqe_wr_id are managed in such a way that the WQ is considered full
2042 * when (prod+1)%max_wr==cons. We currently don't do that because we
2043 * double the number of entries due an iSER issue that pushes far more
2044 * WRs than indicated. If we decline its ib_post_send() then we get
2045 * error prints in the dmesg we'd like to avoid.
2047 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
2050 qp->wqe_wr_id = kcalloc(qp->sq.max_wr, sizeof(*qp->wqe_wr_id),
2052 if (!qp->wqe_wr_id) {
2053 DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
2057 /* QP handle to be written in CQE */
2058 in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
2059 in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
2061 /* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
2062 * the ring. There ring should allow at least a single WR, even if the
2063 * user requested none, due to allocation issues.
2065 qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
2067 /* Allocate driver internal RQ array */
2068 qp->rqe_wr_id = kcalloc(qp->rq.max_wr, sizeof(*qp->rqe_wr_id),
2070 if (!qp->rqe_wr_id) {
2072 "create qp: failed RQ shadow memory allocation\n");
2073 kfree(qp->wqe_wr_id);
2077 qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
2079 n_sq_entries = attrs->cap.max_send_wr;
2080 n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
2081 n_sq_entries = max_t(u32, n_sq_entries, 1);
2082 n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
2084 n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
2086 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2087 rc = qedr_iwarp_create_kernel_qp(dev, qp, &in_params,
2088 n_sq_elems, n_rq_elems);
2090 rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
2091 n_sq_elems, n_rq_elems);
2093 qedr_cleanup_kernel(dev, qp);
2098 struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
2099 struct ib_qp_init_attr *attrs,
2100 struct ib_udata *udata)
2102 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2103 struct qedr_pd *pd = get_qedr_pd(ibpd);
2108 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
2109 udata ? "user library" : "kernel", pd);
2111 rc = qedr_check_qp_attrs(ibpd, dev, attrs, udata);
2115 DP_DEBUG(dev, QEDR_MSG_QP,
2116 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
2117 udata ? "user library" : "kernel", attrs->event_handler, pd,
2118 get_qedr_cq(attrs->send_cq),
2119 get_qedr_cq(attrs->send_cq)->icid,
2120 get_qedr_cq(attrs->recv_cq),
2121 attrs->recv_cq ? get_qedr_cq(attrs->recv_cq)->icid : 0);
2123 qp = kzalloc(sizeof(*qp), GFP_KERNEL);
2125 DP_ERR(dev, "create qp: failed allocating memory\n");
2126 return ERR_PTR(-ENOMEM);
2129 qedr_set_common_qp_params(dev, qp, pd, attrs);
2131 if (attrs->qp_type == IB_QPT_GSI) {
2132 ibqp = qedr_create_gsi_qp(dev, attrs, qp);
2139 rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
2141 rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
2146 qp->ibqp.qp_num = qp->qp_id;
2148 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
2149 rc = xa_insert(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
2159 return ERR_PTR(-EFAULT);
2162 static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
2165 case QED_ROCE_QP_STATE_RESET:
2166 return IB_QPS_RESET;
2167 case QED_ROCE_QP_STATE_INIT:
2169 case QED_ROCE_QP_STATE_RTR:
2171 case QED_ROCE_QP_STATE_RTS:
2173 case QED_ROCE_QP_STATE_SQD:
2175 case QED_ROCE_QP_STATE_ERR:
2177 case QED_ROCE_QP_STATE_SQE:
2183 static enum qed_roce_qp_state qedr_get_state_from_ibqp(
2184 enum ib_qp_state qp_state)
2188 return QED_ROCE_QP_STATE_RESET;
2190 return QED_ROCE_QP_STATE_INIT;
2192 return QED_ROCE_QP_STATE_RTR;
2194 return QED_ROCE_QP_STATE_RTS;
2196 return QED_ROCE_QP_STATE_SQD;
2198 return QED_ROCE_QP_STATE_ERR;
2200 return QED_ROCE_QP_STATE_ERR;
2204 static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
2206 qed_chain_reset(&qph->pbl);
2210 qph->db_data.data.value = cpu_to_le16(0);
2213 static int qedr_update_qp_state(struct qedr_dev *dev,
2215 enum qed_roce_qp_state cur_state,
2216 enum qed_roce_qp_state new_state)
2220 if (new_state == cur_state)
2223 switch (cur_state) {
2224 case QED_ROCE_QP_STATE_RESET:
2225 switch (new_state) {
2226 case QED_ROCE_QP_STATE_INIT:
2227 qp->prev_wqe_size = 0;
2228 qedr_reset_qp_hwq_info(&qp->sq);
2229 qedr_reset_qp_hwq_info(&qp->rq);
2236 case QED_ROCE_QP_STATE_INIT:
2237 switch (new_state) {
2238 case QED_ROCE_QP_STATE_RTR:
2239 /* Update doorbell (in case post_recv was
2240 * done before move to RTR)
2243 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2244 writel(qp->rq.db_data.raw, qp->rq.db);
2247 case QED_ROCE_QP_STATE_ERR:
2250 /* Invalid state change. */
2255 case QED_ROCE_QP_STATE_RTR:
2257 switch (new_state) {
2258 case QED_ROCE_QP_STATE_RTS:
2260 case QED_ROCE_QP_STATE_ERR:
2263 /* Invalid state change. */
2268 case QED_ROCE_QP_STATE_RTS:
2270 switch (new_state) {
2271 case QED_ROCE_QP_STATE_SQD:
2273 case QED_ROCE_QP_STATE_ERR:
2276 /* Invalid state change. */
2281 case QED_ROCE_QP_STATE_SQD:
2283 switch (new_state) {
2284 case QED_ROCE_QP_STATE_RTS:
2285 case QED_ROCE_QP_STATE_ERR:
2288 /* Invalid state change. */
2293 case QED_ROCE_QP_STATE_ERR:
2295 switch (new_state) {
2296 case QED_ROCE_QP_STATE_RESET:
2297 if ((qp->rq.prod != qp->rq.cons) ||
2298 (qp->sq.prod != qp->sq.cons)) {
2300 "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
2301 qp->rq.prod, qp->rq.cons, qp->sq.prod,
2319 int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2320 int attr_mask, struct ib_udata *udata)
2322 struct qedr_qp *qp = get_qedr_qp(ibqp);
2323 struct qed_rdma_modify_qp_in_params qp_params = { 0 };
2324 struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
2325 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
2326 enum ib_qp_state old_qp_state, new_qp_state;
2327 enum qed_roce_qp_state cur_state;
2330 DP_DEBUG(dev, QEDR_MSG_QP,
2331 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
2334 old_qp_state = qedr_get_ibqp_state(qp->state);
2335 if (attr_mask & IB_QP_STATE)
2336 new_qp_state = attr->qp_state;
2338 new_qp_state = old_qp_state;
2340 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2341 if (!ib_modify_qp_is_ok(old_qp_state, new_qp_state,
2342 ibqp->qp_type, attr_mask)) {
2344 "modify qp: invalid attribute mask=0x%x specified for\n"
2345 "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
2346 attr_mask, qp->qp_id, ibqp->qp_type,
2347 old_qp_state, new_qp_state);
2353 /* Translate the masks... */
2354 if (attr_mask & IB_QP_STATE) {
2355 SET_FIELD(qp_params.modify_flags,
2356 QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
2357 qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
2360 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
2361 qp_params.sqd_async = true;
2363 if (attr_mask & IB_QP_PKEY_INDEX) {
2364 SET_FIELD(qp_params.modify_flags,
2365 QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
2366 if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
2371 qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
2374 if (attr_mask & IB_QP_QKEY)
2375 qp->qkey = attr->qkey;
2377 if (attr_mask & IB_QP_ACCESS_FLAGS) {
2378 SET_FIELD(qp_params.modify_flags,
2379 QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
2380 qp_params.incoming_rdma_read_en = attr->qp_access_flags &
2381 IB_ACCESS_REMOTE_READ;
2382 qp_params.incoming_rdma_write_en = attr->qp_access_flags &
2383 IB_ACCESS_REMOTE_WRITE;
2384 qp_params.incoming_atomic_en = attr->qp_access_flags &
2385 IB_ACCESS_REMOTE_ATOMIC;
2388 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
2389 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2392 if (attr_mask & IB_QP_PATH_MTU) {
2393 if (attr->path_mtu < IB_MTU_256 ||
2394 attr->path_mtu > IB_MTU_4096) {
2395 pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
2399 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
2400 ib_mtu_enum_to_int(iboe_get_mtu
2406 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2407 pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
2410 SET_FIELD(qp_params.modify_flags,
2411 QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
2413 qp_params.traffic_class_tos = grh->traffic_class;
2414 qp_params.flow_label = grh->flow_label;
2415 qp_params.hop_limit_ttl = grh->hop_limit;
2417 qp->sgid_idx = grh->sgid_index;
2419 rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
2422 "modify qp: problems with GID index %d (rc=%d)\n",
2423 grh->sgid_index, rc);
2427 rc = qedr_get_dmac(dev, &attr->ah_attr,
2428 qp_params.remote_mac_addr);
2432 qp_params.use_local_mac = true;
2433 ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
2435 DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
2436 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
2437 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
2438 DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
2439 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
2440 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
2441 DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
2442 qp_params.remote_mac_addr);
2444 qp_params.mtu = qp->mtu;
2445 qp_params.lb_indication = false;
2448 if (!qp_params.mtu) {
2449 /* Stay with current MTU */
2451 qp_params.mtu = qp->mtu;
2454 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2457 if (attr_mask & IB_QP_TIMEOUT) {
2458 SET_FIELD(qp_params.modify_flags,
2459 QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
2461 /* The received timeout value is an exponent used like this:
2462 * "12.7.34 LOCAL ACK TIMEOUT
2463 * Value representing the transport (ACK) timeout for use by
2464 * the remote, expressed as: 4.096 * 2^timeout [usec]"
2465 * The FW expects timeout in msec so we need to divide the usec
2466 * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
2467 * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
2468 * The value of zero means infinite so we use a 'max_t' to make
2469 * sure that sub 1 msec values will be configured as 1 msec.
2472 qp_params.ack_timeout =
2473 1 << max_t(int, attr->timeout - 8, 0);
2475 qp_params.ack_timeout = 0;
2478 if (attr_mask & IB_QP_RETRY_CNT) {
2479 SET_FIELD(qp_params.modify_flags,
2480 QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
2481 qp_params.retry_cnt = attr->retry_cnt;
2484 if (attr_mask & IB_QP_RNR_RETRY) {
2485 SET_FIELD(qp_params.modify_flags,
2486 QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
2487 qp_params.rnr_retry_cnt = attr->rnr_retry;
2490 if (attr_mask & IB_QP_RQ_PSN) {
2491 SET_FIELD(qp_params.modify_flags,
2492 QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
2493 qp_params.rq_psn = attr->rq_psn;
2494 qp->rq_psn = attr->rq_psn;
2497 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2498 if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
2501 "unsupported max_rd_atomic=%d, supported=%d\n",
2502 attr->max_rd_atomic,
2503 dev->attr.max_qp_req_rd_atomic_resc);
2507 SET_FIELD(qp_params.modify_flags,
2508 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
2509 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
2512 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
2513 SET_FIELD(qp_params.modify_flags,
2514 QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
2515 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
2518 if (attr_mask & IB_QP_SQ_PSN) {
2519 SET_FIELD(qp_params.modify_flags,
2520 QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
2521 qp_params.sq_psn = attr->sq_psn;
2522 qp->sq_psn = attr->sq_psn;
2525 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2526 if (attr->max_dest_rd_atomic >
2527 dev->attr.max_qp_resp_rd_atomic_resc) {
2529 "unsupported max_dest_rd_atomic=%d, supported=%d\n",
2530 attr->max_dest_rd_atomic,
2531 dev->attr.max_qp_resp_rd_atomic_resc);
2537 SET_FIELD(qp_params.modify_flags,
2538 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
2539 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
2542 if (attr_mask & IB_QP_DEST_QPN) {
2543 SET_FIELD(qp_params.modify_flags,
2544 QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
2546 qp_params.dest_qp = attr->dest_qp_num;
2547 qp->dest_qp_num = attr->dest_qp_num;
2550 cur_state = qp->state;
2552 /* Update the QP state before the actual ramrod to prevent a race with
2553 * fast path. Modifying the QP state to error will cause the device to
2554 * flush the CQEs and while polling the flushed CQEs will considered as
2555 * a potential issue if the QP isn't in error state.
2557 if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
2558 !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
2559 qp->state = QED_ROCE_QP_STATE_ERR;
2561 if (qp->qp_type != IB_QPT_GSI)
2562 rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
2563 qp->qed_qp, &qp_params);
2565 if (attr_mask & IB_QP_STATE) {
2566 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
2567 rc = qedr_update_qp_state(dev, qp, cur_state,
2568 qp_params.new_state);
2569 qp->state = qp_params.new_state;
2576 static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
2578 int ib_qp_acc_flags = 0;
2580 if (params->incoming_rdma_write_en)
2581 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
2582 if (params->incoming_rdma_read_en)
2583 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
2584 if (params->incoming_atomic_en)
2585 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
2586 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
2587 return ib_qp_acc_flags;
2590 int qedr_query_qp(struct ib_qp *ibqp,
2591 struct ib_qp_attr *qp_attr,
2592 int attr_mask, struct ib_qp_init_attr *qp_init_attr)
2594 struct qed_rdma_query_qp_out_params params;
2595 struct qedr_qp *qp = get_qedr_qp(ibqp);
2596 struct qedr_dev *dev = qp->dev;
2599 memset(¶ms, 0, sizeof(params));
2601 rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, ¶ms);
2605 memset(qp_attr, 0, sizeof(*qp_attr));
2606 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2608 qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2609 qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
2610 qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
2611 qp_attr->path_mig_state = IB_MIG_MIGRATED;
2612 qp_attr->rq_psn = params.rq_psn;
2613 qp_attr->sq_psn = params.sq_psn;
2614 qp_attr->dest_qp_num = params.dest_qp;
2616 qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(¶ms);
2618 qp_attr->cap.max_send_wr = qp->sq.max_wr;
2619 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2620 qp_attr->cap.max_send_sge = qp->sq.max_sges;
2621 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
2622 qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
2623 qp_init_attr->cap = qp_attr->cap;
2625 qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
2626 rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
2627 params.flow_label, qp->sgid_idx,
2628 params.hop_limit_ttl, params.traffic_class_tos);
2629 rdma_ah_set_dgid_raw(&qp_attr->ah_attr, ¶ms.dgid.bytes[0]);
2630 rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
2631 rdma_ah_set_sl(&qp_attr->ah_attr, 0);
2632 qp_attr->timeout = params.timeout;
2633 qp_attr->rnr_retry = params.rnr_retry;
2634 qp_attr->retry_cnt = params.retry_cnt;
2635 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2636 qp_attr->pkey_index = params.pkey_index;
2637 qp_attr->port_num = 1;
2638 rdma_ah_set_path_bits(&qp_attr->ah_attr, 0);
2639 rdma_ah_set_static_rate(&qp_attr->ah_attr, 0);
2640 qp_attr->alt_pkey_index = 0;
2641 qp_attr->alt_port_num = 0;
2642 qp_attr->alt_timeout = 0;
2643 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2645 qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2646 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2647 qp_attr->max_rd_atomic = params.max_rd_atomic;
2648 qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2650 DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2651 qp_attr->cap.max_inline_data);
2657 static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
2658 struct ib_udata *udata)
2660 struct qedr_ucontext *ctx =
2661 rdma_udata_to_drv_context(udata, struct qedr_ucontext,
2665 if (qp->qp_type != IB_QPT_GSI) {
2666 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2671 if (qp->create_type == QEDR_QP_CREATE_USER)
2672 qedr_cleanup_user(dev, ctx, qp);
2674 qedr_cleanup_kernel(dev, qp);
2679 int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
2681 struct qedr_qp *qp = get_qedr_qp(ibqp);
2682 struct qedr_dev *dev = qp->dev;
2683 struct ib_qp_attr attr;
2686 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2689 if (rdma_protocol_roce(&dev->ibdev, 1)) {
2690 if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2691 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2692 (qp->state != QED_ROCE_QP_STATE_INIT)) {
2694 attr.qp_state = IB_QPS_ERR;
2695 attr_mask |= IB_QP_STATE;
2697 /* Change the QP state to ERROR */
2698 qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2701 /* If connection establishment started the WAIT_FOR_CONNECT
2702 * bit will be on and we need to Wait for the establishment
2703 * to complete before destroying the qp.
2705 if (test_and_set_bit(QEDR_IWARP_CM_WAIT_FOR_CONNECT,
2706 &qp->iwarp_cm_flags))
2707 wait_for_completion(&qp->iwarp_cm_comp);
2709 /* If graceful disconnect started, the WAIT_FOR_DISCONNECT
2710 * bit will be on, and we need to wait for the disconnect to
2711 * complete before continuing. We can use the same completion,
2712 * iwarp_cm_comp, since this is the only place that waits for
2713 * this completion and it is sequential. In addition,
2714 * disconnect can't occur before the connection is fully
2715 * established, therefore if WAIT_FOR_DISCONNECT is on it
2716 * means WAIT_FOR_CONNECT is also on and the completion for
2717 * CONNECT already occurred.
2719 if (test_and_set_bit(QEDR_IWARP_CM_WAIT_FOR_DISCONNECT,
2720 &qp->iwarp_cm_flags))
2721 wait_for_completion(&qp->iwarp_cm_comp);
2724 if (qp->qp_type == IB_QPT_GSI)
2725 qedr_destroy_gsi_qp(dev);
2727 /* We need to remove the entry from the xarray before we release the
2728 * qp_id to avoid a race of the qp_id being reallocated and failing
2731 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2732 xa_erase(&dev->qps, qp->qp_id);
2734 qedr_free_qp_resources(dev, qp, udata);
2736 if (rdma_protocol_iwarp(&dev->ibdev, 1))
2737 qedr_iw_qp_rem_ref(&qp->ibqp);
2742 int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
2743 struct ib_udata *udata)
2745 struct qedr_ah *ah = get_qedr_ah(ibah);
2747 rdma_copy_ah_attr(&ah->attr, attr);
2752 void qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
2754 struct qedr_ah *ah = get_qedr_ah(ibah);
2756 rdma_destroy_ah_attr(&ah->attr);
2759 static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2761 struct qedr_pbl *pbl, *tmp;
2763 if (info->pbl_table)
2764 list_add_tail(&info->pbl_table->list_entry,
2765 &info->free_pbl_list);
2767 if (!list_empty(&info->inuse_pbl_list))
2768 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2770 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2771 list_del(&pbl->list_entry);
2772 qedr_free_pbl(dev, &info->pbl_info, pbl);
2776 static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2777 size_t page_list_len, bool two_layered)
2779 struct qedr_pbl *tmp;
2782 INIT_LIST_HEAD(&info->free_pbl_list);
2783 INIT_LIST_HEAD(&info->inuse_pbl_list);
2785 rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2786 page_list_len, two_layered);
2790 info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2791 if (IS_ERR(info->pbl_table)) {
2792 rc = PTR_ERR(info->pbl_table);
2796 DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2797 &info->pbl_table->pa);
2799 /* in usual case we use 2 PBLs, so we add one to free
2800 * list and allocating another one
2802 tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2804 DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2808 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2810 DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2814 free_mr_info(dev, info);
2819 struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2820 u64 usr_addr, int acc, struct ib_udata *udata)
2822 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2827 pd = get_qedr_pd(ibpd);
2828 DP_DEBUG(dev, QEDR_MSG_MR,
2829 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2830 pd->pd_id, start, len, usr_addr, acc);
2832 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2833 return ERR_PTR(-EINVAL);
2835 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2839 mr->type = QEDR_MR_USER;
2841 mr->umem = ib_umem_get(ibpd->device, start, len, acc);
2842 if (IS_ERR(mr->umem)) {
2847 rc = init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
2851 qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
2852 &mr->info.pbl_info, PAGE_SHIFT);
2854 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2856 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2860 /* Index only, 18 bit long, lkey = itid << 8 | key */
2861 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2863 mr->hw_mr.pd = pd->pd_id;
2864 mr->hw_mr.local_read = 1;
2865 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2866 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2867 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2868 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2869 mr->hw_mr.mw_bind = false;
2870 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2871 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2872 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2873 mr->hw_mr.page_size_log = PAGE_SHIFT;
2874 mr->hw_mr.fbo = ib_umem_offset(mr->umem);
2875 mr->hw_mr.length = len;
2876 mr->hw_mr.vaddr = usr_addr;
2877 mr->hw_mr.zbva = false;
2878 mr->hw_mr.phy_mr = false;
2879 mr->hw_mr.dma_mr = false;
2881 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2883 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2887 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2888 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2889 mr->hw_mr.remote_atomic)
2890 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2892 DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
2897 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2899 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2905 int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
2907 struct qedr_mr *mr = get_qedr_mr(ib_mr);
2908 struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
2911 rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
2915 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2917 if (mr->type != QEDR_MR_DMA)
2918 free_mr_info(dev, &mr->info);
2920 /* it could be user registered memory. */
2921 ib_umem_release(mr->umem);
2928 static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
2929 int max_page_list_len)
2931 struct qedr_pd *pd = get_qedr_pd(ibpd);
2932 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2936 DP_DEBUG(dev, QEDR_MSG_MR,
2937 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
2940 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2945 mr->type = QEDR_MR_FRMR;
2947 rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
2951 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2953 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2957 /* Index only, 18 bit long, lkey = itid << 8 | key */
2958 mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
2960 mr->hw_mr.pd = pd->pd_id;
2961 mr->hw_mr.local_read = 1;
2962 mr->hw_mr.local_write = 0;
2963 mr->hw_mr.remote_read = 0;
2964 mr->hw_mr.remote_write = 0;
2965 mr->hw_mr.remote_atomic = 0;
2966 mr->hw_mr.mw_bind = false;
2967 mr->hw_mr.pbl_ptr = 0;
2968 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2969 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2971 mr->hw_mr.length = 0;
2972 mr->hw_mr.vaddr = 0;
2973 mr->hw_mr.zbva = false;
2974 mr->hw_mr.phy_mr = true;
2975 mr->hw_mr.dma_mr = false;
2977 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2979 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2983 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2984 mr->ibmr.rkey = mr->ibmr.lkey;
2986 DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
2990 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2996 struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
2997 u32 max_num_sg, struct ib_udata *udata)
3001 if (mr_type != IB_MR_TYPE_MEM_REG)
3002 return ERR_PTR(-EINVAL);
3004 mr = __qedr_alloc_mr(ibpd, max_num_sg);
3007 return ERR_PTR(-EINVAL);
3012 static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
3014 struct qedr_mr *mr = get_qedr_mr(ibmr);
3015 struct qedr_pbl *pbl_table;
3016 struct regpair *pbe;
3019 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
3020 DP_ERR(mr->dev, "qedr_set_page fails when %d\n", mr->npages);
3024 DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
3027 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
3028 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
3029 pbe = (struct regpair *)pbl_table->va;
3030 pbe += mr->npages % pbes_in_page;
3031 pbe->lo = cpu_to_le32((u32)addr);
3032 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
3039 static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
3041 int work = info->completed - info->completed_handled - 1;
3043 DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
3044 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
3045 struct qedr_pbl *pbl;
3047 /* Free all the page list that are possible to be freed
3048 * (all the ones that were invalidated), under the assumption
3049 * that if an FMR was completed successfully that means that
3050 * if there was an invalidate operation before it also ended
3052 pbl = list_first_entry(&info->inuse_pbl_list,
3053 struct qedr_pbl, list_entry);
3054 list_move_tail(&pbl->list_entry, &info->free_pbl_list);
3055 info->completed_handled++;
3059 int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
3060 int sg_nents, unsigned int *sg_offset)
3062 struct qedr_mr *mr = get_qedr_mr(ibmr);
3066 handle_completed_mrs(mr->dev, &mr->info);
3067 return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
3070 struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
3072 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
3073 struct qedr_pd *pd = get_qedr_pd(ibpd);
3077 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
3079 return ERR_PTR(-ENOMEM);
3081 mr->type = QEDR_MR_DMA;
3083 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
3085 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
3089 /* index only, 18 bit long, lkey = itid << 8 | key */
3090 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
3091 mr->hw_mr.pd = pd->pd_id;
3092 mr->hw_mr.local_read = 1;
3093 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
3094 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
3095 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
3096 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
3097 mr->hw_mr.dma_mr = true;
3099 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
3101 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
3105 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3106 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
3107 mr->hw_mr.remote_atomic)
3108 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
3110 DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
3114 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
3120 static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
3122 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
3125 static int sge_data_len(struct ib_sge *sg_list, int num_sge)
3129 for (i = 0; i < num_sge; i++)
3130 len += sg_list[i].length;
3135 static void swap_wqe_data64(u64 *p)
3139 for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
3140 *p = cpu_to_be64(cpu_to_le64(*p));
3143 static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
3144 struct qedr_qp *qp, u8 *wqe_size,
3145 const struct ib_send_wr *wr,
3146 const struct ib_send_wr **bad_wr,
3149 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
3150 char *seg_prt, *wqe;
3153 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
3154 DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
3168 /* Copy data inline */
3169 for (i = 0; i < wr->num_sge; i++) {
3170 u32 len = wr->sg_list[i].length;
3171 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
3176 /* New segment required */
3178 wqe = (char *)qed_chain_produce(&qp->sq.pbl);
3180 seg_siz = sizeof(struct rdma_sq_common_wqe);
3184 /* Calculate currently allowed length */
3185 cur = min_t(u32, len, seg_siz);
3186 memcpy(seg_prt, src, cur);
3188 /* Update segment variables */
3192 /* Update sge variables */
3196 /* Swap fully-completed segments */
3198 swap_wqe_data64((u64 *)wqe);
3202 /* swap last not completed segment */
3204 swap_wqe_data64((u64 *)wqe);
3209 #define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
3211 DMA_REGPAIR_LE(sge->addr, vaddr); \
3212 (sge)->length = cpu_to_le32(vlength); \
3213 (sge)->flags = cpu_to_le32(vflags); \
3216 #define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
3218 DMA_REGPAIR_LE(hdr->wr_id, vwr_id); \
3219 (hdr)->num_sges = num_sge; \
3222 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
3224 DMA_REGPAIR_LE(sge->addr, vaddr); \
3225 (sge)->length = cpu_to_le32(vlength); \
3226 (sge)->l_key = cpu_to_le32(vlkey); \
3229 static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
3230 const struct ib_send_wr *wr)
3235 for (i = 0; i < wr->num_sge; i++) {
3236 struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
3238 DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
3239 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
3240 sge->length = cpu_to_le32(wr->sg_list[i].length);
3241 data_size += wr->sg_list[i].length;
3245 *wqe_size += wr->num_sge;
3250 static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
3252 struct rdma_sq_rdma_wqe_1st *rwqe,
3253 struct rdma_sq_rdma_wqe_2nd *rwqe2,
3254 const struct ib_send_wr *wr,
3255 const struct ib_send_wr **bad_wr)
3257 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
3258 DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
3260 if (wr->send_flags & IB_SEND_INLINE &&
3261 (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
3262 wr->opcode == IB_WR_RDMA_WRITE)) {
3265 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
3266 return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
3267 bad_wr, &rwqe->flags, flags);
3270 return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
3273 static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
3275 struct rdma_sq_send_wqe_1st *swqe,
3276 struct rdma_sq_send_wqe_2st *swqe2,
3277 const struct ib_send_wr *wr,
3278 const struct ib_send_wr **bad_wr)
3280 memset(swqe2, 0, sizeof(*swqe2));
3281 if (wr->send_flags & IB_SEND_INLINE) {
3284 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
3285 return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
3286 bad_wr, &swqe->flags, flags);
3289 return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
3292 static int qedr_prepare_reg(struct qedr_qp *qp,
3293 struct rdma_sq_fmr_wqe_1st *fwqe1,
3294 const struct ib_reg_wr *wr)
3296 struct qedr_mr *mr = get_qedr_mr(wr->mr);
3297 struct rdma_sq_fmr_wqe_2nd *fwqe2;
3299 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
3300 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
3301 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
3302 fwqe1->l_key = wr->key;
3304 fwqe2->access_ctrl = 0;
3306 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
3307 !!(wr->access & IB_ACCESS_REMOTE_READ));
3308 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
3309 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
3310 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
3311 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
3312 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
3313 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
3314 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
3315 fwqe2->fmr_ctrl = 0;
3317 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
3318 ilog2(mr->ibmr.page_size) - 12);
3320 fwqe2->length_hi = 0;
3321 fwqe2->length_lo = mr->ibmr.length;
3322 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
3323 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
3325 qp->wqe_wr_id[qp->sq.prod].mr = mr;
3330 static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
3333 case IB_WR_RDMA_WRITE:
3334 case IB_WR_RDMA_WRITE_WITH_IMM:
3335 return IB_WC_RDMA_WRITE;
3336 case IB_WR_SEND_WITH_IMM:
3338 case IB_WR_SEND_WITH_INV:
3340 case IB_WR_RDMA_READ:
3341 case IB_WR_RDMA_READ_WITH_INV:
3342 return IB_WC_RDMA_READ;
3343 case IB_WR_ATOMIC_CMP_AND_SWP:
3344 return IB_WC_COMP_SWAP;
3345 case IB_WR_ATOMIC_FETCH_AND_ADD:
3346 return IB_WC_FETCH_ADD;
3348 return IB_WC_REG_MR;
3349 case IB_WR_LOCAL_INV:
3350 return IB_WC_LOCAL_INV;
3356 static inline bool qedr_can_post_send(struct qedr_qp *qp,
3357 const struct ib_send_wr *wr)
3359 int wq_is_full, err_wr, pbl_is_full;
3360 struct qedr_dev *dev = qp->dev;
3362 /* prevent SQ overflow and/or processing of a bad WR */
3363 err_wr = wr->num_sge > qp->sq.max_sges;
3364 wq_is_full = qedr_wq_is_full(&qp->sq);
3365 pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
3366 QEDR_MAX_SQE_ELEMENTS_PER_SQE;
3367 if (wq_is_full || err_wr || pbl_is_full) {
3368 if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
3370 "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
3372 qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
3375 if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
3377 "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
3379 qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
3383 !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
3385 "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
3387 qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
3394 static int __qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3395 const struct ib_send_wr **bad_wr)
3397 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3398 struct qedr_qp *qp = get_qedr_qp(ibqp);
3399 struct rdma_sq_atomic_wqe_1st *awqe1;
3400 struct rdma_sq_atomic_wqe_2nd *awqe2;
3401 struct rdma_sq_atomic_wqe_3rd *awqe3;
3402 struct rdma_sq_send_wqe_2st *swqe2;
3403 struct rdma_sq_local_inv_wqe *iwqe;
3404 struct rdma_sq_rdma_wqe_2nd *rwqe2;
3405 struct rdma_sq_send_wqe_1st *swqe;
3406 struct rdma_sq_rdma_wqe_1st *rwqe;
3407 struct rdma_sq_fmr_wqe_1st *fwqe1;
3408 struct rdma_sq_common_wqe *wqe;
3413 if (!qedr_can_post_send(qp, wr)) {
3418 wqe = qed_chain_produce(&qp->sq.pbl);
3419 qp->wqe_wr_id[qp->sq.prod].signaled =
3420 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
3423 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
3424 !!(wr->send_flags & IB_SEND_SOLICITED));
3425 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
3426 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
3427 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
3428 !!(wr->send_flags & IB_SEND_FENCE));
3429 wqe->prev_wqe_size = qp->prev_wqe_size;
3431 qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
3433 switch (wr->opcode) {
3434 case IB_WR_SEND_WITH_IMM:
3435 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3440 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
3441 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3443 swqe2 = qed_chain_produce(&qp->sq.pbl);
3445 swqe->inv_key_or_imm_data = cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
3446 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3448 swqe->length = cpu_to_le32(length);
3449 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3450 qp->prev_wqe_size = swqe->wqe_size;
3451 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3454 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
3455 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3458 swqe2 = qed_chain_produce(&qp->sq.pbl);
3459 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3461 swqe->length = cpu_to_le32(length);
3462 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3463 qp->prev_wqe_size = swqe->wqe_size;
3464 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3466 case IB_WR_SEND_WITH_INV:
3467 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
3468 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3469 swqe2 = qed_chain_produce(&qp->sq.pbl);
3471 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
3472 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3474 swqe->length = cpu_to_le32(length);
3475 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3476 qp->prev_wqe_size = swqe->wqe_size;
3477 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3480 case IB_WR_RDMA_WRITE_WITH_IMM:
3481 if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3486 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
3487 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3490 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
3491 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3492 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3494 rwqe->length = cpu_to_le32(length);
3495 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3496 qp->prev_wqe_size = rwqe->wqe_size;
3497 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3499 case IB_WR_RDMA_WRITE:
3500 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
3501 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3504 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3505 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3507 rwqe->length = cpu_to_le32(length);
3508 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3509 qp->prev_wqe_size = rwqe->wqe_size;
3510 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3512 case IB_WR_RDMA_READ_WITH_INV:
3513 SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
3514 /* fallthrough -- same is identical to RDMA READ */
3516 case IB_WR_RDMA_READ:
3517 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
3518 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3521 rwqe2 = qed_chain_produce(&qp->sq.pbl);
3522 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3524 rwqe->length = cpu_to_le32(length);
3525 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3526 qp->prev_wqe_size = rwqe->wqe_size;
3527 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3530 case IB_WR_ATOMIC_CMP_AND_SWP:
3531 case IB_WR_ATOMIC_FETCH_AND_ADD:
3532 awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
3533 awqe1->wqe_size = 4;
3535 awqe2 = qed_chain_produce(&qp->sq.pbl);
3536 DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
3537 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
3539 awqe3 = qed_chain_produce(&qp->sq.pbl);
3541 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
3542 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
3543 DMA_REGPAIR_LE(awqe3->swap_data,
3544 atomic_wr(wr)->compare_add);
3546 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
3547 DMA_REGPAIR_LE(awqe3->swap_data,
3548 atomic_wr(wr)->swap);
3549 DMA_REGPAIR_LE(awqe3->cmp_data,
3550 atomic_wr(wr)->compare_add);
3553 qedr_prepare_sq_sges(qp, NULL, wr);
3555 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
3556 qp->prev_wqe_size = awqe1->wqe_size;
3559 case IB_WR_LOCAL_INV:
3560 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
3563 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
3564 iwqe->inv_l_key = wr->ex.invalidate_rkey;
3565 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
3566 qp->prev_wqe_size = iwqe->wqe_size;
3569 DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
3570 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
3571 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
3572 fwqe1->wqe_size = 2;
3574 rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
3576 DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
3581 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
3582 qp->prev_wqe_size = fwqe1->wqe_size;
3585 DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
3594 /* Restore prod to its position before
3595 * this WR was processed
3597 value = le16_to_cpu(qp->sq.db_data.data.value);
3598 qed_chain_set_prod(&qp->sq.pbl, value, wqe);
3600 /* Restore prev_wqe_size */
3601 qp->prev_wqe_size = wqe->prev_wqe_size;
3603 DP_ERR(dev, "POST SEND FAILED\n");
3609 int qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3610 const struct ib_send_wr **bad_wr)
3612 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3613 struct qedr_qp *qp = get_qedr_qp(ibqp);
3614 unsigned long flags;
3619 if (qp->qp_type == IB_QPT_GSI)
3620 return qedr_gsi_post_send(ibqp, wr, bad_wr);
3622 spin_lock_irqsave(&qp->q_lock, flags);
3624 if (rdma_protocol_roce(&dev->ibdev, 1)) {
3625 if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
3626 (qp->state != QED_ROCE_QP_STATE_ERR) &&
3627 (qp->state != QED_ROCE_QP_STATE_SQD)) {
3628 spin_unlock_irqrestore(&qp->q_lock, flags);
3630 DP_DEBUG(dev, QEDR_MSG_CQ,
3631 "QP in wrong state! QP icid=0x%x state %d\n",
3632 qp->icid, qp->state);
3638 rc = __qedr_post_send(ibqp, wr, bad_wr);
3642 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3644 qedr_inc_sw_prod(&qp->sq);
3646 qp->sq.db_data.data.value++;
3652 * If there was a failure in the first WR then it will be triggered in
3653 * vane. However this is not harmful (as long as the producer value is
3654 * unchanged). For performance reasons we avoid checking for this
3655 * redundant doorbell.
3657 * qp->wqe_wr_id is accessed during qedr_poll_cq, as
3658 * soon as we give the doorbell, we could get a completion
3659 * for this wr, therefore we need to make sure that the
3660 * memory is updated before giving the doorbell.
3661 * During qedr_poll_cq, rmb is called before accessing the
3662 * cqe. This covers for the smp_rmb as well.
3665 writel(qp->sq.db_data.raw, qp->sq.db);
3667 spin_unlock_irqrestore(&qp->q_lock, flags);
3672 static u32 qedr_srq_elem_left(struct qedr_srq_hwq_info *hw_srq)
3676 /* Calculate number of elements used based on producer
3677 * count and consumer count and subtract it from max
3678 * work request supported so that we get elements left.
3680 used = hw_srq->wr_prod_cnt - hw_srq->wr_cons_cnt;
3682 return hw_srq->max_wr - used;
3685 int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
3686 const struct ib_recv_wr **bad_wr)
3688 struct qedr_srq *srq = get_qedr_srq(ibsrq);
3689 struct qedr_srq_hwq_info *hw_srq;
3690 struct qedr_dev *dev = srq->dev;
3691 struct qed_chain *pbl;
3692 unsigned long flags;
3697 spin_lock_irqsave(&srq->lock, flags);
3699 hw_srq = &srq->hw_srq;
3700 pbl = &srq->hw_srq.pbl;
3702 struct rdma_srq_wqe_header *hdr;
3705 if (!qedr_srq_elem_left(hw_srq) ||
3706 wr->num_sge > srq->hw_srq.max_sges) {
3707 DP_ERR(dev, "Can't post WR (%d,%d) || (%d > %d)\n",
3708 hw_srq->wr_prod_cnt, hw_srq->wr_cons_cnt,
3709 wr->num_sge, srq->hw_srq.max_sges);
3715 hdr = qed_chain_produce(pbl);
3716 num_sge = wr->num_sge;
3717 /* Set number of sge and work request id in header */
3718 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
3720 srq->hw_srq.wr_prod_cnt++;
3724 DP_DEBUG(dev, QEDR_MSG_SRQ,
3725 "SRQ WR: SGEs: %d with wr_id[%d] = %llx\n",
3726 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
3728 for (i = 0; i < wr->num_sge; i++) {
3729 struct rdma_srq_sge *srq_sge = qed_chain_produce(pbl);
3731 /* Set SGE length, lkey and address */
3732 SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
3733 wr->sg_list[i].length, wr->sg_list[i].lkey);
3735 DP_DEBUG(dev, QEDR_MSG_SRQ,
3736 "[%d]: len %d key %x addr %x:%x\n",
3737 i, srq_sge->length, srq_sge->l_key,
3738 srq_sge->addr.hi, srq_sge->addr.lo);
3742 /* Flush WQE and SGE information before
3743 * updating producer.
3747 /* SRQ producer is 8 bytes. Need to update SGE producer index
3748 * in first 4 bytes and need to update WQE producer in
3751 *srq->hw_srq.virt_prod_pair_addr = hw_srq->sge_prod;
3752 offset = offsetof(struct rdma_srq_producers, wqe_prod);
3753 *((u8 *)srq->hw_srq.virt_prod_pair_addr + offset) =
3756 /* Flush producer after updating it. */
3761 DP_DEBUG(dev, QEDR_MSG_SRQ, "POST: Elements in S-RQ: %d\n",
3762 qed_chain_get_elem_left(pbl));
3763 spin_unlock_irqrestore(&srq->lock, flags);
3768 int qedr_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
3769 const struct ib_recv_wr **bad_wr)
3771 struct qedr_qp *qp = get_qedr_qp(ibqp);
3772 struct qedr_dev *dev = qp->dev;
3773 unsigned long flags;
3776 if (qp->qp_type == IB_QPT_GSI)
3777 return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3779 spin_lock_irqsave(&qp->q_lock, flags);
3781 if (qp->state == QED_ROCE_QP_STATE_RESET) {
3782 spin_unlock_irqrestore(&qp->q_lock, flags);
3790 if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3791 QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3792 wr->num_sge > qp->rq.max_sges) {
3793 DP_ERR(dev, "Can't post WR (%d < %d) || (%d > %d)\n",
3794 qed_chain_get_elem_left_u32(&qp->rq.pbl),
3795 QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3801 for (i = 0; i < wr->num_sge; i++) {
3803 struct rdma_rq_sge *rqe =
3804 qed_chain_produce(&qp->rq.pbl);
3806 /* First one must include the number
3807 * of SGE in the list
3810 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3813 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO,
3814 wr->sg_list[i].lkey);
3816 RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3817 wr->sg_list[i].length, flags);
3820 /* Special case of no sges. FW requires between 1-4 sges...
3821 * in this case we need to post 1 sge with length zero. this is
3822 * because rdma write with immediate consumes an RQ.
3826 struct rdma_rq_sge *rqe =
3827 qed_chain_produce(&qp->rq.pbl);
3829 /* First one must include the number
3830 * of SGE in the list
3832 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO, 0);
3833 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3835 RQ_SGE_SET(rqe, 0, 0, flags);
3839 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3840 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3842 qedr_inc_sw_prod(&qp->rq);
3844 /* qp->rqe_wr_id is accessed during qedr_poll_cq, as
3845 * soon as we give the doorbell, we could get a completion
3846 * for this wr, therefore we need to make sure that the
3847 * memory is update before giving the doorbell.
3848 * During qedr_poll_cq, rmb is called before accessing the
3849 * cqe. This covers for the smp_rmb as well.
3853 qp->rq.db_data.data.value++;
3855 writel(qp->rq.db_data.raw, qp->rq.db);
3857 if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
3858 writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
3864 spin_unlock_irqrestore(&qp->q_lock, flags);
3869 static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3871 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3873 return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3877 static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3879 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3882 qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
3883 resp_cqe->qp_handle.lo,
3888 static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
3890 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3892 return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
3895 /* Return latest CQE (needs processing) */
3896 static union rdma_cqe *get_cqe(struct qedr_cq *cq)
3898 return cq->latest_cqe;
3901 /* In fmr we need to increase the number of fmr completed counter for the fmr
3902 * algorithm determining whether we can free a pbl or not.
3903 * we need to perform this whether the work request was signaled or not. for
3904 * this purpose we call this function from the condition that checks if a wr
3905 * should be skipped, to make sure we don't miss it ( possibly this fmr
3906 * operation was not signalted)
3908 static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
3910 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
3911 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3914 static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
3915 struct qedr_cq *cq, int num_entries,
3916 struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
3921 while (num_entries && qp->sq.wqe_cons != hw_cons) {
3922 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
3923 qedr_chk_if_fmr(qp);
3929 wc->status = status;
3932 wc->src_qp = qp->id;
3935 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
3936 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
3938 switch (wc->opcode) {
3939 case IB_WC_RDMA_WRITE:
3940 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3942 case IB_WC_COMP_SWAP:
3943 case IB_WC_FETCH_ADD:
3947 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3949 case IB_WC_RDMA_READ:
3951 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3961 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
3962 qed_chain_consume(&qp->sq.pbl);
3963 qedr_inc_sw_cons(&qp->sq);
3969 static int qedr_poll_cq_req(struct qedr_dev *dev,
3970 struct qedr_qp *qp, struct qedr_cq *cq,
3971 int num_entries, struct ib_wc *wc,
3972 struct rdma_cqe_requester *req)
3976 switch (req->status) {
3977 case RDMA_CQE_REQ_STS_OK:
3978 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3981 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
3982 if (qp->state != QED_ROCE_QP_STATE_ERR)
3983 DP_DEBUG(dev, QEDR_MSG_CQ,
3984 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3985 cq->icid, qp->icid);
3986 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3987 IB_WC_WR_FLUSH_ERR, 1);
3990 /* process all WQE before the cosumer */
3991 qp->state = QED_ROCE_QP_STATE_ERR;
3992 cnt = process_req(dev, qp, cq, num_entries, wc,
3993 req->sq_cons - 1, IB_WC_SUCCESS, 0);
3995 /* if we have extra WC fill it with actual error info */
3996 if (cnt < num_entries) {
3997 enum ib_wc_status wc_status;
3999 switch (req->status) {
4000 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
4002 "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4003 cq->icid, qp->icid);
4004 wc_status = IB_WC_BAD_RESP_ERR;
4006 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
4008 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4009 cq->icid, qp->icid);
4010 wc_status = IB_WC_LOC_LEN_ERR;
4012 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
4014 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4015 cq->icid, qp->icid);
4016 wc_status = IB_WC_LOC_QP_OP_ERR;
4018 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
4020 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4021 cq->icid, qp->icid);
4022 wc_status = IB_WC_LOC_PROT_ERR;
4024 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
4026 "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4027 cq->icid, qp->icid);
4028 wc_status = IB_WC_MW_BIND_ERR;
4030 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
4032 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4033 cq->icid, qp->icid);
4034 wc_status = IB_WC_REM_INV_REQ_ERR;
4036 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
4038 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4039 cq->icid, qp->icid);
4040 wc_status = IB_WC_REM_ACCESS_ERR;
4042 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
4044 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4045 cq->icid, qp->icid);
4046 wc_status = IB_WC_REM_OP_ERR;
4048 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
4050 "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4051 cq->icid, qp->icid);
4052 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
4054 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
4056 "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4057 cq->icid, qp->icid);
4058 wc_status = IB_WC_RETRY_EXC_ERR;
4062 "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
4063 cq->icid, qp->icid);
4064 wc_status = IB_WC_GENERAL_ERR;
4066 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
4074 static inline int qedr_cqe_resp_status_to_ib(u8 status)
4077 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
4078 return IB_WC_LOC_ACCESS_ERR;
4079 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
4080 return IB_WC_LOC_LEN_ERR;
4081 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
4082 return IB_WC_LOC_QP_OP_ERR;
4083 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
4084 return IB_WC_LOC_PROT_ERR;
4085 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
4086 return IB_WC_MW_BIND_ERR;
4087 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
4088 return IB_WC_REM_INV_RD_REQ_ERR;
4089 case RDMA_CQE_RESP_STS_OK:
4090 return IB_WC_SUCCESS;
4092 return IB_WC_GENERAL_ERR;
4096 static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
4099 wc->status = IB_WC_SUCCESS;
4100 wc->byte_len = le32_to_cpu(resp->length);
4102 if (resp->flags & QEDR_RESP_IMM) {
4103 wc->ex.imm_data = cpu_to_be32(le32_to_cpu(resp->imm_data_or_inv_r_Key));
4104 wc->wc_flags |= IB_WC_WITH_IMM;
4106 if (resp->flags & QEDR_RESP_RDMA)
4107 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
4109 if (resp->flags & QEDR_RESP_INV)
4112 } else if (resp->flags & QEDR_RESP_INV) {
4113 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
4114 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
4116 if (resp->flags & QEDR_RESP_RDMA)
4119 } else if (resp->flags & QEDR_RESP_RDMA) {
4126 static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
4127 struct qedr_cq *cq, struct ib_wc *wc,
4128 struct rdma_cqe_responder *resp, u64 wr_id)
4130 /* Must fill fields before qedr_set_ok_cqe_resp_wc() */
4131 wc->opcode = IB_WC_RECV;
4134 if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
4135 if (qedr_set_ok_cqe_resp_wc(resp, wc))
4137 "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
4138 cq, cq->icid, resp->flags);
4141 wc->status = qedr_cqe_resp_status_to_ib(resp->status);
4142 if (wc->status == IB_WC_GENERAL_ERR)
4144 "CQ %p (icid=%d) contains an invalid CQE status %d\n",
4145 cq, cq->icid, resp->status);
4148 /* Fill the rest of the WC */
4150 wc->src_qp = qp->id;
4155 static int process_resp_one_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4156 struct qedr_cq *cq, struct ib_wc *wc,
4157 struct rdma_cqe_responder *resp)
4159 struct qedr_srq *srq = qp->srq;
4162 wr_id = HILO_GEN(le32_to_cpu(resp->srq_wr_id.hi),
4163 le32_to_cpu(resp->srq_wr_id.lo), u64);
4165 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4166 wc->status = IB_WC_WR_FLUSH_ERR;
4170 wc->src_qp = qp->id;
4174 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
4176 srq->hw_srq.wr_cons_cnt++;
4180 static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
4181 struct qedr_cq *cq, struct ib_wc *wc,
4182 struct rdma_cqe_responder *resp)
4184 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4186 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
4188 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4189 qed_chain_consume(&qp->rq.pbl);
4190 qedr_inc_sw_cons(&qp->rq);
4195 static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
4196 int num_entries, struct ib_wc *wc, u16 hw_cons)
4200 while (num_entries && qp->rq.wqe_cons != hw_cons) {
4202 wc->status = IB_WC_WR_FLUSH_ERR;
4205 wc->src_qp = qp->id;
4207 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
4212 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
4213 qed_chain_consume(&qp->rq.pbl);
4214 qedr_inc_sw_cons(&qp->rq);
4220 static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4221 struct rdma_cqe_responder *resp, int *update)
4223 if (le16_to_cpu(resp->rq_cons_or_srq_id) == qp->rq.wqe_cons) {
4229 static int qedr_poll_cq_resp_srq(struct qedr_dev *dev, struct qedr_qp *qp,
4230 struct qedr_cq *cq, int num_entries,
4232 struct rdma_cqe_responder *resp)
4236 cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
4242 static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
4243 struct qedr_cq *cq, int num_entries,
4244 struct ib_wc *wc, struct rdma_cqe_responder *resp,
4249 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4250 cnt = process_resp_flush(qp, cq, num_entries, wc,
4251 resp->rq_cons_or_srq_id);
4252 try_consume_resp_cqe(cq, qp, resp, update);
4254 cnt = process_resp_one(dev, qp, cq, wc, resp);
4262 static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4263 struct rdma_cqe_requester *req, int *update)
4265 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
4271 int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
4273 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
4274 struct qedr_cq *cq = get_qedr_cq(ibcq);
4275 union rdma_cqe *cqe;
4276 u32 old_cons, new_cons;
4277 unsigned long flags;
4281 if (cq->destroyed) {
4283 "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
4288 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
4289 return qedr_gsi_poll_cq(ibcq, num_entries, wc);
4291 spin_lock_irqsave(&cq->cq_lock, flags);
4292 cqe = cq->latest_cqe;
4293 old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4294 while (num_entries && is_valid_cqe(cq, cqe)) {
4298 /* prevent speculative reads of any field of CQE */
4301 qp = cqe_get_qp(cqe);
4303 WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
4309 switch (cqe_get_type(cqe)) {
4310 case RDMA_CQE_TYPE_REQUESTER:
4311 cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
4313 try_consume_req_cqe(cq, qp, &cqe->req, &update);
4315 case RDMA_CQE_TYPE_RESPONDER_RQ:
4316 cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
4317 &cqe->resp, &update);
4319 case RDMA_CQE_TYPE_RESPONDER_SRQ:
4320 cnt = qedr_poll_cq_resp_srq(dev, qp, cq, num_entries,
4324 case RDMA_CQE_TYPE_INVALID:
4326 DP_ERR(dev, "Error: invalid CQE type = %d\n",
4335 new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4337 cq->cq_cons += new_cons - old_cons;
4340 /* doorbell notifies abount latest VALID entry,
4341 * but chain already point to the next INVALID one
4343 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
4345 spin_unlock_irqrestore(&cq->cq_lock, flags);
4349 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
4350 u8 port_num, const struct ib_wc *in_wc,
4351 const struct ib_grh *in_grh, const struct ib_mad *in,
4352 struct ib_mad *out_mad, size_t *out_mad_size,
4353 u16 *out_mad_pkey_index)
4355 return IB_MAD_RESULT_SUCCESS;