1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2013-2015 Brocade Communications Systems, Inc.
3 * Copyright (c) 2015-2018 Cavium Inc.
13 struct vf_resource_query {
17 uint8_t num_mac_filters;
18 uint8_t num_vlan_filters;
19 uint8_t num_mc_filters;
22 #define BNX2X_VF_STATUS_SUCCESS 1
23 #define BNX2X_VF_STATUS_FAILURE 2
24 #define BNX2X_VF_STATUS_NO_RESOURCES 4
25 #define BNX2X_VF_BULLETIN_TRIES 5
27 #define BNX2X_VF_Q_FLAG_CACHE_ALIGN 0x0008
28 #define BNX2X_VF_Q_FLAG_STATS 0x0010
29 #define BNX2X_VF_Q_FLAG_OV 0x0020
30 #define BNX2X_VF_Q_FLAG_VLAN 0x0040
31 #define BNX2X_VF_Q_FLAG_COS 0x0080
32 #define BNX2X_VF_Q_FLAG_HC 0x0100
33 #define BNX2X_VF_Q_FLAG_DHC 0x0200
34 #define BNX2X_VF_Q_FLAG_LEADING_RSS 0x0400
36 #define TLV_BUFFER_SIZE 1024
38 #define VFPF_RX_MASK_ACCEPT_NONE 0x00000000
39 #define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST 0x00000001
40 #define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST 0x00000002
41 #define VFPF_RX_MASK_ACCEPT_ALL_UNICAST 0x00000004
42 #define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST 0x00000008
43 #define VFPF_RX_MASK_ACCEPT_BROADCAST 0x00000010
45 /* general tlv header (used for both vf->pf request and pf->vf response) */
52 struct channel_tlv tl;
53 uint32_t reply_offset;
56 struct tlv_buffer_size {
57 uint8_t tlv_buffer[TLV_BUFFER_SIZE];
60 /* tlv struct for all PF replies except acquire */
61 struct vf_common_reply_tlv {
62 struct channel_tlv tl;
67 /* used to terminate and pad a tlv list */
68 struct channel_list_end_tlv {
69 struct channel_tlv tl;
74 struct vf_acquire_tlv {
75 struct vf_first_tlv first_tlv;
80 struct vf_resource_query res_query;
82 uint64_t bulletin_addr;
85 /* simple operation request on queue */
87 struct vf_first_tlv first_tlv;
92 /* receive side scaling tlv */
94 struct vf_first_tlv first_tlv;
96 uint8_t rss_result_mask;
97 uint8_t ind_table_size;
100 uint8_t ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
101 uint32_t rss_key[T_ETH_RSS_KEY]; /* hash values */
105 #define BNX2X_VF_MAX_QUEUES_PER_VF 16
106 #define BNX2X_VF_MAX_SBS_PER_VF 16
107 uint16_t hw_sbs[BNX2X_VF_MAX_SBS_PER_VF];
108 uint8_t hw_qid[BNX2X_VF_MAX_QUEUES_PER_VF];
112 uint8_t num_mac_filters;
113 uint8_t num_vlan_filters;
114 uint8_t num_mc_filters;
115 uint8_t permanent_mac_addr[ETH_ALEN];
116 struct rte_ether_addr current_mac_addr;
117 uint16_t pf_link_speed;
118 uint32_t pf_link_supported;
121 /* tlv struct holding reply for acquire */
122 struct vf_acquire_resp_tlv {
137 struct vf_first_tlv first_tlv;
138 uint64_t sb_addr[BNX2X_VF_MAX_SBS_PER_VF];
146 struct vf_rxq_params {
147 /* physical addresses */
149 uint64_t rcq_np_addr;
156 uint16_t hc_rate; /* desired interrupts per sec. */
160 uint16_t flags; /* for BNX2X_VF_Q_FLAG_X flags */
161 uint16_t stat_id; /* valid if BNX2X_VF_Q_FLAG_STATS */
166 uint8_t cache_line_log; /* BNX2X_VF_Q_FLAG_CACHE_ALIGN */
170 struct vf_txq_params {
171 /* physical addresses */
175 uint8_t vf_sb_id; /* index in hw_sbs[] */
176 uint8_t sb_index; /* Index in the SB */
177 uint16_t hc_rate; /* desired interrupts per sec. */
178 uint32_t flags; /* for BNX2X_VF_Q_FLAG_X flags */
179 uint16_t stat_id; /* valid if BNX2X_VF_Q_FLAG_STATS */
180 uint8_t traffic_type; /* see in setup_context() */
185 struct vf_setup_q_tlv {
186 struct vf_first_tlv first_tlv;
188 struct vf_rxq_params rxq;
189 struct vf_txq_params txq;
191 uint8_t vf_qid; /* index in hw_qid[] */
193 #define VF_RXQ_VALID 0x01
194 #define VF_TXQ_VALID 0x02
198 /* Set Queue Filters */
199 struct vf_q_mac_vlan_filter {
201 #define BNX2X_VF_Q_FILTER_DEST_MAC_VALID 0x01
202 #define BNX2X_VF_Q_FILTER_VLAN_TAG_VALID 0x02
203 #define BNX2X_VF_Q_FILTER_SET_MAC 0x100 /* set/clear */
204 uint8_t mac[ETH_ALEN];
209 #define _UP_ETH_ALEN (6)
211 /* configure queue filters */
212 struct vf_set_q_filters_tlv {
213 struct vf_first_tlv first_tlv;
216 #define BNX2X_VF_MAC_VLAN_CHANGED 0x01
217 #define BNX2X_VF_MULTICAST_CHANGED 0x02
218 #define BNX2X_VF_RX_MASK_CHANGED 0x04
220 uint8_t vf_qid; /* index in hw_qid[] */
221 uint8_t mac_filters_cnt;
222 uint8_t multicast_cnt;
225 #define VF_MAX_MAC_FILTERS 16
226 #define VF_MAX_VLAN_FILTERS 16
227 #define VF_MAX_FILTERS (VF_MAX_MAC_FILTERS +\
229 struct vf_q_mac_vlan_filter filters[VF_MAX_FILTERS];
231 #define VF_MAX_MULTICAST_PER_VF 32
232 uint8_t multicast[VF_MAX_MULTICAST_PER_VF][_UP_ETH_ALEN];
233 unsigned long rx_mask;
237 /* close VF (disable VF) */
238 struct vf_close_tlv {
239 struct vf_first_tlv first_tlv;
240 uint16_t vf_id; /* for debug */
244 /* release the VF's acquired resources */
245 struct vf_release_tlv {
246 struct vf_first_tlv first_tlv;
247 uint16_t vf_id; /* for debug */
252 struct vf_first_tlv first_tlv;
253 struct vf_acquire_tlv acquire;
254 struct vf_init_tlv init;
255 struct vf_close_tlv close;
256 struct vf_q_op_tlv q_op;
257 struct vf_setup_q_tlv setup_q;
258 struct vf_set_q_filters_tlv set_q_filters;
259 struct vf_release_tlv release;
260 struct vf_rss_tlv update_rss;
261 struct channel_list_end_tlv list_end;
262 struct tlv_buffer_size tlv_buf_size;
266 struct vf_common_reply_tlv common_reply;
267 struct vf_acquire_resp_tlv acquire_resp;
268 struct channel_list_end_tlv list_end;
269 struct tlv_buffer_size tlv_buf_size;
272 /* struct allocated by VF driver, PF sends updates to VF via bulletin */
273 struct bnx2x_vf_bulletin {
274 uint32_t crc; /* crc of structure to ensure is not in
280 uint64_t valid_bitmap; /* bitmap indicating which fields
284 #define MAC_ADDR_VALID 0 /* alert the vf that a new mac address
285 * is available for it
287 #define VLAN_VALID 1 /* when set, the vf should no access the
290 #define CHANNEL_DOWN 2 /* vf channel is disabled. VFs are not
291 * to attempt to send messages on the
292 * channel after this bit is set
294 uint8_t mac[ETH_ALEN];
301 #define MAX_TLVS_IN_LIST 50
303 BNX2X_VF_TLV_NONE, /* ends tlv sequence */
304 BNX2X_VF_TLV_ACQUIRE,
306 BNX2X_VF_TLV_SETUP_Q,
307 BNX2X_VF_TLV_SET_Q_FILTERS,
308 BNX2X_VF_TLV_ACTIVATE_Q,
309 BNX2X_VF_TLV_DEACTIVATE_Q,
310 BNX2X_VF_TLV_TEARDOWN_Q,
312 BNX2X_VF_TLV_RELEASE,
313 BNX2X_VF_TLV_UPDATE_RSS_OLD,
314 BNX2X_VF_TLV_PF_RELEASE_VF,
315 BNX2X_VF_TLV_LIST_END,
317 BNX2X_VF_TLV_PF_SET_MAC,
318 BNX2X_VF_TLV_PF_SET_VLAN,
319 BNX2X_VF_TLV_UPDATE_RSS,
320 BNX2X_VF_TLV_PHYS_PORT_ID,
324 struct bnx2x_vf_mbx_msg {
325 union query_tlvs query[BNX2X_VF_MAX_QUEUES_PER_VF];
326 union resp_tlvs resp;
329 int bnx2x_vf_teardown_queue(struct bnx2x_softc *sc, int qid);
330 int bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set);
331 int bnx2x_vf_config_rss(struct bnx2x_softc *sc, struct ecore_config_rss_params *params);
332 int bnx2x_vfpf_set_mcast(struct bnx2x_softc *sc,
333 struct rte_ether_addr *mc_addrs,
334 uint32_t mc_addrs_num);
336 #endif /* BNX2X_VFPF_H */