1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2022, Microsoft Corporation. All rights reserved. 4 */ 5 6 #include "mana_ib.h" 7 #include "linux/pci.h" 8 9 void mana_ib_uncfg_vport(struct mana_ib_dev *dev, struct mana_ib_pd *pd, 10 u32 port) 11 { 12 struct mana_port_context *mpc; 13 struct net_device *ndev; 14 15 ndev = mana_ib_get_netdev(&dev->ib_dev, port); 16 mpc = netdev_priv(ndev); 17 18 mutex_lock(&pd->vport_mutex); 19 20 pd->vport_use_count--; 21 WARN_ON(pd->vport_use_count < 0); 22 23 if (!pd->vport_use_count) { 24 mana_destroy_eq(mpc); 25 mana_uncfg_vport(mpc); 26 } 27 28 mutex_unlock(&pd->vport_mutex); 29 } 30 31 int mana_ib_cfg_vport(struct mana_ib_dev *dev, u32 port, struct mana_ib_pd *pd, 32 u32 doorbell_id) 33 { 34 struct mana_port_context *mpc; 35 struct net_device *ndev; 36 int err; 37 38 ndev = mana_ib_get_netdev(&dev->ib_dev, port); 39 mpc = netdev_priv(ndev); 40 41 mutex_lock(&pd->vport_mutex); 42 43 pd->vport_use_count++; 44 if (pd->vport_use_count > 1) { 45 /* Reject cross-port PD sharing. EQs and vport config 46 * are per-port, so the PD must stay bound to the port 47 * that was configured on the first raw QP creation. 48 */ 49 if (pd->vport_port != port) { 50 pd->vport_use_count--; 51 mutex_unlock(&pd->vport_mutex); 52 ibdev_dbg(&dev->ib_dev, 53 "PD already bound to port %u\n", 54 pd->vport_port); 55 return -EINVAL; 56 } 57 ibdev_dbg(&dev->ib_dev, 58 "Skip as this PD is already configured vport\n"); 59 mutex_unlock(&pd->vport_mutex); 60 return 0; 61 } 62 63 pd->vport_port = port; 64 65 err = mana_cfg_vport(mpc, pd->pdn, doorbell_id, true); 66 if (err) { 67 pd->vport_use_count--; 68 mutex_unlock(&pd->vport_mutex); 69 70 ibdev_dbg(&dev->ib_dev, "Failed to configure vPort %d\n", err); 71 return err; 72 } 73 74 75 err = mana_create_eq(mpc); 76 if (err) { 77 mana_uncfg_vport(mpc); 78 pd->vport_use_count--; 79 } else { 80 pd->tx_shortform_allowed = mpc->tx_shortform_allowed; 81 pd->tx_vp_offset = mpc->tx_vp_offset; 82 } 83 84 mutex_unlock(&pd->vport_mutex); 85 86 if (!err) 87 ibdev_dbg(&dev->ib_dev, "vport handle %llx pdid %x doorbell_id %x\n", 88 mpc->port_handle, pd->pdn, doorbell_id); 89 90 return err; 91 } 92 93 static int mana_gd_destroy_pd(struct mana_ib_dev *mdev, u64 pd_handle) 94 { 95 struct gdma_destroy_pd_resp resp = {}; 96 struct gdma_destroy_pd_req req = {}; 97 98 mana_gd_init_req_hdr(&req.hdr, GDMA_DESTROY_PD, sizeof(req), 99 sizeof(resp)); 100 101 req.pd_handle = pd_handle; 102 103 return mana_gd_send_request(mdev_to_gc(mdev), sizeof(req), &req, sizeof(resp), &resp); 104 } 105 106 int mana_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) 107 { 108 struct mana_ib_pd *pd = container_of(ibpd, struct mana_ib_pd, ibpd); 109 struct mana_ib_alloc_pd_resp ucmd_resp = {}; 110 struct ib_device *ibdev = ibpd->device; 111 struct gdma_create_pd_resp resp = {}; 112 struct gdma_create_pd_req req = {}; 113 struct mana_ib_alloc_pd ucmd; 114 enum gdma_pd_flags flags = 0; 115 struct mana_ib_dev *dev; 116 struct gdma_context *gc; 117 int err; 118 119 if (udata && udata->inlen) { 120 err = ib_copy_validate_udata_in_cm(udata, ucmd, reserved, 121 MANA_IB_PD_SHORT_PDN); 122 if (err) 123 return err; 124 125 if (ucmd.comp_mask & MANA_IB_PD_SHORT_PDN) 126 flags |= GDMA_PD_FLAG_SHORT_PDN; 127 } 128 129 dev = container_of(ibdev, struct mana_ib_dev, ib_dev); 130 gc = mdev_to_gc(dev); 131 132 mana_gd_init_req_hdr(&req.hdr, GDMA_CREATE_PD, sizeof(req), 133 sizeof(resp)); 134 135 if (!udata) 136 flags |= GDMA_PD_FLAG_ALLOW_GPA_MR; 137 138 req.flags = flags; 139 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 140 if (err) 141 return err; 142 143 pd->pd_handle = resp.pd_handle; 144 pd->pdn = resp.pd_id; 145 mutex_init(&pd->vport_mutex); 146 pd->vport_use_count = 0; 147 148 if (udata) { 149 ucmd_resp.pdn = pd->pdn; 150 err = ib_respond_udata(udata, ucmd_resp); 151 if (err) 152 goto destroy_pd; 153 } 154 155 return 0; 156 157 destroy_pd: 158 mana_gd_destroy_pd(dev, pd->pd_handle); 159 160 return err; 161 } 162 163 int mana_ib_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) 164 { 165 struct mana_ib_pd *pd = container_of(ibpd, struct mana_ib_pd, ibpd); 166 struct ib_device *ibdev = ibpd->device; 167 struct mana_ib_dev *dev; 168 int err; 169 170 err = ib_no_udata_io(udata); 171 if (err) 172 return err; 173 174 dev = container_of(ibdev, struct mana_ib_dev, ib_dev); 175 err = mana_gd_destroy_pd(dev, pd->pd_handle); 176 if (err) 177 return err; 178 179 return 0; 180 } 181 182 static int mana_gd_destroy_doorbell_page(struct gdma_context *gc, 183 int doorbell_page) 184 { 185 struct gdma_destroy_resource_range_req req = {}; 186 struct gdma_resp_hdr resp = {}; 187 188 mana_gd_init_req_hdr(&req.hdr, GDMA_DESTROY_RESOURCE_RANGE, 189 sizeof(req), sizeof(resp)); 190 191 req.resource_type = GDMA_RESOURCE_DOORBELL_PAGE; 192 req.num_resources = 1; 193 req.allocated_resources = doorbell_page; 194 195 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 196 } 197 198 static int mana_gd_allocate_doorbell_page(struct gdma_context *gc, 199 int *doorbell_page) 200 { 201 struct gdma_allocate_resource_range_req req = {}; 202 struct gdma_allocate_resource_range_resp resp = {}; 203 int err; 204 205 mana_gd_init_req_hdr(&req.hdr, GDMA_ALLOCATE_RESOURCE_RANGE, 206 sizeof(req), sizeof(resp)); 207 208 req.resource_type = GDMA_RESOURCE_DOORBELL_PAGE; 209 req.num_resources = 1; 210 req.alignment = PAGE_SIZE / MANA_PAGE_SIZE; 211 212 /* Have GDMA start searching from 0 */ 213 req.allocated_resources = 0; 214 215 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 216 if (err) 217 return err; 218 219 *doorbell_page = resp.allocated_resources; 220 221 return 0; 222 } 223 224 int mana_ib_alloc_ucontext(struct ib_ucontext *ibcontext, 225 struct ib_udata *udata) 226 { 227 struct mana_ib_ucontext *ucontext = 228 container_of(ibcontext, struct mana_ib_ucontext, ibucontext); 229 struct mana_ib_alloc_ucontext_resp ucmd_resp = {}; 230 struct ib_device *ibdev = ibcontext->device; 231 struct mana_ib_dev *mdev; 232 struct gdma_context *gc; 233 int doorbell_page; 234 int ret; 235 236 ret = ib_is_udata_in_empty(udata); 237 if (ret) 238 return ret; 239 240 mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); 241 gc = mdev_to_gc(mdev); 242 243 /* Allocate a doorbell page index */ 244 ret = mana_gd_allocate_doorbell_page(gc, &doorbell_page); 245 if (ret) 246 return ret; 247 248 ucontext->doorbell = doorbell_page; 249 ucmd_resp.comp_mask = MANA_IB_UCNTX_ALLOC_PDN_SUPPORT; 250 ret = ib_respond_udata(udata, ucmd_resp); 251 if (ret) 252 return ret; 253 254 return 0; 255 } 256 257 void mana_ib_dealloc_ucontext(struct ib_ucontext *ibcontext) 258 { 259 struct mana_ib_ucontext *mana_ucontext = 260 container_of(ibcontext, struct mana_ib_ucontext, ibucontext); 261 struct ib_device *ibdev = ibcontext->device; 262 struct mana_ib_dev *mdev; 263 struct gdma_context *gc; 264 int ret; 265 266 mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); 267 gc = mdev_to_gc(mdev); 268 269 ret = mana_gd_destroy_doorbell_page(gc, mana_ucontext->doorbell); 270 if (ret) 271 ibdev_dbg(ibdev, "Failed to destroy doorbell page %d\n", ret); 272 } 273 274 int mana_ib_create_kernel_queue(struct mana_ib_dev *mdev, u32 size, enum gdma_queue_type type, 275 struct mana_ib_queue *queue) 276 { 277 struct gdma_queue_spec spec = {}; 278 int err; 279 280 queue->id = INVALID_QUEUE_ID; 281 queue->gdma_region = GDMA_INVALID_DMA_REGION; 282 spec.type = type; 283 spec.monitor_avl_buf = false; 284 spec.queue_size = size; 285 err = mana_gd_create_mana_wq_cq(mdev->gdma_dev, &spec, &queue->kmem); 286 if (err) 287 return err; 288 /* take ownership into mana_ib from mana */ 289 queue->gdma_region = queue->kmem->mem_info.dma_region_handle; 290 queue->kmem->mem_info.dma_region_handle = GDMA_INVALID_DMA_REGION; 291 return 0; 292 } 293 294 int mana_ib_create_queue(struct mana_ib_dev *mdev, u64 addr, u32 size, 295 struct mana_ib_queue *queue) 296 { 297 struct ib_umem *umem; 298 int err; 299 300 queue->umem = NULL; 301 queue->id = INVALID_QUEUE_ID; 302 queue->gdma_region = GDMA_INVALID_DMA_REGION; 303 304 umem = ib_umem_get_va(&mdev->ib_dev, addr, size, IB_ACCESS_LOCAL_WRITE); 305 if (IS_ERR(umem)) { 306 ibdev_dbg(&mdev->ib_dev, "Failed to get umem, %pe\n", umem); 307 return PTR_ERR(umem); 308 } 309 310 err = mana_ib_create_zero_offset_dma_region(mdev, umem, &queue->gdma_region); 311 if (err) { 312 ibdev_dbg(&mdev->ib_dev, "Failed to create dma region, %d\n", err); 313 goto free_umem; 314 } 315 queue->umem = umem; 316 317 ibdev_dbg(&mdev->ib_dev, "created dma region 0x%llx\n", queue->gdma_region); 318 319 return 0; 320 free_umem: 321 ib_umem_release(umem); 322 return err; 323 } 324 325 void mana_ib_destroy_queue(struct mana_ib_dev *mdev, struct mana_ib_queue *queue) 326 { 327 /* Ignore return code as there is not much we can do about it. 328 * The error message is printed inside. 329 */ 330 mana_ib_gd_destroy_dma_region(mdev, queue->gdma_region); 331 ib_umem_release(queue->umem); 332 if (queue->kmem) 333 mana_gd_destroy_queue(mdev_to_gc(mdev), queue->kmem); 334 } 335 336 static int 337 mana_ib_gd_first_dma_region(struct mana_ib_dev *dev, 338 struct gdma_context *gc, 339 struct gdma_create_dma_region_req *create_req, 340 size_t num_pages, mana_handle_t *gdma_region, 341 u32 expected_status) 342 { 343 struct gdma_create_dma_region_resp create_resp = {}; 344 unsigned int create_req_msg_size; 345 int err; 346 347 create_req_msg_size = 348 struct_size(create_req, page_addr_list, num_pages); 349 create_req->page_addr_list_len = num_pages; 350 351 err = mana_gd_send_request(gc, create_req_msg_size, create_req, 352 sizeof(create_resp), &create_resp); 353 if (err || create_resp.hdr.status != expected_status) { 354 ibdev_dbg(&dev->ib_dev, 355 "Failed to create DMA region: %d, 0x%x\n", 356 err, create_resp.hdr.status); 357 if (!err) 358 err = -EPROTO; 359 360 return err; 361 } 362 363 *gdma_region = create_resp.dma_region_handle; 364 ibdev_dbg(&dev->ib_dev, "Created DMA region handle 0x%llx\n", 365 *gdma_region); 366 367 return 0; 368 } 369 370 static int 371 mana_ib_gd_add_dma_region(struct mana_ib_dev *dev, struct gdma_context *gc, 372 struct gdma_dma_region_add_pages_req *add_req, 373 unsigned int num_pages, u32 expected_status) 374 { 375 unsigned int add_req_msg_size = 376 struct_size(add_req, page_addr_list, num_pages); 377 struct gdma_general_resp add_resp = {}; 378 int err; 379 380 mana_gd_init_req_hdr(&add_req->hdr, GDMA_DMA_REGION_ADD_PAGES, 381 add_req_msg_size, sizeof(add_resp)); 382 add_req->page_addr_list_len = num_pages; 383 384 err = mana_gd_send_request(gc, add_req_msg_size, add_req, 385 sizeof(add_resp), &add_resp); 386 if (err || add_resp.hdr.status != expected_status) { 387 ibdev_dbg(&dev->ib_dev, 388 "Failed to create DMA region: %d, 0x%x\n", 389 err, add_resp.hdr.status); 390 391 if (!err) 392 err = -EPROTO; 393 394 return err; 395 } 396 397 return 0; 398 } 399 400 static int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem, 401 mana_handle_t *gdma_region, unsigned long page_sz) 402 { 403 struct gdma_dma_region_add_pages_req *add_req = NULL; 404 size_t num_pages_processed = 0, num_pages_to_handle; 405 struct gdma_create_dma_region_req *create_req; 406 unsigned int create_req_msg_size; 407 struct hw_channel_context *hwc; 408 struct ib_block_iter biter; 409 size_t max_pgs_add_cmd = 0; 410 size_t max_pgs_create_cmd; 411 struct gdma_context *gc; 412 size_t num_pages_total; 413 unsigned int tail = 0; 414 u64 *page_addr_list; 415 void *request_buf; 416 int err = 0; 417 418 gc = mdev_to_gc(dev); 419 hwc = gc->hwc.driver_data; 420 421 num_pages_total = ib_umem_num_dma_blocks(umem, page_sz); 422 423 max_pgs_create_cmd = 424 (hwc->max_req_msg_size - sizeof(*create_req)) / sizeof(u64); 425 num_pages_to_handle = 426 min_t(size_t, num_pages_total, max_pgs_create_cmd); 427 create_req_msg_size = 428 struct_size(create_req, page_addr_list, num_pages_to_handle); 429 430 request_buf = kzalloc(hwc->max_req_msg_size, GFP_KERNEL); 431 if (!request_buf) 432 return -ENOMEM; 433 434 create_req = request_buf; 435 mana_gd_init_req_hdr(&create_req->hdr, GDMA_CREATE_DMA_REGION, 436 create_req_msg_size, 437 sizeof(struct gdma_create_dma_region_resp)); 438 439 create_req->length = umem->length; 440 create_req->offset_in_page = ib_umem_dma_offset(umem, page_sz); 441 create_req->gdma_page_type = order_base_2(page_sz) - MANA_PAGE_SHIFT; 442 create_req->page_count = num_pages_total; 443 444 ibdev_dbg(&dev->ib_dev, "size_dma_region %lu num_pages_total %lu\n", 445 umem->length, num_pages_total); 446 447 ibdev_dbg(&dev->ib_dev, "page_sz %lu offset_in_page %u\n", 448 page_sz, create_req->offset_in_page); 449 450 ibdev_dbg(&dev->ib_dev, "num_pages_to_handle %lu, gdma_page_type %u", 451 num_pages_to_handle, create_req->gdma_page_type); 452 453 page_addr_list = create_req->page_addr_list; 454 rdma_umem_for_each_dma_block(umem, &biter, page_sz) { 455 u32 expected_status = 0; 456 457 page_addr_list[tail++] = rdma_block_iter_dma_address(&biter); 458 if (tail < num_pages_to_handle) 459 continue; 460 461 if (num_pages_processed + num_pages_to_handle < 462 num_pages_total) 463 expected_status = GDMA_STATUS_MORE_ENTRIES; 464 465 if (!num_pages_processed) { 466 /* First create message */ 467 err = mana_ib_gd_first_dma_region(dev, gc, create_req, 468 tail, gdma_region, 469 expected_status); 470 if (err) 471 goto out; 472 473 max_pgs_add_cmd = (hwc->max_req_msg_size - 474 sizeof(*add_req)) / sizeof(u64); 475 476 add_req = request_buf; 477 add_req->dma_region_handle = *gdma_region; 478 add_req->reserved3 = 0; 479 page_addr_list = add_req->page_addr_list; 480 } else { 481 /* Subsequent create messages */ 482 err = mana_ib_gd_add_dma_region(dev, gc, add_req, tail, 483 expected_status); 484 if (err) 485 break; 486 } 487 488 num_pages_processed += tail; 489 tail = 0; 490 491 /* The remaining pages to create */ 492 num_pages_to_handle = 493 min_t(size_t, 494 num_pages_total - num_pages_processed, 495 max_pgs_add_cmd); 496 } 497 498 if (err) 499 mana_ib_gd_destroy_dma_region(dev, *gdma_region); 500 501 out: 502 kfree(request_buf); 503 return err; 504 } 505 506 int mana_ib_create_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem, 507 mana_handle_t *gdma_region, u64 virt) 508 { 509 unsigned long page_sz; 510 511 page_sz = ib_umem_find_best_pgsz(umem, dev->adapter_caps.page_size_cap, virt); 512 if (!page_sz) { 513 ibdev_dbg(&dev->ib_dev, "Failed to find page size.\n"); 514 return -EINVAL; 515 } 516 517 return mana_ib_gd_create_dma_region(dev, umem, gdma_region, page_sz); 518 } 519 520 int mana_ib_create_zero_offset_dma_region(struct mana_ib_dev *dev, struct ib_umem *umem, 521 mana_handle_t *gdma_region) 522 { 523 unsigned long page_sz; 524 525 /* Hardware requires dma region to align to chosen page size */ 526 page_sz = ib_umem_find_best_pgoff(umem, dev->adapter_caps.page_size_cap, 0); 527 if (!page_sz) { 528 ibdev_dbg(&dev->ib_dev, "Failed to find page size.\n"); 529 return -EINVAL; 530 } 531 532 return mana_ib_gd_create_dma_region(dev, umem, gdma_region, page_sz); 533 } 534 535 int mana_ib_gd_destroy_dma_region(struct mana_ib_dev *dev, u64 gdma_region) 536 { 537 struct gdma_context *gc = mdev_to_gc(dev); 538 539 ibdev_dbg(&dev->ib_dev, "destroy dma region 0x%llx\n", gdma_region); 540 541 return mana_gd_destroy_dma_region(gc, gdma_region); 542 } 543 544 int mana_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma) 545 { 546 struct mana_ib_ucontext *mana_ucontext = 547 container_of(ibcontext, struct mana_ib_ucontext, ibucontext); 548 struct ib_device *ibdev = ibcontext->device; 549 struct mana_ib_dev *mdev; 550 struct gdma_context *gc; 551 phys_addr_t pfn; 552 pgprot_t prot; 553 int ret; 554 555 mdev = container_of(ibdev, struct mana_ib_dev, ib_dev); 556 gc = mdev_to_gc(mdev); 557 558 if (vma->vm_pgoff != 0) { 559 ibdev_dbg(ibdev, "Unexpected vm_pgoff %lu\n", vma->vm_pgoff); 560 return -EINVAL; 561 } 562 563 /* Map to the page indexed by ucontext->doorbell */ 564 pfn = (gc->phys_db_page_base + 565 gc->db_page_size * mana_ucontext->doorbell) >> 566 PAGE_SHIFT; 567 prot = pgprot_writecombine(vma->vm_page_prot); 568 569 ret = rdma_user_mmap_io(ibcontext, vma, pfn, PAGE_SIZE, prot, 570 NULL); 571 if (ret) 572 ibdev_dbg(ibdev, "can't rdma_user_mmap_io ret %d\n", ret); 573 else 574 ibdev_dbg(ibdev, "mapped I/O pfn 0x%llx page_size %lu, ret %d\n", 575 pfn, PAGE_SIZE, ret); 576 577 return ret; 578 } 579 580 int mana_ib_get_port_immutable(struct ib_device *ibdev, u32 port_num, 581 struct ib_port_immutable *immutable) 582 { 583 struct mana_ib_dev *dev = container_of(ibdev, struct mana_ib_dev, ib_dev); 584 struct ib_port_attr attr; 585 int err; 586 587 err = ib_query_port(ibdev, port_num, &attr); 588 if (err) 589 return err; 590 591 immutable->pkey_tbl_len = attr.pkey_tbl_len; 592 immutable->gid_tbl_len = attr.gid_tbl_len; 593 594 if (mana_ib_is_rnic(dev)) { 595 if (port_num == 1) { 596 immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP; 597 immutable->max_mad_size = IB_MGMT_MAD_SIZE; 598 } else { 599 immutable->core_cap_flags = RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP 600 | RDMA_CORE_CAP_ETH_AH; 601 immutable->max_mad_size = 0; 602 } 603 } else { 604 immutable->core_cap_flags = RDMA_CORE_PORT_RAW_PACKET; 605 } 606 607 return 0; 608 } 609 610 int mana_ib_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 611 struct ib_udata *uhw) 612 { 613 struct mana_ib_dev *dev = container_of(ibdev, struct mana_ib_dev, ib_dev); 614 struct pci_dev *pdev = to_pci_dev(mdev_to_gc(dev)->dev); 615 int err; 616 617 err = ib_no_udata_io(uhw); 618 if (err) 619 return err; 620 621 props->vendor_id = pdev->vendor; 622 props->vendor_part_id = dev->gdma_dev->dev_id.type; 623 props->max_mr_size = MANA_IB_MAX_MR_SIZE; 624 props->page_size_cap = dev->adapter_caps.page_size_cap; 625 props->max_qp = dev->adapter_caps.max_qp_count; 626 props->max_qp_wr = dev->adapter_caps.max_qp_wr; 627 props->device_cap_flags = IB_DEVICE_RC_RNR_NAK_GEN; 628 props->max_send_sge = dev->adapter_caps.max_send_sge_count; 629 props->max_recv_sge = dev->adapter_caps.max_recv_sge_count; 630 props->max_sge_rd = dev->adapter_caps.max_recv_sge_count; 631 props->max_cq = dev->adapter_caps.max_cq_count; 632 props->max_cqe = dev->adapter_caps.max_qp_wr; 633 props->max_mr = dev->adapter_caps.max_mr_count; 634 props->max_pd = dev->adapter_caps.max_pd_count; 635 props->max_qp_rd_atom = dev->adapter_caps.max_inbound_read_limit; 636 props->max_res_rd_atom = props->max_qp_rd_atom * props->max_qp; 637 props->max_qp_init_rd_atom = dev->adapter_caps.max_outbound_read_limit; 638 props->atomic_cap = IB_ATOMIC_NONE; 639 props->masked_atomic_cap = IB_ATOMIC_NONE; 640 props->max_ah = INT_MAX; 641 props->max_pkeys = 1; 642 props->local_ca_ack_delay = MANA_CA_ACK_DELAY; 643 if (!mana_ib_is_rnic(dev)) 644 props->raw_packet_caps = IB_RAW_PACKET_CAP_IP_CSUM; 645 646 return 0; 647 } 648 649 int mana_ib_query_port(struct ib_device *ibdev, u32 port, 650 struct ib_port_attr *props) 651 { 652 struct mana_ib_dev *dev = container_of(ibdev, struct mana_ib_dev, ib_dev); 653 struct net_device *ndev = mana_ib_get_netdev(ibdev, port); 654 655 if (!ndev) 656 return -EINVAL; 657 658 memset(props, 0, sizeof(*props)); 659 props->max_mtu = IB_MTU_4096; 660 props->active_mtu = ib_mtu_int_to_enum(ndev->mtu); 661 662 if (netif_carrier_ok(ndev) && netif_running(ndev)) { 663 props->state = IB_PORT_ACTIVE; 664 props->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 665 } else { 666 props->state = IB_PORT_DOWN; 667 props->phys_state = IB_PORT_PHYS_STATE_DISABLED; 668 } 669 670 ib_get_eth_speed(ibdev, port, &props->active_speed, &props->active_width); 671 props->pkey_tbl_len = 1; 672 if (mana_ib_is_rnic(dev)) { 673 props->gid_tbl_len = 16; 674 props->ip_gids = true; 675 props->max_msg_sz = SZ_16M; 676 if (port == 1) 677 props->port_cap_flags = IB_PORT_CM_SUP; 678 } 679 680 return 0; 681 } 682 683 enum rdma_link_layer mana_ib_get_link_layer(struct ib_device *device, u32 port_num) 684 { 685 return IB_LINK_LAYER_ETHERNET; 686 } 687 688 int mana_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index, u16 *pkey) 689 { 690 if (index != 0) 691 return -EINVAL; 692 *pkey = IB_DEFAULT_PKEY_FULL; 693 return 0; 694 } 695 696 int mana_ib_query_gid(struct ib_device *ibdev, u32 port, int index, 697 union ib_gid *gid) 698 { 699 /* This version doesn't return GID properties */ 700 return 0; 701 } 702 703 void mana_ib_disassociate_ucontext(struct ib_ucontext *ibcontext) 704 { 705 } 706 707 int mana_ib_gd_query_adapter_caps(struct mana_ib_dev *dev) 708 { 709 struct mana_ib_adapter_caps *caps = &dev->adapter_caps; 710 struct mana_ib_query_adapter_caps_resp resp = {}; 711 struct mana_ib_query_adapter_caps_req req = {}; 712 int err; 713 714 mana_gd_init_req_hdr(&req.hdr, MANA_IB_GET_ADAPTER_CAP, sizeof(req), 715 sizeof(resp)); 716 req.hdr.resp.msg_version = GDMA_MESSAGE_V4; 717 req.hdr.dev_id = dev->gdma_dev->dev_id; 718 719 err = mana_gd_send_request(mdev_to_gc(dev), sizeof(req), &req, 720 sizeof(resp), &resp); 721 if (err) 722 return err; 723 724 caps->max_sq_id = resp.max_sq_id; 725 caps->max_rq_id = resp.max_rq_id; 726 caps->max_cq_id = resp.max_cq_id; 727 caps->max_qp_count = resp.max_qp_count; 728 caps->max_cq_count = resp.max_cq_count; 729 caps->max_mr_count = resp.max_mr_count; 730 caps->max_pd_count = resp.max_pd_count; 731 caps->max_inbound_read_limit = resp.max_inbound_read_limit; 732 caps->max_outbound_read_limit = resp.max_outbound_read_limit; 733 caps->mw_count = resp.mw_count; 734 caps->max_srq_count = resp.max_srq_count; 735 caps->max_qp_wr = min_t(u32, 736 resp.max_requester_sq_size / GDMA_MAX_SQE_SIZE, 737 resp.max_requester_rq_size / GDMA_MAX_RQE_SIZE); 738 caps->max_inline_data_size = resp.max_inline_data_size; 739 caps->max_send_sge_count = resp.max_send_sge_count; 740 caps->max_recv_sge_count = resp.max_recv_sge_count; 741 caps->feature_flags = resp.feature_flags; 742 743 caps->page_size_cap = PAGE_SZ_BM; 744 if (mdev_to_gc(dev)->pf_cap_flags1 & GDMA_DRV_CAP_FLAG_1_GDMA_PAGES_4MB_1GB_2GB) 745 caps->page_size_cap |= (SZ_4M | SZ_1G | SZ_2G); 746 747 return 0; 748 } 749 750 int mana_eth_query_adapter_caps(struct mana_ib_dev *dev) 751 { 752 struct mana_ib_adapter_caps *caps = &dev->adapter_caps; 753 struct gdma_query_max_resources_resp resp = {}; 754 struct gdma_general_req req = {}; 755 int err; 756 757 mana_gd_init_req_hdr(&req.hdr, GDMA_QUERY_MAX_RESOURCES, 758 sizeof(req), sizeof(resp)); 759 760 err = mana_gd_send_request(mdev_to_gc(dev), sizeof(req), &req, 761 sizeof(resp), &resp); 762 if (err) 763 return err; 764 765 caps->max_qp_count = min_t(u32, resp.max_sq, resp.max_rq); 766 caps->max_cq_count = resp.max_cq; 767 caps->max_mr_count = resp.max_mst; 768 caps->max_pd_count = 0x6000; 769 caps->max_qp_wr = min_t(u32, 770 0x100000 / GDMA_MAX_SQE_SIZE, 771 0x100000 / GDMA_MAX_RQE_SIZE); 772 caps->max_send_sge_count = 30; 773 caps->max_recv_sge_count = 15; 774 caps->page_size_cap = PAGE_SZ_BM; 775 776 return 0; 777 } 778 779 static void 780 mana_ib_event_handler(void *ctx, struct gdma_queue *q, struct gdma_event *event) 781 { 782 struct mana_ib_dev *mdev = (struct mana_ib_dev *)ctx; 783 struct mana_ib_qp *qp; 784 struct ib_event ev; 785 u32 qpn; 786 787 switch (event->type) { 788 case GDMA_EQE_RNIC_QP_FATAL: 789 qpn = event->details[0]; 790 qp = mana_get_qp_ref(mdev, qpn, false); 791 if (!qp) 792 break; 793 if (qp->ibqp.event_handler) { 794 ev.device = qp->ibqp.device; 795 ev.element.qp = &qp->ibqp; 796 ev.event = IB_EVENT_QP_FATAL; 797 qp->ibqp.event_handler(&ev, qp->ibqp.qp_context); 798 } 799 mana_put_qp_ref(qp); 800 break; 801 default: 802 break; 803 } 804 } 805 806 int mana_ib_create_eqs(struct mana_ib_dev *mdev) 807 { 808 struct gdma_context *gc = mdev_to_gc(mdev); 809 struct gdma_queue_spec spec = {}; 810 struct gdma_irq_context *gic; 811 int err, i, msi; 812 813 spec.type = GDMA_EQ; 814 spec.monitor_avl_buf = false; 815 spec.queue_size = EQ_SIZE; 816 spec.eq.callback = mana_ib_event_handler; 817 spec.eq.context = mdev; 818 spec.eq.log2_throttle_limit = LOG2_EQ_THROTTLE; 819 820 msi = 0; 821 gic = mana_gd_get_gic(gc, false, &msi); 822 if (IS_ERR(gic)) 823 return PTR_ERR(gic); 824 spec.eq.msix_index = msi; 825 826 err = mana_gd_create_mana_eq(mdev->gdma_dev, &spec, &mdev->fatal_err_eq); 827 if (err) { 828 mana_gd_put_gic(gc, false, 0); 829 return err; 830 } 831 mdev->fatal_err_eq->eq.irq = gic->irq; 832 833 mdev->eqs = kzalloc_objs(struct gdma_queue *, 834 mdev->ib_dev.num_comp_vectors); 835 if (!mdev->eqs) { 836 err = -ENOMEM; 837 goto destroy_fatal_eq; 838 } 839 spec.eq.callback = NULL; 840 for (i = 0; i < mdev->ib_dev.num_comp_vectors; i++) { 841 msi = (i + 1) % gc->num_msix_usable; 842 843 gic = mana_gd_get_gic(gc, false, &msi); 844 if (IS_ERR(gic)) { 845 err = PTR_ERR(gic); 846 goto destroy_eqs; 847 } 848 spec.eq.msix_index = msi; 849 850 err = mana_gd_create_mana_eq(mdev->gdma_dev, &spec, &mdev->eqs[i]); 851 if (err) { 852 mana_gd_put_gic(gc, false, msi); 853 goto destroy_eqs; 854 } 855 mdev->eqs[i]->eq.irq = gic->irq; 856 } 857 858 return 0; 859 860 destroy_eqs: 861 while (i-- > 0) { 862 mana_gd_destroy_queue(gc, mdev->eqs[i]); 863 mana_gd_put_gic(gc, false, (i + 1) % gc->num_msix_usable); 864 } 865 kfree(mdev->eqs); 866 destroy_fatal_eq: 867 mana_gd_destroy_queue(gc, mdev->fatal_err_eq); 868 mana_gd_put_gic(gc, false, 0); 869 return err; 870 } 871 872 void mana_ib_destroy_eqs(struct mana_ib_dev *mdev) 873 { 874 struct gdma_context *gc = mdev_to_gc(mdev); 875 int i, msi; 876 877 mana_gd_destroy_queue(gc, mdev->fatal_err_eq); 878 mana_gd_put_gic(gc, false, 0); 879 880 for (i = 0; i < mdev->ib_dev.num_comp_vectors; i++) { 881 mana_gd_destroy_queue(gc, mdev->eqs[i]); 882 msi = (i + 1) % gc->num_msix_usable; 883 mana_gd_put_gic(gc, false, msi); 884 } 885 886 kfree(mdev->eqs); 887 } 888 889 int mana_ib_gd_create_rnic_adapter(struct mana_ib_dev *mdev) 890 { 891 struct mana_rnic_create_adapter_resp resp = {}; 892 struct mana_rnic_create_adapter_req req = {}; 893 struct gdma_context *gc = mdev_to_gc(mdev); 894 int err; 895 896 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_ADAPTER, sizeof(req), sizeof(resp)); 897 req.hdr.req.msg_version = GDMA_MESSAGE_V2; 898 req.hdr.dev_id = mdev->gdma_dev->dev_id; 899 req.notify_eq_id = mdev->fatal_err_eq->id; 900 901 if (mdev->adapter_caps.feature_flags & MANA_IB_FEATURE_CLIENT_ERROR_CQE_SUPPORT) 902 req.feature_flags |= MANA_IB_FEATURE_CLIENT_ERROR_CQE_REQUEST; 903 904 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 905 if (err) 906 return err; 907 mdev->adapter_handle = resp.adapter; 908 909 return 0; 910 } 911 912 int mana_ib_gd_destroy_rnic_adapter(struct mana_ib_dev *mdev) 913 { 914 struct mana_rnic_destroy_adapter_resp resp = {}; 915 struct mana_rnic_destroy_adapter_req req = {}; 916 struct gdma_context *gc; 917 918 gc = mdev_to_gc(mdev); 919 mana_gd_init_req_hdr(&req.hdr, MANA_IB_DESTROY_ADAPTER, sizeof(req), sizeof(resp)); 920 req.hdr.dev_id = mdev->gdma_dev->dev_id; 921 req.adapter = mdev->adapter_handle; 922 923 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 924 } 925 926 int mana_ib_gd_add_gid(const struct ib_gid_attr *attr, void **context) 927 { 928 struct mana_ib_dev *mdev = container_of(attr->device, struct mana_ib_dev, ib_dev); 929 enum rdma_network_type ntype = rdma_gid_attr_network_type(attr); 930 struct mana_rnic_config_addr_resp resp = {}; 931 struct gdma_context *gc = mdev_to_gc(mdev); 932 struct mana_rnic_config_addr_req req = {}; 933 934 if (ntype != RDMA_NETWORK_IPV4 && ntype != RDMA_NETWORK_IPV6) { 935 ibdev_dbg(&mdev->ib_dev, "Unsupported rdma network type %d", ntype); 936 return -EINVAL; 937 } 938 939 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CONFIG_IP_ADDR, sizeof(req), sizeof(resp)); 940 req.hdr.dev_id = mdev->gdma_dev->dev_id; 941 req.adapter = mdev->adapter_handle; 942 req.op = ADDR_OP_ADD; 943 req.sgid_type = (ntype == RDMA_NETWORK_IPV6) ? SGID_TYPE_IPV6 : SGID_TYPE_IPV4; 944 copy_in_reverse(req.ip_addr, attr->gid.raw, sizeof(union ib_gid)); 945 946 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 947 } 948 949 int mana_ib_gd_del_gid(const struct ib_gid_attr *attr, void **context) 950 { 951 struct mana_ib_dev *mdev = container_of(attr->device, struct mana_ib_dev, ib_dev); 952 enum rdma_network_type ntype = rdma_gid_attr_network_type(attr); 953 struct mana_rnic_config_addr_resp resp = {}; 954 struct gdma_context *gc = mdev_to_gc(mdev); 955 struct mana_rnic_config_addr_req req = {}; 956 957 if (ntype != RDMA_NETWORK_IPV4 && ntype != RDMA_NETWORK_IPV6) { 958 ibdev_dbg(&mdev->ib_dev, "Unsupported rdma network type %d", ntype); 959 return -EINVAL; 960 } 961 962 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CONFIG_IP_ADDR, sizeof(req), sizeof(resp)); 963 req.hdr.dev_id = mdev->gdma_dev->dev_id; 964 req.adapter = mdev->adapter_handle; 965 req.op = ADDR_OP_REMOVE; 966 req.sgid_type = (ntype == RDMA_NETWORK_IPV6) ? SGID_TYPE_IPV6 : SGID_TYPE_IPV4; 967 copy_in_reverse(req.ip_addr, attr->gid.raw, sizeof(union ib_gid)); 968 969 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 970 } 971 972 int mana_ib_gd_config_mac(struct mana_ib_dev *mdev, enum mana_ib_addr_op op, u8 *mac) 973 { 974 struct mana_rnic_config_mac_addr_resp resp = {}; 975 struct mana_rnic_config_mac_addr_req req = {}; 976 struct gdma_context *gc = mdev_to_gc(mdev); 977 978 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CONFIG_MAC_ADDR, sizeof(req), sizeof(resp)); 979 req.hdr.dev_id = mdev->gdma_dev->dev_id; 980 req.adapter = mdev->adapter_handle; 981 req.op = op; 982 copy_in_reverse(req.mac_addr, mac, ETH_ALEN); 983 984 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 985 } 986 987 int mana_ib_gd_create_cq(struct mana_ib_dev *mdev, struct mana_ib_cq *cq, u32 doorbell) 988 { 989 struct gdma_context *gc = mdev_to_gc(mdev); 990 struct mana_rnic_create_cq_resp resp = {}; 991 struct mana_rnic_create_cq_req req = {}; 992 int err; 993 994 if (!mdev->eqs) 995 return -EINVAL; 996 997 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_CQ, sizeof(req), sizeof(resp)); 998 req.hdr.dev_id = mdev->gdma_dev->dev_id; 999 req.adapter = mdev->adapter_handle; 1000 req.gdma_region = cq->queue.gdma_region; 1001 req.eq_id = mdev->eqs[cq->comp_vector]->id; 1002 req.doorbell_page = doorbell; 1003 1004 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1005 1006 if (err) { 1007 ibdev_err(&mdev->ib_dev, "Failed to create cq err %d", err); 1008 return err; 1009 } 1010 1011 cq->queue.id = resp.cq_id; 1012 cq->cq_handle = resp.cq_handle; 1013 /* The GDMA region is now owned by the CQ handle */ 1014 cq->queue.gdma_region = GDMA_INVALID_DMA_REGION; 1015 1016 return 0; 1017 } 1018 1019 int mana_ib_gd_destroy_cq(struct mana_ib_dev *mdev, struct mana_ib_cq *cq) 1020 { 1021 struct gdma_context *gc = mdev_to_gc(mdev); 1022 struct mana_rnic_destroy_cq_resp resp = {}; 1023 struct mana_rnic_destroy_cq_req req = {}; 1024 1025 if (cq->cq_handle == INVALID_MANA_HANDLE) 1026 return 0; 1027 1028 mana_gd_init_req_hdr(&req.hdr, MANA_IB_DESTROY_CQ, sizeof(req), sizeof(resp)); 1029 req.hdr.dev_id = mdev->gdma_dev->dev_id; 1030 req.adapter = mdev->adapter_handle; 1031 req.cq_handle = cq->cq_handle; 1032 1033 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1034 } 1035 1036 int mana_ib_gd_create_rc_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp, 1037 struct ib_qp_init_attr *attr, u32 doorbell, u64 flags) 1038 { 1039 struct mana_ib_cq *send_cq = container_of(qp->ibqp.send_cq, struct mana_ib_cq, ibcq); 1040 struct mana_ib_cq *recv_cq = container_of(qp->ibqp.recv_cq, struct mana_ib_cq, ibcq); 1041 struct mana_ib_pd *pd = container_of(qp->ibqp.pd, struct mana_ib_pd, ibpd); 1042 struct gdma_context *gc = mdev_to_gc(mdev); 1043 struct mana_rnic_create_qp_resp resp = {}; 1044 struct mana_rnic_create_qp_req req = {}; 1045 int err, i; 1046 1047 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_RC_QP, sizeof(req), sizeof(resp)); 1048 req.hdr.dev_id = mdev->gdma_dev->dev_id; 1049 req.adapter = mdev->adapter_handle; 1050 req.pd_handle = pd->pd_handle; 1051 req.send_cq_handle = send_cq->cq_handle; 1052 req.recv_cq_handle = recv_cq->cq_handle; 1053 for (i = 0; i < MANA_RC_QUEUE_TYPE_MAX; i++) 1054 req.dma_region[i] = qp->rc_qp.queues[i].gdma_region; 1055 req.doorbell_page = doorbell; 1056 req.max_send_wr = attr->cap.max_send_wr; 1057 req.max_recv_wr = attr->cap.max_recv_wr; 1058 req.max_send_sge = attr->cap.max_send_sge; 1059 req.max_recv_sge = attr->cap.max_recv_sge; 1060 req.flags = flags; 1061 1062 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1063 if (err) 1064 return err; 1065 1066 qp->qp_handle = resp.rc_qp_handle; 1067 for (i = 0; i < MANA_RC_QUEUE_TYPE_MAX; i++) { 1068 qp->rc_qp.queues[i].id = resp.queue_ids[i]; 1069 /* The GDMA regions are now owned by the RNIC QP handle */ 1070 qp->rc_qp.queues[i].gdma_region = GDMA_INVALID_DMA_REGION; 1071 } 1072 return 0; 1073 } 1074 1075 int mana_ib_gd_create_uc_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp, 1076 struct ib_qp_init_attr *attr, u32 doorbell, u64 flags) 1077 { 1078 struct mana_ib_cq *send_cq = container_of(qp->ibqp.send_cq, struct mana_ib_cq, ibcq); 1079 struct mana_ib_cq *recv_cq = container_of(qp->ibqp.recv_cq, struct mana_ib_cq, ibcq); 1080 struct mana_ib_pd *pd = container_of(qp->ibqp.pd, struct mana_ib_pd, ibpd); 1081 struct gdma_context *gc = mdev_to_gc(mdev); 1082 struct mana_rnic_create_uc_qp_resp resp = {}; 1083 struct mana_rnic_create_uc_qp_req req = {}; 1084 int err, i; 1085 1086 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_UC_QP, sizeof(req), sizeof(resp)); 1087 req.hdr.dev_id = mdev->gdma_dev->dev_id; 1088 req.adapter = mdev->adapter_handle; 1089 req.pd_handle = pd->pd_handle; 1090 req.send_cq_handle = send_cq->cq_handle; 1091 req.recv_cq_handle = recv_cq->cq_handle; 1092 for (i = 0; i < MANA_UC_QUEUE_TYPE_MAX; i++) 1093 req.dma_region[i] = qp->uc_qp.queues[i].gdma_region; 1094 req.doorbell_page = doorbell; 1095 req.max_send_wr = attr->cap.max_send_wr; 1096 req.max_recv_wr = attr->cap.max_recv_wr; 1097 req.max_send_sge = attr->cap.max_send_sge; 1098 req.max_recv_sge = attr->cap.max_recv_sge; 1099 req.flags = flags; 1100 1101 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1102 if (err) 1103 return err; 1104 1105 qp->qp_handle = resp.qp_handle; 1106 for (i = 0; i < MANA_UC_QUEUE_TYPE_MAX; i++) { 1107 qp->uc_qp.queues[i].id = resp.queue_ids[i]; 1108 /* The GDMA regions are now owned by the RNIC QP handle */ 1109 qp->uc_qp.queues[i].gdma_region = GDMA_INVALID_DMA_REGION; 1110 } 1111 return 0; 1112 } 1113 1114 int mana_ib_gd_destroy_rnic_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp) 1115 { 1116 struct mana_rnic_destroy_rnic_qp_resp resp = {0}; 1117 struct mana_rnic_destroy_rnic_qp_req req = {0}; 1118 struct gdma_context *gc = mdev_to_gc(mdev); 1119 1120 mana_gd_init_req_hdr(&req.hdr, MANA_IB_DESTROY_RNIC_QP, sizeof(req), sizeof(resp)); 1121 req.hdr.dev_id = mdev->gdma_dev->dev_id; 1122 req.adapter = mdev->adapter_handle; 1123 req.qp_handle = qp->qp_handle; 1124 1125 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1126 } 1127 1128 int mana_ib_gd_create_ud_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp, 1129 struct ib_qp_init_attr *attr, u32 doorbell, u32 type) 1130 { 1131 struct mana_ib_cq *send_cq = container_of(qp->ibqp.send_cq, struct mana_ib_cq, ibcq); 1132 struct mana_ib_cq *recv_cq = container_of(qp->ibqp.recv_cq, struct mana_ib_cq, ibcq); 1133 struct mana_ib_pd *pd = container_of(qp->ibqp.pd, struct mana_ib_pd, ibpd); 1134 struct gdma_context *gc = mdev_to_gc(mdev); 1135 struct mana_rnic_create_udqp_resp resp = {}; 1136 struct mana_rnic_create_udqp_req req = {}; 1137 int err, i; 1138 1139 mana_gd_init_req_hdr(&req.hdr, MANA_IB_CREATE_UD_QP, sizeof(req), sizeof(resp)); 1140 req.hdr.dev_id = mdev->gdma_dev->dev_id; 1141 req.adapter = mdev->adapter_handle; 1142 req.pd_handle = pd->pd_handle; 1143 req.send_cq_handle = send_cq->cq_handle; 1144 req.recv_cq_handle = recv_cq->cq_handle; 1145 for (i = 0; i < MANA_UD_QUEUE_TYPE_MAX; i++) 1146 req.dma_region[i] = qp->ud_qp.queues[i].gdma_region; 1147 req.doorbell_page = doorbell; 1148 req.max_send_wr = attr->cap.max_send_wr; 1149 req.max_recv_wr = attr->cap.max_recv_wr; 1150 req.max_send_sge = attr->cap.max_send_sge; 1151 req.max_recv_sge = attr->cap.max_recv_sge; 1152 req.qp_type = type; 1153 err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1154 if (err) 1155 return err; 1156 1157 qp->qp_handle = resp.qp_handle; 1158 for (i = 0; i < MANA_UD_QUEUE_TYPE_MAX; i++) { 1159 qp->ud_qp.queues[i].id = resp.queue_ids[i]; 1160 /* The GDMA regions are now owned by the RNIC QP handle */ 1161 qp->ud_qp.queues[i].gdma_region = GDMA_INVALID_DMA_REGION; 1162 } 1163 return 0; 1164 } 1165 1166 int mana_ib_gd_destroy_ud_qp(struct mana_ib_dev *mdev, struct mana_ib_qp *qp) 1167 { 1168 struct mana_rnic_destroy_udqp_resp resp = {0}; 1169 struct mana_rnic_destroy_udqp_req req = {0}; 1170 struct gdma_context *gc = mdev_to_gc(mdev); 1171 1172 mana_gd_init_req_hdr(&req.hdr, MANA_IB_DESTROY_UD_QP, sizeof(req), sizeof(resp)); 1173 req.hdr.dev_id = mdev->gdma_dev->dev_id; 1174 req.adapter = mdev->adapter_handle; 1175 req.qp_handle = qp->qp_handle; 1176 1177 return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp); 1178 } 1179