net/mlx5: fix flow mark with sampling and metering
[dpdk.git] / drivers / net / bnx2x / bnx2x_vfpf.h
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 struct vf_resource_query {
14         uint8_t num_rxqs;
15         uint8_t num_txqs;
16         uint8_t num_sbs;
17         uint8_t num_mac_filters;
18         uint8_t num_vlan_filters;
19         uint8_t num_mc_filters;
20 };
21
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
26
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
35
36 #define TLV_BUFFER_SIZE                 1024
37
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
44
45 /* general tlv header (used for both vf->pf request and pf->vf response) */
46 struct channel_tlv {
47         uint16_t type;
48         uint16_t length;
49 };
50
51 struct vf_first_tlv {
52         struct channel_tlv tl;
53         uint32_t reply_offset;
54 };
55
56 struct tlv_buffer_size {
57         uint8_t tlv_buffer[TLV_BUFFER_SIZE];
58 };
59
60 /* tlv struct for all PF replies except acquire */
61 struct vf_common_reply_tlv {
62         struct channel_tlv tl;
63         uint8_t status;
64         uint8_t pad[3];
65 };
66
67 /* used to terminate and pad a tlv list */
68 struct channel_list_end_tlv {
69         struct channel_tlv tl;
70         uint32_t pad;
71 };
72
73 /* Acquire */
74 struct vf_acquire_tlv {
75         struct vf_first_tlv first_tlv;
76
77         uint8_t vf_id;
78         uint8_t pad[3];
79
80         struct vf_resource_query res_query;
81
82         uint64_t bulletin_addr;
83 };
84
85 /* simple operation request on queue */
86 struct vf_q_op_tlv {
87         struct vf_first_tlv     first_tlv;
88         uint8_t vf_qid;
89         uint8_t pad[3];
90 };
91
92 /* receive side scaling tlv */
93 struct vf_rss_tlv {
94         struct vf_first_tlv     first_tlv;
95         uint32_t                rss_flags;
96         uint8_t                 rss_result_mask;
97         uint8_t                 ind_table_size;
98         uint8_t                 rss_key_size;
99         uint8_t                 pad;
100         uint8_t                 ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
101         uint32_t                rss_key[T_ETH_RSS_KEY]; /* hash values */
102 };
103
104 struct vf_resc {
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];
109         uint8_t num_rxqs;
110         uint8_t num_txqs;
111         uint8_t num_sbs;
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;
119 };
120
121 /* tlv struct holding reply for acquire */
122 struct vf_acquire_resp_tlv {
123         uint16_t type;
124         uint16_t length;
125         uint8_t status;
126         uint8_t pad1[3];
127         uint32_t chip_num;
128         uint8_t pad2[4];
129         char fw_ver[32];
130         uint16_t db_size;
131         uint8_t pad3[2];
132         struct vf_resc resc;
133 };
134
135 /* Init VF */
136 struct vf_init_tlv {
137         struct vf_first_tlv first_tlv;
138         uint64_t sb_addr[BNX2X_VF_MAX_SBS_PER_VF];
139         uint64_t spq_addr;
140         uint64_t stats_addr;
141         uint16_t stats_step;
142         uint32_t flags;
143         uint32_t pad[2];
144 };
145
146 struct vf_rxq_params {
147         /* physical addresses */
148         uint64_t rcq_addr;
149         uint64_t rcq_np_addr;
150         uint64_t rxq_addr;
151         uint64_t pad1;
152
153         /* sb + hc info */
154         uint8_t  vf_sb_id;
155         uint8_t  sb_cq_index;
156         uint16_t hc_rate;       /* desired interrupts per sec. */
157         /* rx buffer info */
158         uint16_t mtu;
159         uint16_t buf_sz;
160         uint16_t flags;         /* for BNX2X_VF_Q_FLAG_X flags */
161         uint16_t stat_id;       /* valid if BNX2X_VF_Q_FLAG_STATS */
162
163         uint8_t pad2[5];
164
165         uint8_t drop_flags;
166         uint8_t cache_line_log; /* BNX2X_VF_Q_FLAG_CACHE_ALIGN */
167         uint8_t pad3;
168 };
169
170 struct vf_txq_params {
171         /* physical addresses */
172         uint64_t txq_addr;
173
174         /* sb + hc info */
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() */
181         uint8_t  pad;
182 };
183
184 /* Setup Queue */
185 struct vf_setup_q_tlv {
186         struct vf_first_tlv first_tlv;
187
188         struct vf_rxq_params rxq;
189         struct vf_txq_params txq;
190
191         uint8_t vf_qid;                 /* index in hw_qid[] */
192         uint8_t param_valid;
193         #define VF_RXQ_VALID            0x01
194         #define VF_TXQ_VALID            0x02
195         uint8_t pad[2];
196 };
197
198 /* Set Queue Filters */
199 struct vf_q_mac_vlan_filter {
200         uint32_t flags;
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];
205         uint16_t vlan_tag;
206 };
207
208
209 #define _UP_ETH_ALEN    (6)
210
211 /* configure queue filters */
212 struct vf_set_q_filters_tlv {
213         struct vf_first_tlv first_tlv;
214
215         uint32_t flags;
216         #define BNX2X_VF_MAC_VLAN_CHANGED       0x01
217         #define BNX2X_VF_MULTICAST_CHANGED      0x02
218         #define BNX2X_VF_RX_MASK_CHANGED        0x04
219
220         uint8_t vf_qid;                 /* index in hw_qid[] */
221         uint8_t mac_filters_cnt;
222         uint8_t multicast_cnt;
223         uint8_t pad;
224
225         #define VF_MAX_MAC_FILTERS                      16
226         #define VF_MAX_VLAN_FILTERS                     16
227         #define VF_MAX_FILTERS                  (VF_MAX_MAC_FILTERS +\
228                                                         VF_MAX_VLAN_FILTERS)
229         struct vf_q_mac_vlan_filter filters[VF_MAX_FILTERS];
230
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;
234 };
235
236
237 /* close VF (disable VF) */
238 struct vf_close_tlv {
239         struct vf_first_tlv     first_tlv;
240         uint16_t                vf_id;  /* for debug */
241         uint8_t pad[2];
242 };
243
244 /* rlease the VF's acquired resources */
245 struct vf_release_tlv {
246         struct vf_first_tlv   first_tlv;
247         uint16_t                vf_id;  /* for debug */
248         uint8_t pad[2];
249 };
250
251 union query_tlvs {
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;
263 };
264
265 union resp_tlvs {
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;
270 };
271
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
275                                          * mid-update
276                                          */
277         uint16_t version;
278         uint16_t length;
279
280         uint64_t valid_bitmap;  /* bitmap indicating which fields
281                                          * hold valid values
282                                          */
283
284 #define MAC_ADDR_VALID          0       /* alert the vf that a new mac address
285                                          * is available for it
286                                          */
287 #define VLAN_VALID              1       /* when set, the vf should no access the
288                                          * vf channel
289                                          */
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
293                                          */
294         uint8_t mac[ETH_ALEN];
295         uint8_t mac_pad[2];
296
297         uint16_t vlan;
298         uint8_t vlan_pad[6];
299 };
300
301 #define MAX_TLVS_IN_LIST 50
302 enum channel_tlvs {
303         BNX2X_VF_TLV_NONE, /* ends tlv sequence */
304         BNX2X_VF_TLV_ACQUIRE,
305         BNX2X_VF_TLV_INIT,
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,
311         BNX2X_VF_TLV_CLOSE,
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,
316         BNX2X_VF_TLV_FLR,
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,
321         BNX2X_VF_TLV_MAX
322 };
323
324 struct bnx2x_vf_mbx_msg {
325         union query_tlvs query[BNX2X_VF_MAX_QUEUES_PER_VF];
326         union resp_tlvs resp;
327 };
328
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);
335
336 #endif /* BNX2X_VFPF_H */