1316485Sdavidcs/*
2337517Sdavidcs * 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: stable/11/sys/dev/qlnx/qlnxe/ecore_vfpf_if.h 337517 2018-08-09 01:17:35Z davidcs $
28316485Sdavidcs *
29316485Sdavidcs */
30316485Sdavidcs
31320164Sdavidcs
32316485Sdavidcs#ifndef __ECORE_VF_PF_IF_H__
33316485Sdavidcs#define __ECORE_VF_PF_IF_H__
34316485Sdavidcs
35316485Sdavidcs#define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */
36316485Sdavidcs#define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */
37320164Sdavidcs#ifndef LINUX_REMOVE
38337517Sdavidcs#ifndef ETH_ALEN
39316485Sdavidcs#define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/
40320164Sdavidcs#endif
41337517Sdavidcs#endif
42316485Sdavidcs
43316485Sdavidcs/***********************************************
44316485Sdavidcs *
45316485Sdavidcs * Common definitions for all HVs
46316485Sdavidcs *
47316485Sdavidcs **/
48316485Sdavidcsstruct vf_pf_resc_request {
49316485Sdavidcs	u8 num_rxqs;
50316485Sdavidcs	u8 num_txqs;
51316485Sdavidcs	u8 num_sbs;
52316485Sdavidcs	u8 num_mac_filters;
53316485Sdavidcs	u8 num_vlan_filters;
54316485Sdavidcs	u8 num_mc_filters; /* No limit  so superfluous */
55316485Sdavidcs	u8 num_cids;
56316485Sdavidcs	u8 padding;
57316485Sdavidcs};
58316485Sdavidcs
59316485Sdavidcsstruct hw_sb_info {
60316485Sdavidcs	u16 hw_sb_id;    /* aka absolute igu id, used to ack the sb */
61316485Sdavidcs	u8 sb_qid;      /* used to update DHC for sb */
62316485Sdavidcs	u8 padding[5];
63316485Sdavidcs};
64316485Sdavidcs
65316485Sdavidcs/***********************************************
66316485Sdavidcs *
67316485Sdavidcs * HW VF-PF channel definitions
68316485Sdavidcs *
69316485Sdavidcs * A.K.A VF-PF mailbox
70316485Sdavidcs *
71316485Sdavidcs **/
72316485Sdavidcs#define TLV_BUFFER_SIZE 		1024
73316485Sdavidcs
74316485Sdavidcs/* vf pf channel tlvs */
75316485Sdavidcs/* general tlv header (used for both vf->pf request and pf->vf response) */
76316485Sdavidcsstruct channel_tlv {
77316485Sdavidcs	u16 type;
78316485Sdavidcs	u16 length;
79316485Sdavidcs};
80316485Sdavidcs
81316485Sdavidcs/* header of first vf->pf tlv carries the offset used to calculate reponse
82316485Sdavidcs * buffer address
83316485Sdavidcs */
84316485Sdavidcsstruct vfpf_first_tlv {
85316485Sdavidcs	struct channel_tlv tl;
86316485Sdavidcs	u32 padding;
87316485Sdavidcs	u64 reply_address;
88316485Sdavidcs};
89316485Sdavidcs
90316485Sdavidcs/* header of pf->vf tlvs, carries the status of handling the request */
91316485Sdavidcsstruct pfvf_tlv {
92316485Sdavidcs	struct channel_tlv tl;
93316485Sdavidcs	u8 status;
94316485Sdavidcs	u8 padding[3];
95316485Sdavidcs};
96316485Sdavidcs
97316485Sdavidcs/* response tlv used for most tlvs */
98316485Sdavidcsstruct pfvf_def_resp_tlv {
99316485Sdavidcs	struct pfvf_tlv hdr;
100316485Sdavidcs};
101316485Sdavidcs
102316485Sdavidcs/* used to terminate and pad a tlv list */
103316485Sdavidcsstruct channel_list_end_tlv {
104316485Sdavidcs	struct channel_tlv tl;
105316485Sdavidcs	u8 padding[4];
106316485Sdavidcs};
107316485Sdavidcs
108316485Sdavidcs/* Acquire */
109316485Sdavidcsstruct vfpf_acquire_tlv {
110316485Sdavidcs	struct vfpf_first_tlv first_tlv;
111316485Sdavidcs
112316485Sdavidcs	struct vf_pf_vfdev_info {
113320164Sdavidcs#ifndef LINUX_REMOVE
114316485Sdavidcs	/* First bit was used on 8.7.x and 8.8.x versions, which had different
115316485Sdavidcs	 * FWs used but with the same faspath HSI. As this was prior to the
116316485Sdavidcs	 * fastpath versioning, wanted to have ability to override fw matching
117316485Sdavidcs	 * and allow them to interact.
118316485Sdavidcs	 */
119320164Sdavidcs#endif
120316485Sdavidcs#define VFPF_ACQUIRE_CAP_PRE_FP_HSI	(1 << 0) /* VF pre-FP hsi version */
121316485Sdavidcs#define VFPF_ACQUIRE_CAP_100G		(1 << 1) /* VF can support 100g */
122316485Sdavidcs
123316485Sdavidcs	/* A requirement for supporting multi-Tx queues on a single queue-zone,
124316485Sdavidcs	 * VF would pass qids as additional information whenever passing queue
125316485Sdavidcs	 * references.
126316485Sdavidcs	 * TODO - due to the CID limitations in Bar0, VFs currently don't pass
127316485Sdavidcs	 * this, and use the legacy CID scheme.
128316485Sdavidcs	 */
129316485Sdavidcs#define VFPF_ACQUIRE_CAP_QUEUE_QIDS	(1 << 2)
130337517Sdavidcs
131337517Sdavidcs	/* The VF is using the physical bar. While this is mostly internal
132337517Sdavidcs	 * to the VF, might affect the number of CIDs supported assuming
133337517Sdavidcs	 * QUEUE_QIDS is set.
134337517Sdavidcs	 */
135337517Sdavidcs#define VFPF_ACQUIRE_CAP_PHYSICAL_BAR	(1 << 3)
136316485Sdavidcs		u64 capabilities;
137316485Sdavidcs		u8 fw_major;
138316485Sdavidcs		u8 fw_minor;
139316485Sdavidcs		u8 fw_revision;
140316485Sdavidcs		u8 fw_engineering;
141316485Sdavidcs		u32 driver_version;
142316485Sdavidcs		u16 opaque_fid; /* ME register value */
143316485Sdavidcs		u8 os_type; /* VFPF_ACQUIRE_OS_* value */
144316485Sdavidcs		u8 eth_fp_hsi_major;
145316485Sdavidcs		u8 eth_fp_hsi_minor;
146316485Sdavidcs		u8 padding[3];
147316485Sdavidcs	} vfdev_info;
148316485Sdavidcs
149316485Sdavidcs	struct vf_pf_resc_request resc_request;
150316485Sdavidcs
151316485Sdavidcs	u64 bulletin_addr;
152316485Sdavidcs	u32 bulletin_size;
153316485Sdavidcs	u32 padding;
154316485Sdavidcs};
155316485Sdavidcs
156316485Sdavidcs/* receive side scaling tlv */
157316485Sdavidcsstruct vfpf_vport_update_rss_tlv {
158316485Sdavidcs	struct channel_tlv	tl;
159316485Sdavidcs
160316485Sdavidcs	u8 update_rss_flags;
161316485Sdavidcs	#define VFPF_UPDATE_RSS_CONFIG_FLAG	  (1 << 0)
162316485Sdavidcs	#define VFPF_UPDATE_RSS_CAPS_FLAG	  (1 << 1)
163316485Sdavidcs	#define VFPF_UPDATE_RSS_IND_TABLE_FLAG	  (1 << 2)
164316485Sdavidcs	#define VFPF_UPDATE_RSS_KEY_FLAG	  (1 << 3)
165316485Sdavidcs
166316485Sdavidcs	u8 rss_enable;
167316485Sdavidcs	u8 rss_caps;
168316485Sdavidcs	u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */
169316485Sdavidcs	u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
170316485Sdavidcs	u32 rss_key[T_ETH_RSS_KEY_SIZE];
171316485Sdavidcs};
172316485Sdavidcs
173316485Sdavidcsstruct pfvf_storm_stats {
174316485Sdavidcs	u32 address;
175316485Sdavidcs	u32 len;
176316485Sdavidcs};
177316485Sdavidcs
178316485Sdavidcsstruct pfvf_stats_info {
179316485Sdavidcs	struct pfvf_storm_stats mstats;
180316485Sdavidcs	struct pfvf_storm_stats pstats;
181316485Sdavidcs	struct pfvf_storm_stats tstats;
182316485Sdavidcs	struct pfvf_storm_stats ustats;
183316485Sdavidcs};
184316485Sdavidcs
185316485Sdavidcs/* acquire response tlv - carries the allocated resources */
186316485Sdavidcsstruct pfvf_acquire_resp_tlv {
187316485Sdavidcs	struct pfvf_tlv hdr;
188316485Sdavidcs
189316485Sdavidcs	struct pf_vf_pfdev_info {
190316485Sdavidcs		u32 chip_num;
191316485Sdavidcs		u32 mfw_ver;
192316485Sdavidcs
193316485Sdavidcs		u16 fw_major;
194316485Sdavidcs		u16 fw_minor;
195316485Sdavidcs		u16 fw_rev;
196316485Sdavidcs		u16 fw_eng;
197316485Sdavidcs
198316485Sdavidcs		u64 capabilities;
199316485Sdavidcs#define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED	(1 << 0)
200316485Sdavidcs#define PFVF_ACQUIRE_CAP_100G			(1 << 1) /* If set, 100g PF */
201316485Sdavidcs/* There are old PF versions where the PF might mistakenly override the sanity
202316485Sdavidcs * mechanism [version-based] and allow a VF that can't be supported to pass
203316485Sdavidcs * the acquisition phase.
204316485Sdavidcs * To overcome this, PFs now indicate that they're past that point and the new
205316485Sdavidcs * VFs would fail probe on the older PFs that fail to do so.
206316485Sdavidcs */
207320164Sdavidcs#ifndef LINUX_REMOVE
208320164Sdavidcs/* Said bug was in quest/serpens; Can't be certain no official release included
209320164Sdavidcs * the bug since the fix arrived very late in the programs.
210320164Sdavidcs */
211320164Sdavidcs#endif
212316485Sdavidcs#define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE	(1 << 2)
213316485Sdavidcs
214316485Sdavidcs	/* PF expects queues to be received with additional qids */
215316485Sdavidcs#define PFVF_ACQUIRE_CAP_QUEUE_QIDS		(1 << 3)
216316485Sdavidcs
217316485Sdavidcs		u16 db_size;
218316485Sdavidcs		u8  indices_per_sb;
219316485Sdavidcs		u8 os_type;
220316485Sdavidcs
221316485Sdavidcs		/* These should match the PF's ecore_dev values */
222316485Sdavidcs		u16 chip_rev;
223316485Sdavidcs		u8 dev_type;
224316485Sdavidcs
225337517Sdavidcs		/* Doorbell bar size configured in HW: log(size) or 0 */
226337517Sdavidcs		u8 bar_size;
227316485Sdavidcs
228316485Sdavidcs		struct pfvf_stats_info stats_info;
229316485Sdavidcs
230316485Sdavidcs		u8 port_mac[ETH_ALEN];
231316485Sdavidcs
232316485Sdavidcs		/* It's possible PF had to configure an older fastpath HSI
233316485Sdavidcs		 * [in case VF is newer than PF]. This is communicated back
234316485Sdavidcs		 * to the VF. It can also be used in case of error due to
235316485Sdavidcs		 * non-matching versions to shed light in VF about failure.
236316485Sdavidcs		 */
237316485Sdavidcs		u8 major_fp_hsi;
238316485Sdavidcs		u8 minor_fp_hsi;
239316485Sdavidcs	} pfdev_info;
240316485Sdavidcs
241316485Sdavidcs	struct pf_vf_resc {
242316485Sdavidcs		/* in case of status NO_RESOURCE in message hdr, pf will fill
243316485Sdavidcs		 * this struct with suggested amount of resources for next
244316485Sdavidcs		 * acquire request
245316485Sdavidcs		 */
246316485Sdavidcs		#define PFVF_MAX_QUEUES_PER_VF         16
247316485Sdavidcs		#define PFVF_MAX_SBS_PER_VF            16
248316485Sdavidcs		struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
249316485Sdavidcs		u8      hw_qid[PFVF_MAX_QUEUES_PER_VF];
250316485Sdavidcs		u8      cid[PFVF_MAX_QUEUES_PER_VF];
251316485Sdavidcs
252316485Sdavidcs		u8      num_rxqs;
253316485Sdavidcs		u8      num_txqs;
254316485Sdavidcs		u8      num_sbs;
255316485Sdavidcs		u8      num_mac_filters;
256316485Sdavidcs		u8      num_vlan_filters;
257316485Sdavidcs		u8      num_mc_filters;
258316485Sdavidcs		u8	num_cids;
259316485Sdavidcs		u8      padding;
260316485Sdavidcs	} resc;
261316485Sdavidcs
262316485Sdavidcs	u32 bulletin_size;
263316485Sdavidcs	u32 padding;
264316485Sdavidcs};
265316485Sdavidcs
266316485Sdavidcsstruct pfvf_start_queue_resp_tlv {
267316485Sdavidcs	struct pfvf_tlv hdr;
268316485Sdavidcs	u32 offset; /* offset to consumer/producer of queue */
269316485Sdavidcs	u8 padding[4];
270316485Sdavidcs};
271316485Sdavidcs
272316485Sdavidcs/* Extended queue information - additional index for reference inside qzone.
273316485Sdavidcs * If commmunicated between VF/PF, each TLV relating to queues should be
274316485Sdavidcs * extended by one such [or have a future base TLV that already contains info].
275316485Sdavidcs */
276316485Sdavidcsstruct vfpf_qid_tlv {
277316485Sdavidcs	struct channel_tlv	tl;
278316485Sdavidcs	u8			qid;
279316485Sdavidcs	u8			padding[3];
280316485Sdavidcs};
281316485Sdavidcs
282316485Sdavidcs/* Setup Queue */
283316485Sdavidcsstruct vfpf_start_rxq_tlv {
284316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
285316485Sdavidcs
286316485Sdavidcs	/* physical addresses */
287316485Sdavidcs	u64		rxq_addr;
288316485Sdavidcs	u64		deprecated_sge_addr;
289316485Sdavidcs	u64		cqe_pbl_addr;
290316485Sdavidcs
291316485Sdavidcs	u16			cqe_pbl_size;
292316485Sdavidcs	u16			hw_sb;
293316485Sdavidcs	u16			rx_qid;
294316485Sdavidcs	u16			hc_rate; /* desired interrupts per sec. */
295316485Sdavidcs
296316485Sdavidcs	u16			bd_max_bytes;
297316485Sdavidcs	u16			stat_id;
298316485Sdavidcs	u8			sb_index;
299316485Sdavidcs	u8			padding[3];
300316485Sdavidcs
301316485Sdavidcs};
302316485Sdavidcs
303316485Sdavidcsstruct vfpf_start_txq_tlv {
304316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
305316485Sdavidcs
306316485Sdavidcs	/* physical addresses */
307316485Sdavidcs	u64		pbl_addr;
308316485Sdavidcs	u16			pbl_size;
309316485Sdavidcs	u16			stat_id;
310316485Sdavidcs	u16			tx_qid;
311316485Sdavidcs	u16			hw_sb;
312316485Sdavidcs
313316485Sdavidcs	u32			flags; /* VFPF_QUEUE_FLG_X flags */
314316485Sdavidcs	u16			hc_rate; /* desired interrupts per sec. */
315316485Sdavidcs	u8			sb_index;
316316485Sdavidcs	u8			padding[3];
317316485Sdavidcs};
318316485Sdavidcs
319316485Sdavidcs/* Stop RX Queue */
320316485Sdavidcsstruct vfpf_stop_rxqs_tlv {
321316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
322316485Sdavidcs
323316485Sdavidcs	u16			rx_qid;
324316485Sdavidcs
325316485Sdavidcs	/* While the API supports multiple Rx-queues on a single TLV
326316485Sdavidcs	 * message, in practice older VFs always used it as one [ecore].
327316485Sdavidcs	 * And there are PFs [starting with the CHANNEL_TLV_QID] which
328316485Sdavidcs	 * would start assuming this is always a '1'. So in practice this
329316485Sdavidcs	 * field should be considered deprecated and *Always* set to '1'.
330316485Sdavidcs	 */
331316485Sdavidcs	u8			num_rxqs;
332316485Sdavidcs
333316485Sdavidcs	u8			cqe_completion;
334316485Sdavidcs	u8			padding[4];
335316485Sdavidcs};
336316485Sdavidcs
337316485Sdavidcs/* Stop TX Queues */
338316485Sdavidcsstruct vfpf_stop_txqs_tlv {
339316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
340316485Sdavidcs
341316485Sdavidcs	u16			tx_qid;
342316485Sdavidcs
343316485Sdavidcs	/* While the API supports multiple Tx-queues on a single TLV
344316485Sdavidcs	 * message, in practice older VFs always used it as one [ecore].
345316485Sdavidcs	 * And there are PFs [starting with the CHANNEL_TLV_QID] which
346316485Sdavidcs	 * would start assuming this is always a '1'. So in practice this
347316485Sdavidcs	 * field should be considered deprecated and *Always* set to '1'.
348316485Sdavidcs	 */
349316485Sdavidcs	u8			num_txqs;
350316485Sdavidcs	u8			padding[5];
351316485Sdavidcs};
352316485Sdavidcs
353316485Sdavidcsstruct vfpf_update_rxq_tlv {
354316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
355316485Sdavidcs
356316485Sdavidcs	u64		deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
357316485Sdavidcs
358316485Sdavidcs	u16			rx_qid;
359316485Sdavidcs	u8			num_rxqs;
360316485Sdavidcs	u8			flags;
361316485Sdavidcs	#define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG	(1 << 0)
362316485Sdavidcs	#define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG		(1 << 1)
363316485Sdavidcs	#define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG	(1 << 2)
364316485Sdavidcs
365316485Sdavidcs	u8			padding[4];
366316485Sdavidcs};
367316485Sdavidcs
368316485Sdavidcs/* Set Queue Filters */
369316485Sdavidcsstruct vfpf_q_mac_vlan_filter {
370316485Sdavidcs	u32 flags;
371316485Sdavidcs	#define VFPF_Q_FILTER_DEST_MAC_VALID    0x01
372316485Sdavidcs	#define VFPF_Q_FILTER_VLAN_TAG_VALID    0x02
373316485Sdavidcs	#define VFPF_Q_FILTER_SET_MAC   	0x100   /* set/clear */
374316485Sdavidcs
375316485Sdavidcs	u8  mac[ETH_ALEN];
376316485Sdavidcs	u16 vlan_tag;
377316485Sdavidcs
378316485Sdavidcs	u8	padding[4];
379316485Sdavidcs};
380316485Sdavidcs
381316485Sdavidcs/* Start a vport */
382316485Sdavidcsstruct vfpf_vport_start_tlv {
383316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
384316485Sdavidcs
385316485Sdavidcs	u64		sb_addr[PFVF_MAX_SBS_PER_VF];
386316485Sdavidcs
387316485Sdavidcs	u32			tpa_mode;
388316485Sdavidcs	u16			dep1;
389316485Sdavidcs	u16			mtu;
390316485Sdavidcs
391316485Sdavidcs	u8			vport_id;
392316485Sdavidcs	u8			inner_vlan_removal;
393316485Sdavidcs
394316485Sdavidcs	u8			only_untagged;
395316485Sdavidcs	u8			max_buffers_per_cqe;
396316485Sdavidcs
397337517Sdavidcs	u8			zero_placement_offset;
398337517Sdavidcs	u8			padding[3];
399316485Sdavidcs};
400316485Sdavidcs
401316485Sdavidcs/* Extended tlvs - need to add rss, mcast, accept mode tlvs */
402316485Sdavidcsstruct vfpf_vport_update_activate_tlv {
403316485Sdavidcs	struct channel_tlv	tl;
404316485Sdavidcs	u8			update_rx;
405316485Sdavidcs	u8			update_tx;
406316485Sdavidcs	u8			active_rx;
407316485Sdavidcs	u8			active_tx;
408316485Sdavidcs};
409316485Sdavidcs
410316485Sdavidcsstruct vfpf_vport_update_tx_switch_tlv {
411316485Sdavidcs	struct channel_tlv	tl;
412316485Sdavidcs	u8			tx_switching;
413316485Sdavidcs	u8			padding[3];
414316485Sdavidcs};
415316485Sdavidcs
416316485Sdavidcsstruct vfpf_vport_update_vlan_strip_tlv {
417316485Sdavidcs	struct channel_tlv	tl;
418316485Sdavidcs	u8			remove_vlan;
419316485Sdavidcs	u8			padding[3];
420316485Sdavidcs};
421316485Sdavidcs
422316485Sdavidcsstruct vfpf_vport_update_mcast_bin_tlv {
423316485Sdavidcs	struct channel_tlv	tl;
424316485Sdavidcs	u8			padding[4];
425316485Sdavidcs
426337517Sdavidcs	/* This was a mistake; There are only 256 approx bins,
427337517Sdavidcs	 * and in HSI they're divided into 32-bit values.
428337517Sdavidcs	 * As old VFs used to set-bit to the values on its side,
429337517Sdavidcs	 * the upper half of the array is never expected to contain any data.
430337517Sdavidcs	 */
431337517Sdavidcs	u64		bins[4];
432337517Sdavidcs	u64		obsolete_bins[4];
433316485Sdavidcs};
434316485Sdavidcs
435316485Sdavidcsstruct vfpf_vport_update_accept_param_tlv {
436316485Sdavidcs	struct channel_tlv tl;
437316485Sdavidcs	u8	update_rx_mode;
438316485Sdavidcs	u8	update_tx_mode;
439316485Sdavidcs	u8	rx_accept_filter;
440316485Sdavidcs	u8	tx_accept_filter;
441316485Sdavidcs};
442316485Sdavidcs
443316485Sdavidcsstruct vfpf_vport_update_accept_any_vlan_tlv {
444316485Sdavidcs	struct channel_tlv tl;
445316485Sdavidcs	u8 update_accept_any_vlan_flg;
446316485Sdavidcs	u8 accept_any_vlan;
447316485Sdavidcs
448316485Sdavidcs	u8 padding[2];
449316485Sdavidcs};
450316485Sdavidcs
451316485Sdavidcsstruct vfpf_vport_update_sge_tpa_tlv {
452316485Sdavidcs	struct channel_tlv	tl;
453316485Sdavidcs
454316485Sdavidcs	u16			sge_tpa_flags;
455316485Sdavidcs	#define VFPF_TPA_IPV4_EN_FLAG	     (1 << 0)
456316485Sdavidcs	#define VFPF_TPA_IPV6_EN_FLAG        (1 << 1)
457316485Sdavidcs	#define VFPF_TPA_PKT_SPLIT_FLAG      (1 << 2)
458316485Sdavidcs	#define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3)
459316485Sdavidcs	#define VFPF_TPA_GRO_CONSIST_FLAG    (1 << 4)
460316485Sdavidcs
461316485Sdavidcs	u8			update_sge_tpa_flags;
462316485Sdavidcs	#define VFPF_UPDATE_SGE_DEPRECATED_FLAG	   (1 << 0)
463316485Sdavidcs	#define VFPF_UPDATE_TPA_EN_FLAG    (1 << 1)
464316485Sdavidcs	#define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2)
465316485Sdavidcs
466316485Sdavidcs	u8			max_buffers_per_cqe;
467316485Sdavidcs
468316485Sdavidcs	u16			deprecated_sge_buff_size;
469316485Sdavidcs	u16			tpa_max_size;
470316485Sdavidcs	u16			tpa_min_size_to_start;
471316485Sdavidcs	u16			tpa_min_size_to_cont;
472316485Sdavidcs
473316485Sdavidcs	u8			tpa_max_aggs_num;
474316485Sdavidcs	u8			padding[7];
475316485Sdavidcs
476316485Sdavidcs};
477316485Sdavidcs
478316485Sdavidcs/* Primary tlv as a header for various extended tlvs for
479316485Sdavidcs * various functionalities in vport update ramrod.
480316485Sdavidcs */
481316485Sdavidcsstruct vfpf_vport_update_tlv {
482316485Sdavidcs	struct vfpf_first_tlv first_tlv;
483316485Sdavidcs};
484316485Sdavidcs
485316485Sdavidcsstruct vfpf_ucast_filter_tlv {
486316485Sdavidcs	struct vfpf_first_tlv	first_tlv;
487316485Sdavidcs
488316485Sdavidcs	u8			opcode;
489316485Sdavidcs	u8			type;
490316485Sdavidcs
491316485Sdavidcs	u8			mac[ETH_ALEN];
492316485Sdavidcs
493316485Sdavidcs	u16			vlan;
494316485Sdavidcs	u16			padding[3];
495316485Sdavidcs};
496316485Sdavidcs
497316485Sdavidcs/* tunnel update param tlv */
498316485Sdavidcsstruct vfpf_update_tunn_param_tlv {
499316485Sdavidcs	struct vfpf_first_tlv   first_tlv;
500316485Sdavidcs
501316485Sdavidcs	u8			tun_mode_update_mask;
502316485Sdavidcs	u8			tunn_mode;
503316485Sdavidcs	u8			update_tun_cls;
504316485Sdavidcs	u8			vxlan_clss;
505316485Sdavidcs	u8			l2gre_clss;
506316485Sdavidcs	u8			ipgre_clss;
507316485Sdavidcs	u8			l2geneve_clss;
508316485Sdavidcs	u8			ipgeneve_clss;
509316485Sdavidcs	u8			update_geneve_port;
510316485Sdavidcs	u8			update_vxlan_port;
511316485Sdavidcs	u16			geneve_port;
512316485Sdavidcs	u16			vxlan_port;
513316485Sdavidcs	u8			padding[2];
514316485Sdavidcs};
515316485Sdavidcs
516316485Sdavidcsstruct pfvf_update_tunn_param_tlv {
517316485Sdavidcs	struct pfvf_tlv hdr;
518316485Sdavidcs
519316485Sdavidcs	u16			tunn_feature_mask;
520316485Sdavidcs	u8			vxlan_mode;
521316485Sdavidcs	u8			l2geneve_mode;
522316485Sdavidcs	u8			ipgeneve_mode;
523316485Sdavidcs	u8			l2gre_mode;
524316485Sdavidcs	u8			ipgre_mode;
525316485Sdavidcs	u8			vxlan_clss;
526316485Sdavidcs	u8			l2gre_clss;
527316485Sdavidcs	u8			ipgre_clss;
528316485Sdavidcs	u8			l2geneve_clss;
529316485Sdavidcs	u8			ipgeneve_clss;
530316485Sdavidcs	u16			vxlan_udp_port;
531316485Sdavidcs	u16			geneve_udp_port;
532316485Sdavidcs};
533316485Sdavidcs
534316485Sdavidcsstruct tlv_buffer_size {
535316485Sdavidcs	u8 tlv_buffer[TLV_BUFFER_SIZE];
536316485Sdavidcs};
537316485Sdavidcs
538316485Sdavidcsstruct vfpf_update_coalesce {
539316485Sdavidcs	struct vfpf_first_tlv first_tlv;
540316485Sdavidcs	u16 rx_coal;
541316485Sdavidcs	u16 tx_coal;
542316485Sdavidcs	u16 qid;
543316485Sdavidcs	u8 padding[2];
544316485Sdavidcs};
545316485Sdavidcs
546337517Sdavidcsstruct vfpf_read_coal_req_tlv {
547337517Sdavidcs	struct vfpf_first_tlv first_tlv;
548337517Sdavidcs	u16 qid;
549337517Sdavidcs	u8 is_rx;
550337517Sdavidcs	u8 padding[5];
551337517Sdavidcs};
552337517Sdavidcs
553337517Sdavidcsstruct pfvf_read_coal_resp_tlv {
554337517Sdavidcs	struct pfvf_tlv hdr;
555337517Sdavidcs	u16 coal;
556337517Sdavidcs	u8 padding[6];
557337517Sdavidcs};
558337517Sdavidcs
559316485Sdavidcsunion vfpf_tlvs {
560316485Sdavidcs	struct vfpf_first_tlv			first_tlv;
561316485Sdavidcs	struct vfpf_acquire_tlv			acquire;
562316485Sdavidcs	struct vfpf_start_rxq_tlv		start_rxq;
563316485Sdavidcs	struct vfpf_start_txq_tlv		start_txq;
564316485Sdavidcs	struct vfpf_stop_rxqs_tlv		stop_rxqs;
565316485Sdavidcs	struct vfpf_stop_txqs_tlv		stop_txqs;
566316485Sdavidcs	struct vfpf_update_rxq_tlv		update_rxq;
567316485Sdavidcs	struct vfpf_vport_start_tlv		start_vport;
568316485Sdavidcs	struct vfpf_vport_update_tlv		vport_update;
569316485Sdavidcs	struct vfpf_ucast_filter_tlv		ucast_filter;
570316485Sdavidcs	struct vfpf_update_tunn_param_tlv	tunn_param_update;
571316485Sdavidcs	struct vfpf_update_coalesce		update_coalesce;
572337517Sdavidcs	struct vfpf_read_coal_req_tlv		read_coal_req;
573316485Sdavidcs	struct tlv_buffer_size			tlv_buf_size;
574316485Sdavidcs};
575316485Sdavidcs
576316485Sdavidcsunion pfvf_tlvs {
577316485Sdavidcs	struct pfvf_def_resp_tlv		default_resp;
578316485Sdavidcs	struct pfvf_acquire_resp_tlv		acquire_resp;
579316485Sdavidcs	struct tlv_buffer_size			tlv_buf_size;
580316485Sdavidcs	struct pfvf_start_queue_resp_tlv	queue_start;
581316485Sdavidcs	struct pfvf_update_tunn_param_tlv	tunn_param_resp;
582337517Sdavidcs	struct pfvf_read_coal_resp_tlv		read_coal_resp;
583316485Sdavidcs};
584316485Sdavidcs
585316485Sdavidcs/* This is a structure which is allocated in the VF, which the PF may update
586316485Sdavidcs * when it deems it necessary to do so. The bulletin board is sampled
587316485Sdavidcs * periodically by the VF. A copy per VF is maintained in the PF (to prevent
588316485Sdavidcs * loss of data upon multiple updates (or the need for read modify write)).
589316485Sdavidcs */
590316485Sdavidcsenum ecore_bulletin_bit {
591316485Sdavidcs	/* Alert the VF that a forced MAC was set by the PF */
592316485Sdavidcs	MAC_ADDR_FORCED = 0,
593316485Sdavidcs
594316485Sdavidcs	/* The VF should not access the vfpf channel */
595316485Sdavidcs	VFPF_CHANNEL_INVALID = 1,
596316485Sdavidcs
597316485Sdavidcs	/* Alert the VF that a forced VLAN was set by the PF */
598316485Sdavidcs	VLAN_ADDR_FORCED = 2,
599316485Sdavidcs
600316485Sdavidcs	/* Indicate that `default_only_untagged' contains actual data */
601316485Sdavidcs	VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
602316485Sdavidcs	VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
603316485Sdavidcs
604316485Sdavidcs	/* Alert the VF that suggested mac was sent by the PF.
605316485Sdavidcs	 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set
606316485Sdavidcs	 */
607316485Sdavidcs	VFPF_BULLETIN_MAC_ADDR = 5
608316485Sdavidcs};
609316485Sdavidcs
610316485Sdavidcsstruct ecore_bulletin_content {
611316485Sdavidcs	/* crc of structure to ensure is not in mid-update */
612316485Sdavidcs	u32 crc;
613316485Sdavidcs
614316485Sdavidcs	u32 version;
615316485Sdavidcs
616316485Sdavidcs	/* bitmap indicating which fields hold valid values */
617316485Sdavidcs	u64 valid_bitmap;
618316485Sdavidcs
619316485Sdavidcs	/* used for MAC_ADDR or MAC_ADDR_FORCED */
620316485Sdavidcs	u8 mac[ETH_ALEN];
621316485Sdavidcs
622316485Sdavidcs	/* If valid, 1 => only untagged Rx if no vlan is configured */
623316485Sdavidcs	u8 default_only_untagged;
624316485Sdavidcs	u8 padding;
625316485Sdavidcs
626316485Sdavidcs	/* The following is a 'copy' of ecore_mcp_link_state,
627316485Sdavidcs	 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's
628316485Sdavidcs	 * possible the structs will increase further along the road we cannot
629316485Sdavidcs	 * have it here; Instead we need to have all of its fields.
630316485Sdavidcs	 */
631316485Sdavidcs	u8 req_autoneg;
632316485Sdavidcs	u8 req_autoneg_pause;
633316485Sdavidcs	u8 req_forced_rx;
634316485Sdavidcs	u8 req_forced_tx;
635316485Sdavidcs	u8 padding2[4];
636316485Sdavidcs
637316485Sdavidcs	u32 req_adv_speed;
638316485Sdavidcs	u32 req_forced_speed;
639316485Sdavidcs	u32 req_loopback;
640316485Sdavidcs	u32 padding3;
641316485Sdavidcs
642316485Sdavidcs	u8 link_up;
643316485Sdavidcs	u8 full_duplex;
644316485Sdavidcs	u8 autoneg;
645316485Sdavidcs	u8 autoneg_complete;
646316485Sdavidcs	u8 parallel_detection;
647316485Sdavidcs	u8 pfc_enabled;
648316485Sdavidcs	u8 partner_tx_flow_ctrl_en;
649316485Sdavidcs	u8 partner_rx_flow_ctrl_en;
650316485Sdavidcs
651316485Sdavidcs	u8 partner_adv_pause;
652316485Sdavidcs	u8 sfp_tx_fault;
653316485Sdavidcs	u16 vxlan_udp_port;
654316485Sdavidcs	u16 geneve_udp_port;
655316485Sdavidcs	u8 padding4[2];
656316485Sdavidcs
657316485Sdavidcs	u32 speed;
658316485Sdavidcs	u32 partner_adv_speed;
659316485Sdavidcs
660316485Sdavidcs	u32 capability_speed;
661316485Sdavidcs
662316485Sdavidcs	/* Forced vlan */
663316485Sdavidcs	u16 pvid;
664316485Sdavidcs	u16 padding5;
665316485Sdavidcs};
666316485Sdavidcs
667316485Sdavidcsstruct ecore_bulletin {
668316485Sdavidcs	dma_addr_t phys;
669316485Sdavidcs	struct ecore_bulletin_content *p_virt;
670316485Sdavidcs	u32 size;
671316485Sdavidcs};
672316485Sdavidcs
673316485Sdavidcsenum {
674316485Sdavidcs/*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
675316485Sdavidcs
676316485Sdavidcs	CHANNEL_TLV_NONE, /* ends tlv sequence */
677316485Sdavidcs	CHANNEL_TLV_ACQUIRE,
678316485Sdavidcs	CHANNEL_TLV_VPORT_START,
679316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE,
680316485Sdavidcs	CHANNEL_TLV_VPORT_TEARDOWN,
681316485Sdavidcs	CHANNEL_TLV_START_RXQ,
682316485Sdavidcs	CHANNEL_TLV_START_TXQ,
683316485Sdavidcs	CHANNEL_TLV_STOP_RXQS,
684316485Sdavidcs	CHANNEL_TLV_STOP_TXQS,
685316485Sdavidcs	CHANNEL_TLV_UPDATE_RXQ,
686316485Sdavidcs	CHANNEL_TLV_INT_CLEANUP,
687316485Sdavidcs	CHANNEL_TLV_CLOSE,
688316485Sdavidcs	CHANNEL_TLV_RELEASE,
689316485Sdavidcs	CHANNEL_TLV_LIST_END,
690316485Sdavidcs	CHANNEL_TLV_UCAST_FILTER,
691316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
692316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
693316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
694316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_MCAST,
695316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
696316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_RSS,
697316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
698316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
699316485Sdavidcs	CHANNEL_TLV_UPDATE_TUNN_PARAM,
700316485Sdavidcs	CHANNEL_TLV_COALESCE_UPDATE,
701316485Sdavidcs	CHANNEL_TLV_QID,
702337517Sdavidcs	CHANNEL_TLV_COALESCE_READ,
703316485Sdavidcs	CHANNEL_TLV_MAX,
704316485Sdavidcs
705316485Sdavidcs	/* Required for iterating over vport-update tlvs.
706316485Sdavidcs	 * Will break in case non-sequential vport-update tlvs.
707316485Sdavidcs	 */
708316485Sdavidcs	CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
709316485Sdavidcs
710316485Sdavidcs/*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/
711316485Sdavidcs};
712316485Sdavidcsextern const char *ecore_channel_tlvs_string[];
713316485Sdavidcs
714316485Sdavidcs#endif /* __ECORE_VF_PF_IF_H__ */
715