xref: /dpdk/drivers/net/bnx2x/bnx2x_vfpf.h (revision 68a03efeed657e6e05f281479b33b51102797e15)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2013-2015 Brocade Communications Systems, Inc.
3  * Copyright (c) 2015-2018 Cavium Inc.
4  * All rights reserved.
5  * www.cavium.com
6  */
7 
8 #ifndef BNX2X_VFPF_H
9 #define BNX2X_VFPF_H
10 
11 #include "ecore_sp.h"
12 
13 #define VLAN_HLEN 4
14 
15 struct vf_resource_query {
16 	uint8_t num_rxqs;
17 	uint8_t num_txqs;
18 	uint8_t num_sbs;
19 	uint8_t num_mac_filters;
20 	uint8_t num_vlan_filters;
21 	uint8_t num_mc_filters;
22 };
23 
24 #define	BNX2X_VF_STATUS_SUCCESS         1
25 #define	BNX2X_VF_STATUS_FAILURE         2
26 #define	BNX2X_VF_STATUS_NO_RESOURCES    4
27 #define	BNX2X_VF_BULLETIN_TRIES         5
28 
29 #define	BNX2X_VF_Q_FLAG_CACHE_ALIGN     0x0008
30 #define	BNX2X_VF_Q_FLAG_STATS           0x0010
31 #define	BNX2X_VF_Q_FLAG_OV              0x0020
32 #define	BNX2X_VF_Q_FLAG_VLAN            0x0040
33 #define	BNX2X_VF_Q_FLAG_COS             0x0080
34 #define	BNX2X_VF_Q_FLAG_HC              0x0100
35 #define	BNX2X_VF_Q_FLAG_DHC             0x0200
36 #define	BNX2X_VF_Q_FLAG_LEADING_RSS     0x0400
37 
38 #define TLV_BUFFER_SIZE			1024
39 
40 #define VFPF_RX_MASK_ACCEPT_NONE		0x00000000
41 #define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST	0x00000001
42 #define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST	0x00000002
43 #define VFPF_RX_MASK_ACCEPT_ALL_UNICAST		0x00000004
44 #define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST	0x00000008
45 #define VFPF_RX_MASK_ACCEPT_BROADCAST		0x00000010
46 
47 /* general tlv header (used for both vf->pf request and pf->vf response) */
48 struct channel_tlv {
49 	uint16_t type;
50 	uint16_t length;
51 };
52 
53 struct vf_first_tlv {
54 	struct channel_tlv tl;
55 	uint32_t reply_offset;
56 };
57 
58 struct tlv_buffer_size {
59 	uint8_t tlv_buffer[TLV_BUFFER_SIZE];
60 };
61 
62 /* tlv struct for all PF replies except acquire */
63 struct vf_common_reply_tlv {
64 	struct channel_tlv tl;
65 	uint8_t status;
66 	uint8_t pad[3];
67 };
68 
69 /* used to terminate and pad a tlv list */
70 struct channel_list_end_tlv {
71 	struct channel_tlv tl;
72 	uint32_t pad;
73 };
74 
75 /* Acquire */
76 struct vf_acquire_tlv {
77 	struct vf_first_tlv first_tlv;
78 
79 	uint8_t vf_id;
80 	uint8_t pad[3];
81 
82 	struct vf_resource_query res_query;
83 
84 	uint64_t bulletin_addr;
85 };
86 
87 /* simple operation request on queue */
88 struct vf_q_op_tlv {
89 	struct vf_first_tlv	first_tlv;
90 	uint8_t vf_qid;
91 	uint8_t pad[3];
92 };
93 
94 /* receive side scaling tlv */
95 struct vf_rss_tlv {
96 	struct vf_first_tlv	first_tlv;
97 	uint32_t		rss_flags;
98 	uint8_t			rss_result_mask;
99 	uint8_t			ind_table_size;
100 	uint8_t			rss_key_size;
101 	uint8_t			pad;
102 	uint8_t			ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
103 	uint32_t		rss_key[T_ETH_RSS_KEY];	/* hash values */
104 };
105 
106 struct vf_resc {
107 #define BNX2X_VF_MAX_QUEUES_PER_VF         16
108 #define BNX2X_VF_MAX_SBS_PER_VF            16
109 	uint16_t hw_sbs[BNX2X_VF_MAX_SBS_PER_VF];
110 	uint8_t hw_qid[BNX2X_VF_MAX_QUEUES_PER_VF];
111 	uint8_t num_rxqs;
112 	uint8_t num_txqs;
113 	uint8_t num_sbs;
114 	uint8_t num_mac_filters;
115 	uint8_t num_vlan_filters;
116 	uint8_t num_mc_filters;
117 	uint8_t permanent_mac_addr[ETH_ALEN];
118 	struct rte_ether_addr current_mac_addr;
119 	uint16_t pf_link_speed;
120 	uint32_t pf_link_supported;
121 };
122 
123 /* tlv struct holding reply for acquire */
124 struct vf_acquire_resp_tlv {
125 	uint16_t type;
126 	uint16_t length;
127 	uint8_t status;
128 	uint8_t pad1[3];
129 	uint32_t chip_num;
130 	uint8_t pad2[4];
131 	char fw_ver[32];
132 	uint16_t db_size;
133 	uint8_t pad3[2];
134 	struct vf_resc resc;
135 };
136 
137 /* Init VF */
138 struct vf_init_tlv {
139 	struct vf_first_tlv first_tlv;
140 	uint64_t sb_addr[BNX2X_VF_MAX_SBS_PER_VF];
141 	uint64_t spq_addr;
142 	uint64_t stats_addr;
143 	uint16_t stats_step;
144 	uint32_t flags;
145 	uint32_t pad[2];
146 };
147 
148 struct vf_rxq_params {
149 	/* physical addresses */
150 	uint64_t rcq_addr;
151 	uint64_t rcq_np_addr;
152 	uint64_t rxq_addr;
153 	uint64_t pad1;
154 
155 	/* sb + hc info */
156 	uint8_t  vf_sb_id;
157 	uint8_t  sb_cq_index;
158 	uint16_t hc_rate;	/* desired interrupts per sec. */
159 	/* rx buffer info */
160 	uint16_t mtu;
161 	uint16_t buf_sz;
162 	uint16_t flags;         /* for BNX2X_VF_Q_FLAG_X flags */
163 	uint16_t stat_id;	/* valid if BNX2X_VF_Q_FLAG_STATS */
164 
165 	uint8_t pad2[5];
166 
167 	uint8_t drop_flags;
168 	uint8_t cache_line_log;	/* BNX2X_VF_Q_FLAG_CACHE_ALIGN */
169 	uint8_t pad3;
170 };
171 
172 struct vf_txq_params {
173 	/* physical addresses */
174 	uint64_t txq_addr;
175 
176 	/* sb + hc info */
177 	uint8_t  vf_sb_id;	/* index in hw_sbs[] */
178 	uint8_t  sb_index;	/* Index in the SB */
179 	uint16_t hc_rate;	/* desired interrupts per sec. */
180 	uint32_t flags;		/* for BNX2X_VF_Q_FLAG_X flags */
181 	uint16_t stat_id;	/* valid if BNX2X_VF_Q_FLAG_STATS */
182 	uint8_t  traffic_type;	/* see in setup_context() */
183 	uint8_t  pad;
184 };
185 
186 /* Setup Queue */
187 struct vf_setup_q_tlv {
188 	struct vf_first_tlv first_tlv;
189 
190 	struct vf_rxq_params rxq;
191 	struct vf_txq_params txq;
192 
193 	uint8_t vf_qid;			/* index in hw_qid[] */
194 	uint8_t param_valid;
195 	#define VF_RXQ_VALID		0x01
196 	#define VF_TXQ_VALID		0x02
197 	uint8_t pad[2];
198 };
199 
200 /* Set Queue Filters */
201 struct vf_q_mac_vlan_filter {
202 	uint32_t flags;
203 	#define BNX2X_VF_Q_FILTER_DEST_MAC_VALID	0x01
204 	#define BNX2X_VF_Q_FILTER_VLAN_TAG_VALID	0x02
205 	#define BNX2X_VF_Q_FILTER_SET_MAC		0x100	/* set/clear */
206 	uint8_t  mac[ETH_ALEN];
207 	uint16_t vlan_tag;
208 };
209 
210 
211 #define _UP_ETH_ALEN	(6)
212 
213 /* configure queue filters */
214 struct vf_set_q_filters_tlv {
215 	struct vf_first_tlv first_tlv;
216 
217 	uint32_t flags;
218 	#define BNX2X_VF_MAC_VLAN_CHANGED 	0x01
219 	#define BNX2X_VF_MULTICAST_CHANGED	0x02
220 	#define BNX2X_VF_RX_MASK_CHANGED  	0x04
221 
222 	uint8_t vf_qid;			/* index in hw_qid[] */
223 	uint8_t mac_filters_cnt;
224 	uint8_t multicast_cnt;
225 	uint8_t pad;
226 
227 	#define VF_MAX_MAC_FILTERS			16
228 	#define VF_MAX_VLAN_FILTERS       		16
229 	#define VF_MAX_FILTERS 			(VF_MAX_MAC_FILTERS +\
230 							VF_MAX_VLAN_FILTERS)
231 	struct vf_q_mac_vlan_filter filters[VF_MAX_FILTERS];
232 
233 	#define VF_MAX_MULTICAST_PER_VF   		32
234 	uint8_t  multicast[VF_MAX_MULTICAST_PER_VF][_UP_ETH_ALEN];
235 	unsigned long rx_mask;
236 };
237 
238 
239 /* close VF (disable VF) */
240 struct vf_close_tlv {
241 	struct vf_first_tlv	first_tlv;
242 	uint16_t		vf_id;  /* for debug */
243 	uint8_t pad[2];
244 };
245 
246 /* rlease the VF's acquired resources */
247 struct vf_release_tlv {
248 	struct vf_first_tlv   first_tlv;
249 	uint16_t		vf_id;  /* for debug */
250 	uint8_t pad[2];
251 };
252 
253 union query_tlvs {
254 	struct vf_first_tlv		first_tlv;
255 	struct vf_acquire_tlv		acquire;
256 	struct vf_init_tlv		init;
257 	struct vf_close_tlv		close;
258 	struct vf_q_op_tlv		q_op;
259 	struct vf_setup_q_tlv		setup_q;
260 	struct vf_set_q_filters_tlv	set_q_filters;
261 	struct vf_release_tlv		release;
262 	struct vf_rss_tlv		update_rss;
263 	struct channel_list_end_tlv     list_end;
264 	struct tlv_buffer_size		tlv_buf_size;
265 };
266 
267 union resp_tlvs {
268 	struct vf_common_reply_tlv	common_reply;
269 	struct vf_acquire_resp_tlv	acquire_resp;
270 	struct channel_list_end_tlv	list_end;
271 	struct tlv_buffer_size		tlv_buf_size;
272 };
273 
274 /* struct allocated by VF driver, PF sends updates to VF via bulletin */
275 struct bnx2x_vf_bulletin {
276 	uint32_t crc;			/* crc of structure to ensure is not in
277 					 * mid-update
278 					 */
279 	uint16_t version;
280 	uint16_t length;
281 
282 	uint64_t valid_bitmap;	/* bitmap indicating which fields
283 					 * hold valid values
284 					 */
285 
286 #define MAC_ADDR_VALID		0	/* alert the vf that a new mac address
287 					 * is available for it
288 					 */
289 #define VLAN_VALID		1	/* when set, the vf should no access the
290 					 * vf channel
291 					 */
292 #define CHANNEL_DOWN		2	/* vf channel is disabled. VFs are not
293 					 * to attempt to send messages on the
294 					 * channel after this bit is set
295 					 */
296 	uint8_t mac[ETH_ALEN];
297 	uint8_t mac_pad[2];
298 
299 	uint16_t vlan;
300 	uint8_t vlan_pad[6];
301 };
302 
303 #define MAX_TLVS_IN_LIST 50
304 enum channel_tlvs {
305 	BNX2X_VF_TLV_NONE, /* ends tlv sequence */
306 	BNX2X_VF_TLV_ACQUIRE,
307 	BNX2X_VF_TLV_INIT,
308 	BNX2X_VF_TLV_SETUP_Q,
309 	BNX2X_VF_TLV_SET_Q_FILTERS,
310 	BNX2X_VF_TLV_ACTIVATE_Q,
311 	BNX2X_VF_TLV_DEACTIVATE_Q,
312 	BNX2X_VF_TLV_TEARDOWN_Q,
313 	BNX2X_VF_TLV_CLOSE,
314 	BNX2X_VF_TLV_RELEASE,
315 	BNX2X_VF_TLV_UPDATE_RSS_OLD,
316 	BNX2X_VF_TLV_PF_RELEASE_VF,
317 	BNX2X_VF_TLV_LIST_END,
318 	BNX2X_VF_TLV_FLR,
319 	BNX2X_VF_TLV_PF_SET_MAC,
320 	BNX2X_VF_TLV_PF_SET_VLAN,
321 	BNX2X_VF_TLV_UPDATE_RSS,
322 	BNX2X_VF_TLV_PHYS_PORT_ID,
323 	BNX2X_VF_TLV_MAX
324 };
325 
326 struct bnx2x_vf_mbx_msg {
327 	union query_tlvs query[BNX2X_VF_MAX_QUEUES_PER_VF];
328 	union resp_tlvs resp;
329 };
330 
331 int bnx2x_vf_teardown_queue(struct bnx2x_softc *sc, int qid);
332 int bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set);
333 int bnx2x_vf_config_rss(struct bnx2x_softc *sc, struct ecore_config_rss_params *params);
334 int bnx2x_vfpf_set_mcast(struct bnx2x_softc *sc,
335 			struct rte_ether_addr *mc_addrs,
336 			uint32_t mc_addrs_num);
337 
338 #endif /* BNX2X_VFPF_H */
339