ecore_vfpf_if.h revision 316485
1316485Sdavidcs/*
2316485Sdavidcs * Copyright (c) 2017-2018 Cavium, Inc.
3316485Sdavidcs * All rights reserved.
4316485Sdavidcs *
5316485Sdavidcs *  Redistribution and use in source and binary forms, with or without
6316485Sdavidcs *  modification, are permitted provided that the following conditions
7316485Sdavidcs *  are met:
8316485Sdavidcs *
9316485Sdavidcs *  1. Redistributions of source code must retain the above copyright
10316485Sdavidcs *     notice, this list of conditions and the following disclaimer.
11316485Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12316485Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13316485Sdavidcs *     documentation and/or other materials provided with the distribution.
14316485Sdavidcs *
15316485Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16316485Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17316485Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18316485Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19316485Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20316485Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21316485Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22316485Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23316485Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24316485Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25316485Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26316485Sdavidcs *
27316485Sdavidcs * $FreeBSD: head/sys/dev/qlnx/qlnxe/ecore_vfpf_if.h 316485 2017-04-04 06:16:59Z davidcs $
28316485Sdavidcs *
29316485Sdavidcs */
30316485Sdavidcs
31316485Sdavidcs#ifndef __ECORE_VF_PF_IF_H__
32316485Sdavidcs#define __ECORE_VF_PF_IF_H__
33316485Sdavidcs
34316485Sdavidcs#define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */
35316485Sdavidcs#define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */
36316485Sdavidcs#define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/
37316485Sdavidcs
38316485Sdavidcs/***********************************************
39316485Sdavidcs *
40316485Sdavidcs * Common definitions for all HVs
41316485Sdavidcs *
42316485Sdavidcs **/
43316485Sdavidcsstruct vf_pf_resc_request {
44316485Sdavidcs	u8 num_rxqs;
45316485Sdavidcs	u8 num_txqs;
46316485Sdavidcs	u8 num_sbs;
47316485Sdavidcs	u8 num_mac_filters;
48316485Sdavidcs	u8 num_vlan_filters;
49316485Sdavidcs	u8 num_mc_filters; /* No limit  so superfluous */
50316485Sdavidcs	u8 num_cids;
51316485Sdavidcs	u8 padding;
52316485Sdavidcs};
53316485Sdavidcs
54316485Sdavidcsstruct hw_sb_info {
55316485Sdavidcs	u16 hw_sb_id;    /* aka absolute igu id, used to ack the sb */
56316485Sdavidcs	u8 sb_qid;      /* used to update DHC for sb */
57316485Sdavidcs	u8 padding[5];
58316485Sdavidcs};
59316485Sdavidcs
60316485Sdavidcs/***********************************************
61316485Sdavidcs *
62316485Sdavidcs * HW VF-PF channel definitions
63316485Sdavidcs *
64316485Sdavidcs * A.K.A VF-PF mailbox
65316485Sdavidcs *
66316485Sdavidcs **/
67316485Sdavidcs#define TLV_BUFFER_SIZE 		1024
68316485Sdavidcs
69316485Sdavidcs/* vf pf channel tlvs */
70316485Sdavidcs/* general tlv header (used for both vf->pf request and pf->vf response) */
71316485Sdavidcsstruct channel_tlv {
72316485Sdavidcs	u16 type;
73316485Sdavidcs	u16 length;
74316485Sdavidcs};
75316485Sdavidcs
76316485Sdavidcs/* header of first vf->pf tlv carries the offset used to calculate reponse
77316485Sdavidcs * buffer address
78316485Sdavidcs */
79316485Sdavidcsstruct vfpf_first_tlv {
80316485Sdavidcs	struct channel_tlv tl;
81316485Sdavidcs	u32 padding;
82316485Sdavidcs	u64 reply_address;
83316485Sdavidcs};
84316485Sdavidcs
85316485Sdavidcs/* header of pf->vf tlvs, carries the status of handling the request */
86316485Sdavidcsstruct pfvf_tlv {
87316485Sdavidcs	struct channel_tlv tl;
88316485Sdavidcs	u8 status;
89316485Sdavidcs	u8 padding[3];
90316485Sdavidcs};
91316485Sdavidcs
92316485Sdavidcs/* response tlv used for most tlvs */
93316485Sdavidcsstruct pfvf_def_resp_tlv {
94316485Sdavidcs	struct pfvf_tlv hdr;
95316485Sdavidcs};
96316485Sdavidcs
97316485Sdavidcs/* used to terminate and pad a tlv list */
98316485Sdavidcsstruct channel_list_end_tlv {
99316485Sdavidcs	struct channel_tlv tl;
100316485Sdavidcs	u8 padding[4];
101316485Sdavidcs};
102316485Sdavidcs
103316485Sdavidcs/* Acquire */
104316485Sdavidcsstruct vfpf_acquire_tlv {
105316485Sdavidcs	struct vfpf_first_tlv first_tlv;
106316485Sdavidcs
107316485Sdavidcs	struct vf_pf_vfdev_info {
108316485Sdavidcs	/* First bit was used on 8.7.x and 8.8.x versions, which had different
109316485Sdavidcs	 * FWs used but with the same faspath HSI. As this was prior to the
110316485Sdavidcs	 * fastpath versioning, wanted to have ability to override fw matching
111316485Sdavidcs	 * and allow them to interact.
112316485Sdavidcs	 */
113316485Sdavidcs#define VFPF_ACQUIRE_CAP_PRE_FP_HSI	(1 << 0) /* VF pre-FP hsi version */
114316485Sdavidcs#define VFPF_ACQUIRE_CAP_100G		(1 << 1) /* VF can support 100g */
115316485Sdavidcs
116316485Sdavidcs	/* A requirement for supporting multi-Tx queues on a single queue-zone,
117316485Sdavidcs	 * VF would pass qids as additional information whenever passing queue
118316485Sdavidcs	 * references.
119316485Sdavidcs	 * TODO - due to the CID limitations in Bar0, VFs currently don't pass
120316485Sdavidcs	 * this, and use the legacy CID scheme.
121316485Sdavidcs	 */
122316485Sdavidcs#define VFPF_ACQUIRE_CAP_QUEUE_QIDS	(1 << 2)
123316485Sdavidcs		u64 capabilities;
124316485Sdavidcs		u8 fw_major;
125316485Sdavidcs		u8 fw_minor;
126316485Sdavidcs		u8 fw_revision;
127316485Sdavidcs		u8 fw_engineering;
128316485Sdavidcs		u32 driver_version;
129316485Sdavidcs		u16 opaque_fid; /* ME register value */
130316485Sdavidcs		u8 os_type; /* VFPF_ACQUIRE_OS_* value */
131316485Sdavidcs		u8 eth_fp_hsi_major;
132316485Sdavidcs		u8 eth_fp_hsi_minor;
133316485Sdavidcs		u8 padding[3];
134316485Sdavidcs	} vfdev_info;
135316485Sdavidcs
136316485Sdavidcs	struct vf_pf_resc_request resc_request;
137316485Sdavidcs
138316485Sdavidcs	u64 bulletin_addr;
139316485Sdavidcs	u32 bulletin_size;
140316485Sdavidcs	u32 padding;
141316485Sdavidcs};
142316485Sdavidcs
143316485Sdavidcs/* receive side scaling tlv */
144316485Sdavidcsstruct vfpf_vport_update_rss_tlv {
145316485Sdavidcs	struct channel_tlv	tl;
146316485Sdavidcs
147316485Sdavidcs	u8 update_rss_flags;
148316485Sdavidcs	#define VFPF_UPDATE_RSS_CONFIG_FLAG	  (1 << 0)
149316485Sdavidcs	#define VFPF_UPDATE_RSS_CAPS_FLAG	  (1 << 1)
150316485Sdavidcs	#define VFPF_UPDATE_RSS_IND_TABLE_FLAG	  (1 << 2)
151316485Sdavidcs	#define VFPF_UPDATE_RSS_KEY_FLAG	  (1 << 3)
152316485Sdavidcs
153316485Sdavidcs	u8 rss_enable;
154316485Sdavidcs	u8 rss_caps;
155316485Sdavidcs	u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
156316485Sdavidcs	u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
157316485Sdavidcs	u32 rss_key[T_ETH_RSS_KEY_SIZE];
158316485Sdavidcs};
159316485Sdavidcs
160316485Sdavidcsstruct pfvf_storm_stats {
161316485Sdavidcs	u32 address;
162316485Sdavidcs	u32 len;
163316485Sdavidcs};
164316485Sdavidcs
165316485Sdavidcsstruct pfvf_stats_info {
166316485Sdavidcs	struct pfvf_storm_stats mstats;
167316485Sdavidcs	struct pfvf_storm_stats pstats;
168316485Sdavidcs	struct pfvf_storm_stats tstats;
169316485Sdavidcs	struct pfvf_storm_stats ustats;
170316485Sdavidcs};
171316485Sdavidcs
172316485Sdavidcs/* acquire response tlv - carries the allocated resources */
173316485Sdavidcsstruct pfvf_acquire_resp_tlv {
174316485Sdavidcs	struct pfvf_tlv hdr;
175316485Sdavidcs
176316485Sdavidcs	struct pf_vf_pfdev_info {
177316485Sdavidcs		u32 chip_num;
178316485Sdavidcs		u32 mfw_ver;
179316485Sdavidcs
180316485Sdavidcs		u16 fw_major;
181316485Sdavidcs		u16 fw_minor;
182316485Sdavidcs		u16 fw_rev;
183316485Sdavidcs		u16 fw_eng;
184316485Sdavidcs
185316485Sdavidcs		u64 capabilities;
186316485Sdavidcs#define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED	(1 << 0)
187316485Sdavidcs#define PFVF_ACQUIRE_CAP_100G			(1 << 1) /* If set, 100g PF */
188316485Sdavidcs/* There are old PF versions where the PF might mistakenly override the sanity
189316485Sdavidcs * mechanism [version-based] and allow a VF that can't be supported to pass
190316485Sdavidcs * the acquisition phase.
191316485Sdavidcs * To overcome this, PFs now indicate that they're past that point and the new
192316485Sdavidcs * VFs would fail probe on the older PFs that fail to do so.
193316485Sdavidcs */
194316485Sdavidcs#define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE	(1 << 2)
195316485Sdavidcs
196316485Sdavidcs	/* PF expects queues to be received with additional qids */
197316485Sdavidcs#define PFVF_ACQUIRE_CAP_QUEUE_QIDS		(1 << 3)
198316485Sdavidcs
199316485Sdavidcs		u16 db_size;
200316485Sdavidcs		u8  indices_per_sb;
201316485Sdavidcs		u8 os_type;
202316485Sdavidcs
203316485Sdavidcs		/* These should match the PF's ecore_dev values */
204316485Sdavidcs		u16 chip_rev;
205316485Sdavidcs		u8 dev_type;
206316485Sdavidcs
207316485Sdavidcs		u8 padding;
208316485Sdavidcs
209316485Sdavidcs		struct pfvf_stats_info stats_info;
210316485Sdavidcs
211316485Sdavidcs		u8 port_mac[ETH_ALEN];
212316485Sdavidcs
213316485Sdavidcs		/* It's possible PF had to configure an older fastpath HSI
214316485Sdavidcs		 * [in case VF is newer than PF]. This is communicated back
215316485Sdavidcs		 * to the VF. It can also be used in case of error due to
216316485Sdavidcs		 * non-matching versions to shed light in VF about failure.
217316485Sdavidcs		 */
218316485Sdavidcs		u8 major_fp_hsi;
219316485Sdavidcs		u8 minor_fp_hsi;
220316485Sdavidcs	} pfdev_info;
221316485Sdavidcs
222316485Sdavidcs	struct pf_vf_resc {
223316485Sdavidcs		/* in case of status NO_RESOURCE in message hdr, pf will fill
224316485Sdavidcs		 * this struct with suggested amount of resources for next
225316485Sdavidcs		 * acquire request
226316485Sdavidcs		 */
227316485Sdavidcs		#define PFVF_MAX_QUEUES_PER_VF         16
228316485Sdavidcs		#define PFVF_MAX_SBS_PER_VF            16
229316485Sdavidcs		struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
230316485Sdavidcs		u8      hw_qid[PFVF_MAX_QUEUES_PER_VF];
231316485Sdavidcs		u8      cid[PFVF_MAX_QUEUES_PER_VF];
232316485Sdavidcs
233316485Sdavidcs		u8      num_rxqs;
234316485Sdavidcs		u8      num_txqs;
235316485Sdavidcs		u8      num_sbs;
236316485Sdavidcs		u8      num_mac_filters;
237316485Sdavidcs		u8      num_vlan_filters;
238316485Sdavidcs		u8      num_mc_filters;
239316485Sdavidcs		u8	num_cids;
240316485Sdavidcs		u8      padding;
241316485Sdavidcs	} resc;
242316485Sdavidcs
243316485Sdavidcs	u32 bulletin_size;
244316485Sdavidcs	u32 padding;
245316485Sdavidcs};
246316485Sdavidcs
247316485Sdavidcsstruct pfvf_start_queue_resp_tlv {
248316485Sdavidcs	struct pfvf_tlv hdr;
249316485Sdavidcs	u32 offset; /* offset to consumer/producer of queue */
250316485Sdavidcs	u8 padding[4];
251316485Sdavidcs};
252316485Sdavidcs
253316485Sdavidcs/* Extended queue information - additional index for reference inside qzone.
254316485Sdavidcs * If commmunicated between VF/PF, each TLV relating to queues should be
255316485Sdavidcs * extended by one such [or have a future base TLV that already contains info].
256316485Sdavidcs */
257316485Sdavidcsstruct vfpf_qid_tlv {
258316485Sdavidcs	struct channel_tlv	tl;
259316485Sdavidcs	u8			qid;
260316485Sdavidcs	u8			padding[3];
261316485Sdavidcs};
262316485Sdavidcs
263316485Sdavidcs/* Setup Queue */
264316485Sdavidcsstruct vfpf_start_rxq_tlv {
265316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
266316485Sdavidcs
267316485Sdavidcs	/* physical addresses */
268316485Sdavidcs	u64		rxq_addr;
269316485Sdavidcs	u64		deprecated_sge_addr;
270316485Sdavidcs	u64		cqe_pbl_addr;
271316485Sdavidcs
272316485Sdavidcs	u16			cqe_pbl_size;
273316485Sdavidcs	u16			hw_sb;
274316485Sdavidcs	u16			rx_qid;
275316485Sdavidcs	u16			hc_rate; /* desired interrupts per sec. */
276316485Sdavidcs
277316485Sdavidcs	u16			bd_max_bytes;
278316485Sdavidcs	u16			stat_id;
279316485Sdavidcs	u8			sb_index;
280316485Sdavidcs	u8			padding[3];
281316485Sdavidcs
282316485Sdavidcs};
283316485Sdavidcs
284316485Sdavidcsstruct vfpf_start_txq_tlv {
285316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
286316485Sdavidcs
287316485Sdavidcs	/* physical addresses */
288316485Sdavidcs	u64		pbl_addr;
289316485Sdavidcs	u16			pbl_size;
290316485Sdavidcs	u16			stat_id;
291316485Sdavidcs	u16			tx_qid;
292316485Sdavidcs	u16			hw_sb;
293316485Sdavidcs
294316485Sdavidcs	u32			flags; /* VFPF_QUEUE_FLG_X flags */
295316485Sdavidcs	u16			hc_rate; /* desired interrupts per sec. */
296316485Sdavidcs	u8			sb_index;
297316485Sdavidcs	u8			padding[3];
298316485Sdavidcs};
299316485Sdavidcs
300316485Sdavidcs/* Stop RX Queue */
301316485Sdavidcsstruct vfpf_stop_rxqs_tlv {
302316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
303316485Sdavidcs
304316485Sdavidcs	u16			rx_qid;
305316485Sdavidcs
306316485Sdavidcs	/* While the API supports multiple Rx-queues on a single TLV
307316485Sdavidcs	 * message, in practice older VFs always used it as one [ecore].
308316485Sdavidcs	 * And there are PFs [starting with the CHANNEL_TLV_QID] which
309316485Sdavidcs	 * would start assuming this is always a '1'. So in practice this
310316485Sdavidcs	 * field should be considered deprecated and *Always* set to '1'.
311316485Sdavidcs	 */
312316485Sdavidcs	u8			num_rxqs;
313316485Sdavidcs
314316485Sdavidcs	u8			cqe_completion;
315316485Sdavidcs	u8			padding[4];
316316485Sdavidcs};
317316485Sdavidcs
318316485Sdavidcs/* Stop TX Queues */
319316485Sdavidcsstruct vfpf_stop_txqs_tlv {
320316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
321316485Sdavidcs
322316485Sdavidcs	u16			tx_qid;
323316485Sdavidcs
324316485Sdavidcs	/* While the API supports multiple Tx-queues on a single TLV
325316485Sdavidcs	 * message, in practice older VFs always used it as one [ecore].
326316485Sdavidcs	 * And there are PFs [starting with the CHANNEL_TLV_QID] which
327316485Sdavidcs	 * would start assuming this is always a '1'. So in practice this
328316485Sdavidcs	 * field should be considered deprecated and *Always* set to '1'.
329316485Sdavidcs	 */
330316485Sdavidcs	u8			num_txqs;
331316485Sdavidcs	u8			padding[5];
332316485Sdavidcs};
333316485Sdavidcs
334316485Sdavidcsstruct vfpf_update_rxq_tlv {
335316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
336316485Sdavidcs
337316485Sdavidcs	u64		deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
338316485Sdavidcs
339316485Sdavidcs	u16			rx_qid;
340316485Sdavidcs	u8			num_rxqs;
341316485Sdavidcs	u8			flags;
342316485Sdavidcs	#define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG	(1 << 0)
343316485Sdavidcs	#define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG		(1 << 1)
344316485Sdavidcs	#define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG	(1 << 2)
345316485Sdavidcs
346316485Sdavidcs	u8			padding[4];
347316485Sdavidcs};
348316485Sdavidcs
349316485Sdavidcs/* Set Queue Filters */
350316485Sdavidcsstruct vfpf_q_mac_vlan_filter {
351316485Sdavidcs	u32 flags;
352316485Sdavidcs	#define VFPF_Q_FILTER_DEST_MAC_VALID    0x01
353316485Sdavidcs	#define VFPF_Q_FILTER_VLAN_TAG_VALID    0x02
354316485Sdavidcs	#define VFPF_Q_FILTER_SET_MAC   	0x100   /* set/clear */
355316485Sdavidcs
356316485Sdavidcs	u8  mac[ETH_ALEN];
357316485Sdavidcs	u16 vlan_tag;
358316485Sdavidcs
359316485Sdavidcs	u8	padding[4];
360316485Sdavidcs};
361316485Sdavidcs
362316485Sdavidcs/* Start a vport */
363316485Sdavidcsstruct vfpf_vport_start_tlv {
364316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
365316485Sdavidcs
366316485Sdavidcs	u64		sb_addr[PFVF_MAX_SBS_PER_VF];
367316485Sdavidcs
368316485Sdavidcs	u32			tpa_mode;
369316485Sdavidcs	u16			dep1;
370316485Sdavidcs	u16			mtu;
371316485Sdavidcs
372316485Sdavidcs	u8			vport_id;
373316485Sdavidcs	u8			inner_vlan_removal;
374316485Sdavidcs
375316485Sdavidcs	u8			only_untagged;
376316485Sdavidcs	u8			max_buffers_per_cqe;
377316485Sdavidcs
378316485Sdavidcs	u8			padding[4];
379316485Sdavidcs};
380316485Sdavidcs
381316485Sdavidcs/* Extended tlvs - need to add rss, mcast, accept mode tlvs */
382316485Sdavidcsstruct vfpf_vport_update_activate_tlv {
383316485Sdavidcs	struct channel_tlv	tl;
384316485Sdavidcs	u8			update_rx;
385316485Sdavidcs	u8			update_tx;
386316485Sdavidcs	u8			active_rx;
387316485Sdavidcs	u8			active_tx;
388316485Sdavidcs};
389316485Sdavidcs
390316485Sdavidcsstruct vfpf_vport_update_tx_switch_tlv {
391316485Sdavidcs	struct channel_tlv	tl;
392316485Sdavidcs	u8			tx_switching;
393316485Sdavidcs	u8			padding[3];
394316485Sdavidcs};
395316485Sdavidcs
396316485Sdavidcsstruct vfpf_vport_update_vlan_strip_tlv {
397316485Sdavidcs	struct channel_tlv	tl;
398316485Sdavidcs	u8			remove_vlan;
399316485Sdavidcs	u8			padding[3];
400316485Sdavidcs};
401316485Sdavidcs
402316485Sdavidcsstruct vfpf_vport_update_mcast_bin_tlv {
403316485Sdavidcs	struct channel_tlv	tl;
404316485Sdavidcs	u8			padding[4];
405316485Sdavidcs
406316485Sdavidcs	u64		bins[8];
407316485Sdavidcs};
408316485Sdavidcs
409316485Sdavidcsstruct vfpf_vport_update_accept_param_tlv {
410316485Sdavidcs	struct channel_tlv tl;
411316485Sdavidcs	u8	update_rx_mode;
412316485Sdavidcs	u8	update_tx_mode;
413316485Sdavidcs	u8	rx_accept_filter;
414316485Sdavidcs	u8	tx_accept_filter;
415316485Sdavidcs};
416316485Sdavidcs
417316485Sdavidcsstruct vfpf_vport_update_accept_any_vlan_tlv {
418316485Sdavidcs	struct channel_tlv tl;
419316485Sdavidcs	u8 update_accept_any_vlan_flg;
420316485Sdavidcs	u8 accept_any_vlan;
421316485Sdavidcs
422316485Sdavidcs	u8 padding[2];
423316485Sdavidcs};
424316485Sdavidcs
425316485Sdavidcsstruct vfpf_vport_update_sge_tpa_tlv {
426316485Sdavidcs	struct channel_tlv	tl;
427316485Sdavidcs
428316485Sdavidcs	u16			sge_tpa_flags;
429316485Sdavidcs	#define VFPF_TPA_IPV4_EN_FLAG	     (1 << 0)
430316485Sdavidcs	#define VFPF_TPA_IPV6_EN_FLAG        (1 << 1)
431316485Sdavidcs	#define VFPF_TPA_PKT_SPLIT_FLAG      (1 << 2)
432316485Sdavidcs	#define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
433316485Sdavidcs	#define VFPF_TPA_GRO_CONSIST_FLAG    (1 << 4)
434316485Sdavidcs
435316485Sdavidcs	u8			update_sge_tpa_flags;
436316485Sdavidcs	#define VFPF_UPDATE_SGE_DEPRECATED_FLAG	   (1 << 0)
437316485Sdavidcs	#define VFPF_UPDATE_TPA_EN_FLAG    (1 << 1)
438316485Sdavidcs	#define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
439316485Sdavidcs
440316485Sdavidcs	u8			max_buffers_per_cqe;
441316485Sdavidcs
442316485Sdavidcs	u16			deprecated_sge_buff_size;
443316485Sdavidcs	u16			tpa_max_size;
444316485Sdavidcs	u16			tpa_min_size_to_start;
445316485Sdavidcs	u16			tpa_min_size_to_cont;
446316485Sdavidcs
447316485Sdavidcs	u8			tpa_max_aggs_num;
448316485Sdavidcs	u8			padding[7];
449316485Sdavidcs
450316485Sdavidcs};
451316485Sdavidcs
452316485Sdavidcs/* Primary tlv as a header for various extended tlvs for
453316485Sdavidcs * various functionalities in vport update ramrod.
454316485Sdavidcs */
455316485Sdavidcsstruct vfpf_vport_update_tlv {
456316485Sdavidcs	struct vfpf_first_tlv first_tlv;
457316485Sdavidcs};
458316485Sdavidcs
459316485Sdavidcsstruct vfpf_ucast_filter_tlv {
460316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
461316485Sdavidcs
462316485Sdavidcs	u8			opcode;
463316485Sdavidcs	u8			type;
464316485Sdavidcs
465316485Sdavidcs	u8			mac[ETH_ALEN];
466316485Sdavidcs
467316485Sdavidcs	u16			vlan;
468316485Sdavidcs	u16			padding[3];
469316485Sdavidcs};
470316485Sdavidcs
471316485Sdavidcs/* tunnel update param tlv */
472316485Sdavidcsstruct vfpf_update_tunn_param_tlv {
473316485Sdavidcs	struct vfpf_first_tlv   first_tlv;
474316485Sdavidcs
475316485Sdavidcs	u8			tun_mode_update_mask;
476316485Sdavidcs	u8			tunn_mode;
477316485Sdavidcs	u8			update_tun_cls;
478316485Sdavidcs	u8			vxlan_clss;
479316485Sdavidcs	u8			l2gre_clss;
480316485Sdavidcs	u8			ipgre_clss;
481316485Sdavidcs	u8			l2geneve_clss;
482316485Sdavidcs	u8			ipgeneve_clss;
483316485Sdavidcs	u8			update_geneve_port;
484316485Sdavidcs	u8			update_vxlan_port;
485316485Sdavidcs	u16			geneve_port;
486316485Sdavidcs	u16			vxlan_port;
487316485Sdavidcs	u8			padding[2];
488316485Sdavidcs};
489316485Sdavidcs
490316485Sdavidcsstruct pfvf_update_tunn_param_tlv {
491316485Sdavidcs	struct pfvf_tlv hdr;
492316485Sdavidcs
493316485Sdavidcs	u16			tunn_feature_mask;
494316485Sdavidcs	u8			vxlan_mode;
495316485Sdavidcs	u8			l2geneve_mode;
496316485Sdavidcs	u8			ipgeneve_mode;
497316485Sdavidcs	u8			l2gre_mode;
498316485Sdavidcs	u8			ipgre_mode;
499316485Sdavidcs	u8			vxlan_clss;
500316485Sdavidcs	u8			l2gre_clss;
501316485Sdavidcs	u8			ipgre_clss;
502316485Sdavidcs	u8			l2geneve_clss;
503316485Sdavidcs	u8			ipgeneve_clss;
504316485Sdavidcs	u16			vxlan_udp_port;
505316485Sdavidcs	u16			geneve_udp_port;
506316485Sdavidcs};
507316485Sdavidcs
508316485Sdavidcsstruct tlv_buffer_size {
509316485Sdavidcs	u8 tlv_buffer[TLV_BUFFER_SIZE];
510316485Sdavidcs};
511316485Sdavidcs
512316485Sdavidcsstruct vfpf_update_coalesce {
513316485Sdavidcs	struct vfpf_first_tlv first_tlv;
514316485Sdavidcs	u16 rx_coal;
515316485Sdavidcs	u16 tx_coal;
516316485Sdavidcs	u16 qid;
517316485Sdavidcs	u8 padding[2];
518316485Sdavidcs};
519316485Sdavidcs
520316485Sdavidcsunion vfpf_tlvs {
521316485Sdavidcs	struct vfpf_first_tlv			first_tlv;
522316485Sdavidcs	struct vfpf_acquire_tlv			acquire;
523316485Sdavidcs	struct vfpf_start_rxq_tlv		start_rxq;
524316485Sdavidcs	struct vfpf_start_txq_tlv		start_txq;
525316485Sdavidcs	struct vfpf_stop_rxqs_tlv		stop_rxqs;
526316485Sdavidcs	struct vfpf_stop_txqs_tlv		stop_txqs;
527316485Sdavidcs	struct vfpf_update_rxq_tlv		update_rxq;
528316485Sdavidcs	struct vfpf_vport_start_tlv		start_vport;
529316485Sdavidcs	struct vfpf_vport_update_tlv		vport_update;
530316485Sdavidcs	struct vfpf_ucast_filter_tlv		ucast_filter;
531316485Sdavidcs	struct vfpf_update_tunn_param_tlv	tunn_param_update;
532316485Sdavidcs	struct vfpf_update_coalesce		update_coalesce;
533316485Sdavidcs	struct tlv_buffer_size			tlv_buf_size;
534316485Sdavidcs};
535316485Sdavidcs
536316485Sdavidcsunion pfvf_tlvs {
537316485Sdavidcs	struct pfvf_def_resp_tlv		default_resp;
538316485Sdavidcs	struct pfvf_acquire_resp_tlv		acquire_resp;
539316485Sdavidcs	struct tlv_buffer_size			tlv_buf_size;
540316485Sdavidcs	struct pfvf_start_queue_resp_tlv	queue_start;
541316485Sdavidcs	struct pfvf_update_tunn_param_tlv	tunn_param_resp;
542316485Sdavidcs};
543316485Sdavidcs
544316485Sdavidcs/* This is a structure which is allocated in the VF, which the PF may update
545316485Sdavidcs * when it deems it necessary to do so. The bulletin board is sampled
546316485Sdavidcs * periodically by the VF. A copy per VF is maintained in the PF (to prevent
547316485Sdavidcs * loss of data upon multiple updates (or the need for read modify write)).
548316485Sdavidcs */
549316485Sdavidcsenum ecore_bulletin_bit {
550316485Sdavidcs	/* Alert the VF that a forced MAC was set by the PF */
551316485Sdavidcs	MAC_ADDR_FORCED = 0,
552316485Sdavidcs
553316485Sdavidcs	/* The VF should not access the vfpf channel */
554316485Sdavidcs	VFPF_CHANNEL_INVALID = 1,
555316485Sdavidcs
556316485Sdavidcs	/* Alert the VF that a forced VLAN was set by the PF */
557316485Sdavidcs	VLAN_ADDR_FORCED = 2,
558316485Sdavidcs
559316485Sdavidcs	/* Indicate that `default_only_untagged' contains actual data */
560316485Sdavidcs	VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
561316485Sdavidcs	VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
562316485Sdavidcs
563316485Sdavidcs	/* Alert the VF that suggested mac was sent by the PF.
564316485Sdavidcs	 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
565316485Sdavidcs	 */
566316485Sdavidcs	VFPF_BULLETIN_MAC_ADDR = 5
567316485Sdavidcs};
568316485Sdavidcs
569316485Sdavidcsstruct ecore_bulletin_content {
570316485Sdavidcs	/* crc of structure to ensure is not in mid-update */
571316485Sdavidcs	u32 crc;
572316485Sdavidcs
573316485Sdavidcs	u32 version;
574316485Sdavidcs
575316485Sdavidcs	/* bitmap indicating which fields hold valid values */
576316485Sdavidcs	u64 valid_bitmap;
577316485Sdavidcs
578316485Sdavidcs	/* used for MAC_ADDR or MAC_ADDR_FORCED */
579316485Sdavidcs	u8 mac[ETH_ALEN];
580316485Sdavidcs
581316485Sdavidcs	/* If valid, 1 => only untagged Rx if no vlan is configured */
582316485Sdavidcs	u8 default_only_untagged;
583316485Sdavidcs	u8 padding;
584316485Sdavidcs
585316485Sdavidcs	/* The following is a 'copy' of ecore_mcp_link_state,
586316485Sdavidcs	 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
587316485Sdavidcs	 * possible the structs will increase further along the road we cannot
588316485Sdavidcs	 * have it here; Instead we need to have all of its fields.
589316485Sdavidcs	 */
590316485Sdavidcs	u8 req_autoneg;
591316485Sdavidcs	u8 req_autoneg_pause;
592316485Sdavidcs	u8 req_forced_rx;
593316485Sdavidcs	u8 req_forced_tx;
594316485Sdavidcs	u8 padding2[4];
595316485Sdavidcs
596316485Sdavidcs	u32 req_adv_speed;
597316485Sdavidcs	u32 req_forced_speed;
598316485Sdavidcs	u32 req_loopback;
599316485Sdavidcs	u32 padding3;
600316485Sdavidcs
601316485Sdavidcs	u8 link_up;
602316485Sdavidcs	u8 full_duplex;
603316485Sdavidcs	u8 autoneg;
604316485Sdavidcs	u8 autoneg_complete;
605316485Sdavidcs	u8 parallel_detection;
606316485Sdavidcs	u8 pfc_enabled;
607316485Sdavidcs	u8 partner_tx_flow_ctrl_en;
608316485Sdavidcs	u8 partner_rx_flow_ctrl_en;
609316485Sdavidcs
610316485Sdavidcs	u8 partner_adv_pause;
611316485Sdavidcs	u8 sfp_tx_fault;
612316485Sdavidcs	u16 vxlan_udp_port;
613316485Sdavidcs	u16 geneve_udp_port;
614316485Sdavidcs	u8 padding4[2];
615316485Sdavidcs
616316485Sdavidcs	u32 speed;
617316485Sdavidcs	u32 partner_adv_speed;
618316485Sdavidcs
619316485Sdavidcs	u32 capability_speed;
620316485Sdavidcs
621316485Sdavidcs	/* Forced vlan */
622316485Sdavidcs	u16 pvid;
623316485Sdavidcs	u16 padding5;
624316485Sdavidcs};
625316485Sdavidcs
626316485Sdavidcsstruct ecore_bulletin {
627316485Sdavidcs	dma_addr_t phys;
628316485Sdavidcs	struct ecore_bulletin_content *p_virt;
629316485Sdavidcs	u32 size;
630316485Sdavidcs};
631316485Sdavidcs
632316485Sdavidcsenum {
633316485Sdavidcs/*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
634316485Sdavidcs
635316485Sdavidcs	CHANNEL_TLV_NONE, /* ends tlv sequence */
636316485Sdavidcs	CHANNEL_TLV_ACQUIRE,
637316485Sdavidcs	CHANNEL_TLV_VPORT_START,
638316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE,
639316485Sdavidcs	CHANNEL_TLV_VPORT_TEARDOWN,
640316485Sdavidcs	CHANNEL_TLV_START_RXQ,
641316485Sdavidcs	CHANNEL_TLV_START_TXQ,
642316485Sdavidcs	CHANNEL_TLV_STOP_RXQS,
643316485Sdavidcs	CHANNEL_TLV_STOP_TXQS,
644316485Sdavidcs	CHANNEL_TLV_UPDATE_RXQ,
645316485Sdavidcs	CHANNEL_TLV_INT_CLEANUP,
646316485Sdavidcs	CHANNEL_TLV_CLOSE,
647316485Sdavidcs	CHANNEL_TLV_RELEASE,
648316485Sdavidcs	CHANNEL_TLV_LIST_END,
649316485Sdavidcs	CHANNEL_TLV_UCAST_FILTER,
650316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
651316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
652316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
653316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_MCAST,
654316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
655316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_RSS,
656316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
657316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
658316485Sdavidcs	CHANNEL_TLV_UPDATE_TUNN_PARAM,
659316485Sdavidcs	CHANNEL_TLV_COALESCE_UPDATE,
660316485Sdavidcs	CHANNEL_TLV_QID,
661316485Sdavidcs	CHANNEL_TLV_MAX,
662316485Sdavidcs
663316485Sdavidcs	/* Required for iterating over vport-update tlvs.
664316485Sdavidcs	 * Will break in case non-sequential vport-update tlvs.
665316485Sdavidcs	 */
666316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
667316485Sdavidcs
668316485Sdavidcs/*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
669316485Sdavidcs};
670316485Sdavidcsextern const char *ecore_channel_tlvs_string[];
671316485Sdavidcs
672316485Sdavidcs#endif /* __ECORE_VF_PF_IF_H__ */
673