i40e_virtchnl.h revision 292100
1/****************************************************************************** 2 3 Copyright (c) 2013-2015, 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 292100 2015-12-11 13:08:38Z smh $*/ 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/* The PF sends status change events to VFs using 71 * the I40E_VIRTCHNL_OP_EVENT opcode. 72 * VFs send requests to the PF using the other ops. 73 */ 74 I40E_VIRTCHNL_OP_UNKNOWN = 0, 75 I40E_VIRTCHNL_OP_VERSION = 1, /* must ALWAYS be 1 */ 76 I40E_VIRTCHNL_OP_RESET_VF = 2, 77 I40E_VIRTCHNL_OP_GET_VF_RESOURCES = 3, 78 I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE = 4, 79 I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE = 5, 80 I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES = 6, 81 I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP = 7, 82 I40E_VIRTCHNL_OP_ENABLE_QUEUES = 8, 83 I40E_VIRTCHNL_OP_DISABLE_QUEUES = 9, 84 I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS = 10, 85 I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS = 11, 86 I40E_VIRTCHNL_OP_ADD_VLAN = 12, 87 I40E_VIRTCHNL_OP_DEL_VLAN = 13, 88 I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE = 14, 89 I40E_VIRTCHNL_OP_GET_STATS = 15, 90 I40E_VIRTCHNL_OP_FCOE = 16, 91 I40E_VIRTCHNL_OP_EVENT = 17, 92}; 93 94/* Virtual channel message descriptor. This overlays the admin queue 95 * descriptor. All other data is passed in external buffers. 96 */ 97 98struct i40e_virtchnl_msg { 99 u8 pad[8]; /* AQ flags/opcode/len/retval fields */ 100 enum i40e_virtchnl_ops v_opcode; /* avoid confusion with desc->opcode */ 101 enum i40e_status_code v_retval; /* ditto for desc->retval */ 102 u32 vfid; /* used by PF when sending to VF */ 103}; 104 105/* Message descriptions and data structures.*/ 106 107/* I40E_VIRTCHNL_OP_VERSION 108 * VF posts its version number to the PF. PF responds with its version number 109 * in the same format, along with a return code. 110 * Reply from PF has its major/minor versions also in param0 and param1. 111 * If there is a major version mismatch, then the VF cannot operate. 112 * If there is a minor version mismatch, then the VF can operate but should 113 * add a warning to the system log. 114 * 115 * This enum element MUST always be specified as == 1, regardless of other 116 * changes in the API. The PF must always respond to this message without 117 * error regardless of version mismatch. 118 */ 119#define I40E_VIRTCHNL_VERSION_MAJOR 1 120#define I40E_VIRTCHNL_VERSION_MINOR 1 121#define I40E_VIRTCHNL_VERSION_MINOR_NO_VF_CAPS 0 122 123struct i40e_virtchnl_version_info { 124 u32 major; 125 u32 minor; 126}; 127 128/* I40E_VIRTCHNL_OP_RESET_VF 129 * VF sends this request to PF with no parameters 130 * PF does NOT respond! VF driver must delay then poll VFGEN_RSTAT register 131 * until reset completion is indicated. The admin queue must be reinitialized 132 * after this operation. 133 * 134 * When reset is complete, PF must ensure that all queues in all VSIs associated 135 * with the VF are stopped, all queue configurations in the HMC are set to 0, 136 * and all MAC and VLAN filters (except the default MAC address) on all VSIs 137 * are cleared. 138 */ 139 140/* I40E_VIRTCHNL_OP_GET_VF_RESOURCES 141 * Version 1.0 VF sends this request to PF with no parameters 142 * Version 1.1 VF sends this request to PF with u32 bitmap of its capabilities 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_RSS_AQ 0x00000008 160#define I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG 0x00000010 161#define I40E_VIRTCHNL_VF_OFFLOAD_VLAN 0x00010000 162#define I40E_VIRTCHNL_VF_OFFLOAD_RX_POLLING 0x00020000 163 164struct i40e_virtchnl_vf_resource { 165 u16 num_vsis; 166 u16 num_queue_pairs; 167 u16 max_vectors; 168 u16 max_mtu; 169 170 u32 vf_offload_flags; 171 u32 max_fcoe_contexts; 172 u32 max_fcoe_filters; 173 174 struct i40e_virtchnl_vsi_resource vsi_res[1]; 175}; 176 177/* I40E_VIRTCHNL_OP_CONFIG_TX_QUEUE 178 * VF sends this message to set up parameters for one TX queue. 179 * External data buffer contains one instance of i40e_virtchnl_txq_info. 180 * PF configures requested queue and returns a status code. 181 */ 182 183/* Tx queue config info */ 184struct i40e_virtchnl_txq_info { 185 u16 vsi_id; 186 u16 queue_id; 187 u16 ring_len; /* number of descriptors, multiple of 8 */ 188 u16 headwb_enabled; 189 u64 dma_ring_addr; 190 u64 dma_headwb_addr; 191}; 192 193/* I40E_VIRTCHNL_OP_CONFIG_RX_QUEUE 194 * VF sends this message to set up parameters for one RX queue. 195 * External data buffer contains one instance of i40e_virtchnl_rxq_info. 196 * PF configures requested queue and returns a status code. 197 */ 198 199/* Rx queue config info */ 200struct i40e_virtchnl_rxq_info { 201 u16 vsi_id; 202 u16 queue_id; 203 u32 ring_len; /* number of descriptors, multiple of 32 */ 204 u16 hdr_size; 205 u16 splithdr_enabled; 206 u32 databuffer_size; 207 u32 max_pkt_size; 208 u64 dma_ring_addr; 209 enum i40e_hmc_obj_rx_hsplit_0 rx_split_pos; 210}; 211 212/* I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES 213 * VF sends this message to set parameters for all active TX and RX queues 214 * associated with the specified VSI. 215 * PF configures queues and returns status. 216 * If the number of queues specified is greater than the number of queues 217 * associated with the VSI, an error is returned and no queues are configured. 218 */ 219struct i40e_virtchnl_queue_pair_info { 220 /* NOTE: vsi_id and queue_id should be identical for both queues. */ 221 struct i40e_virtchnl_txq_info txq; 222 struct i40e_virtchnl_rxq_info rxq; 223}; 224 225struct i40e_virtchnl_vsi_queue_config_info { 226 u16 vsi_id; 227 u16 num_queue_pairs; 228 struct i40e_virtchnl_queue_pair_info qpair[1]; 229}; 230 231/* I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP 232 * VF uses this message to map vectors to queues. 233 * The rxq_map and txq_map fields are bitmaps used to indicate which queues 234 * are to be associated with the specified vector. 235 * The "other" causes are always mapped to vector 0. 236 * PF configures interrupt mapping and returns status. 237 */ 238struct i40e_virtchnl_vector_map { 239 u16 vsi_id; 240 u16 vector_id; 241 u16 rxq_map; 242 u16 txq_map; 243 u16 rxitr_idx; 244 u16 txitr_idx; 245}; 246 247struct i40e_virtchnl_irq_map_info { 248 u16 num_vectors; 249 struct i40e_virtchnl_vector_map vecmap[1]; 250}; 251 252/* I40E_VIRTCHNL_OP_ENABLE_QUEUES 253 * I40E_VIRTCHNL_OP_DISABLE_QUEUES 254 * VF sends these message to enable or disable TX/RX queue pairs. 255 * The queues fields are bitmaps indicating which queues to act upon. 256 * (Currently, we only support 16 queues per VF, but we make the field 257 * u32 to allow for expansion.) 258 * PF performs requested action and returns status. 259 */ 260struct i40e_virtchnl_queue_select { 261 u16 vsi_id; 262 u16 pad; 263 u32 rx_queues; 264 u32 tx_queues; 265}; 266 267/* I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS 268 * VF sends this message in order to add one or more unicast or multicast 269 * address filters for the specified VSI. 270 * PF adds the filters and returns status. 271 */ 272 273/* I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS 274 * VF sends this message in order to remove one or more unicast or multicast 275 * filters for the specified VSI. 276 * PF removes the filters and returns status. 277 */ 278 279struct i40e_virtchnl_ether_addr { 280 u8 addr[I40E_ETH_LENGTH_OF_ADDRESS]; 281 u8 pad[2]; 282}; 283 284struct i40e_virtchnl_ether_addr_list { 285 u16 vsi_id; 286 u16 num_elements; 287 struct i40e_virtchnl_ether_addr list[1]; 288}; 289 290/* I40E_VIRTCHNL_OP_ADD_VLAN 291 * VF sends this message to add one or more VLAN tag filters for receives. 292 * PF adds the filters and returns status. 293 * If a port VLAN is configured by the PF, this operation will return an 294 * error to the VF. 295 */ 296 297/* I40E_VIRTCHNL_OP_DEL_VLAN 298 * VF sends this message to remove one or more VLAN tag filters for receives. 299 * PF removes the filters and returns status. 300 * If a port VLAN is configured by the PF, this operation will return an 301 * error to the VF. 302 */ 303 304struct i40e_virtchnl_vlan_filter_list { 305 u16 vsi_id; 306 u16 num_elements; 307 u16 vlan_id[1]; 308}; 309 310/* I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE 311 * VF sends VSI id and flags. 312 * PF returns status code in retval. 313 * Note: we assume that broadcast accept mode is always enabled. 314 */ 315struct i40e_virtchnl_promisc_info { 316 u16 vsi_id; 317 u16 flags; 318}; 319 320#define I40E_FLAG_VF_UNICAST_PROMISC 0x00000001 321#define I40E_FLAG_VF_MULTICAST_PROMISC 0x00000002 322 323/* I40E_VIRTCHNL_OP_GET_STATS 324 * VF sends this message to request stats for the selected VSI. VF uses 325 * the i40e_virtchnl_queue_select struct to specify the VSI. The queue_id 326 * field is ignored by the PF. 327 * 328 * PF replies with struct i40e_eth_stats in an external buffer. 329 */ 330 331/* I40E_VIRTCHNL_OP_EVENT 332 * PF sends this message to inform the VF driver of events that may affect it. 333 * No direct response is expected from the VF, though it may generate other 334 * messages in response to this one. 335 */ 336enum i40e_virtchnl_event_codes { 337 I40E_VIRTCHNL_EVENT_UNKNOWN = 0, 338 I40E_VIRTCHNL_EVENT_LINK_CHANGE, 339 I40E_VIRTCHNL_EVENT_RESET_IMPENDING, 340 I40E_VIRTCHNL_EVENT_PF_DRIVER_CLOSE, 341}; 342#define I40E_PF_EVENT_SEVERITY_INFO 0 343#define I40E_PF_EVENT_SEVERITY_ATTENTION 1 344#define I40E_PF_EVENT_SEVERITY_ACTION_REQUIRED 2 345#define I40E_PF_EVENT_SEVERITY_CERTAIN_DOOM 255 346 347struct i40e_virtchnl_pf_event { 348 enum i40e_virtchnl_event_codes event; 349 union { 350 struct { 351 enum i40e_aq_link_speed link_speed; 352 bool link_status; 353 } link_event; 354 } event_data; 355 356 int severity; 357}; 358 359/* VF reset states - these are written into the RSTAT register: 360 * I40E_VFGEN_RSTAT1 on the PF 361 * I40E_VFGEN_RSTAT on the VF 362 * When the PF initiates a reset, it writes 0 363 * When the reset is complete, it writes 1 364 * When the PF detects that the VF has recovered, it writes 2 365 * VF checks this register periodically to determine if a reset has occurred, 366 * then polls it to know when the reset is complete. 367 * If either the PF or VF reads the register while the hardware 368 * is in a reset state, it will return DEADBEEF, which, when masked 369 * will result in 3. 370 */ 371enum i40e_vfr_states { 372 I40E_VFR_INPROGRESS = 0, 373 I40E_VFR_COMPLETED, 374 I40E_VFR_VFACTIVE, 375 I40E_VFR_UNKNOWN, 376}; 377 378#endif /* _I40E_VIRTCHNL_H_ */ 379