]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/dpdk/drivers/net/bnx2x/bnx2x_vfpf.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / spdk / dpdk / 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 #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 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_set_mac(struct bnx2x_softc *sc, int set);
332 int bnx2x_vf_config_rss(struct bnx2x_softc *sc, struct ecore_config_rss_params *params);
333
334 #endif /* BNX2X_VFPF_H */