i40e_virtchnl.h revision 270631
1/******************************************************************************
2
3  Copyright (c) 2013-2014, Intel Corporation
4  All rights reserved.
5
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8
9   1. Redistributions of source code must retain the above copyright notice,
10      this list of conditions and the following disclaimer.
11
12   2. Redistributions in binary form must reproduce the above copyright
13      notice, this list of conditions and the following disclaimer in the
14      documentation and/or other materials provided with the distribution.
15
16   3. Neither the name of the Intel Corporation nor the names of its
17      contributors may be used to endorse or promote products derived from
18      this software without specific prior written permission.
19
20  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: stable/10/sys/dev/ixl/i40e_virtchnl.h 270631 2014-08-25 22:04:29Z jfv $*/
34
35#ifndef _I40E_VIRTCHNL_H_
36#define _I40E_VIRTCHNL_H_
37
38#include "i40e_type.h"
39
40/* Description:
41 * This header file describes the VF-PF communication protocol used
42 * by the various i40e drivers.
43 *
44 * Admin queue buffer usage:
45 * desc->opcode is always i40e_aqc_opc_send_msg_to_pf
46 * flags, retval, datalen, and data addr are all used normally.
47 * Firmware copies the cookie fields when sending messages between the PF and
48 * VF, but uses all other fields internally. Due to this limitation, we
49 * must send all messages as "indirect", i.e. using an external buffer.
50 *
51 * All the vsi indexes are relative to the VF. Each VF can have maximum of
52 * three VSIs. All the queue indexes are relative to the VSI.  Each VF can
53 * have a maximum of sixteen queues for all of its VSIs.
54 *
55 * The PF is required to return a status code in v_retval for all messages
56 * except RESET_VF, which does not require any response. The return value is of
57 * i40e_status_code type, defined in the i40e_type.h.
58 *
59 * In general, VF driver initialization should roughly follow the order of these
60 * opcodes. The VF driver must first validate the API version of the PF driver,
61 * then request a reset, then get resources, then configure queues and
62 * interrupts. After these operations are complete, the VF driver may start
63 * its queues, optionally add MAC and VLAN filters, and process traffic.
64 */
65
66/* Opcodes for VF-PF communication. These are placed in the v_opcode field
67 * of the virtchnl_msg structure.
68 */
69enum i40e_virtchnl_ops {
70/* VF sends req. to pf for the following
71 * ops.
72 */
73	I40E_VIRTCHNL_OP_UNKNOWN = 0,
74	I40E_VIRTCHNL_OP_VERSION = 1, /* must ALWAYS be 1 */
75	I40E_VIRTCHNL_OP_RESET_VF,
76	I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
77	I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE,
78	I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE,
79	I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
80	I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
81	I40E_VIRTCHNL_OP_ENABLE_QUEUES,
82	I40E_VIRTCHNL_OP_DISABLE_QUEUES,
83	I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
84	I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS,
85	I40E_VIRTCHNL_OP_ADD_VLAN,
86	I40E_VIRTCHNL_OP_DEL_VLAN,
87	I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE,
88	I40E_VIRTCHNL_OP_GET_STATS,
89	I40E_VIRTCHNL_OP_FCOE,
90	I40E_VIRTCHNL_OP_CONFIG_RSS,
91/* PF sends status change events to vfs using
92 * the following op.
93 */
94	I40E_VIRTCHNL_OP_EVENT,
95};
96
97/* Virtual channel message descriptor. This overlays the admin queue
98 * descriptor. All other data is passed in external buffers.
99 */
100
101struct i40e_virtchnl_msg {
102	u8 pad[8];			 /* AQ flags/opcode/len/retval fields */
103	enum i40e_virtchnl_ops v_opcode; /* avoid confusion with desc->opcode */
104	enum i40e_status_code v_retval;  /* ditto for desc->retval */
105	u32 vfid;			 /* used by PF when sending to VF */
106};
107
108/* Message descriptions and data structures.*/
109
110/* I40E_VIRTCHNL_OP_VERSION
111 * VF posts its version number to the PF. PF responds with its version number
112 * in the same format, along with a return code.
113 * Reply from PF has its major/minor versions also in param0 and param1.
114 * If there is a major version mismatch, then the VF cannot operate.
115 * If there is a minor version mismatch, then the VF can operate but should
116 * add a warning to the system log.
117 *
118 * This enum element MUST always be specified as == 1, regardless of other
119 * changes in the API. The PF must always respond to this message without
120 * error regardless of version mismatch.
121 */
122#define I40E_VIRTCHNL_VERSION_MAJOR		1
123#define I40E_VIRTCHNL_VERSION_MINOR		0
124struct i40e_virtchnl_version_info {
125	u32 major;
126	u32 minor;
127};
128
129/* I40E_VIRTCHNL_OP_RESET_VF
130 * VF sends this request to PF with no parameters
131 * PF does NOT respond! VF driver must delay then poll VFGEN_RSTAT register
132 * until reset completion is indicated. The admin queue must be reinitialized
133 * after this operation.
134 *
135 * When reset is complete, PF must ensure that all queues in all VSIs associated
136 * with the VF are stopped, all queue configurations in the HMC are set to 0,
137 * and all MAC and VLAN filters (except the default MAC address) on all VSIs
138 * are cleared.
139 */
140
141/* I40E_VIRTCHNL_OP_GET_VF_RESOURCES
142 * VF sends this request to PF with no parameters
143 * PF responds with an indirect message containing
144 * i40e_virtchnl_vf_resource and one or more
145 * i40e_virtchnl_vsi_resource structures.
146 */
147
148struct i40e_virtchnl_vsi_resource {
149	u16 vsi_id;
150	u16 num_queue_pairs;
151	enum i40e_vsi_type vsi_type;
152	u16 qset_handle;
153	u8 default_mac_addr[I40E_ETH_LENGTH_OF_ADDRESS];
154};
155/* VF offload flags */
156#define I40E_VIRTCHNL_VF_OFFLOAD_L2	0x00000001
157#define I40E_VIRTCHNL_VF_OFFLOAD_IWARP	0x00000002
158#define I40E_VIRTCHNL_VF_OFFLOAD_FCOE	0x00000004
159#define I40E_VIRTCHNL_VF_OFFLOAD_VLAN	0x00010000
160
161struct i40e_virtchnl_vf_resource {
162	u16 num_vsis;
163	u16 num_queue_pairs;
164	u16 max_vectors;
165	u16 max_mtu;
166
167	u32 vf_offload_flags;
168	u32 max_fcoe_contexts;
169	u32 max_fcoe_filters;
170
171	struct i40e_virtchnl_vsi_resource vsi_res[1];
172};
173
174/* I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE
175 * VF sends this message to set up parameters for one TX queue.
176 * External data buffer contains one instance of i40e_virtchnl_txq_info.
177 * PF configures requested queue and returns a status code.
178 */
179
180/* Tx queue config info */
181struct i40e_virtchnl_txq_info {
182	u16 vsi_id;
183	u16 queue_id;
184	u16 ring_len;		/* number of descriptors, multiple of 8 */
185	u16 headwb_enabled;
186	u64 dma_ring_addr;
187	u64 dma_headwb_addr;
188};
189
190/* I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE
191 * VF sends this message to set up parameters for one RX queue.
192 * External data buffer contains one instance of i40e_virtchnl_rxq_info.
193 * PF configures requested queue and returns a status code.
194 */
195
196/* Rx queue config info */
197struct i40e_virtchnl_rxq_info {
198	u16 vsi_id;
199	u16 queue_id;
200	u32 ring_len;		/* number of descriptors, multiple of 32 */
201	u16 hdr_size;
202	u16 splithdr_enabled;
203	u32 databuffer_size;
204	u32 max_pkt_size;
205	u64 dma_ring_addr;
206	enum i40e_hmc_obj_rx_hsplit_0 rx_split_pos;
207};
208
209/* I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES
210 * VF sends this message to set parameters for all active TX and RX queues
211 * associated with the specified VSI.
212 * PF configures queues and returns status.
213 * If the number of queues specified is greater than the number of queues
214 * associated with the VSI, an error is returned and no queues are configured.
215 */
216struct i40e_virtchnl_queue_pair_info {
217	/* NOTE: vsi_id and queue_id should be identical for both queues. */
218	struct i40e_virtchnl_txq_info txq;
219	struct i40e_virtchnl_rxq_info rxq;
220};
221
222struct i40e_virtchnl_vsi_queue_config_info {
223	u16 vsi_id;
224	u16 num_queue_pairs;
225	struct i40e_virtchnl_queue_pair_info qpair[1];
226};
227
228/* I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP
229 * VF uses this message to map vectors to queues.
230 * The rxq_map and txq_map fields are bitmaps used to indicate which queues
231 * are to be associated with the specified vector.
232 * The "other" causes are always mapped to vector 0.
233 * PF configures interrupt mapping and returns status.
234 */
235struct i40e_virtchnl_vector_map {
236	u16 vsi_id;
237	u16 vector_id;
238	u16 rxq_map;
239	u16 txq_map;
240	u16 rxitr_idx;
241	u16 txitr_idx;
242};
243
244struct i40e_virtchnl_irq_map_info {
245	u16 num_vectors;
246	struct i40e_virtchnl_vector_map vecmap[1];
247};
248
249/* I40E_VIRTCHNL_OP_ENABLE_QUEUES
250 * I40E_VIRTCHNL_OP_DISABLE_QUEUES
251 * VF sends these message to enable or disable TX/RX queue pairs.
252 * The queues fields are bitmaps indicating which queues to act upon.
253 * (Currently, we only support 16 queues per VF, but we make the field
254 * u32 to allow for expansion.)
255 * PF performs requested action and returns status.
256 */
257struct i40e_virtchnl_queue_select {
258	u16 vsi_id;
259	u16 pad;
260	u32 rx_queues;
261	u32 tx_queues;
262};
263
264/* I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS
265 * VF sends this message in order to add one or more unicast or multicast
266 * address filters for the specified VSI.
267 * PF adds the filters and returns status.
268 */
269
270/* I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS
271 * VF sends this message in order to remove one or more unicast or multicast
272 * filters for the specified VSI.
273 * PF removes the filters and returns status.
274 */
275
276struct i40e_virtchnl_ether_addr {
277	u8 addr[I40E_ETH_LENGTH_OF_ADDRESS];
278	u8 pad[2];
279};
280
281struct i40e_virtchnl_ether_addr_list {
282	u16 vsi_id;
283	u16 num_elements;
284	struct i40e_virtchnl_ether_addr list[1];
285};
286
287/* I40E_VIRTCHNL_OP_ADD_VLAN
288 * VF sends this message to add one or more VLAN tag filters for receives.
289 * PF adds the filters and returns status.
290 * If a port VLAN is configured by the PF, this operation will return an
291 * error to the VF.
292 */
293
294/* I40E_VIRTCHNL_OP_DEL_VLAN
295 * VF sends this message to remove one or more VLAN tag filters for receives.
296 * PF removes the filters and returns status.
297 * If a port VLAN is configured by the PF, this operation will return an
298 * error to the VF.
299 */
300
301struct i40e_virtchnl_vlan_filter_list {
302	u16 vsi_id;
303	u16 num_elements;
304	u16 vlan_id[1];
305};
306
307/* I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE
308 * VF sends VSI id and flags.
309 * PF returns status code in retval.
310 * Note: we assume that broadcast accept mode is always enabled.
311 */
312struct i40e_virtchnl_promisc_info {
313	u16 vsi_id;
314	u16 flags;
315};
316
317#define I40E_FLAG_VF_UNICAST_PROMISC	0x00000001
318#define I40E_FLAG_VF_MULTICAST_PROMISC	0x00000002
319
320/* I40E_VIRTCHNL_OP_GET_STATS
321 * VF sends this message to request stats for the selected VSI. VF uses
322 * the i40e_virtchnl_queue_select struct to specify the VSI. The queue_id
323 * field is ignored by the PF.
324 *
325 * PF replies with struct i40e_eth_stats in an external buffer.
326 */
327
328/* I40E_VIRTCHNL_OP_EVENT
329 * PF sends this message to inform the VF driver of events that may affect it.
330 * No direct response is expected from the VF, though it may generate other
331 * messages in response to this one.
332 */
333enum i40e_virtchnl_event_codes {
334	I40E_VIRTCHNL_EVENT_UNKNOWN = 0,
335	I40E_VIRTCHNL_EVENT_LINK_CHANGE,
336	I40E_VIRTCHNL_EVENT_RESET_IMPENDING,
337	I40E_VIRTCHNL_EVENT_PF_DRIVER_CLOSE,
338};
339#define I40E_PF_EVENT_SEVERITY_INFO		0
340#define I40E_PF_EVENT_SEVERITY_ATTENTION	1
341#define I40E_PF_EVENT_SEVERITY_ACTION_REQUIRED	2
342#define I40E_PF_EVENT_SEVERITY_CERTAIN_DOOM	255
343
344struct i40e_virtchnl_pf_event {
345	enum i40e_virtchnl_event_codes event;
346	union {
347		struct {
348			enum i40e_aq_link_speed link_speed;
349			bool link_status;
350		} link_event;
351	} event_data;
352
353	int severity;
354};
355
356/* VF reset states - these are written into the RSTAT register:
357 * I40E_VFGEN_RSTAT1 on the PF
358 * I40E_VFGEN_RSTAT on the VF
359 * When the PF initiates a reset, it writes 0
360 * When the reset is complete, it writes 1
361 * When the PF detects that the VF has recovered, it writes 2
362 * VF checks this register periodically to determine if a reset has occurred,
363 * then polls it to know when the reset is complete.
364 * If either the PF or VF reads the register while the hardware
365 * is in a reset state, it will return DEADBEEF, which, when masked
366 * will result in 3.
367 */
368enum i40e_vfr_states {
369	I40E_VFR_INPROGRESS = 0,
370	I40E_VFR_COMPLETED,
371	I40E_VFR_VFACTIVE,
372	I40E_VFR_UNKNOWN,
373};
374
375#endif /* _I40E_VIRTCHNL_H_ */
376