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