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