1 #ifndef VF_PF_SW_IF_H
2 #define VF_PF_SW_IF_H
3 
4 
5 /*
6  * common flags - right now it duplicates the #defines in the PF code -
7  * TODO: put in another common header file
8  */
9 #define SW_VFPF_QUEUE_FLG_TPA   		0x0001
10 #define SW_VFPF_QUEUE_FLG_CACHE_ALIGN   	0x0002
11 #define SW_VFPF_QUEUE_FLG_STATS		0x0004
12 #define SW_VFPF_QUEUE_FLG_OV    		0x0008
13 #define SW_VFPF_QUEUE_FLG_VLAN  		0x0010
14 #define SW_VFPF_QUEUE_FLG_COS   		0x0020
15 #define SW_VFPF_QUEUE_FLG_HC		0x0040
16 #define SW_VFPF_QUEUE_FLG_DHC		0x0080
17 
18 #define SW_VFPF_QUEUE_DROP_IP_CS_ERR	(1 << 0)
19 #define SW_VFPF_QUEUE_DROP_TCP_CS_ERR	(1 << 1)
20 #define SW_VFPF_QUEUE_DROP_TTL0		(1 << 2)
21 #define SW_VFPF_QUEUE_DROP_UDP_CS_ERR	(1 << 3)
22 
23 #define SW_VFPF_VFDEF_INFO_AUX_DIRECT_DQ   0x01
24 
25 enum {
26 	SW_PFVF_STATUS_WAITING = 0,
27 	SW_PFVF_STATUS_SUCCESS,
28 	SW_PFVF_STATUS_FAILURE,
29 	SW_PFVF_STATUS_NOT_SUPPORTED,
30     SW_PFVF_STATUS_MISMATCH_PF_VF_VERSION,
31     SW_PFVF_STATUS_NO_RESOURCE,
32     SW_PFVF_STATUS_MISMATCH_FW_HSI
33 };
34 
35 /*  Headers */
36 struct vf_pf_msg_hdr {
37 	u16 opcode;
38 
39 #define PFVF_IF_VERSION     	   1
40 	u8  if_ver;
41 	u8  opcode_ver;
42 	u32 resp_msg_offset;
43 };
44 
45 struct pf_vf_msg_hdr {
46 	u8 status;
47 	u8 opcode_ver;
48 	u16 opcode;
49 };
50 
51 /* simple response */
52 struct pf_vf_msg_resp {
53 	struct pf_vf_msg_hdr    hdr;
54 };
55 
56 
57 /* Acquire */
58 struct vf_pf_msg_acquire {
59 	struct vf_pf_msg_hdr hdr;
60 
61 	struct sw_vf_pf_vfdev_info
62 	{
63 		/* the following fields are for debug purposes */
64 		u8  vf_id;      	/* ME register value */
65 		u8  vf_os;      	/* e.g. Linux, W2K8 */
66         u8  vf_aux;
67         u8  fp_hsi_ver;
68         u32 vf_fw_hsi_version;  /* e.g. 6.0.12 */
69 	} vfdev_info;
70 
71 	struct sw_vf_pf_resc_request
72 	{
73 		u8  num_rxqs;
74 		u8  num_txqs;
75 		u8  num_sbs;
76 		u8  num_mac_filters;
77 		u8  num_vlan_filters;
78 		u8  num_mc_filters;
79         u8  reserved1;
80         u8  reserved2;
81 
82 	/* TODO: future:
83 		statistics resc?, other resc?   */
84 	} resc_request;
85 };
86 
87 
88 /* simple operation request on queue */
89 struct vf_pf_msg_q_op {
90 	struct vf_pf_msg_hdr    hdr;
91 	u8      		vf_qid;
92 	u8			padding[3];
93 };
94 
95 struct vf_pf_msg_rss {
96 	struct vf_pf_msg_hdr    hdr;
97 	u32   					rss_flags;
98 
99 	/* Number hash bits to take into an account */
100 	u8  					rss_result_mask;
101 
102 	u8						ind_table_size;
103 	u8						rss_key_size;
104 
105 	/* Indirection table */
106 	u8  					ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
107 
108 	/* RSS hash values */
109 	u32 					rss_key[10];
110 };
111 
112 struct vf_pf_msg_rsc {
113     struct vf_pf_msg_hdr    hdr;
114     u32                     rsc_ipv4_state;
115     u32                     rsc_ipv6_state;
116 };
117 
118 struct sw_hw_sb_info {
119 	u8 hw_sb_id;	/* aka absolute igu id, used to ack the sb */
120 	u8 sb_qid;	/* used to update DHC for sb */
121 };
122 
123 struct pf_vf_msg_acquire_resp {
124 	struct pf_vf_msg_hdr hdr;
125 
126 	struct sw_pf_vf_pfdev_info
127 	{
128 		u32 chip_num;
129 
130 		u32 pf_cap;
131 		#define PFVF_CAP_RSS        0x00000001
132 		#define PFVF_CAP_DHC        0x00000002
133 		#define PFVF_CAP_TPA        0x00000004
134                 #define PFVF_DEBUG          0x80000000
135 
136 		u16 db_size;
137 		u8  indices_per_sb;
138 		u8  padding;
139 	} pfdev_info;
140 
141 	struct sw_pf_vf_resc
142 	{
143 		/*
144 		 * in case of status NO_RESOURCE in message hdr, pf will fill
145 		 * this struct with suggested amount of resources for next
146 		 * acquire request
147 		 */
148 
149 		#define PFVF_MAX_QUEUES_PER_VF         16
150 		#define PFVF_MAX_SBS_PER_VF            16
151 		struct sw_hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
152 		u8	hw_qid[PFVF_MAX_QUEUES_PER_VF];
153 		u8	num_rxqs;
154 		u8	num_txqs;
155 		u8	num_sbs;
156 		u8	num_mac_filters;
157 		u8	num_vlan_filters;
158 		u8	num_mc_filters;
159 		u8  igu_test_cnt;
160 		u8  igu_cnt;
161 		u8 	permanent_mac_addr[8];
162 		u8 	current_mac_addr[8];
163 	/* TODO: stats resc? cid for the ramrod? stats_id? spq prod id? */
164 	} resc;
165 };
166 
167 /* Init VF */
168 struct vf_pf_msg_init_vf {
169 	struct vf_pf_msg_hdr hdr;
170 
171 	u64 sb_addr[PFVF_MAX_SBS_PER_VF]; /* vf_sb based */
172 	u64 spq_addr;
173 	u64 stats_addr;
174 };
175 
176 /* Setup Queue */
177 struct vf_pf_msg_setup_q {
178 	struct vf_pf_msg_hdr hdr;
179 	u8 vf_qid;			/* index in hw_qid[] */
180 
181 	u8 param_valid;
182 	#define VFPF_RXQ_VALID		0x01
183 	#define VFPF_TXQ_VALID		0x02
184 
185 	u16 padding;
186 
187 	struct sw_vf_pf_rxq_params {
188 		/* physical addresses */
189 		u64 rcq_addr;
190 		u64 rcq_np_addr;
191 		u64 rxq_addr;
192 		u64 sge_addr;
193 
194 		/* sb + hc info */
195 		u8  vf_sb;		/* index in hw_sbs[] */
196 		u8  sb_index;           /* Index in the SB */
197 		u16 hc_rate;		/* desired interrupts per sec. */
198 					/* valid iff VFPF_QUEUE_FLG_HC */
199 		/* rx buffer info */
200 		u16 mtu;
201 		u16 buf_sz;
202 		u16 flags;              /* VFPF_QUEUE_FLG_X flags */
203 		u16 stat_id;		/* valid iff VFPF_QUEUE_FLG_STATS */
204 
205 		/* valid iff VFPF_QUEUE_FLG_TPA */
206 		u16 sge_buf_sz;
207 		u16 tpa_agg_sz;
208 		u8 max_sge_pkt;
209 
210 		u8 drop_flags;		/* VFPF_QUEUE_DROP_X, for Linux all should
211 					 * be turned off, see setup_rx_queue()
212 					 * for reference
213 					 */
214 
215 		u8 cache_line_log;	/* VFPF_QUEUE_FLG_CACHE_ALIGN
216 					 * see init_rx_queue()
217 					 */
218 		u8 padding;
219 	} rxq;
220 
221 	struct sw_vf_pf_txq_params {
222 		/* physical addresses */
223 		u64 txq_addr;
224 
225 		/* sb + hc info */
226 		u8  vf_sb;		/* index in hw_sbs[] */
227 		u8  sb_index;		/* Index in the SB */
228 		u16 hc_rate;		/* desired interrupts per sec. */
229 					/* valid iff VFPF_QUEUE_FLG_HC */
230 		u32 flags;		/* VFPF_QUEUE_FLG_X flags */
231 		u16 stat_id;		/* valid iff VFPF_QUEUE_FLG_STATS */
232 		u8  traffic_type;	/* see in setup_context() */
233 		u8  padding;
234 	} txq;
235 };
236 
237 
238 /* Set Queue Filters */
239 struct vf_pf_q_mac_vlan_filter {
240 	u32 flags;
241 	#define VFPF_Q_FILTER_DEST_MAC_PRESENT 	0x01
242 	#define VFPF_Q_FILTER_VLAN_TAG_PRESENT	0x02
243 
244 	#define VFPF_Q_FILTER_SET_MAC			0x100
245 
246 	u8  dest_mac[6];
247 	u16 vlan_tag;
248 };
249 
250 struct vf_pf_msg_set_q_filters {
251 	struct vf_pf_msg_hdr hdr;
252 
253 	u32 flags;
254 	#define VFPF_SET_Q_FILTERS_MAC_VLAN_CHANGED 	0x01
255 	#define VFPF_SET_Q_FILTERS_MULTICAST_CHANGED	0x02
256 	#define VFPF_SET_Q_FILTERS_RX_MASK_CHANGED  	0x04
257 
258 	u8 vf_qid;			/* index in hw_qid[] */
259 	u8 n_mac_vlan_filters;
260 	u8 n_multicast;
261 	u8 padding;
262 
263 	#define PFVF_MAX_MAC_FILTERS			16
264 	#define PFVF_MAX_VLAN_FILTERS       		16
265 //	#define PFVF_MAX_MAC_FILTERS			1
266 //	#define PFVF_MAX_VLAN_FILTERS       		1
267 	#define PFVF_MAX_FILTERS 			(PFVF_MAX_MAC_FILTERS +\
268 							 PFVF_MAX_VLAN_FILTERS)
269 	struct vf_pf_q_mac_vlan_filter filters[PFVF_MAX_FILTERS];
270 
271 	#define PFVF_MAX_MULTICAST_PER_VF   		32
272 //	#define PFVF_MAX_MULTICAST_PER_VF   		1
273 	u8  multicast[PFVF_MAX_MULTICAST_PER_VF][6];
274 
275 	u32 rx_mask;
276 	#define VFPF_RX_MASK_ACCEPT_NONE		0x00000000
277 	#define VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST	0x00000001
278 	#define VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST	0x00000002
279 	#define VFPF_RX_MASK_ACCEPT_ALL_UNICAST		0x00000004
280 	#define VFPF_RX_MASK_ACCEPT_ALL_MULTICAST	0x00000008
281 	#define VFPF_RX_MASK_ACCEPT_BROADCAST		0x00000010
282 	/* TODO: #define VFPF_RX_MASK_ACCEPT_ANY_VLAN	0x00000020 */
283 };
284 
285 
286 /* close VF (disable VF) */
287 struct vf_pf_msg_close_vf {
288 	struct vf_pf_msg_hdr	hdr;
289 	u16			vf_id;  /* for debug */
290 	u16			padding;
291 };
292 
293 /* rlease the VF's acquired resources */
294 struct vf_pf_msg_release_vf {
295 	struct vf_pf_msg_hdr	hdr;
296 	u16			vf_id;  /* for debug */
297 	u16			padding;
298 };
299 
300 
301 union vf_pf_msg {
302 	struct vf_pf_msg_hdr		hdr;
303 	struct vf_pf_msg_acquire	acquire;
304 	struct vf_pf_msg_init_vf	init_vf;
305 	struct vf_pf_msg_close_vf	close_vf;
306 	struct vf_pf_msg_q_op		q_op;
307 	struct vf_pf_msg_setup_q	setup_q;
308 	struct vf_pf_msg_set_q_filters	set_q_filters;
309 	struct vf_pf_msg_release_vf	release_vf;
310 	struct vf_pf_msg_rss		update_rss;
311     struct vf_pf_msg_rsc        update_rsc;
312 };
313 
314 
315 union pf_vf_msg {
316 	struct pf_vf_msg_resp		resp;
317 	struct pf_vf_msg_acquire_resp	acquire_resp;
318 };
319 
320 typedef struct {
321 	u32 req_sz;
322 	u32 resp_sz;
323 } msg_sz_t;
324 
325 #define PFVF_OP_VER_MAX(op_arry)  (sizeof(op_arry)/sizeof(*op_arry) - 1)
326 
327 static const msg_sz_t acquire_req_sz[] = {
328 	/* sizeof(vf_pf_msg_acquire) - offsetof(struct vf_pf_msg_acquire, fieldX), */
329 	{sizeof(struct vf_pf_msg_acquire),
330 	sizeof(struct pf_vf_msg_acquire_resp)}
331 };
332 #define PFVF_ACQUIRE_VER  PFVF_OP_VER_MAX(acquire_req_sz)
333 
334 static const msg_sz_t init_vf_req_sz[] = {
335 	{sizeof(struct vf_pf_msg_init_vf), sizeof(struct pf_vf_msg_resp)}
336 };
337 #define PFVF_INIT_VF_VER  PFVF_OP_VER_MAX(init_vf_req_sz)
338 
339 static const msg_sz_t setup_q_req_sz[] = {
340 	{sizeof(struct vf_pf_msg_setup_q), sizeof(struct pf_vf_msg_resp)}
341 };
342 #define PFVF_SETUP_Q_VER  PFVF_OP_VER_MAX(setup_q_req_sz)
343 
344 static const msg_sz_t set_q_filters_req_sz[] = {
345 	{sizeof(struct vf_pf_msg_set_q_filters), sizeof(struct pf_vf_msg_resp)}
346 };
347 #define PFVF_SET_Q_FILTERS_VER  PFVF_OP_VER_MAX(set_q_filters_req_sz)
348 
349 static const msg_sz_t activate_q_req_sz[] = {
350 	{sizeof(struct vf_pf_msg_q_op), sizeof(struct pf_vf_msg_resp)}
351 };
352 #define PFVF_ACTIVATE_Q_VER  PFVF_OP_VER_MAX(activate_q_req_sz)
353 
354 static const msg_sz_t deactivate_q_req_sz[] = {
355 	{sizeof(struct vf_pf_msg_q_op), sizeof(struct pf_vf_msg_resp)}
356 };
357 #define PFVF_DEACTIVATE_Q_VER  PFVF_OP_VER_MAX(deactivate_q_req_sz)
358 
359 static const msg_sz_t teardown_q_req_sz[] = {
360 	{sizeof(struct vf_pf_msg_q_op), sizeof(struct pf_vf_msg_resp)}
361 };
362 #define PFVF_TEARDOWN_Q_VER  PFVF_OP_VER_MAX(teardown_q_req_sz)
363 
364 static const msg_sz_t close_vf_req_sz[] = {
365 	{sizeof(struct vf_pf_msg_close_vf), sizeof(struct pf_vf_msg_resp)}
366 };
367 #define PFVF_CLOSE_VF_VER  PFVF_OP_VER_MAX(close_vf_req_sz)
368 
369 static const msg_sz_t release_vf_req_sz[] = {
370 	{sizeof(struct vf_pf_msg_release_vf), sizeof(struct pf_vf_msg_resp)}
371 };
372 #define PFVF_RELEASE_VF_VER  PFVF_OP_VER_MAX(release_vf_req_sz)
373 
374 static const msg_sz_t update_rss_req_sz[] = {
375 	{sizeof(struct vf_pf_msg_rss), sizeof(struct pf_vf_msg_resp)}
376 };
377 #define PFVF_UPDATE_RSS_VER  PFVF_OP_VER_MAX(update_rss_req_sz)
378 
379 static const msg_sz_t update_rsc_req_sz[] = {
380     {sizeof(struct vf_pf_msg_rsc), sizeof(struct pf_vf_msg_resp)}
381 };
382 #define PFVF_UPDATE_RSC_VER  PFVF_OP_VER_MAX(update_rsc_req_sz)
383 
384 enum {
385 	PFVF_OP_ACQUIRE = 0,
386 	PFVF_OP_INIT_VF,
387 	PFVF_OP_SETUP_Q,
388 	PFVF_OP_SET_Q_FILTERS,
389 	PFVF_OP_ACTIVATE_Q,
390 	PFVF_OP_DEACTIVATE_Q,
391 	PFVF_OP_TEARDOWN_Q,
392 	PFVF_OP_CLOSE_VF,
393 	PFVF_OP_RELEASE_VF,
394 	PFVF_OP_UPDATE_RSS,
395     PFVF_OP_UPDATE_RSC,
396 	PFVF_OP_MAX
397 };
398 
399 
400 /** To get size of message of the type X(request or response)
401  *  for the op_code Y of the version Z one should use
402  *
403  *  op_code_req_sz[Y][Z].req_sz/resp_sz
404  ******************************************************************/
405 /* const msg_sz_t* op_codes_req_sz[] = {
406 	(const msg_sz_t*)acquire_req_sz,
407 	(const msg_sz_t*)init_vf_req_sz,
408 	(const msg_sz_t*)setup_q_req_sz,
409 	(const msg_sz_t*)set_q_filters_req_sz,
410 	(const msg_sz_t*)activate_q_req_sz,
411 	(const msg_sz_t*)deactivate_q_req_sz,
412 	(const msg_sz_t*)teardown_q_req_sz,
413 	(const msg_sz_t*)close_vf_req_sz,
414 	(const msg_sz_t*)release_vf_req_sz
415 }; */
416 
417 #endif /* VF_PF_SW_IF_H */
418