xref: /dpdk/drivers/net/gve/base/gve_adminq.h (revision eb8ec5c3452a35e02dbb928b19d6c394e5e7e658)
1f86e5ed8SJunfeng Guo /* SPDX-License-Identifier: MIT
2f86e5ed8SJunfeng Guo  * Google Virtual Ethernet (gve) driver
3748d0e7fSRushil Gupta  * Copyright (C) 2015-2023 Google, Inc.
4f86e5ed8SJunfeng Guo  */
5f86e5ed8SJunfeng Guo 
6f86e5ed8SJunfeng Guo #ifndef _GVE_ADMINQ_H
7f86e5ed8SJunfeng Guo #define _GVE_ADMINQ_H
8f86e5ed8SJunfeng Guo 
9c9ba2cafSJunfeng Guo #include "gve_osdep.h"
10c9ba2cafSJunfeng Guo 
11f86e5ed8SJunfeng Guo /* Admin queue opcodes */
12f86e5ed8SJunfeng Guo enum gve_adminq_opcodes {
13f86e5ed8SJunfeng Guo 	GVE_ADMINQ_DESCRIBE_DEVICE		= 0x1,
14f86e5ed8SJunfeng Guo 	GVE_ADMINQ_CONFIGURE_DEVICE_RESOURCES	= 0x2,
15f86e5ed8SJunfeng Guo 	GVE_ADMINQ_REGISTER_PAGE_LIST		= 0x3,
16f86e5ed8SJunfeng Guo 	GVE_ADMINQ_UNREGISTER_PAGE_LIST		= 0x4,
17f86e5ed8SJunfeng Guo 	GVE_ADMINQ_CREATE_TX_QUEUE		= 0x5,
18f86e5ed8SJunfeng Guo 	GVE_ADMINQ_CREATE_RX_QUEUE		= 0x6,
19f86e5ed8SJunfeng Guo 	GVE_ADMINQ_DESTROY_TX_QUEUE		= 0x7,
20f86e5ed8SJunfeng Guo 	GVE_ADMINQ_DESTROY_RX_QUEUE		= 0x8,
21f86e5ed8SJunfeng Guo 	GVE_ADMINQ_DECONFIGURE_DEVICE_RESOURCES	= 0x9,
22179f293bSJoshua Washington 	GVE_ADMINQ_CONFIGURE_RSS		= 0xA,
23f86e5ed8SJunfeng Guo 	GVE_ADMINQ_SET_DRIVER_PARAMETER		= 0xB,
24f86e5ed8SJunfeng Guo 	GVE_ADMINQ_REPORT_STATS			= 0xC,
25f86e5ed8SJunfeng Guo 	GVE_ADMINQ_REPORT_LINK_SPEED		= 0xD,
26f86e5ed8SJunfeng Guo 	GVE_ADMINQ_GET_PTYPE_MAP		= 0xE,
27748d0e7fSRushil Gupta 	GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY	= 0xF,
28f86e5ed8SJunfeng Guo };
29f86e5ed8SJunfeng Guo 
30f86e5ed8SJunfeng Guo /* Admin queue status codes */
31f86e5ed8SJunfeng Guo enum gve_adminq_statuses {
32f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_UNSET			= 0x0,
33f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_PASSED			= 0x1,
34f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_ABORTED		= 0xFFFFFFF0,
35f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_ALREADY_EXISTS		= 0xFFFFFFF1,
36f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_CANCELLED		= 0xFFFFFFF2,
37f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_DATALOSS		= 0xFFFFFFF3,
38f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_DEADLINE_EXCEEDED	= 0xFFFFFFF4,
39f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_FAILED_PRECONDITION	= 0xFFFFFFF5,
40f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_INTERNAL_ERROR		= 0xFFFFFFF6,
41f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_INVALID_ARGUMENT	= 0xFFFFFFF7,
42f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_NOT_FOUND		= 0xFFFFFFF8,
43f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_OUT_OF_RANGE		= 0xFFFFFFF9,
44f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_PERMISSION_DENIED	= 0xFFFFFFFA,
45f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_UNAUTHENTICATED	= 0xFFFFFFFB,
46f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_RESOURCE_EXHAUSTED	= 0xFFFFFFFC,
47f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_UNAVAILABLE		= 0xFFFFFFFD,
48f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_UNIMPLEMENTED		= 0xFFFFFFFE,
49f86e5ed8SJunfeng Guo 	GVE_ADMINQ_COMMAND_ERROR_UNKNOWN_ERROR		= 0xFFFFFFFF,
50f86e5ed8SJunfeng Guo };
51f86e5ed8SJunfeng Guo 
52f86e5ed8SJunfeng Guo #define GVE_ADMINQ_DEVICE_DESCRIPTOR_VERSION 1
53f86e5ed8SJunfeng Guo 
54f86e5ed8SJunfeng Guo /* All AdminQ command structs should be naturally packed.
55f86e5ed8SJunfeng Guo  * GVE_CHECK_STRUCT/UNION_LEN will check struct/union length and throw
56f86e5ed8SJunfeng Guo  * error at compile time when the size is not correct.
57f86e5ed8SJunfeng Guo  */
58f86e5ed8SJunfeng Guo 
59f86e5ed8SJunfeng Guo struct gve_adminq_describe_device {
60f86e5ed8SJunfeng Guo 	__be64 device_descriptor_addr;
61f86e5ed8SJunfeng Guo 	__be32 device_descriptor_version;
62f86e5ed8SJunfeng Guo 	__be32 available_length;
63f86e5ed8SJunfeng Guo };
64f86e5ed8SJunfeng Guo 
65f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, gve_adminq_describe_device);
66f86e5ed8SJunfeng Guo 
67f86e5ed8SJunfeng Guo struct gve_device_descriptor {
68f86e5ed8SJunfeng Guo 	__be64 max_registered_pages;
69f86e5ed8SJunfeng Guo 	__be16 reserved1;
70f86e5ed8SJunfeng Guo 	__be16 tx_queue_entries;
71f86e5ed8SJunfeng Guo 	__be16 rx_queue_entries;
72f86e5ed8SJunfeng Guo 	__be16 default_num_queues;
73f86e5ed8SJunfeng Guo 	__be16 mtu;
74f86e5ed8SJunfeng Guo 	__be16 counters;
75f86e5ed8SJunfeng Guo 	__be16 tx_pages_per_qpl;
76f86e5ed8SJunfeng Guo 	__be16 rx_pages_per_qpl;
77f86e5ed8SJunfeng Guo 	u8  mac[ETH_ALEN];
78f86e5ed8SJunfeng Guo 	__be16 num_device_options;
79f86e5ed8SJunfeng Guo 	__be16 total_length;
80f86e5ed8SJunfeng Guo 	u8  reserved2[6];
81f86e5ed8SJunfeng Guo };
82f86e5ed8SJunfeng Guo 
83f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(40, gve_device_descriptor);
84f86e5ed8SJunfeng Guo 
85f86e5ed8SJunfeng Guo struct gve_device_option {
86f86e5ed8SJunfeng Guo 	__be16 option_id;
87f86e5ed8SJunfeng Guo 	__be16 option_length;
88f86e5ed8SJunfeng Guo 	__be32 required_features_mask;
89f86e5ed8SJunfeng Guo };
90f86e5ed8SJunfeng Guo 
91f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_device_option);
92f86e5ed8SJunfeng Guo 
93f86e5ed8SJunfeng Guo struct gve_device_option_gqi_rda {
94f86e5ed8SJunfeng Guo 	__be32 supported_features_mask;
95f86e5ed8SJunfeng Guo };
96f86e5ed8SJunfeng Guo 
97f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_device_option_gqi_rda);
98f86e5ed8SJunfeng Guo 
99f86e5ed8SJunfeng Guo struct gve_device_option_gqi_qpl {
100f86e5ed8SJunfeng Guo 	__be32 supported_features_mask;
101f86e5ed8SJunfeng Guo };
102f86e5ed8SJunfeng Guo 
103f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_device_option_gqi_qpl);
104f86e5ed8SJunfeng Guo 
105f86e5ed8SJunfeng Guo struct gve_device_option_dqo_rda {
106f86e5ed8SJunfeng Guo 	__be32 supported_features_mask;
107f86e5ed8SJunfeng Guo 	__be16 tx_comp_ring_entries;
108f86e5ed8SJunfeng Guo 	__be16 rx_buff_ring_entries;
109f86e5ed8SJunfeng Guo };
110f86e5ed8SJunfeng Guo 
111f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_device_option_dqo_rda);
112f86e5ed8SJunfeng Guo 
113*eb8ec5c3SJoshua Washington struct gve_ring_size_bound {
114*eb8ec5c3SJoshua Washington 	__be16 rx;
115*eb8ec5c3SJoshua Washington 	__be16 tx;
116b6af400eSJoshua Washington };
117b6af400eSJoshua Washington 
118*eb8ec5c3SJoshua Washington GVE_CHECK_STRUCT_LEN(4, gve_ring_size_bound);
119*eb8ec5c3SJoshua Washington 
120*eb8ec5c3SJoshua Washington struct gve_device_option_modify_ring {
121*eb8ec5c3SJoshua Washington 	__be32 supported_features_mask;
122*eb8ec5c3SJoshua Washington 	struct gve_ring_size_bound max_ring_size;
123*eb8ec5c3SJoshua Washington 	struct gve_ring_size_bound min_ring_size;
124*eb8ec5c3SJoshua Washington };
125*eb8ec5c3SJoshua Washington 
126*eb8ec5c3SJoshua Washington GVE_CHECK_STRUCT_LEN(12, gve_device_option_modify_ring);
127b6af400eSJoshua Washington 
128f86e5ed8SJunfeng Guo struct gve_device_option_jumbo_frames {
129f86e5ed8SJunfeng Guo 	__be32 supported_features_mask;
130f86e5ed8SJunfeng Guo 	__be16 max_mtu;
131f86e5ed8SJunfeng Guo 	u8 padding[2];
132f86e5ed8SJunfeng Guo };
133f86e5ed8SJunfeng Guo 
134f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_device_option_jumbo_frames);
135f86e5ed8SJunfeng Guo 
136f86e5ed8SJunfeng Guo /* Terminology:
137f86e5ed8SJunfeng Guo  *
138f86e5ed8SJunfeng Guo  * RDA - Raw DMA Addressing - Buffers associated with SKBs are directly DMA
139f86e5ed8SJunfeng Guo  *       mapped and read/updated by the device.
140f86e5ed8SJunfeng Guo  *
141f86e5ed8SJunfeng Guo  * QPL - Queue Page Lists - Driver uses bounce buffers which are DMA mapped with
142f86e5ed8SJunfeng Guo  *       the device for read/write and data is copied from/to SKBs.
143f86e5ed8SJunfeng Guo  */
144f86e5ed8SJunfeng Guo enum gve_dev_opt_id {
145f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_ID_GQI_RAW_ADDRESSING = 0x1,
146f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_ID_GQI_RDA = 0x2,
147f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_ID_GQI_QPL = 0x3,
148f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_ID_DQO_RDA = 0x4,
149b6af400eSJoshua Washington 	GVE_DEV_OPT_ID_MODIFY_RING = 0x6,
150f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_ID_JUMBO_FRAMES = 0x8,
151f86e5ed8SJunfeng Guo };
152f86e5ed8SJunfeng Guo 
153f86e5ed8SJunfeng Guo enum gve_dev_opt_req_feat_mask {
154f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_REQ_FEAT_MASK_GQI_RAW_ADDRESSING = 0x0,
155f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_REQ_FEAT_MASK_GQI_RDA = 0x0,
156f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_REQ_FEAT_MASK_GQI_QPL = 0x0,
157f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_REQ_FEAT_MASK_DQO_RDA = 0x0,
158b6af400eSJoshua Washington 	GVE_DEV_OPT_REQ_FEAT_MASK_MODIFY_RING = 0x0,
159f86e5ed8SJunfeng Guo 	GVE_DEV_OPT_REQ_FEAT_MASK_JUMBO_FRAMES = 0x0,
160f86e5ed8SJunfeng Guo };
161f86e5ed8SJunfeng Guo 
162f86e5ed8SJunfeng Guo enum gve_sup_feature_mask {
163b6af400eSJoshua Washington 	GVE_SUP_MODIFY_RING_MASK = 1 << 0,
164f86e5ed8SJunfeng Guo 	GVE_SUP_JUMBO_FRAMES_MASK = 1 << 2,
165f86e5ed8SJunfeng Guo };
166f86e5ed8SJunfeng Guo 
167f86e5ed8SJunfeng Guo #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0
168748d0e7fSRushil Gupta enum gve_driver_capbility {
169748d0e7fSRushil Gupta 	gve_driver_capability_gqi_qpl = 0,
170748d0e7fSRushil Gupta 	gve_driver_capability_gqi_rda = 1,
171748d0e7fSRushil Gupta 	gve_driver_capability_dqo_qpl = 2, /* reserved for future use */
172748d0e7fSRushil Gupta 	gve_driver_capability_dqo_rda = 3,
173748d0e7fSRushil Gupta };
174748d0e7fSRushil Gupta 
175748d0e7fSRushil Gupta #define GVE_CAP1(a) BIT((int)a)
176748d0e7fSRushil Gupta 
177748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS1 \
178748d0e7fSRushil Gupta 	(GVE_CAP1(gve_driver_capability_gqi_qpl) | \
179748d0e7fSRushil Gupta 	 GVE_CAP1(gve_driver_capability_gqi_rda) | \
180748d0e7fSRushil Gupta 	 GVE_CAP1(gve_driver_capability_dqo_rda))
181748d0e7fSRushil Gupta 
182748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0
183748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0
184748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS4 0x0
185748d0e7fSRushil Gupta 
186748d0e7fSRushil Gupta struct gve_driver_info {
187748d0e7fSRushil Gupta 	u8 os_type;	/* 0x05 = DPDK */
188748d0e7fSRushil Gupta 	u8 driver_major;
189748d0e7fSRushil Gupta 	u8 driver_minor;
190748d0e7fSRushil Gupta 	u8 driver_sub;
191748d0e7fSRushil Gupta 	__be32 os_version_major;
192748d0e7fSRushil Gupta 	__be32 os_version_minor;
193748d0e7fSRushil Gupta 	__be32 os_version_sub;
194748d0e7fSRushil Gupta 	__be64 driver_capability_flags[4];
195748d0e7fSRushil Gupta 	u8 os_version_str1[OS_VERSION_STRLEN];
196748d0e7fSRushil Gupta 	u8 os_version_str2[OS_VERSION_STRLEN];
197748d0e7fSRushil Gupta };
198748d0e7fSRushil Gupta 
199748d0e7fSRushil Gupta struct gve_adminq_verify_driver_compatibility {
200748d0e7fSRushil Gupta 	__be64 driver_info_len;
201748d0e7fSRushil Gupta 	__be64 driver_info_addr;
202748d0e7fSRushil Gupta };
203748d0e7fSRushil Gupta 
204748d0e7fSRushil Gupta GVE_CHECK_STRUCT_LEN(16,  gve_adminq_verify_driver_compatibility);
205748d0e7fSRushil Gupta 
206f86e5ed8SJunfeng Guo 
207f86e5ed8SJunfeng Guo struct gve_adminq_configure_device_resources {
208f86e5ed8SJunfeng Guo 	__be64 counter_array;
209f86e5ed8SJunfeng Guo 	__be64 irq_db_addr;
210f86e5ed8SJunfeng Guo 	__be32 num_counters;
211f86e5ed8SJunfeng Guo 	__be32 num_irq_dbs;
212f86e5ed8SJunfeng Guo 	__be32 irq_db_stride;
213f86e5ed8SJunfeng Guo 	__be32 ntfy_blk_msix_base_idx;
214f86e5ed8SJunfeng Guo 	u8 queue_format;
215f86e5ed8SJunfeng Guo 	u8 padding[7];
216f86e5ed8SJunfeng Guo };
217f86e5ed8SJunfeng Guo 
218f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(40, gve_adminq_configure_device_resources);
219f86e5ed8SJunfeng Guo 
220f86e5ed8SJunfeng Guo struct gve_adminq_register_page_list {
221f86e5ed8SJunfeng Guo 	__be32 page_list_id;
222f86e5ed8SJunfeng Guo 	__be32 num_pages;
223f86e5ed8SJunfeng Guo 	__be64 page_address_list_addr;
224f86e5ed8SJunfeng Guo };
225f86e5ed8SJunfeng Guo 
226f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, gve_adminq_register_page_list);
227f86e5ed8SJunfeng Guo 
228f86e5ed8SJunfeng Guo struct gve_adminq_unregister_page_list {
229f86e5ed8SJunfeng Guo 	__be32 page_list_id;
230f86e5ed8SJunfeng Guo };
231f86e5ed8SJunfeng Guo 
232f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_adminq_unregister_page_list);
233f86e5ed8SJunfeng Guo 
234f86e5ed8SJunfeng Guo #define GVE_RAW_ADDRESSING_QPL_ID 0xFFFFFFFF
235f86e5ed8SJunfeng Guo 
236f86e5ed8SJunfeng Guo struct gve_adminq_create_tx_queue {
237f86e5ed8SJunfeng Guo 	__be32 queue_id;
238f86e5ed8SJunfeng Guo 	__be32 reserved;
239f86e5ed8SJunfeng Guo 	__be64 queue_resources_addr;
240f86e5ed8SJunfeng Guo 	__be64 tx_ring_addr;
241f86e5ed8SJunfeng Guo 	__be32 queue_page_list_id;
242f86e5ed8SJunfeng Guo 	__be32 ntfy_id;
243f86e5ed8SJunfeng Guo 	__be64 tx_comp_ring_addr;
244f86e5ed8SJunfeng Guo 	__be16 tx_ring_size;
245f86e5ed8SJunfeng Guo 	__be16 tx_comp_ring_size;
246f86e5ed8SJunfeng Guo 	u8 padding[4];
247f86e5ed8SJunfeng Guo };
248f86e5ed8SJunfeng Guo 
249f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(48, gve_adminq_create_tx_queue);
250f86e5ed8SJunfeng Guo 
251f86e5ed8SJunfeng Guo struct gve_adminq_create_rx_queue {
252f86e5ed8SJunfeng Guo 	__be32 queue_id;
253f86e5ed8SJunfeng Guo 	__be32 index;
254f86e5ed8SJunfeng Guo 	__be32 reserved;
255f86e5ed8SJunfeng Guo 	__be32 ntfy_id;
256f86e5ed8SJunfeng Guo 	__be64 queue_resources_addr;
257f86e5ed8SJunfeng Guo 	__be64 rx_desc_ring_addr;
258f86e5ed8SJunfeng Guo 	__be64 rx_data_ring_addr;
259f86e5ed8SJunfeng Guo 	__be32 queue_page_list_id;
260f86e5ed8SJunfeng Guo 	__be16 rx_ring_size;
261f86e5ed8SJunfeng Guo 	__be16 packet_buffer_size;
262f86e5ed8SJunfeng Guo 	__be16 rx_buff_ring_size;
263f86e5ed8SJunfeng Guo 	u8 enable_rsc;
264f86e5ed8SJunfeng Guo 	u8 padding[5];
265f86e5ed8SJunfeng Guo };
266f86e5ed8SJunfeng Guo 
267f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(56, gve_adminq_create_rx_queue);
268f86e5ed8SJunfeng Guo 
269f86e5ed8SJunfeng Guo /* Queue resources that are shared with the device */
270f86e5ed8SJunfeng Guo struct gve_queue_resources {
271f86e5ed8SJunfeng Guo 	union {
272f86e5ed8SJunfeng Guo 		struct {
273f86e5ed8SJunfeng Guo 			__be32 db_index;	/* Device -> Guest */
274f86e5ed8SJunfeng Guo 			__be32 counter_index;	/* Device -> Guest */
275f86e5ed8SJunfeng Guo 		};
276f86e5ed8SJunfeng Guo 		u8 reserved[64];
277f86e5ed8SJunfeng Guo 	};
278f86e5ed8SJunfeng Guo };
279f86e5ed8SJunfeng Guo 
280f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(64, gve_queue_resources);
281f86e5ed8SJunfeng Guo 
282f86e5ed8SJunfeng Guo struct gve_adminq_destroy_tx_queue {
283f86e5ed8SJunfeng Guo 	__be32 queue_id;
284f86e5ed8SJunfeng Guo };
285f86e5ed8SJunfeng Guo 
286f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_adminq_destroy_tx_queue);
287f86e5ed8SJunfeng Guo 
288f86e5ed8SJunfeng Guo struct gve_adminq_destroy_rx_queue {
289f86e5ed8SJunfeng Guo 	__be32 queue_id;
290f86e5ed8SJunfeng Guo };
291f86e5ed8SJunfeng Guo 
292f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_adminq_destroy_rx_queue);
293f86e5ed8SJunfeng Guo 
294f86e5ed8SJunfeng Guo /* GVE Set Driver Parameter Types */
295f86e5ed8SJunfeng Guo enum gve_set_driver_param_types {
296f86e5ed8SJunfeng Guo 	GVE_SET_PARAM_MTU	= 0x1,
297f86e5ed8SJunfeng Guo };
298f86e5ed8SJunfeng Guo 
299f86e5ed8SJunfeng Guo struct gve_adminq_set_driver_parameter {
300f86e5ed8SJunfeng Guo 	__be32 parameter_type;
301f86e5ed8SJunfeng Guo 	u8 reserved[4];
302f86e5ed8SJunfeng Guo 	__be64 parameter_value;
303f86e5ed8SJunfeng Guo };
304f86e5ed8SJunfeng Guo 
305f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, gve_adminq_set_driver_parameter);
306f86e5ed8SJunfeng Guo 
307f86e5ed8SJunfeng Guo struct gve_adminq_report_stats {
308f86e5ed8SJunfeng Guo 	__be64 stats_report_len;
309f86e5ed8SJunfeng Guo 	__be64 stats_report_addr;
310f86e5ed8SJunfeng Guo 	__be64 interval;
311f86e5ed8SJunfeng Guo };
312f86e5ed8SJunfeng Guo 
313f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(24, gve_adminq_report_stats);
314f86e5ed8SJunfeng Guo 
315f86e5ed8SJunfeng Guo struct gve_adminq_report_link_speed {
316f86e5ed8SJunfeng Guo 	__be64 link_speed_address;
317f86e5ed8SJunfeng Guo };
318f86e5ed8SJunfeng Guo 
319f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_adminq_report_link_speed);
320f86e5ed8SJunfeng Guo 
321f86e5ed8SJunfeng Guo struct stats {
322f86e5ed8SJunfeng Guo 	__be32 stat_name;
323f86e5ed8SJunfeng Guo 	__be32 queue_id;
324f86e5ed8SJunfeng Guo 	__be64 value;
325f86e5ed8SJunfeng Guo };
326f86e5ed8SJunfeng Guo 
327f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, stats);
328f86e5ed8SJunfeng Guo 
329f86e5ed8SJunfeng Guo struct gve_stats_report {
330f86e5ed8SJunfeng Guo 	__be64 written_count;
331f86e5ed8SJunfeng Guo 	struct stats stats[];
332f86e5ed8SJunfeng Guo };
333f86e5ed8SJunfeng Guo 
334f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_stats_report);
335f86e5ed8SJunfeng Guo 
336458b53deSRushil Gupta /* Numbers of gve tx/rx stats in stats report. */
337458b53deSRushil Gupta #define GVE_TX_STATS_REPORT_NUM        6
338458b53deSRushil Gupta #define GVE_RX_STATS_REPORT_NUM        2
339458b53deSRushil Gupta 
340458b53deSRushil Gupta /* Interval to schedule a stats report update, 20000ms. */
341458b53deSRushil Gupta #define GVE_STATS_REPORT_TIMER_PERIOD  20000
342458b53deSRushil Gupta 
343458b53deSRushil Gupta /* Numbers of NIC tx/rx stats in stats report. */
344458b53deSRushil Gupta #define NIC_TX_STATS_REPORT_NUM        0
345458b53deSRushil Gupta #define NIC_RX_STATS_REPORT_NUM        4
346458b53deSRushil Gupta 
347f86e5ed8SJunfeng Guo enum gve_stat_names {
348f86e5ed8SJunfeng Guo 	/* stats from gve */
349f86e5ed8SJunfeng Guo 	TX_WAKE_CNT			= 1,
350f86e5ed8SJunfeng Guo 	TX_STOP_CNT			= 2,
351f86e5ed8SJunfeng Guo 	TX_FRAMES_SENT			= 3,
352f86e5ed8SJunfeng Guo 	TX_BYTES_SENT			= 4,
353f86e5ed8SJunfeng Guo 	TX_LAST_COMPLETION_PROCESSED	= 5,
354f86e5ed8SJunfeng Guo 	RX_NEXT_EXPECTED_SEQUENCE	= 6,
355f86e5ed8SJunfeng Guo 	RX_BUFFERS_POSTED		= 7,
356f86e5ed8SJunfeng Guo 	TX_TIMEOUT_CNT			= 8,
357f86e5ed8SJunfeng Guo 	/* stats from NIC */
358f86e5ed8SJunfeng Guo 	RX_QUEUE_DROP_CNT		= 65,
359f86e5ed8SJunfeng Guo 	RX_NO_BUFFERS_POSTED		= 66,
360f86e5ed8SJunfeng Guo 	RX_DROPS_PACKET_OVER_MRU	= 67,
361f86e5ed8SJunfeng Guo 	RX_DROPS_INVALID_CHECKSUM	= 68,
362f86e5ed8SJunfeng Guo };
363f86e5ed8SJunfeng Guo 
364f86e5ed8SJunfeng Guo enum gve_l3_type {
365f86e5ed8SJunfeng Guo 	/* Must be zero so zero initialized LUT is unknown. */
366f86e5ed8SJunfeng Guo 	GVE_L3_TYPE_UNKNOWN = 0,
367f86e5ed8SJunfeng Guo 	GVE_L3_TYPE_OTHER,
368f86e5ed8SJunfeng Guo 	GVE_L3_TYPE_IPV4,
369f86e5ed8SJunfeng Guo 	GVE_L3_TYPE_IPV6,
370f86e5ed8SJunfeng Guo };
371f86e5ed8SJunfeng Guo 
372f86e5ed8SJunfeng Guo enum gve_l4_type {
373f86e5ed8SJunfeng Guo 	/* Must be zero so zero initialized LUT is unknown. */
374f86e5ed8SJunfeng Guo 	GVE_L4_TYPE_UNKNOWN = 0,
375f86e5ed8SJunfeng Guo 	GVE_L4_TYPE_OTHER,
376f86e5ed8SJunfeng Guo 	GVE_L4_TYPE_TCP,
377f86e5ed8SJunfeng Guo 	GVE_L4_TYPE_UDP,
378f86e5ed8SJunfeng Guo 	GVE_L4_TYPE_ICMP,
379f86e5ed8SJunfeng Guo 	GVE_L4_TYPE_SCTP,
380f86e5ed8SJunfeng Guo };
381f86e5ed8SJunfeng Guo 
382f86e5ed8SJunfeng Guo /* These are control path types for PTYPE which are the same as the data path
383f86e5ed8SJunfeng Guo  * types.
384f86e5ed8SJunfeng Guo  */
385f86e5ed8SJunfeng Guo struct gve_ptype_entry {
386f86e5ed8SJunfeng Guo 	u8 l3_type;
387f86e5ed8SJunfeng Guo 	u8 l4_type;
388f86e5ed8SJunfeng Guo };
389f86e5ed8SJunfeng Guo 
390f86e5ed8SJunfeng Guo struct gve_ptype_map {
391f86e5ed8SJunfeng Guo 	struct gve_ptype_entry ptypes[1 << 10]; /* PTYPES are always 10 bits. */
392f86e5ed8SJunfeng Guo };
393f86e5ed8SJunfeng Guo 
394f86e5ed8SJunfeng Guo struct gve_adminq_get_ptype_map {
395f86e5ed8SJunfeng Guo 	__be64 ptype_map_len;
396f86e5ed8SJunfeng Guo 	__be64 ptype_map_addr;
397f86e5ed8SJunfeng Guo };
398f86e5ed8SJunfeng Guo 
399179f293bSJoshua Washington 
400179f293bSJoshua Washington /* RSS configuration command */
401179f293bSJoshua Washington struct gve_adminq_configure_rss {
402179f293bSJoshua Washington 	__be16 hash_types;
403179f293bSJoshua Washington 	u8 halg; /* hash algorithm */
404179f293bSJoshua Washington 	u8 reserved;
405179f293bSJoshua Washington 	__be16 hkey_len;
406179f293bSJoshua Washington 	__be16 indir_len;
407179f293bSJoshua Washington 	__be64 hkey_addr;
408179f293bSJoshua Washington 	__be64 indir_addr;
409179f293bSJoshua Washington };
410179f293bSJoshua Washington 
411f86e5ed8SJunfeng Guo union gve_adminq_command {
412f86e5ed8SJunfeng Guo 	struct {
413f86e5ed8SJunfeng Guo 		__be32 opcode;
414f86e5ed8SJunfeng Guo 		__be32 status;
415f86e5ed8SJunfeng Guo 		union {
416f86e5ed8SJunfeng Guo 			struct gve_adminq_configure_device_resources
417f86e5ed8SJunfeng Guo 						configure_device_resources;
418f86e5ed8SJunfeng Guo 			struct gve_adminq_create_tx_queue create_tx_queue;
419f86e5ed8SJunfeng Guo 			struct gve_adminq_create_rx_queue create_rx_queue;
420f86e5ed8SJunfeng Guo 			struct gve_adminq_destroy_tx_queue destroy_tx_queue;
421f86e5ed8SJunfeng Guo 			struct gve_adminq_destroy_rx_queue destroy_rx_queue;
422f86e5ed8SJunfeng Guo 			struct gve_adminq_describe_device describe_device;
423f86e5ed8SJunfeng Guo 			struct gve_adminq_register_page_list reg_page_list;
424f86e5ed8SJunfeng Guo 			struct gve_adminq_unregister_page_list unreg_page_list;
425179f293bSJoshua Washington 			struct gve_adminq_configure_rss configure_rss;
426f86e5ed8SJunfeng Guo 			struct gve_adminq_set_driver_parameter set_driver_param;
427f86e5ed8SJunfeng Guo 			struct gve_adminq_report_stats report_stats;
428f86e5ed8SJunfeng Guo 			struct gve_adminq_report_link_speed report_link_speed;
429f86e5ed8SJunfeng Guo 			struct gve_adminq_get_ptype_map get_ptype_map;
430748d0e7fSRushil Gupta 			struct gve_adminq_verify_driver_compatibility
431748d0e7fSRushil Gupta 				verify_driver_compatibility;
432f86e5ed8SJunfeng Guo 		};
433f86e5ed8SJunfeng Guo 	};
434f86e5ed8SJunfeng Guo 	u8 reserved[64];
435f86e5ed8SJunfeng Guo };
436f86e5ed8SJunfeng Guo 
437f86e5ed8SJunfeng Guo GVE_CHECK_UNION_LEN(64, gve_adminq_command);
438f86e5ed8SJunfeng Guo 
439179f293bSJoshua Washington struct gve_priv;
440d6ac6f45SJoshua Washington struct gve_rss_config;
441179f293bSJoshua Washington struct gve_queue_page_list;
442f86e5ed8SJunfeng Guo int gve_adminq_alloc(struct gve_priv *priv);
443f86e5ed8SJunfeng Guo void gve_adminq_free(struct gve_priv *priv);
444f86e5ed8SJunfeng Guo void gve_adminq_release(struct gve_priv *priv);
445f86e5ed8SJunfeng Guo int gve_adminq_describe_device(struct gve_priv *priv);
446f86e5ed8SJunfeng Guo int gve_adminq_configure_device_resources(struct gve_priv *priv,
447f86e5ed8SJunfeng Guo 					  dma_addr_t counter_array_bus_addr,
448f86e5ed8SJunfeng Guo 					  u32 num_counters,
449f86e5ed8SJunfeng Guo 					  dma_addr_t db_array_bus_addr,
450f86e5ed8SJunfeng Guo 					  u32 num_ntfy_blks);
451f86e5ed8SJunfeng Guo int gve_adminq_deconfigure_device_resources(struct gve_priv *priv);
452f86e5ed8SJunfeng Guo int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 num_queues);
453f86e5ed8SJunfeng Guo int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 queue_id);
454f86e5ed8SJunfeng Guo int gve_adminq_create_rx_queues(struct gve_priv *priv, u32 num_queues);
455f86e5ed8SJunfeng Guo int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 queue_id);
456f86e5ed8SJunfeng Guo int gve_adminq_register_page_list(struct gve_priv *priv,
457f86e5ed8SJunfeng Guo 				  struct gve_queue_page_list *qpl);
458f86e5ed8SJunfeng Guo int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_id);
459f86e5ed8SJunfeng Guo int gve_adminq_set_mtu(struct gve_priv *priv, u64 mtu);
460f86e5ed8SJunfeng Guo int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len,
461f86e5ed8SJunfeng Guo 			    dma_addr_t stats_report_addr, u64 interval);
462f86e5ed8SJunfeng Guo int gve_adminq_report_link_speed(struct gve_priv *priv);
463f86e5ed8SJunfeng Guo 
464f86e5ed8SJunfeng Guo struct gve_ptype_lut;
465f86e5ed8SJunfeng Guo int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv,
466f86e5ed8SJunfeng Guo 				 struct gve_ptype_lut *ptype_lut);
467f86e5ed8SJunfeng Guo 
468748d0e7fSRushil Gupta int gve_adminq_verify_driver_compatibility(struct gve_priv *priv,
469748d0e7fSRushil Gupta 					   u64 driver_info_len,
470748d0e7fSRushil Gupta 					   dma_addr_t driver_info_addr);
471179f293bSJoshua Washington 
472179f293bSJoshua Washington int gve_adminq_configure_rss(struct gve_priv *priv,
473179f293bSJoshua Washington 			     struct gve_rss_config *rss_config);
474179f293bSJoshua Washington 
475f86e5ed8SJunfeng Guo #endif /* _GVE_ADMINQ_H */
476