xref: /freebsd/sys/dev/mana/gdma.h (revision 81ad6265)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2021 Microsoft Corp.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  * $FreeBSD$
31  *
32  */
33 
34 #ifndef _GDMA_H
35 #define _GDMA_H
36 
37 #include <sys/bus.h>
38 #include <sys/bus_dma.h>
39 #include <sys/types.h>
40 #include <sys/limits.h>
41 #include <sys/sx.h>
42 
43 #include "gdma_util.h"
44 #include "shm_channel.h"
45 
46 #define GDMA_STATUS_MORE_ENTRIES	0x00000105
47 
48 /* Structures labeled with "HW DATA" are exchanged with the hardware. All of
49  * them are naturally aligned and hence don't need __packed.
50  */
51 
52 #define GDMA_BAR0		0
53 
54 #define GDMA_IRQNAME_SZ		40
55 
56 struct gdma_bus {
57 	bus_space_handle_t	bar0_h;
58 	bus_space_tag_t		bar0_t;
59 };
60 
61 struct gdma_msix_entry {
62 	int			entry;
63 	int			vector;
64 };
65 
66 enum gdma_request_type {
67 	GDMA_VERIFY_VF_DRIVER_VERSION	= 1,
68 	GDMA_QUERY_MAX_RESOURCES	= 2,
69 	GDMA_LIST_DEVICES		= 3,
70 	GDMA_REGISTER_DEVICE		= 4,
71 	GDMA_DEREGISTER_DEVICE		= 5,
72 	GDMA_GENERATE_TEST_EQE		= 10,
73 	GDMA_CREATE_QUEUE		= 12,
74 	GDMA_DISABLE_QUEUE		= 13,
75 	GDMA_ALLOCATE_RESOURCE_RANGE	= 22,
76 	GDMA_DESTROY_RESOURCE_RANGE	= 24,
77 	GDMA_CREATE_DMA_REGION		= 25,
78 	GDMA_DMA_REGION_ADD_PAGES	= 26,
79 	GDMA_DESTROY_DMA_REGION		= 27,
80 	GDMA_CREATE_PD			= 29,
81 	GDMA_DESTROY_PD			= 30,
82 	GDMA_CREATE_MR			= 31,
83 	GDMA_DESTROY_MR			= 32,
84 };
85 
86 #define GDMA_RESOURCE_DOORBELL_PAGE	27
87 
88 enum gdma_queue_type {
89 	GDMA_INVALID_QUEUE,
90 	GDMA_SQ,
91 	GDMA_RQ,
92 	GDMA_CQ,
93 	GDMA_EQ,
94 };
95 
96 enum gdma_work_request_flags {
97 	GDMA_WR_NONE			= 0,
98 	GDMA_WR_OOB_IN_SGL		= BIT(0),
99 	GDMA_WR_PAD_BY_SGE0		= BIT(1),
100 };
101 
102 enum gdma_eqe_type {
103 	GDMA_EQE_COMPLETION		= 3,
104 	GDMA_EQE_TEST_EVENT		= 64,
105 	GDMA_EQE_HWC_INIT_EQ_ID_DB	= 129,
106 	GDMA_EQE_HWC_INIT_DATA		= 130,
107 	GDMA_EQE_HWC_INIT_DONE		= 131,
108 };
109 
110 enum {
111 	GDMA_DEVICE_NONE	= 0,
112 	GDMA_DEVICE_HWC		= 1,
113 	GDMA_DEVICE_MANA	= 2,
114 };
115 
116 typedef uint64_t gdma_obj_handle_t;
117 
118 struct gdma_resource {
119 	/* Protect the bitmap */
120 	struct mtx		lock_spin;
121 
122 	/* The bitmap size in bits. */
123 	uint32_t		size;
124 
125 	/* The bitmap tracks the resources. */
126 	unsigned long		*map;
127 };
128 
129 union gdma_doorbell_entry {
130 	uint64_t		as_uint64;
131 
132 	struct {
133 		uint64_t id		: 24;
134 		uint64_t reserved	: 8;
135 		uint64_t tail_ptr	: 31;
136 		uint64_t arm		: 1;
137 	} cq;
138 
139 	struct {
140 		uint64_t id		: 24;
141 		uint64_t wqe_cnt	: 8;
142 		uint64_t tail_ptr	: 32;
143 	} rq;
144 
145 	struct {
146 		uint64_t id		: 24;
147 		uint64_t reserved	: 8;
148 		uint64_t tail_ptr	: 32;
149 	} sq;
150 
151 	struct {
152 		uint64_t id		: 16;
153 		uint64_t reserved	: 16;
154 		uint64_t tail_ptr	: 31;
155 		uint64_t arm		: 1;
156 	} eq;
157 }; /* HW DATA */
158 
159 struct gdma_msg_hdr {
160 	uint32_t	hdr_type;
161 	uint32_t	msg_type;
162 	uint16_t	msg_version;
163 	uint16_t	hwc_msg_id;
164 	uint32_t	msg_size;
165 }; /* HW DATA */
166 
167 struct gdma_dev_id {
168 	union {
169 		struct {
170 			uint16_t type;
171 			uint16_t instance;
172 		};
173 
174 		uint32_t as_uint32;
175 	};
176 }; /* HW DATA */
177 
178 struct gdma_req_hdr {
179 	struct gdma_msg_hdr	req;
180 	struct gdma_msg_hdr	resp; /* The expected response */
181 	struct gdma_dev_id	dev_id;
182 	uint32_t		activity_id;
183 }; /* HW DATA */
184 
185 struct gdma_resp_hdr {
186 	struct gdma_msg_hdr	response;
187 	struct gdma_dev_id	dev_id;
188 	uint32_t		activity_id;
189 	uint32_t		status;
190 	uint32_t		reserved;
191 }; /* HW DATA */
192 
193 struct gdma_general_req {
194 	struct gdma_req_hdr	hdr;
195 }; /* HW DATA */
196 
197 #define GDMA_MESSAGE_V1 1
198 
199 struct gdma_general_resp {
200 	struct gdma_resp_hdr	hdr;
201 }; /* HW DATA */
202 
203 #define GDMA_STANDARD_HEADER_TYPE	0
204 
205 static inline void
206 mana_gd_init_req_hdr(struct gdma_req_hdr *hdr, uint32_t code,
207     uint32_t req_size, uint32_t resp_size)
208 {
209 	hdr->req.hdr_type = GDMA_STANDARD_HEADER_TYPE;
210 	hdr->req.msg_type = code;
211 	hdr->req.msg_version = GDMA_MESSAGE_V1;
212 	hdr->req.msg_size = req_size;
213 
214 	hdr->resp.hdr_type = GDMA_STANDARD_HEADER_TYPE;
215 	hdr->resp.msg_type = code;
216 	hdr->resp.msg_version = GDMA_MESSAGE_V1;
217 	hdr->resp.msg_size = resp_size;
218 }
219 
220 /* The 16-byte struct is part of the GDMA work queue entry (WQE). */
221 struct gdma_sge {
222 	uint64_t		address;
223 	uint32_t		mem_key;
224 	uint32_t		size;
225 }; /* HW DATA */
226 
227 struct gdma_wqe_request {
228 	struct gdma_sge		*sgl;
229 	uint32_t		num_sge;
230 
231 	uint32_t		inline_oob_size;
232 	const void		*inline_oob_data;
233 
234 	uint32_t		flags;
235 	uint32_t		client_data_unit;
236 };
237 
238 enum gdma_page_type {
239 	GDMA_PAGE_TYPE_4K,
240 };
241 
242 #define GDMA_INVALID_DMA_REGION		0
243 
244 struct gdma_mem_info {
245 	device_t		dev;
246 
247 	bus_dma_tag_t		dma_tag;
248 	bus_dmamap_t		dma_map;
249 	bus_addr_t		dma_handle;	/* Physical address	*/
250 	void			*virt_addr;	/* Virtual address	*/
251 	uint64_t		length;
252 
253 	/* Allocated by the PF driver */
254 	gdma_obj_handle_t	dma_region_handle;
255 };
256 
257 #define REGISTER_ATB_MST_MKEY_LOWER_SIZE 8
258 
259 struct gdma_dev {
260 	struct gdma_context	*gdma_context;
261 
262 	struct gdma_dev_id	dev_id;
263 
264 	uint32_t		pdid;
265 	uint32_t		doorbell;
266 	uint32_t		gpa_mkey;
267 
268 	/* GDMA driver specific pointer */
269 	void			*driver_data;
270 };
271 
272 #define MINIMUM_SUPPORTED_PAGE_SIZE PAGE_SIZE
273 
274 #define GDMA_CQE_SIZE		64
275 #define GDMA_EQE_SIZE		16
276 #define GDMA_MAX_SQE_SIZE	512
277 #define GDMA_MAX_RQE_SIZE	256
278 
279 #define GDMA_COMP_DATA_SIZE	0x3C
280 
281 #define GDMA_EVENT_DATA_SIZE	0xC
282 
283 /* The WQE size must be a multiple of the Basic Unit, which is 32 bytes. */
284 #define GDMA_WQE_BU_SIZE	32
285 
286 #define INVALID_PDID		UINT_MAX
287 #define INVALID_DOORBELL	UINT_MAX
288 #define INVALID_MEM_KEY		UINT_MAX
289 #define INVALID_QUEUE_ID	UINT_MAX
290 #define INVALID_PCI_MSIX_INDEX  UINT_MAX
291 
292 struct gdma_comp {
293 	uint32_t		cqe_data[GDMA_COMP_DATA_SIZE / 4];
294 	uint32_t		wq_num;
295 	bool			is_sq;
296 };
297 
298 struct gdma_event {
299 	uint32_t		details[GDMA_EVENT_DATA_SIZE / 4];
300 	uint8_t			type;
301 };
302 
303 struct gdma_queue;
304 
305 typedef void gdma_eq_callback(void *context, struct gdma_queue *q,
306     struct gdma_event *e);
307 
308 typedef void gdma_cq_callback(void *context, struct gdma_queue *q);
309 
310 /* The 'head' is the producer index. For SQ/RQ, when the driver posts a WQE
311  * (Note: the WQE size must be a multiple of the 32-byte Basic Unit), the
312  * driver increases the 'head' in BUs rather than in bytes, and notifies
313  * the HW of the updated head. For EQ/CQ, the driver uses the 'head' to track
314  * the HW head, and increases the 'head' by 1 for every processed EQE/CQE.
315  *
316  * The 'tail' is the consumer index for SQ/RQ. After the CQE of the SQ/RQ is
317  * processed, the driver increases the 'tail' to indicate that WQEs have
318  * been consumed by the HW, so the driver can post new WQEs into the SQ/RQ.
319  *
320  * The driver doesn't use the 'tail' for EQ/CQ, because the driver ensures
321  * that the EQ/CQ is big enough so they can't overflow, and the driver uses
322  * the owner bits mechanism to detect if the queue has become empty.
323  */
324 struct gdma_queue {
325 	struct gdma_dev		*gdma_dev;
326 
327 	enum gdma_queue_type	type;
328 	uint32_t		id;
329 
330 	struct gdma_mem_info	mem_info;
331 
332 	void			*queue_mem_ptr;
333 	uint32_t		queue_size;
334 
335 	bool			monitor_avl_buf;
336 
337 	uint32_t		head;
338 	uint32_t		tail;
339 
340 	/* Extra fields specific to EQ/CQ. */
341 	union {
342 		struct {
343 			bool			disable_needed;
344 
345 			gdma_eq_callback	*callback;
346 			void			*context;
347 
348 			unsigned int		msix_index;
349 
350 			uint32_t		log2_throttle_limit;
351 		} eq;
352 
353 		struct {
354 			gdma_cq_callback	*callback;
355 			void			*context;
356 
357 			/* For CQ/EQ relationship */
358 			struct gdma_queue	*parent;
359 		} cq;
360 	};
361 };
362 
363 struct gdma_queue_spec {
364 	enum gdma_queue_type	type;
365 	bool			monitor_avl_buf;
366 	unsigned int		queue_size;
367 
368 	/* Extra fields specific to EQ/CQ. */
369 	union {
370 		struct {
371 			gdma_eq_callback	*callback;
372 			void			*context;
373 
374 			unsigned long		log2_throttle_limit;
375 		} eq;
376 
377 		struct {
378 			gdma_cq_callback	*callback;
379 			void			*context;
380 
381 			struct			gdma_queue *parent_eq;
382 
383 		} cq;
384 	};
385 };
386 
387 struct mana_eq {
388 	struct gdma_queue	*eq;
389 };
390 
391 struct gdma_irq_context {
392 	struct gdma_msix_entry	msix_e;
393 	struct resource		*res;
394 	driver_intr_t		*handler;
395 	void			*arg;
396 	void			*cookie;
397 	bool			requested;
398 	int			cpu;
399 	char			name[GDMA_IRQNAME_SZ];
400 };
401 
402 struct gdma_context {
403 	device_t		dev;
404 
405 	struct gdma_bus		gd_bus;
406 
407 	/* Per-vPort max number of queues */
408 	unsigned int		max_num_queues;
409 	unsigned int		max_num_msix;
410 	unsigned int		num_msix_usable;
411 	struct gdma_resource	msix_resource;
412 	struct gdma_irq_context	*irq_contexts;
413 
414 	/* This maps a CQ index to the queue structure. */
415 	unsigned int		max_num_cqs;
416 	struct gdma_queue	**cq_table;
417 
418 	/* Protect eq_test_event and test_event_eq_id  */
419 	struct sx		eq_test_event_sx;
420 	struct completion	eq_test_event;
421 	uint32_t		test_event_eq_id;
422 
423 	struct resource		*bar0;
424 	struct resource		*msix;
425 	int			msix_rid;
426 	void __iomem		*shm_base;
427 	void __iomem		*db_page_base;
428 	vm_paddr_t		phys_db_page_base;
429 	uint32_t		db_page_size;
430 
431 	/* Shared memory chanenl (used to bootstrap HWC) */
432 	struct shm_channel	shm_channel;
433 
434 	/* Hardware communication channel (HWC) */
435 	struct gdma_dev		hwc;
436 
437 	/* Azure network adapter */
438 	struct gdma_dev		mana;
439 };
440 
441 #define MAX_NUM_GDMA_DEVICES	4
442 
443 static inline bool mana_gd_is_mana(struct gdma_dev *gd)
444 {
445 	return gd->dev_id.type == GDMA_DEVICE_MANA;
446 }
447 
448 static inline bool mana_gd_is_hwc(struct gdma_dev *gd)
449 {
450 	return gd->dev_id.type == GDMA_DEVICE_HWC;
451 }
452 
453 uint8_t *mana_gd_get_wqe_ptr(const struct gdma_queue *wq, uint32_t wqe_offset);
454 uint32_t mana_gd_wq_avail_space(struct gdma_queue *wq);
455 
456 int mana_gd_test_eq(struct gdma_context *gc, struct gdma_queue *eq);
457 
458 int mana_gd_create_hwc_queue(struct gdma_dev *gd,
459     const struct gdma_queue_spec *spec,
460     struct gdma_queue **queue_ptr);
461 
462 int mana_gd_create_mana_eq(struct gdma_dev *gd,
463     const struct gdma_queue_spec *spec,
464     struct gdma_queue **queue_ptr);
465 
466 int mana_gd_create_mana_wq_cq(struct gdma_dev *gd,
467     const struct gdma_queue_spec *spec,
468     struct gdma_queue **queue_ptr);
469 
470 void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue *queue);
471 
472 int mana_gd_poll_cq(struct gdma_queue *cq, struct gdma_comp *comp, int num_cqe);
473 
474 void mana_gd_ring_cq(struct gdma_queue *cq, uint8_t arm_bit);
475 
476 struct gdma_wqe {
477 	uint32_t reserved	:24;
478 	uint32_t last_vbytes	:8;
479 
480 	union {
481 		uint32_t flags;
482 
483 		struct {
484 			uint32_t num_sge		:8;
485 			uint32_t inline_oob_size_div4	:3;
486 			uint32_t client_oob_in_sgl	:1;
487 			uint32_t reserved1		:4;
488 			uint32_t client_data_unit	:14;
489 			uint32_t reserved2		:2;
490 		};
491 	};
492 }; /* HW DATA */
493 
494 #define INLINE_OOB_SMALL_SIZE	8
495 #define INLINE_OOB_LARGE_SIZE	24
496 
497 #define MAX_TX_WQE_SIZE		512
498 #define MAX_RX_WQE_SIZE		256
499 
500 #define MAX_TX_WQE_SGL_ENTRIES	((GDMA_MAX_SQE_SIZE -			   \
501 			sizeof(struct gdma_sge) - INLINE_OOB_SMALL_SIZE) / \
502 			sizeof(struct gdma_sge))
503 
504 #define MAX_RX_WQE_SGL_ENTRIES	((GDMA_MAX_RQE_SIZE -			   \
505 			sizeof(struct gdma_sge)) / sizeof(struct gdma_sge))
506 
507 struct gdma_cqe {
508 	uint32_t cqe_data[GDMA_COMP_DATA_SIZE / 4];
509 
510 	union {
511 		uint32_t as_uint32;
512 
513 		struct {
514 			uint32_t wq_num		:24;
515 			uint32_t is_sq		:1;
516 			uint32_t reserved	:4;
517 			uint32_t owner_bits	:3;
518 		};
519 	} cqe_info;
520 }; /* HW DATA */
521 
522 #define GDMA_CQE_OWNER_BITS	3
523 
524 #define GDMA_CQE_OWNER_MASK	((1 << GDMA_CQE_OWNER_BITS) - 1)
525 
526 #define SET_ARM_BIT		1
527 
528 #define GDMA_EQE_OWNER_BITS	3
529 
530 union gdma_eqe_info {
531 	uint32_t as_uint32;
532 
533 	struct {
534 		uint32_t type		: 8;
535 		uint32_t reserved1	: 8;
536 		uint32_t client_id	: 2;
537 		uint32_t reserved2	: 11;
538 		uint32_t owner_bits	: 3;
539 	};
540 }; /* HW DATA */
541 
542 #define GDMA_EQE_OWNER_MASK	((1 << GDMA_EQE_OWNER_BITS) - 1)
543 #define INITIALIZED_OWNER_BIT(log2_num_entries)	(1UL << (log2_num_entries))
544 
545 struct gdma_eqe {
546 	uint32_t details[GDMA_EVENT_DATA_SIZE / 4];
547 	uint32_t eqe_info;
548 }; /* HW DATA */
549 
550 #define GDMA_REG_DB_PAGE_OFFSET	8
551 #define GDMA_REG_DB_PAGE_SIZE	0x10
552 #define GDMA_REG_SHM_OFFSET	0x18
553 
554 struct gdma_posted_wqe_info {
555 	uint32_t wqe_size_in_bu;
556 };
557 
558 /* GDMA_GENERATE_TEST_EQE */
559 struct gdma_generate_test_event_req {
560 	struct gdma_req_hdr hdr;
561 	uint32_t queue_index;
562 }; /* HW DATA */
563 
564 /* GDMA_VERIFY_VF_DRIVER_VERSION */
565 enum {
566 	GDMA_PROTOCOL_V1	= 1,
567 	GDMA_PROTOCOL_FIRST	= GDMA_PROTOCOL_V1,
568 	GDMA_PROTOCOL_LAST	= GDMA_PROTOCOL_V1,
569 };
570 
571 struct gdma_verify_ver_req {
572 	struct gdma_req_hdr hdr;
573 
574 	/* Mandatory fields required for protocol establishment */
575 	uint64_t protocol_ver_min;
576 	uint64_t protocol_ver_max;
577 	uint64_t drv_cap_flags1;
578 	uint64_t drv_cap_flags2;
579 	uint64_t drv_cap_flags3;
580 	uint64_t drv_cap_flags4;
581 
582 	/* Advisory fields */
583 	uint64_t drv_ver;
584 	uint32_t os_type; /* Linux = 0x10; Windows = 0x20; Other = 0x30 */
585 	uint32_t reserved;
586 	uint32_t os_ver_major;
587 	uint32_t os_ver_minor;
588 	uint32_t os_ver_build;
589 	uint32_t os_ver_platform;
590 	uint64_t reserved_2;
591 	uint8_t os_ver_str1[128];
592 	uint8_t os_ver_str2[128];
593 	uint8_t os_ver_str3[128];
594 	uint8_t os_ver_str4[128];
595 }; /* HW DATA */
596 
597 struct gdma_verify_ver_resp {
598 	struct gdma_resp_hdr hdr;
599 	uint64_t gdma_protocol_ver;
600 	uint64_t pf_cap_flags1;
601 	uint64_t pf_cap_flags2;
602 	uint64_t pf_cap_flags3;
603 	uint64_t pf_cap_flags4;
604 }; /* HW DATA */
605 
606 /* GDMA_QUERY_MAX_RESOURCES */
607 struct gdma_query_max_resources_resp {
608 	struct gdma_resp_hdr hdr;
609 	uint32_t status;
610 	uint32_t max_sq;
611 	uint32_t max_rq;
612 	uint32_t max_cq;
613 	uint32_t max_eq;
614 	uint32_t max_db;
615 	uint32_t max_mst;
616 	uint32_t max_cq_mod_ctx;
617 	uint32_t max_mod_cq;
618 	uint32_t max_msix;
619 }; /* HW DATA */
620 
621 /* GDMA_LIST_DEVICES */
622 struct gdma_list_devices_resp {
623 	struct gdma_resp_hdr hdr;
624 	uint32_t num_of_devs;
625 	uint32_t reserved;
626 	struct gdma_dev_id devs[64];
627 }; /* HW DATA */
628 
629 /* GDMA_REGISTER_DEVICE */
630 struct gdma_register_device_resp {
631 	struct gdma_resp_hdr hdr;
632 	uint32_t pdid;
633 	uint32_t gpa_mkey;
634 	uint32_t db_id;
635 }; /* HW DATA */
636 
637 struct gdma_allocate_resource_range_req {
638 	struct gdma_req_hdr hdr;
639 	uint32_t resource_type;
640 	uint32_t num_resources;
641 	uint32_t alignment;
642 	uint32_t allocated_resources;
643 };
644 
645 struct gdma_allocate_resource_range_resp {
646 	struct gdma_resp_hdr hdr;
647 	uint32_t allocated_resources;
648 };
649 
650 struct gdma_destroy_resource_range_req {
651 	struct gdma_req_hdr hdr;
652 	uint32_t resource_type;
653 	uint32_t num_resources;
654 	uint32_t allocated_resources;
655 };
656 
657 /* GDMA_CREATE_QUEUE */
658 struct gdma_create_queue_req {
659 	struct gdma_req_hdr hdr;
660 	uint32_t type;
661 	uint32_t reserved1;
662 	uint32_t pdid;
663 	uint32_t doolbell_id;
664 	gdma_obj_handle_t gdma_region;
665 	uint32_t reserved2;
666 	uint32_t queue_size;
667 	uint32_t log2_throttle_limit;
668 	uint32_t eq_pci_msix_index;
669 	uint32_t cq_mod_ctx_id;
670 	uint32_t cq_parent_eq_id;
671 	uint8_t  rq_drop_on_overrun;
672 	uint8_t  rq_err_on_wqe_overflow;
673 	uint8_t  rq_chain_rec_wqes;
674 	uint8_t  sq_hw_db;
675 	uint32_t reserved3;
676 }; /* HW DATA */
677 
678 struct gdma_create_queue_resp {
679 	struct gdma_resp_hdr hdr;
680 	uint32_t queue_index;
681 }; /* HW DATA */
682 
683 /* GDMA_DISABLE_QUEUE */
684 struct gdma_disable_queue_req {
685 	struct gdma_req_hdr hdr;
686 	uint32_t type;
687 	uint32_t queue_index;
688 	uint32_t alloc_res_id_on_creation;
689 }; /* HW DATA */
690 
691 enum atb_page_size {
692 	ATB_PAGE_SIZE_4K,
693 	ATB_PAGE_SIZE_8K,
694 	ATB_PAGE_SIZE_16K,
695 	ATB_PAGE_SIZE_32K,
696 	ATB_PAGE_SIZE_64K,
697 	ATB_PAGE_SIZE_128K,
698 	ATB_PAGE_SIZE_256K,
699 	ATB_PAGE_SIZE_512K,
700 	ATB_PAGE_SIZE_1M,
701 	ATB_PAGE_SIZE_2M,
702 	ATB_PAGE_SIZE_MAX,
703 };
704 
705 enum gdma_mr_access_flags {
706 	GDMA_ACCESS_FLAG_LOCAL_READ = BIT(0),
707 	GDMA_ACCESS_FLAG_LOCAL_WRITE = BIT(1),
708 	GDMA_ACCESS_FLAG_REMOTE_READ = BIT(2),
709 	GDMA_ACCESS_FLAG_REMOTE_WRITE = BIT(3),
710 	GDMA_ACCESS_FLAG_REMOTE_ATOMIC = BIT(4),
711 };
712 
713 /* GDMA_CREATE_DMA_REGION */
714 struct gdma_create_dma_region_req {
715 	struct gdma_req_hdr hdr;
716 
717 	/* The total size of the DMA region */
718 	uint64_t length;
719 
720 	/* The offset in the first page */
721 	uint32_t offset_in_page;
722 
723 	/* enum gdma_page_type */
724 	uint32_t gdma_page_type;
725 
726 	/* The total number of pages */
727 	uint32_t page_count;
728 
729 	/* If page_addr_list_len is smaller than page_count,
730 	 * the remaining page addresses will be added via the
731 	 * message GDMA_DMA_REGION_ADD_PAGES.
732 	 */
733 	uint32_t page_addr_list_len;
734 	uint64_t page_addr_list[];
735 }; /* HW DATA */
736 
737 struct gdma_create_dma_region_resp {
738 	struct gdma_resp_hdr hdr;
739 	gdma_obj_handle_t dma_region_handle;
740 }; /* HW DATA */
741 
742 /* GDMA_DMA_REGION_ADD_PAGES */
743 struct gdma_dma_region_add_pages_req {
744 	struct gdma_req_hdr hdr;
745 
746 	gdma_obj_handle_t dma_region_handle;
747 
748 	uint32_t page_addr_list_len;
749 	uint32_t reserved3;
750 
751 	uint64_t page_addr_list[];
752 }; /* HW DATA */
753 
754 /* GDMA_DESTROY_DMA_REGION */
755 struct gdma_destroy_dma_region_req {
756 	struct gdma_req_hdr hdr;
757 
758 	gdma_obj_handle_t dma_region_handle;
759 }; /* HW DATA */
760 
761 enum gdma_pd_flags {
762 	GDMA_PD_FLAG_INVALID = 0,
763 };
764 
765 struct gdma_create_pd_req {
766 	struct gdma_req_hdr hdr;
767 	enum gdma_pd_flags flags;
768 	uint32_t reserved;
769 };/* HW DATA */
770 
771 struct gdma_create_pd_resp {
772 	struct gdma_resp_hdr hdr;
773 	gdma_obj_handle_t pd_handle;
774 	uint32_t pd_id;
775 	uint32_t reserved;
776 };/* HW DATA */
777 
778 struct gdma_destroy_pd_req {
779 	struct gdma_req_hdr hdr;
780 	gdma_obj_handle_t pd_handle;
781 };/* HW DATA */
782 
783 struct gdma_destory_pd_resp {
784 	struct gdma_resp_hdr hdr;
785 };/* HW DATA */
786 
787 enum gdma_mr_type {
788 	/* Guest Virtual Address - MRs of this type allow access
789 	 * to memory mapped by PTEs associated with this MR using a virtual
790 	 * address that is set up in the MST
791 	 */
792 	GDMA_MR_TYPE_GVA = 2,
793 };
794 
795 struct gdma_create_mr_params {
796 	gdma_obj_handle_t pd_handle;
797 	enum gdma_mr_type mr_type;
798 	union {
799 		struct {
800 			gdma_obj_handle_t dma_region_handle;
801 			uint64_t virtual_address;
802 			enum gdma_mr_access_flags access_flags;
803 		} gva;
804 	};
805 };
806 
807 struct gdma_create_mr_request {
808 	struct gdma_req_hdr hdr;
809 	gdma_obj_handle_t pd_handle;
810 	enum gdma_mr_type mr_type;
811 	uint32_t reserved_1;
812 
813 	union {
814 		struct {
815 			gdma_obj_handle_t dma_region_handle;
816 			uint64_t virtual_address;
817 			enum gdma_mr_access_flags access_flags;
818 		} gva;
819 
820 	};
821 	uint32_t reserved_2;
822 };/* HW DATA */
823 
824 struct gdma_create_mr_response {
825 	struct gdma_resp_hdr hdr;
826 	gdma_obj_handle_t mr_handle;
827 	uint32_t lkey;
828 	uint32_t rkey;
829 };/* HW DATA */
830 
831 struct gdma_destroy_mr_request {
832 	struct gdma_req_hdr hdr;
833 	gdma_obj_handle_t mr_handle;
834 };/* HW DATA */
835 
836 struct gdma_destroy_mr_response {
837 	struct gdma_resp_hdr hdr;
838 };/* HW DATA */
839 
840 int mana_gd_verify_vf_version(device_t dev);
841 
842 int mana_gd_register_device(struct gdma_dev *gd);
843 int mana_gd_deregister_device(struct gdma_dev *gd);
844 
845 int mana_gd_post_work_request(struct gdma_queue *wq,
846     const struct gdma_wqe_request *wqe_req,
847     struct gdma_posted_wqe_info *wqe_info);
848 
849 int mana_gd_post_and_ring(struct gdma_queue *queue,
850     const struct gdma_wqe_request *wqe,
851     struct gdma_posted_wqe_info *wqe_info);
852 
853 int mana_gd_alloc_res_map(uint32_t res_avil, struct gdma_resource *r,
854     const char *lock_name);
855 void mana_gd_free_res_map(struct gdma_resource *r);
856 
857 void mana_gd_wq_ring_doorbell(struct gdma_context *gc,
858     struct gdma_queue *queue);
859 
860 int mana_gd_alloc_memory(struct gdma_context *gc, unsigned int length,
861     struct gdma_mem_info *gmi);
862 
863 void mana_gd_free_memory(struct gdma_mem_info *gmi);
864 
865 void mana_gd_dma_map_paddr(void *arg, bus_dma_segment_t *segs,
866     int nseg, int error);
867 
868 int mana_gd_send_request(struct gdma_context *gc, uint32_t req_len,
869     const void *req, uint32_t resp_len, void *resp);
870 
871 int mana_gd_allocate_doorbell_page(struct gdma_context *gc,
872     int *doorbell_page);
873 
874 int mana_gd_destroy_doorbell_page(struct gdma_context *gc,
875     int doorbell_page);
876 
877 int mana_gd_destroy_dma_region(struct gdma_context *gc,
878     gdma_obj_handle_t dma_region_handle);
879 #endif /* _GDMA_H */
880