1 | /* bnx2x_vfpf.h: Qlogic Everest network driver. |
2 | * |
3 | * Copyright (c) 2011-2013 Broadcom Corporation |
4 | * Copyright (c) 2014 QLogic Corporation |
5 | * All rights reserved |
6 | * |
7 | * Unless you and Qlogic execute a separate written software license |
8 | * agreement governing use of this software, this software is licensed to you |
9 | * under the terms of the GNU General Public License version 2 (the “GPL”), |
10 | * available at http://www.gnu.org/licenses/gpl-2.0.html, with the following |
11 | * added to such license: |
12 | * |
13 | * As a special exception, the copyright holders of this software give you |
14 | * permission to link this software with independent modules, and to copy and |
15 | * distribute the resulting executable under terms of your choice, provided that |
16 | * you also meet, for each linked independent module, the terms and conditions |
17 | * of the license of that module. An independent module is a module which is |
18 | * not derived from this software. The special exception does not apply to any |
19 | * modifications of the software. |
20 | * |
21 | * Maintained by: Ariel Elior <ariel.elior@qlogic.com> |
22 | * Written by: Ariel Elior <ariel.elior@qlogic.com> |
23 | */ |
24 | #ifndef VF_PF_IF_H |
25 | #define VF_PF_IF_H |
26 | |
27 | #ifdef CONFIG_BNX2X_SRIOV |
28 | |
29 | /* Common definitions for all HVs */ |
30 | struct vf_pf_resc_request { |
31 | u8 num_rxqs; |
32 | u8 num_txqs; |
33 | u8 num_sbs; |
34 | u8 num_mac_filters; |
35 | u8 num_vlan_filters; |
36 | u8 num_mc_filters; /* No limit so superfluous */ |
37 | }; |
38 | |
39 | struct hw_sb_info { |
40 | u8 hw_sb_id; /* aka absolute igu id, used to ack the sb */ |
41 | u8 sb_qid; /* used to update DHC for sb */ |
42 | }; |
43 | |
44 | /* HW VF-PF channel definitions |
45 | * A.K.A VF-PF mailbox |
46 | */ |
47 | #define TLV_BUFFER_SIZE 1024 |
48 | #define PF_VF_BULLETIN_SIZE 512 |
49 | |
50 | #define VFPF_QUEUE_FLG_TPA 0x0001 |
51 | #define VFPF_QUEUE_FLG_TPA_IPV6 0x0002 |
52 | #define VFPF_QUEUE_FLG_TPA_GRO 0x0004 |
53 | #define VFPF_QUEUE_FLG_CACHE_ALIGN 0x0008 |
54 | #define VFPF_QUEUE_FLG_STATS 0x0010 |
55 | #define VFPF_QUEUE_FLG_OV 0x0020 |
56 | #define VFPF_QUEUE_FLG_VLAN 0x0040 |
57 | #define VFPF_QUEUE_FLG_COS 0x0080 |
58 | #define VFPF_QUEUE_FLG_HC 0x0100 |
59 | #define VFPF_QUEUE_FLG_DHC 0x0200 |
60 | #define 0x0400 |
61 | |
62 | #define VFPF_QUEUE_DROP_IP_CS_ERR (1 << 0) |
63 | #define VFPF_QUEUE_DROP_TCP_CS_ERR (1 << 1) |
64 | #define VFPF_QUEUE_DROP_TTL0 (1 << 2) |
65 | #define VFPF_QUEUE_DROP_UDP_CS_ERR (1 << 3) |
66 | |
67 | #define VFPF_RX_MASK_ACCEPT_NONE 0x00000000 |
68 | #define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST 0x00000001 |
69 | #define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST 0x00000002 |
70 | #define VFPF_RX_MASK_ACCEPT_ALL_UNICAST 0x00000004 |
71 | #define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST 0x00000008 |
72 | #define VFPF_RX_MASK_ACCEPT_BROADCAST 0x00000010 |
73 | #define VFPF_RX_MASK_ACCEPT_ANY_VLAN 0x00000020 |
74 | |
75 | #define BULLETIN_CONTENT_SIZE (sizeof(struct pf_vf_bulletin_content)) |
76 | #define BULLETIN_CONTENT_LEGACY_SIZE (32) |
77 | #define BULLETIN_ATTEMPTS 5 /* crc failures before throwing towel */ |
78 | #define BULLETIN_CRC_SEED 0 |
79 | |
80 | enum { |
81 | PFVF_STATUS_WAITING = 0, |
82 | PFVF_STATUS_SUCCESS, |
83 | PFVF_STATUS_FAILURE, |
84 | PFVF_STATUS_NOT_SUPPORTED, |
85 | PFVF_STATUS_NO_RESOURCE |
86 | }; |
87 | |
88 | /* vf pf channel tlvs */ |
89 | /* general tlv header (used for both vf->pf request and pf->vf response) */ |
90 | struct channel_tlv { |
91 | u16 type; |
92 | u16 length; |
93 | }; |
94 | |
95 | /* header of first vf->pf tlv carries the offset used to calculate response |
96 | * buffer address |
97 | */ |
98 | struct vfpf_first_tlv { |
99 | struct channel_tlv tl; |
100 | u32 resp_msg_offset; |
101 | }; |
102 | |
103 | /* header of pf->vf tlvs, carries the status of handling the request */ |
104 | struct pfvf_tlv { |
105 | struct channel_tlv tl; |
106 | u8 status; |
107 | u8 padding[3]; |
108 | }; |
109 | |
110 | /* response tlv used for most tlvs */ |
111 | struct pfvf_general_resp_tlv { |
112 | struct pfvf_tlv hdr; |
113 | }; |
114 | |
115 | /* used to terminate and pad a tlv list */ |
116 | struct channel_list_end_tlv { |
117 | struct channel_tlv tl; |
118 | u8 padding[4]; |
119 | }; |
120 | |
121 | /* Acquire */ |
122 | struct vfpf_acquire_tlv { |
123 | struct vfpf_first_tlv first_tlv; |
124 | |
125 | struct vf_pf_vfdev_info { |
126 | /* the following fields are for debug purposes */ |
127 | u8 vf_id; /* ME register value */ |
128 | u8 vf_os; /* e.g. Linux, W2K8 */ |
129 | #define VF_OS_SUBVERSION_MASK (0x1f) |
130 | #define VF_OS_MASK (0xe0) |
131 | #define VF_OS_SHIFT (5) |
132 | #define VF_OS_UNDEFINED (0 << VF_OS_SHIFT) |
133 | #define VF_OS_WINDOWS (1 << VF_OS_SHIFT) |
134 | |
135 | u8 fp_hsi_ver; |
136 | u8 caps; |
137 | #define VF_CAP_SUPPORT_EXT_BULLETIN (1 << 0) |
138 | #define VF_CAP_SUPPORT_VLAN_FILTER (1 << 1) |
139 | } vfdev_info; |
140 | |
141 | struct vf_pf_resc_request resc_request; |
142 | |
143 | aligned_u64 bulletin_addr; |
144 | }; |
145 | |
146 | /* simple operation request on queue */ |
147 | struct vfpf_q_op_tlv { |
148 | struct vfpf_first_tlv first_tlv; |
149 | u8 vf_qid; |
150 | u8 padding[3]; |
151 | }; |
152 | |
153 | /* receive side scaling tlv */ |
154 | struct { |
155 | struct vfpf_first_tlv ; |
156 | u32 ; |
157 | #define (1 << 0) |
158 | #define (1 << 1) |
159 | #define (1 << 2) |
160 | #define (1 << 3) |
161 | #define (1 << 4) |
162 | #define (1 << 5) |
163 | #define (1 << 6) |
164 | #define (1 << 7) |
165 | #define (1 << 8) |
166 | u8 ; |
167 | u8 ; |
168 | u8 ; |
169 | u8 ; |
170 | u8 [T_ETH_INDIRECTION_TABLE_SIZE]; |
171 | u32 [T_ETH_RSS_KEY]; /* hash values */ |
172 | }; |
173 | |
174 | /* acquire response tlv - carries the allocated resources */ |
175 | struct pfvf_acquire_resp_tlv { |
176 | struct pfvf_tlv hdr; |
177 | struct pf_vf_pfdev_info { |
178 | u32 chip_num; |
179 | u32 pf_cap; |
180 | #define 0x00000001 |
181 | #define PFVF_CAP_DHC 0x00000002 |
182 | #define PFVF_CAP_TPA 0x00000004 |
183 | #define PFVF_CAP_TPA_UPDATE 0x00000008 |
184 | #define PFVF_CAP_VLAN_FILTER 0x00000010 |
185 | |
186 | char fw_ver[32]; |
187 | u16 db_size; |
188 | u8 indices_per_sb; |
189 | u8 padding; |
190 | } pfdev_info; |
191 | struct pf_vf_resc { |
192 | /* in case of status NO_RESOURCE in message hdr, pf will fill |
193 | * this struct with suggested amount of resources for next |
194 | * acquire request |
195 | */ |
196 | #define PFVF_MAX_QUEUES_PER_VF 16 |
197 | #define PFVF_MAX_SBS_PER_VF 16 |
198 | struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF]; |
199 | u8 hw_qid[PFVF_MAX_QUEUES_PER_VF]; |
200 | u8 num_rxqs; |
201 | u8 num_txqs; |
202 | u8 num_sbs; |
203 | u8 num_mac_filters; |
204 | u8 num_vlan_filters; |
205 | u8 num_mc_filters; |
206 | u8 permanent_mac_addr[ETH_ALEN]; |
207 | u8 current_mac_addr[ETH_ALEN]; |
208 | u8 padding[2]; |
209 | } resc; |
210 | }; |
211 | |
212 | struct vfpf_port_phys_id_resp_tlv { |
213 | struct channel_tlv tl; |
214 | u8 id[ETH_ALEN]; |
215 | u8 padding[2]; |
216 | }; |
217 | |
218 | struct vfpf_fp_hsi_resp_tlv { |
219 | struct channel_tlv tl; |
220 | u8 is_supported; |
221 | u8 padding[3]; |
222 | }; |
223 | |
224 | #define VFPF_INIT_FLG_STATS_COALESCE (1 << 0) /* when set the VFs queues |
225 | * stats will be coalesced on |
226 | * the leading RSS queue |
227 | */ |
228 | |
229 | /* Init VF */ |
230 | struct vfpf_init_tlv { |
231 | struct vfpf_first_tlv first_tlv; |
232 | aligned_u64 sb_addr[PFVF_MAX_SBS_PER_VF]; /* vf_sb based */ |
233 | aligned_u64 spq_addr; |
234 | aligned_u64 stats_addr; |
235 | u16 stats_stride; |
236 | u32 flags; |
237 | u32 padding[2]; |
238 | }; |
239 | |
240 | /* Setup Queue */ |
241 | struct vfpf_setup_q_tlv { |
242 | struct vfpf_first_tlv first_tlv; |
243 | |
244 | struct vf_pf_rxq_params { |
245 | /* physical addresses */ |
246 | aligned_u64 rcq_addr; |
247 | aligned_u64 rcq_np_addr; |
248 | aligned_u64 rxq_addr; |
249 | aligned_u64 sge_addr; |
250 | |
251 | /* sb + hc info */ |
252 | u8 vf_sb; /* index in hw_sbs[] */ |
253 | u8 sb_index; /* Index in the SB */ |
254 | u16 hc_rate; /* desired interrupts per sec. */ |
255 | /* valid iff VFPF_QUEUE_FLG_HC */ |
256 | /* rx buffer info */ |
257 | u16 mtu; |
258 | u16 buf_sz; |
259 | u16 flags; /* VFPF_QUEUE_FLG_X flags */ |
260 | u16 stat_id; /* valid iff VFPF_QUEUE_FLG_STATS */ |
261 | |
262 | /* valid iff VFPF_QUEUE_FLG_TPA */ |
263 | u16 sge_buf_sz; |
264 | u16 tpa_agg_sz; |
265 | u8 max_sge_pkt; |
266 | |
267 | u8 drop_flags; /* VFPF_QUEUE_DROP_X, for Linux VMs |
268 | * all the flags are turned off |
269 | */ |
270 | |
271 | u8 cache_line_log; /* VFPF_QUEUE_FLG_CACHE_ALIGN */ |
272 | u8 padding; |
273 | } rxq; |
274 | |
275 | struct vf_pf_txq_params { |
276 | /* physical addresses */ |
277 | aligned_u64 txq_addr; |
278 | |
279 | /* sb + hc info */ |
280 | u8 vf_sb; /* index in hw_sbs[] */ |
281 | u8 sb_index; /* Index in the SB */ |
282 | u16 hc_rate; /* desired interrupts per sec. */ |
283 | /* valid iff VFPF_QUEUE_FLG_HC */ |
284 | u32 flags; /* VFPF_QUEUE_FLG_X flags */ |
285 | u16 stat_id; /* valid iff VFPF_QUEUE_FLG_STATS */ |
286 | u8 traffic_type; /* see in setup_context() */ |
287 | u8 padding; |
288 | } txq; |
289 | |
290 | u8 vf_qid; /* index in hw_qid[] */ |
291 | u8 param_valid; |
292 | #define VFPF_RXQ_VALID 0x01 |
293 | #define VFPF_TXQ_VALID 0x02 |
294 | u8 padding[2]; |
295 | }; |
296 | |
297 | /* Set Queue Filters */ |
298 | struct vfpf_q_mac_vlan_filter { |
299 | u32 flags; |
300 | #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01 |
301 | #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02 |
302 | #define VFPF_Q_FILTER_SET 0x100 /* set/clear */ |
303 | u8 mac[ETH_ALEN]; |
304 | u16 vlan_tag; |
305 | }; |
306 | |
307 | /* configure queue filters */ |
308 | struct vfpf_set_q_filters_tlv { |
309 | struct vfpf_first_tlv first_tlv; |
310 | |
311 | u32 flags; |
312 | #define VFPF_SET_Q_FILTERS_MAC_VLAN_CHANGED 0x01 |
313 | #define VFPF_SET_Q_FILTERS_MULTICAST_CHANGED 0x02 |
314 | #define VFPF_SET_Q_FILTERS_RX_MASK_CHANGED 0x04 |
315 | |
316 | u8 vf_qid; /* index in hw_qid[] */ |
317 | u8 n_mac_vlan_filters; |
318 | u8 n_multicast; |
319 | u8 padding; |
320 | |
321 | #define PFVF_MAX_MAC_FILTERS 16 |
322 | #define PFVF_MAX_VLAN_FILTERS 16 |
323 | #define PFVF_MAX_FILTERS (PFVF_MAX_MAC_FILTERS +\ |
324 | PFVF_MAX_VLAN_FILTERS) |
325 | struct vfpf_q_mac_vlan_filter filters[PFVF_MAX_FILTERS]; |
326 | |
327 | #define PFVF_MAX_MULTICAST_PER_VF 32 |
328 | u8 multicast[PFVF_MAX_MULTICAST_PER_VF][ETH_ALEN]; |
329 | |
330 | u32 rx_mask; /* see mask constants at the top of the file */ |
331 | }; |
332 | |
333 | struct vfpf_tpa_tlv { |
334 | struct vfpf_first_tlv first_tlv; |
335 | |
336 | struct vf_pf_tpa_client_info { |
337 | aligned_u64 sge_addr[PFVF_MAX_QUEUES_PER_VF]; |
338 | u8 update_ipv4; |
339 | u8 update_ipv6; |
340 | u8 max_tpa_queues; |
341 | u8 max_sges_for_packet; |
342 | u8 complete_on_both_clients; |
343 | u8 dont_verify_thr; |
344 | u8 tpa_mode; |
345 | u16 sge_buff_size; |
346 | u16 max_agg_size; |
347 | u16 sge_pause_thr_low; |
348 | u16 sge_pause_thr_high; |
349 | } tpa_client_info; |
350 | }; |
351 | |
352 | /* close VF (disable VF) */ |
353 | struct vfpf_close_tlv { |
354 | struct vfpf_first_tlv first_tlv; |
355 | u16 vf_id; /* for debug */ |
356 | u8 padding[2]; |
357 | }; |
358 | |
359 | /* release the VF's acquired resources */ |
360 | struct vfpf_release_tlv { |
361 | struct vfpf_first_tlv first_tlv; |
362 | u16 vf_id; |
363 | u8 padding[2]; |
364 | }; |
365 | |
366 | struct tlv_buffer_size { |
367 | u8 tlv_buffer[TLV_BUFFER_SIZE]; |
368 | }; |
369 | |
370 | union vfpf_tlvs { |
371 | struct vfpf_first_tlv first_tlv; |
372 | struct vfpf_acquire_tlv acquire; |
373 | struct vfpf_init_tlv init; |
374 | struct vfpf_close_tlv close; |
375 | struct vfpf_q_op_tlv q_op; |
376 | struct vfpf_setup_q_tlv setup_q; |
377 | struct vfpf_set_q_filters_tlv set_q_filters; |
378 | struct vfpf_release_tlv release; |
379 | struct vfpf_rss_tlv ; |
380 | struct vfpf_tpa_tlv update_tpa; |
381 | struct channel_list_end_tlv list_end; |
382 | struct tlv_buffer_size tlv_buf_size; |
383 | }; |
384 | |
385 | union pfvf_tlvs { |
386 | struct pfvf_general_resp_tlv general_resp; |
387 | struct pfvf_acquire_resp_tlv acquire_resp; |
388 | struct channel_list_end_tlv list_end; |
389 | struct tlv_buffer_size tlv_buf_size; |
390 | }; |
391 | |
392 | /* This is a structure which is allocated in the VF, which the PF may update |
393 | * when it deems it necessary to do so. The bulletin board is sampled |
394 | * periodically by the VF. A copy per VF is maintained in the PF (to prevent |
395 | * loss of data upon multiple updates (or the need for read modify write)). |
396 | */ |
397 | struct pf_vf_bulletin_size { |
398 | u8 size[PF_VF_BULLETIN_SIZE]; |
399 | }; |
400 | |
401 | struct pf_vf_bulletin_content { |
402 | u32 crc; /* crc of structure to ensure is not in |
403 | * mid-update |
404 | */ |
405 | u16 version; |
406 | u16 length; |
407 | |
408 | aligned_u64 valid_bitmap; /* bitmap indicating which fields |
409 | * hold valid values |
410 | */ |
411 | |
412 | #define MAC_ADDR_VALID 0 /* alert the vf that a new mac address |
413 | * is available for it |
414 | */ |
415 | #define VLAN_VALID 1 /* when set, the vf should not access |
416 | * the vfpf channel |
417 | */ |
418 | #define CHANNEL_DOWN 2 /* vfpf channel is disabled. VFs are not |
419 | * to attempt to send messages on the |
420 | * channel after this bit is set |
421 | */ |
422 | #define LINK_VALID 3 /* alert the VF thet a new link status |
423 | * update is available for it |
424 | */ |
425 | u8 mac[ETH_ALEN]; |
426 | u8 mac_padding[2]; |
427 | |
428 | u16 vlan; |
429 | u8 vlan_padding[6]; |
430 | |
431 | u16 link_speed; /* Effective line speed */ |
432 | u8 link_speed_padding[6]; |
433 | u32 link_flags; /* VFPF_LINK_REPORT_XXX flags */ |
434 | #define VFPF_LINK_REPORT_LINK_DOWN (1 << 0) |
435 | #define VFPF_LINK_REPORT_FULL_DUPLEX (1 << 1) |
436 | #define VFPF_LINK_REPORT_RX_FC_ON (1 << 2) |
437 | #define VFPF_LINK_REPORT_TX_FC_ON (1 << 3) |
438 | u8 link_flags_padding[4]; |
439 | }; |
440 | |
441 | union pf_vf_bulletin { |
442 | struct pf_vf_bulletin_content content; |
443 | struct pf_vf_bulletin_size size; |
444 | }; |
445 | |
446 | #define MAX_TLVS_IN_LIST 50 |
447 | |
448 | enum channel_tlvs { |
449 | CHANNEL_TLV_NONE, |
450 | CHANNEL_TLV_ACQUIRE, |
451 | CHANNEL_TLV_INIT, |
452 | CHANNEL_TLV_SETUP_Q, |
453 | CHANNEL_TLV_SET_Q_FILTERS, |
454 | CHANNEL_TLV_ACTIVATE_Q, |
455 | CHANNEL_TLV_DEACTIVATE_Q, |
456 | CHANNEL_TLV_TEARDOWN_Q, |
457 | CHANNEL_TLV_CLOSE, |
458 | CHANNEL_TLV_RELEASE, |
459 | , |
460 | CHANNEL_TLV_PF_RELEASE_VF, |
461 | CHANNEL_TLV_LIST_END, |
462 | CHANNEL_TLV_FLR, |
463 | CHANNEL_TLV_PF_SET_MAC, |
464 | CHANNEL_TLV_PF_SET_VLAN, |
465 | , |
466 | CHANNEL_TLV_PHYS_PORT_ID, |
467 | CHANNEL_TLV_UPDATE_TPA, |
468 | CHANNEL_TLV_FP_HSI_SUPPORT, |
469 | CHANNEL_TLV_MAX |
470 | }; |
471 | |
472 | #endif /* CONFIG_BNX2X_SRIOV */ |
473 | #endif /* VF_PF_IF_H */ |
474 | |