1 /* bnx2x_vfpf.h: Broadcom Everest network driver.
2  *
3  * Copyright (c) 2011-2013 Broadcom Corporation
4  *
5  * Unless you and Broadcom execute a separate written software license
6  * agreement governing use of this software, this software is licensed to you
7  * under the terms of the GNU General Public License version 2, available
8  * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL").
9  *
10  * Notwithstanding the above, under no circumstances may you combine this
11  * software in any way with any other Broadcom software provided under a
12  * license other than the GPL, without Broadcom's express prior written
13  * consent.
14  *
15  * Maintained by: Eilon Greenstein <eilong@broadcom.com>
16  * Written by: Ariel Elior <ariele@broadcom.com>
17  */
18 #ifndef VF_PF_IF_H
19 #define VF_PF_IF_H
20 
21 #ifdef CONFIG_BNX2X_SRIOV
22 
23 /* Common definitions for all HVs */
24 struct vf_pf_resc_request {
25 	u8  num_rxqs;
26 	u8  num_txqs;
27 	u8  num_sbs;
28 	u8  num_mac_filters;
29 	u8  num_vlan_filters;
30 	u8  num_mc_filters; /* No limit  so superfluous */
31 };
32 
33 struct hw_sb_info {
34 	u8 hw_sb_id;	/* aka absolute igu id, used to ack the sb */
35 	u8 sb_qid;	/* used to update DHC for sb */
36 };
37 
38 /* HW VF-PF channel definitions
39  * A.K.A VF-PF mailbox
40  */
41 #define TLV_BUFFER_SIZE			1024
42 #define PF_VF_BULLETIN_SIZE		512
43 
44 #define VFPF_QUEUE_FLG_TPA		0x0001
45 #define VFPF_QUEUE_FLG_TPA_IPV6		0x0002
46 #define VFPF_QUEUE_FLG_TPA_GRO		0x0004
47 #define VFPF_QUEUE_FLG_CACHE_ALIGN	0x0008
48 #define VFPF_QUEUE_FLG_STATS		0x0010
49 #define VFPF_QUEUE_FLG_OV		0x0020
50 #define VFPF_QUEUE_FLG_VLAN		0x0040
51 #define VFPF_QUEUE_FLG_COS		0x0080
52 #define VFPF_QUEUE_FLG_HC		0x0100
53 #define VFPF_QUEUE_FLG_DHC		0x0200
54 
55 #define VFPF_QUEUE_DROP_IP_CS_ERR	(1 << 0)
56 #define VFPF_QUEUE_DROP_TCP_CS_ERR	(1 << 1)
57 #define VFPF_QUEUE_DROP_TTL0		(1 << 2)
58 #define VFPF_QUEUE_DROP_UDP_CS_ERR	(1 << 3)
59 
60 #define VFPF_RX_MASK_ACCEPT_NONE		0x00000000
61 #define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST	0x00000001
62 #define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST	0x00000002
63 #define VFPF_RX_MASK_ACCEPT_ALL_UNICAST		0x00000004
64 #define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST	0x00000008
65 #define VFPF_RX_MASK_ACCEPT_BROADCAST		0x00000010
66 #define BULLETIN_CONTENT_SIZE		(sizeof(struct pf_vf_bulletin_content))
67 #define BULLETIN_ATTEMPTS	5 /* crc failures before throwing towel */
68 #define BULLETIN_CRC_SEED	0
69 
70 enum {
71 	PFVF_STATUS_WAITING = 0,
72 	PFVF_STATUS_SUCCESS,
73 	PFVF_STATUS_FAILURE,
74 	PFVF_STATUS_NOT_SUPPORTED,
75 	PFVF_STATUS_NO_RESOURCE
76 };
77 
78 /* vf pf channel tlvs */
79 /* general tlv header (used for both vf->pf request and pf->vf response) */
80 struct channel_tlv {
81 	u16 type;
82 	u16 length;
83 };
84 
85 /* header of first vf->pf tlv carries the offset used to calculate response
86  * buffer address
87  */
88 struct vfpf_first_tlv {
89 	struct channel_tlv tl;
90 	u32 resp_msg_offset;
91 };
92 
93 /* header of pf->vf tlvs, carries the status of handling the request */
94 struct pfvf_tlv {
95 	struct channel_tlv tl;
96 	u8 status;
97 	u8 padding[3];
98 };
99 
100 /* response tlv used for most tlvs */
101 struct pfvf_general_resp_tlv {
102 	struct pfvf_tlv hdr;
103 };
104 
105 /* used to terminate and pad a tlv list */
106 struct channel_list_end_tlv {
107 	struct channel_tlv tl;
108 	u8 padding[4];
109 };
110 
111 /* Acquire */
112 struct vfpf_acquire_tlv {
113 	struct vfpf_first_tlv first_tlv;
114 
115 	struct vf_pf_vfdev_info {
116 		/* the following fields are for debug purposes */
117 		u8  vf_id;		/* ME register value */
118 		u8  vf_os;		/* e.g. Linux, W2K8 */
119 		u8 padding[2];
120 	} vfdev_info;
121 
122 	struct vf_pf_resc_request resc_request;
123 
124 	aligned_u64 bulletin_addr;
125 };
126 
127 /* simple operation request on queue */
128 struct vfpf_q_op_tlv {
129 	struct vfpf_first_tlv	first_tlv;
130 	u8 vf_qid;
131 	u8 padding[3];
132 };
133 
134 /* acquire response tlv - carries the allocated resources */
135 struct pfvf_acquire_resp_tlv {
136 	struct pfvf_tlv hdr;
137 	struct pf_vf_pfdev_info {
138 		u32 chip_num;
139 		u32 pf_cap;
140 #define PFVF_CAP_RSS		0x00000001
141 #define PFVF_CAP_DHC		0x00000002
142 #define PFVF_CAP_TPA		0x00000004
143 		char fw_ver[32];
144 		u16 db_size;
145 		u8  indices_per_sb;
146 		u8  padding;
147 	} pfdev_info;
148 	struct pf_vf_resc {
149 		/* in case of status NO_RESOURCE in message hdr, pf will fill
150 		 * this struct with suggested amount of resources for next
151 		 * acquire request
152 		 */
153 #define PFVF_MAX_QUEUES_PER_VF         16
154 #define PFVF_MAX_SBS_PER_VF            16
155 		struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
156 		u8	hw_qid[PFVF_MAX_QUEUES_PER_VF];
157 		u8	num_rxqs;
158 		u8	num_txqs;
159 		u8	num_sbs;
160 		u8	num_mac_filters;
161 		u8	num_vlan_filters;
162 		u8	num_mc_filters;
163 		u8	permanent_mac_addr[ETH_ALEN];
164 		u8	current_mac_addr[ETH_ALEN];
165 		u8	padding[2];
166 	} resc;
167 };
168 
169 /* Init VF */
170 struct vfpf_init_tlv {
171 	struct vfpf_first_tlv first_tlv;
172 	aligned_u64 sb_addr[PFVF_MAX_SBS_PER_VF]; /* vf_sb based */
173 	aligned_u64 spq_addr;
174 	aligned_u64 stats_addr;
175 };
176 
177 /* Setup Queue */
178 struct vfpf_setup_q_tlv {
179 	struct vfpf_first_tlv first_tlv;
180 
181 	struct vf_pf_rxq_params {
182 		/* physical addresses */
183 		aligned_u64 rcq_addr;
184 		aligned_u64 rcq_np_addr;
185 		aligned_u64 rxq_addr;
186 		aligned_u64 sge_addr;
187 
188 		/* sb + hc info */
189 		u8  vf_sb;		/* index in hw_sbs[] */
190 		u8  sb_index;		/* Index in the SB */
191 		u16 hc_rate;		/* desired interrupts per sec. */
192 					/* valid iff VFPF_QUEUE_FLG_HC */
193 		/* rx buffer info */
194 		u16 mtu;
195 		u16 buf_sz;
196 		u16 flags;		/* VFPF_QUEUE_FLG_X flags */
197 		u16 stat_id;		/* valid iff VFPF_QUEUE_FLG_STATS */
198 
199 		/* valid iff VFPF_QUEUE_FLG_TPA */
200 		u16 sge_buf_sz;
201 		u16 tpa_agg_sz;
202 		u8 max_sge_pkt;
203 
204 		u8 drop_flags;		/* VFPF_QUEUE_DROP_X, for Linux VMs
205 					 * all the flags are turned off
206 					 */
207 
208 		u8 cache_line_log;	/* VFPF_QUEUE_FLG_CACHE_ALIGN */
209 		u8 padding;
210 	} rxq;
211 
212 	struct vf_pf_txq_params {
213 		/* physical addresses */
214 		aligned_u64 txq_addr;
215 
216 		/* sb + hc info */
217 		u8  vf_sb;		/* index in hw_sbs[] */
218 		u8  sb_index;		/* Index in the SB */
219 		u16 hc_rate;		/* desired interrupts per sec. */
220 					/* valid iff VFPF_QUEUE_FLG_HC */
221 		u32 flags;		/* VFPF_QUEUE_FLG_X flags */
222 		u16 stat_id;		/* valid iff VFPF_QUEUE_FLG_STATS */
223 		u8  traffic_type;	/* see in setup_context() */
224 		u8  padding;
225 	} txq;
226 
227 	u8 vf_qid;			/* index in hw_qid[] */
228 	u8 param_valid;
229 #define VFPF_RXQ_VALID		0x01
230 #define VFPF_TXQ_VALID		0x02
231 	u8 padding[2];
232 };
233 
234 /* Set Queue Filters */
235 struct vfpf_q_mac_vlan_filter {
236 	u32 flags;
237 #define VFPF_Q_FILTER_DEST_MAC_VALID	0x01
238 #define VFPF_Q_FILTER_VLAN_TAG_VALID	0x02
239 #define VFPF_Q_FILTER_SET_MAC		0x100	/* set/clear */
240 	u8  mac[ETH_ALEN];
241 	u16 vlan_tag;
242 };
243 
244 /* configure queue filters */
245 struct vfpf_set_q_filters_tlv {
246 	struct vfpf_first_tlv first_tlv;
247 
248 	u32 flags;
249 #define VFPF_SET_Q_FILTERS_MAC_VLAN_CHANGED	0x01
250 #define VFPF_SET_Q_FILTERS_MULTICAST_CHANGED	0x02
251 #define VFPF_SET_Q_FILTERS_RX_MASK_CHANGED	0x04
252 
253 	u8 vf_qid;			/* index in hw_qid[] */
254 	u8 n_mac_vlan_filters;
255 	u8 n_multicast;
256 	u8 padding;
257 
258 #define PFVF_MAX_MAC_FILTERS                   16
259 #define PFVF_MAX_VLAN_FILTERS                  16
260 #define PFVF_MAX_FILTERS               (PFVF_MAX_MAC_FILTERS +\
261 					 PFVF_MAX_VLAN_FILTERS)
262 	struct vfpf_q_mac_vlan_filter filters[PFVF_MAX_FILTERS];
263 
264 #define PFVF_MAX_MULTICAST_PER_VF              32
265 	u8  multicast[PFVF_MAX_MULTICAST_PER_VF][ETH_ALEN];
266 
267 	u32 rx_mask;	/* see mask constants at the top of the file */
268 };
269 
270 /* close VF (disable VF) */
271 struct vfpf_close_tlv {
272 	struct vfpf_first_tlv   first_tlv;
273 	u16			vf_id;  /* for debug */
274 	u8 padding[2];
275 };
276 
277 /* release the VF's acquired resources */
278 struct vfpf_release_tlv {
279 	struct vfpf_first_tlv	first_tlv;
280 	u16			vf_id;
281 	u8 padding[2];
282 };
283 
284 struct tlv_buffer_size {
285 	u8 tlv_buffer[TLV_BUFFER_SIZE];
286 };
287 
288 union vfpf_tlvs {
289 	struct vfpf_first_tlv		first_tlv;
290 	struct vfpf_acquire_tlv		acquire;
291 	struct vfpf_init_tlv		init;
292 	struct vfpf_close_tlv		close;
293 	struct vfpf_q_op_tlv		q_op;
294 	struct vfpf_setup_q_tlv		setup_q;
295 	struct vfpf_set_q_filters_tlv	set_q_filters;
296 	struct vfpf_release_tlv         release;
297 	struct channel_list_end_tlv     list_end;
298 	struct tlv_buffer_size		tlv_buf_size;
299 };
300 
301 union pfvf_tlvs {
302 	struct pfvf_general_resp_tlv    general_resp;
303 	struct pfvf_acquire_resp_tlv	acquire_resp;
304 	struct channel_list_end_tlv	list_end;
305 	struct tlv_buffer_size		tlv_buf_size;
306 };
307 
308 /* This is a structure which is allocated in the VF, which the PF may update
309  * when it deems it necessary to do so. The bulletin board is sampled
310  * periodically by the VF. A copy per VF is maintained in the PF (to prevent
311  * loss of data upon multiple updates (or the need for read modify write)).
312  */
313 struct pf_vf_bulletin_size {
314 	u8 size[PF_VF_BULLETIN_SIZE];
315 };
316 
317 struct pf_vf_bulletin_content {
318 	u32 crc;			/* crc of structure to ensure is not in
319 					 * mid-update
320 					 */
321 	u16 version;
322 	u16 length;
323 
324 	aligned_u64 valid_bitmap;	/* bitmap indicating which fields
325 					 * hold valid values
326 					 */
327 
328 #define MAC_ADDR_VALID		0	/* alert the vf that a new mac address
329 					 * is available for it
330 					 */
331 #define VLAN_VALID		1	/* when set, the vf should not access
332 					 * the vfpf channel
333 					 */
334 
335 	u8 mac[ETH_ALEN];
336 	u8 mac_padding[2];
337 
338 	u16 vlan;
339 	u8 vlan_padding[6];
340 };
341 
342 union pf_vf_bulletin {
343 	struct pf_vf_bulletin_content content;
344 	struct pf_vf_bulletin_size size;
345 };
346 
347 #define MAX_TLVS_IN_LIST 50
348 
349 enum channel_tlvs {
350 	CHANNEL_TLV_NONE,
351 	CHANNEL_TLV_ACQUIRE,
352 	CHANNEL_TLV_INIT,
353 	CHANNEL_TLV_SETUP_Q,
354 	CHANNEL_TLV_SET_Q_FILTERS,
355 	CHANNEL_TLV_TEARDOWN_Q,
356 	CHANNEL_TLV_CLOSE,
357 	CHANNEL_TLV_RELEASE,
358 	CHANNEL_TLV_PF_RELEASE_VF,
359 	CHANNEL_TLV_LIST_END,
360 	CHANNEL_TLV_FLR,
361 	CHANNEL_TLV_PF_SET_MAC,
362 	CHANNEL_TLV_PF_SET_VLAN,
363 	CHANNEL_TLV_MAX
364 };
365 
366 #endif /* CONFIG_BNX2X_SRIOV */
367 #endif /* VF_PF_IF_H */
368