]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ice/ice_switch.h
Re-enable disabled googletest-port-test tests after r363820
[FreeBSD/FreeBSD.git] / sys / dev / ice / ice_switch.h
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*  Copyright (c) 2020, Intel Corporation
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above copyright notice,
9  *      this list of conditions and the following disclaimer.
10  *
11  *   2. Redistributions in binary form must reproduce the above copyright
12  *      notice, this list of conditions and the following disclaimer in the
13  *      documentation and/or other materials provided with the distribution.
14  *
15  *   3. Neither the name of the Intel Corporation nor the names of its
16  *      contributors may be used to endorse or promote products derived from
17  *      this software without specific prior written permission.
18  *
19  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  *  POSSIBILITY OF SUCH DAMAGE.
30  */
31 /*$FreeBSD$*/
32
33 #ifndef _ICE_SWITCH_H_
34 #define _ICE_SWITCH_H_
35
36 #include "ice_common.h"
37 #include "ice_protocol_type.h"
38
39 #define ICE_SW_CFG_MAX_BUF_LEN 2048
40 #define ICE_MAX_SW 256
41 #define ICE_DFLT_VSI_INVAL 0xff
42 #define ICE_FLTR_RX BIT(0)
43 #define ICE_FLTR_TX BIT(1)
44 #define ICE_FLTR_TX_RX (ICE_FLTR_RX | ICE_FLTR_TX)
45
46 /* Worst case buffer length for ice_aqc_opc_get_res_alloc */
47 #define ICE_MAX_RES_TYPES 0x80
48 #define ICE_AQ_GET_RES_ALLOC_BUF_LEN \
49         (ICE_MAX_RES_TYPES * sizeof(struct ice_aqc_get_res_resp_elem))
50
51 #define ICE_VSI_INVAL_ID 0xFFFF
52 #define ICE_INVAL_Q_HANDLE 0xFFFF
53
54 /* VSI context structure for add/get/update/free operations */
55 struct ice_vsi_ctx {
56         u16 vsi_num;
57         u16 vsis_allocd;
58         u16 vsis_unallocated;
59         u16 flags;
60         struct ice_aqc_vsi_props info;
61         struct ice_sched_vsi_info sched;
62         u8 alloc_from_pool;
63         u8 vf_num;
64         u16 num_lan_q_entries[ICE_MAX_TRAFFIC_CLASS];
65         struct ice_q_ctx *lan_q_ctx[ICE_MAX_TRAFFIC_CLASS];
66 };
67
68 /* This is to be used by add/update mirror rule Admin Queue command */
69 struct ice_mir_rule_buf {
70         u16 vsi_idx; /* VSI index */
71
72         /* For each VSI, user can specify whether corresponding VSI
73          * should be added/removed to/from mirror rule
74          *
75          * add mirror rule: this should always be TRUE.
76          * update mirror rule:  add(true) or remove(false) VSI to/from
77          * mirror rule
78          */
79         u8 add;
80 };
81
82 /* Switch recipe ID enum values are specific to hardware */
83 enum ice_sw_lkup_type {
84         ICE_SW_LKUP_ETHERTYPE = 0,
85         ICE_SW_LKUP_MAC = 1,
86         ICE_SW_LKUP_MAC_VLAN = 2,
87         ICE_SW_LKUP_PROMISC = 3,
88         ICE_SW_LKUP_VLAN = 4,
89         ICE_SW_LKUP_DFLT = 5,
90         ICE_SW_LKUP_ETHERTYPE_MAC = 8,
91         ICE_SW_LKUP_PROMISC_VLAN = 9,
92         ICE_SW_LKUP_LAST
93 };
94
95 /* type of filter src ID */
96 enum ice_src_id {
97         ICE_SRC_ID_UNKNOWN = 0,
98         ICE_SRC_ID_VSI,
99         ICE_SRC_ID_QUEUE,
100         ICE_SRC_ID_LPORT,
101 };
102
103 struct ice_fltr_info {
104         /* Look up information: how to look up packet */
105         enum ice_sw_lkup_type lkup_type;
106         /* Forward action: filter action to do after lookup */
107         enum ice_sw_fwd_act_type fltr_act;
108         /* rule ID returned by firmware once filter rule is created */
109         u16 fltr_rule_id;
110         u16 flag;
111
112         /* Source VSI for LOOKUP_TX or source port for LOOKUP_RX */
113         u16 src;
114         enum ice_src_id src_id;
115
116         union {
117                 struct {
118                         u8 mac_addr[ETH_ALEN];
119                 } mac;
120                 struct {
121                         u8 mac_addr[ETH_ALEN];
122                         u16 vlan_id;
123                 } mac_vlan;
124                 struct {
125                         u16 vlan_id;
126                 } vlan;
127                 /* Set lkup_type as ICE_SW_LKUP_ETHERTYPE
128                  * if just using ethertype as filter. Set lkup_type as
129                  * ICE_SW_LKUP_ETHERTYPE_MAC if MAC also needs to be
130                  * passed in as filter.
131                  */
132                 struct {
133                         u16 ethertype;
134                         u8 mac_addr[ETH_ALEN]; /* optional */
135                 } ethertype_mac;
136         } l_data; /* Make sure to zero out the memory of l_data before using
137                    * it or only set the data associated with lookup match
138                    * rest everything should be zero
139                    */
140
141         /* Depending on filter action */
142         union {
143                 /* queue ID in case of ICE_FWD_TO_Q and starting
144                  * queue ID in case of ICE_FWD_TO_QGRP.
145                  */
146                 u16 q_id:11;
147                 u16 hw_vsi_id:10;
148                 u16 vsi_id:10;
149                 u16 vsi_list_id:10;
150         } fwd_id;
151
152         /* Sw VSI handle */
153         u16 vsi_handle;
154
155         /* Set to num_queues if action is ICE_FWD_TO_QGRP. This field
156          * determines the range of queues the packet needs to be forwarded to.
157          * Note that qgrp_size must be set to a power of 2.
158          */
159         u8 qgrp_size;
160
161         /* Rule creations populate these indicators basing on the switch type */
162         u8 lb_en;       /* Indicate if packet can be looped back */
163         u8 lan_en;      /* Indicate if packet can be forwarded to the uplink */
164 };
165
166 struct ice_adv_lkup_elem {
167         enum ice_protocol_type type;
168         union ice_prot_hdr h_u; /* Header values */
169         union ice_prot_hdr m_u; /* Mask of header values to match */
170 };
171
172 struct ice_sw_act_ctrl {
173         /* Source VSI for LOOKUP_TX or source port for LOOKUP_RX */
174         u16 src;
175         u16 flag;
176         enum ice_sw_fwd_act_type fltr_act;
177         /* Depending on filter action */
178         union {
179                 /* This is a queue ID in case of ICE_FWD_TO_Q and starting
180                  * queue ID in case of ICE_FWD_TO_QGRP.
181                  */
182                 u16 q_id:11;
183                 u16 vsi_id:10;
184                 u16 hw_vsi_id:10;
185                 u16 vsi_list_id:10;
186         } fwd_id;
187         /* software VSI handle */
188         u16 vsi_handle;
189         u8 qgrp_size;
190 };
191
192 struct ice_rule_query_data {
193         /* Recipe ID for which the requested rule was added */
194         u16 rid;
195         /* Rule ID that was added or is supposed to be removed */
196         u16 rule_id;
197         /* vsi_handle for which Rule was added or is supposed to be removed */
198         u16 vsi_handle;
199 };
200
201 struct ice_adv_rule_info {
202         enum ice_sw_tunnel_type tun_type;
203         struct ice_sw_act_ctrl sw_act;
204         u32 priority;
205         u8 rx; /* true means LOOKUP_RX otherwise LOOKUP_TX */
206         u16 fltr_rule_id;
207 };
208
209 /* A collection of one or more four word recipe */
210 struct ice_sw_recipe {
211         /* For a chained recipe the root recipe is what should be used for
212          * programming rules
213          */
214         u8 is_root;
215         u8 root_rid;
216         u8 recp_created;
217
218         /* Number of extraction words */
219         u8 n_ext_words;
220         /* Protocol ID and Offset pair (extraction word) to describe the
221          * recipe
222          */
223         struct ice_fv_word ext_words[ICE_MAX_CHAIN_WORDS];
224         u16 word_masks[ICE_MAX_CHAIN_WORDS];
225
226         /* if this recipe is a collection of other recipe */
227         u8 big_recp;
228
229         /* if this recipe is part of another bigger recipe then chain index
230          * corresponding to this recipe
231          */
232         u8 chain_idx;
233
234         /* if this recipe is a collection of other recipe then count of other
235          * recipes and recipe IDs of those recipes
236          */
237         u8 n_grp_count;
238
239         /* Bit map specifying the IDs associated with this group of recipe */
240         ice_declare_bitmap(r_bitmap, ICE_MAX_NUM_RECIPES);
241
242         enum ice_sw_tunnel_type tun_type;
243
244         /* List of type ice_fltr_mgmt_list_entry or adv_rule */
245         u8 adv_rule;
246         struct LIST_HEAD_TYPE filt_rules;
247         struct LIST_HEAD_TYPE filt_replay_rules;
248
249         struct ice_lock filt_rule_lock; /* protect filter rule structure */
250
251         /* Profiles this recipe should be associated with */
252         struct LIST_HEAD_TYPE fv_list;
253
254         /* Profiles this recipe is associated with */
255         u8 num_profs, *prof_ids;
256
257         /* Possible result indexes are 44, 45, 46 and 47 */
258 #define ICE_POSSIBLE_RES_IDX 0x0000F00000000000ULL
259         ice_declare_bitmap(res_idxs, ICE_MAX_FV_WORDS);
260
261         /* This allows user to specify the recipe priority.
262          * For now, this becomes 'fwd_priority' when recipe
263          * is created, usually recipes can have 'fwd' and 'join'
264          * priority.
265          */
266         u8 priority;
267
268         struct LIST_HEAD_TYPE rg_list;
269
270         /* AQ buffer associated with this recipe */
271         struct ice_aqc_recipe_data_elem *root_buf;
272         /* This struct saves the fv_words for a given lookup */
273         struct ice_prot_lkup_ext lkup_exts;
274 };
275
276 /* Bookkeeping structure to hold bitmap of VSIs corresponding to VSI list ID */
277 struct ice_vsi_list_map_info {
278         struct LIST_ENTRY_TYPE list_entry;
279         ice_declare_bitmap(vsi_map, ICE_MAX_VSI);
280         u16 vsi_list_id;
281         /* counter to track how many rules are reusing this VSI list */
282         u16 ref_cnt;
283 };
284
285 struct ice_fltr_list_entry {
286         struct LIST_ENTRY_TYPE list_entry;
287         enum ice_status status;
288         struct ice_fltr_info fltr_info;
289 };
290
291 /**
292  * enum ice_fltr_marker - Marker for syncing OS and driver filter lists
293  * @ICE_FLTR_NOT_FOUND: initial state, indicates filter has not been found
294  * @ICE_FLTR_FOUND: set when a filter has been found in both lists
295  *
296  * This enumeration is used to help sync an operating system provided filter
297  * list with the filters previously added.
298  *
299  * This is required for FreeBSD because the operating system does not provide
300  * individual indications of whether a filter has been added or deleted, but
301  * instead just notifies the driver with the entire new list.
302  *
303  * To use this marker state, the driver shall initially reset all filters to
304  * the ICE_FLTR_NOT_FOUND state. Then, for each filter in the OS list, it
305  * shall search the driver list for the filter. If found, the filter state
306  * will be set to ICE_FLTR_FOUND. If not found, that filter will be added.
307  * Finally, the driver shall search the internal filter list for all filters
308  * still marked as ICE_FLTR_NOT_FOUND and remove them.
309  */
310 enum ice_fltr_marker {
311         ICE_FLTR_NOT_FOUND,
312         ICE_FLTR_FOUND,
313 };
314
315 /* This defines an entry in the list that maintains MAC or VLAN membership
316  * to HW list mapping, since multiple VSIs can subscribe to the same MAC or
317  * VLAN. As an optimization the VSI list should be created only when a
318  * second VSI becomes a subscriber to the same MAC address. VSI lists are always
319  * used for VLAN membership.
320  */
321 struct ice_fltr_mgmt_list_entry {
322         /* back pointer to VSI list ID to VSI list mapping */
323         struct ice_vsi_list_map_info *vsi_list_info;
324         u16 vsi_count;
325 #define ICE_INVAL_LG_ACT_INDEX 0xffff
326         u16 lg_act_idx;
327 #define ICE_INVAL_SW_MARKER_ID 0xffff
328         u16 sw_marker_id;
329         struct LIST_ENTRY_TYPE list_entry;
330         struct ice_fltr_info fltr_info;
331 #define ICE_INVAL_COUNTER_ID 0xff
332         u8 counter_index;
333         enum ice_fltr_marker marker;
334 };
335
336 struct ice_adv_fltr_mgmt_list_entry {
337         struct LIST_ENTRY_TYPE list_entry;
338
339         struct ice_adv_lkup_elem *lkups;
340         struct ice_adv_rule_info rule_info;
341         u16 lkups_cnt;
342         struct ice_vsi_list_map_info *vsi_list_info;
343         u16 vsi_count;
344 };
345
346 enum ice_promisc_flags {
347         ICE_PROMISC_UCAST_RX = 0x1,
348         ICE_PROMISC_UCAST_TX = 0x2,
349         ICE_PROMISC_MCAST_RX = 0x4,
350         ICE_PROMISC_MCAST_TX = 0x8,
351         ICE_PROMISC_BCAST_RX = 0x10,
352         ICE_PROMISC_BCAST_TX = 0x20,
353         ICE_PROMISC_VLAN_RX = 0x40,
354         ICE_PROMISC_VLAN_TX = 0x80,
355 };
356
357 /* VSI related commands */
358 enum ice_status
359 ice_aq_add_vsi(struct ice_hw *hw, struct ice_vsi_ctx *vsi_ctx,
360                struct ice_sq_cd *cd);
361 enum ice_status
362 ice_aq_free_vsi(struct ice_hw *hw, struct ice_vsi_ctx *vsi_ctx,
363                 bool keep_vsi_alloc, struct ice_sq_cd *cd);
364 enum ice_status
365 ice_aq_update_vsi(struct ice_hw *hw, struct ice_vsi_ctx *vsi_ctx,
366                   struct ice_sq_cd *cd);
367 enum ice_status
368 ice_add_vsi(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi_ctx,
369             struct ice_sq_cd *cd);
370 enum ice_status
371 ice_free_vsi(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi_ctx,
372              bool keep_vsi_alloc, struct ice_sq_cd *cd);
373 enum ice_status
374 ice_update_vsi(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi_ctx,
375                struct ice_sq_cd *cd);
376 struct ice_vsi_ctx *ice_get_vsi_ctx(struct ice_hw *hw, u16 vsi_handle);
377 void ice_clear_all_vsi_ctx(struct ice_hw *hw);
378 enum ice_status
379 ice_aq_get_vsi_params(struct ice_hw *hw, struct ice_vsi_ctx *vsi_ctx,
380                       struct ice_sq_cd *cd);
381 enum ice_status
382 ice_aq_add_update_mir_rule(struct ice_hw *hw, u16 rule_type, u16 dest_vsi,
383                            u16 count, struct ice_mir_rule_buf *mr_buf,
384                            struct ice_sq_cd *cd, u16 *rule_id);
385 enum ice_status
386 ice_aq_delete_mir_rule(struct ice_hw *hw, u16 rule_id, bool keep_allocd,
387                        struct ice_sq_cd *cd);
388 enum ice_status
389 ice_aq_get_storm_ctrl(struct ice_hw *hw, u32 *bcast_thresh, u32 *mcast_thresh,
390                       u32 *ctl_bitmask);
391 enum ice_status
392 ice_aq_set_storm_ctrl(struct ice_hw *hw, u32 bcast_thresh, u32 mcast_thresh,
393                       u32 ctl_bitmask);
394 /* Switch config */
395 enum ice_status ice_get_initial_sw_cfg(struct ice_hw *hw);
396
397 enum ice_status
398 ice_alloc_vlan_res_counter(struct ice_hw *hw, u16 *counter_id);
399 enum ice_status
400 ice_free_vlan_res_counter(struct ice_hw *hw, u16 counter_id);
401
402 /* Switch/bridge related commands */
403 enum ice_status ice_update_sw_rule_bridge_mode(struct ice_hw *hw);
404 enum ice_status
405 ice_alloc_sw(struct ice_hw *hw, bool ena_stats, bool shared_res, u16 *sw_id,
406              u16 *counter_id);
407 enum ice_status
408 ice_free_sw(struct ice_hw *hw, u16 sw_id, u16 counter_id);
409 enum ice_status
410 ice_aq_get_res_alloc(struct ice_hw *hw, u16 *num_entries, void *buf,
411                      u16 buf_size, struct ice_sq_cd *cd);
412 enum ice_status
413 ice_aq_get_res_descs(struct ice_hw *hw, u16 num_entries,
414                      struct ice_aqc_get_allocd_res_desc_resp *buf,
415                      u16 buf_size, u16 res_type, bool res_shared, u16 *desc_id,
416                      struct ice_sq_cd *cd);
417 enum ice_status
418 ice_add_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list);
419 enum ice_status
420 ice_remove_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list);
421 void ice_rem_all_sw_rules_info(struct ice_hw *hw);
422 enum ice_status ice_add_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_lst);
423 enum ice_status ice_remove_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_lst);
424 enum ice_status
425 ice_add_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list);
426 enum ice_status
427 ice_remove_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list);
428
429 enum ice_status
430 ice_add_mac_with_sw_marker(struct ice_hw *hw, struct ice_fltr_info *f_info,
431                            u16 sw_marker);
432 enum ice_status
433 ice_add_mac_with_counter(struct ice_hw *hw, struct ice_fltr_info *f_info);
434 void ice_remove_vsi_fltr(struct ice_hw *hw, u16 vsi_handle);
435
436 /* Promisc/defport setup for VSIs */
437 enum ice_status
438 ice_cfg_dflt_vsi(struct ice_port_info *pi, u16 vsi_handle, bool set,
439                  u8 direction);
440 enum ice_status
441 ice_set_vsi_promisc(struct ice_hw *hw, u16 vsi_handle, u8 promisc_mask,
442                     u16 vid);
443 enum ice_status
444 ice_clear_vsi_promisc(struct ice_hw *hw, u16 vsi_handle, u8 promisc_mask,
445                       u16 vid);
446 enum ice_status
447 ice_set_vlan_vsi_promisc(struct ice_hw *hw, u16 vsi_handle, u8 promisc_mask,
448                          bool rm_vlan_promisc);
449
450 /* Get VSIs Promisc/defport settings */
451 enum ice_status
452 ice_get_vsi_promisc(struct ice_hw *hw, u16 vsi_handle, u8 *promisc_mask,
453                     u16 *vid);
454 enum ice_status
455 ice_get_vsi_vlan_promisc(struct ice_hw *hw, u16 vsi_handle, u8 *promisc_mask,
456                          u16 *vid);
457
458 enum ice_status ice_replay_all_fltr(struct ice_hw *hw);
459
460 enum ice_status
461 ice_init_def_sw_recp(struct ice_hw *hw, struct ice_sw_recipe **recp_list);
462 u16 ice_get_hw_vsi_num(struct ice_hw *hw, u16 vsi_handle);
463 bool ice_is_vsi_valid(struct ice_hw *hw, u16 vsi_handle);
464
465 enum ice_status ice_replay_vsi_all_fltr(struct ice_hw *hw, u16 vsi_handle);
466 void ice_rm_all_sw_replay_rule_info(struct ice_hw *hw);
467
468 #endif /* _ICE_SWITCH_H_ */