xref: /linux/drivers/infiniband/hw/mana/main.c (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
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