xref: /freebsd/sys/dev/liquidio/base/lio_common.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1*f173c2b7SSean Bruno /*
2*f173c2b7SSean Bruno  *   BSD LICENSE
3*f173c2b7SSean Bruno  *
4*f173c2b7SSean Bruno  *   Copyright(c) 2017 Cavium, Inc.. All rights reserved.
5*f173c2b7SSean Bruno  *   All rights reserved.
6*f173c2b7SSean Bruno  *
7*f173c2b7SSean Bruno  *   Redistribution and use in source and binary forms, with or without
8*f173c2b7SSean Bruno  *   modification, are permitted provided that the following conditions
9*f173c2b7SSean Bruno  *   are met:
10*f173c2b7SSean Bruno  *
11*f173c2b7SSean Bruno  *     * Redistributions of source code must retain the above copyright
12*f173c2b7SSean Bruno  *       notice, this list of conditions and the following disclaimer.
13*f173c2b7SSean Bruno  *     * Redistributions in binary form must reproduce the above copyright
14*f173c2b7SSean Bruno  *       notice, this list of conditions and the following disclaimer in
15*f173c2b7SSean Bruno  *       the documentation and/or other materials provided with the
16*f173c2b7SSean Bruno  *       distribution.
17*f173c2b7SSean Bruno  *     * Neither the name of Cavium, Inc. nor the names of its
18*f173c2b7SSean Bruno  *       contributors may be used to endorse or promote products derived
19*f173c2b7SSean Bruno  *       from this software without specific prior written permission.
20*f173c2b7SSean Bruno  *
21*f173c2b7SSean Bruno  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22*f173c2b7SSean Bruno  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23*f173c2b7SSean Bruno  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24*f173c2b7SSean Bruno  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25*f173c2b7SSean Bruno  *   OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26*f173c2b7SSean Bruno  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27*f173c2b7SSean Bruno  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28*f173c2b7SSean Bruno  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29*f173c2b7SSean Bruno  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30*f173c2b7SSean Bruno  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31*f173c2b7SSean Bruno  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*f173c2b7SSean Bruno  */
33*f173c2b7SSean Bruno 
34*f173c2b7SSean Bruno /*   \file  lio_common.h
35*f173c2b7SSean Bruno  *   \brief Common: Structures and macros used in PCI-NIC package by core and
36*f173c2b7SSean Bruno  *   host driver.
37*f173c2b7SSean Bruno  */
38*f173c2b7SSean Bruno 
39*f173c2b7SSean Bruno #ifndef __LIO_COMMON_H__
40*f173c2b7SSean Bruno #define __LIO_COMMON_H__
41*f173c2b7SSean Bruno 
42*f173c2b7SSean Bruno #include "lio_config.h"
43*f173c2b7SSean Bruno 
44*f173c2b7SSean Bruno #define LIO_STR_HELPER(x)	#x
45*f173c2b7SSean Bruno #define LIO_STR(x)	LIO_STR_HELPER(x)
46*f173c2b7SSean Bruno #define LIO_BASE_MAJOR_VERSION	1
47*f173c2b7SSean Bruno #define LIO_BASE_MINOR_VERSION	6
48*f173c2b7SSean Bruno #define LIO_BASE_MICRO_VERSION	1
49*f173c2b7SSean Bruno #define LIO_BASE_VERSION	LIO_STR(LIO_BASE_MAJOR_VERSION) "."	\
50*f173c2b7SSean Bruno 				LIO_STR(LIO_BASE_MINOR_VERSION)
51*f173c2b7SSean Bruno #define LIO_VERSION		LIO_STR(LIO_BASE_MAJOR_VERSION) "."	\
52*f173c2b7SSean Bruno 				LIO_STR(LIO_BASE_MINOR_VERSION)		\
53*f173c2b7SSean Bruno 				"." LIO_STR(LIO_BASE_MICRO_VERSION)
54*f173c2b7SSean Bruno 
55*f173c2b7SSean Bruno struct lio_version {
56*f173c2b7SSean Bruno 	uint16_t	major;
57*f173c2b7SSean Bruno 	uint16_t	minor;
58*f173c2b7SSean Bruno 	uint16_t	micro;
59*f173c2b7SSean Bruno 	uint16_t	reserved;
60*f173c2b7SSean Bruno };
61*f173c2b7SSean Bruno 
62*f173c2b7SSean Bruno /* Tag types used by Octeon cores in its work. */
63*f173c2b7SSean Bruno enum lio_tag_type {
64*f173c2b7SSean Bruno 	LIO_ORDERED_TAG		= 0,
65*f173c2b7SSean Bruno 	LIO_ATOMIC_TAG		= 1,
66*f173c2b7SSean Bruno 	LIO_NULL_TAG		= 2,
67*f173c2b7SSean Bruno 	LIO_NULL_NULL_TAG	= 3
68*f173c2b7SSean Bruno };
69*f173c2b7SSean Bruno 
70*f173c2b7SSean Bruno /* pre-defined host->NIC tag values */
71*f173c2b7SSean Bruno #define LIO_CONTROL	(0x11111110)
72*f173c2b7SSean Bruno #define LIO_DATA(i)	(0x11111111 + (i))
73*f173c2b7SSean Bruno 
74*f173c2b7SSean Bruno /*
75*f173c2b7SSean Bruno  * Opcodes used by host driver/apps to perform operations on the core.
76*f173c2b7SSean Bruno  * These are used to identify the major subsystem that the operation
77*f173c2b7SSean Bruno  * is for.
78*f173c2b7SSean Bruno  */
79*f173c2b7SSean Bruno #define LIO_OPCODE_NIC	1	/* used for NIC operations */
80*f173c2b7SSean Bruno 
81*f173c2b7SSean Bruno /*
82*f173c2b7SSean Bruno  * Subcodes are used by host driver/apps to identify the sub-operation
83*f173c2b7SSean Bruno  * for the core. They only need to by unique for a given subsystem.
84*f173c2b7SSean Bruno  */
85*f173c2b7SSean Bruno #define LIO_OPCODE_SUBCODE(op, sub)	((((op) & 0x0f) << 8) | ((sub) & 0x7f))
86*f173c2b7SSean Bruno 
87*f173c2b7SSean Bruno /* OPCODE_CORE subcodes. For future use. */
88*f173c2b7SSean Bruno 
89*f173c2b7SSean Bruno /* OPCODE_NIC subcodes */
90*f173c2b7SSean Bruno 
91*f173c2b7SSean Bruno /* This subcode is sent by core PCI driver to indicate cores are ready. */
92*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_CORE_DRV_ACTIVE	0x01
93*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_NW_DATA		0x02	/* network packet data */
94*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_CMD		0x03
95*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_INFO		0x04
96*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_PORT_STATS	0x05
97*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_INTRMOD_CFG	0x08
98*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_IF_CFG		0x09
99*f173c2b7SSean Bruno #define LIO_OPCODE_NIC_INTRMOD_PARAMS	0x0B
100*f173c2b7SSean Bruno 
101*f173c2b7SSean Bruno /* Application codes advertised by the core driver initialization packet. */
102*f173c2b7SSean Bruno #define LIO_DRV_APP_START	0x0
103*f173c2b7SSean Bruno #define LIO_DRV_APP_COUNT	0x2
104*f173c2b7SSean Bruno #define LIO_DRV_NIC_APP		(LIO_DRV_APP_START + 0x1)
105*f173c2b7SSean Bruno #define LIO_DRV_INVALID_APP	(LIO_DRV_APP_START + 0x2)
106*f173c2b7SSean Bruno #define LIO_DRV_APP_END		(LIO_DRV_INVALID_APP - 1)
107*f173c2b7SSean Bruno 
108*f173c2b7SSean Bruno #define BYTES_PER_DHLEN_UNIT	8
109*f173c2b7SSean Bruno 
110*f173c2b7SSean Bruno #define SCR2_BIT_FW_LOADED	63
111*f173c2b7SSean Bruno #define SCR2_BIT_FW_RELOADED	62
112*f173c2b7SSean Bruno 
113*f173c2b7SSean Bruno static inline uint32_t
lio_incr_index(uint32_t index,uint32_t count,uint32_t max)114*f173c2b7SSean Bruno lio_incr_index(uint32_t index, uint32_t count, uint32_t max)
115*f173c2b7SSean Bruno {
116*f173c2b7SSean Bruno 	if ((index + count) >= max)
117*f173c2b7SSean Bruno 		index = index + count - max;
118*f173c2b7SSean Bruno 	else
119*f173c2b7SSean Bruno 		index += count;
120*f173c2b7SSean Bruno 
121*f173c2b7SSean Bruno 	return (index);
122*f173c2b7SSean Bruno }
123*f173c2b7SSean Bruno 
124*f173c2b7SSean Bruno #define LIO_BOARD_NAME		32
125*f173c2b7SSean Bruno #define LIO_SERIAL_NUM_LEN	64
126*f173c2b7SSean Bruno 
127*f173c2b7SSean Bruno /*
128*f173c2b7SSean Bruno  * Structure used by core driver to send indication that the Octeon
129*f173c2b7SSean Bruno  * application is ready.
130*f173c2b7SSean Bruno  */
131*f173c2b7SSean Bruno struct lio_core_setup {
132*f173c2b7SSean Bruno 	uint64_t	corefreq;
133*f173c2b7SSean Bruno 
134*f173c2b7SSean Bruno 	char		boardname[LIO_BOARD_NAME];
135*f173c2b7SSean Bruno 
136*f173c2b7SSean Bruno 	char		board_serial_number[LIO_SERIAL_NUM_LEN];
137*f173c2b7SSean Bruno 
138*f173c2b7SSean Bruno 	uint64_t	board_rev_major;
139*f173c2b7SSean Bruno 
140*f173c2b7SSean Bruno 	uint64_t	board_rev_minor;
141*f173c2b7SSean Bruno 
142*f173c2b7SSean Bruno };
143*f173c2b7SSean Bruno 
144*f173c2b7SSean Bruno /*---------------------------  SCATTER GATHER ENTRY  -----------------------*/
145*f173c2b7SSean Bruno 
146*f173c2b7SSean Bruno /*
147*f173c2b7SSean Bruno  * The Scatter-Gather List Entry. The scatter or gather component used with
148*f173c2b7SSean Bruno  * a Octeon input instruction has this format.
149*f173c2b7SSean Bruno  */
150*f173c2b7SSean Bruno struct lio_sg_entry {
151*f173c2b7SSean Bruno 	/* The first 64 bit gives the size of data in each dptr. */
152*f173c2b7SSean Bruno 	union {
153*f173c2b7SSean Bruno 		uint16_t	size[4];
154*f173c2b7SSean Bruno 		uint64_t	size64;
155*f173c2b7SSean Bruno 	}	u;
156*f173c2b7SSean Bruno 
157*f173c2b7SSean Bruno 	/* The 4 dptr pointers for this entry. */
158*f173c2b7SSean Bruno 	uint64_t	ptr[4];
159*f173c2b7SSean Bruno 
160*f173c2b7SSean Bruno };
161*f173c2b7SSean Bruno 
162*f173c2b7SSean Bruno #define LIO_SG_ENTRY_SIZE    (sizeof(struct lio_sg_entry))
163*f173c2b7SSean Bruno 
164*f173c2b7SSean Bruno /*
165*f173c2b7SSean Bruno  * \brief Add size to gather list
166*f173c2b7SSean Bruno  * @param sg_entry scatter/gather entry
167*f173c2b7SSean Bruno  * @param size size to add
168*f173c2b7SSean Bruno  * @param pos position to add it.
169*f173c2b7SSean Bruno  */
170*f173c2b7SSean Bruno static inline void
lio_add_sg_size(struct lio_sg_entry * sg_entry,uint16_t size,uint32_t pos)171*f173c2b7SSean Bruno lio_add_sg_size(struct lio_sg_entry *sg_entry, uint16_t size, uint32_t pos)
172*f173c2b7SSean Bruno {
173*f173c2b7SSean Bruno 
174*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
175*f173c2b7SSean Bruno 	sg_entry->u.size[pos] = size;
176*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN  */
177*f173c2b7SSean Bruno 	sg_entry->u.size[3 - pos] = size;
178*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN  */
179*f173c2b7SSean Bruno }
180*f173c2b7SSean Bruno 
181*f173c2b7SSean Bruno /*------------------------- End Scatter/Gather ---------------------------*/
182*f173c2b7SSean Bruno 
183*f173c2b7SSean Bruno #define LIO_FRM_HEADER_SIZE	 22	/* VLAN + Ethernet */
184*f173c2b7SSean Bruno 
185*f173c2b7SSean Bruno #define LIO_MAX_FRM_SIZE	(16000 + LIO_FRM_HEADER_SIZE)
186*f173c2b7SSean Bruno 
187*f173c2b7SSean Bruno #define LIO_DEFAULT_FRM_SIZE	(1500 + LIO_FRM_HEADER_SIZE)
188*f173c2b7SSean Bruno 
189*f173c2b7SSean Bruno /* NIC Command types */
190*f173c2b7SSean Bruno #define LIO_CMD_CHANGE_MTU	0x1
191*f173c2b7SSean Bruno #define LIO_CMD_CHANGE_MACADDR	0x2
192*f173c2b7SSean Bruno #define LIO_CMD_CHANGE_DEVFLAGS	0x3
193*f173c2b7SSean Bruno #define LIO_CMD_RX_CTL		0x4
194*f173c2b7SSean Bruno #define LIO_CMD_SET_MULTI_LIST	0x5
195*f173c2b7SSean Bruno 
196*f173c2b7SSean Bruno /* command for setting the speed, duplex & autoneg */
197*f173c2b7SSean Bruno #define LIO_CMD_SET_SETTINGS	0x7
198*f173c2b7SSean Bruno #define LIO_CMD_SET_FLOW_CTL	0x8
199*f173c2b7SSean Bruno 
200*f173c2b7SSean Bruno #define LIO_CMD_GPIO_ACCESS	0xA
201*f173c2b7SSean Bruno #define LIO_CMD_LRO_ENABLE	0xB
202*f173c2b7SSean Bruno #define LIO_CMD_LRO_DISABLE	0xC
203*f173c2b7SSean Bruno #define LIO_CMD_SET_RSS		0xD
204*f173c2b7SSean Bruno 
205*f173c2b7SSean Bruno #define LIO_CMD_TNL_RX_CSUM_CTL	0x10
206*f173c2b7SSean Bruno #define LIO_CMD_TNL_TX_CSUM_CTL	0x11
207*f173c2b7SSean Bruno #define LIO_CMD_VERBOSE_ENABLE	0x14
208*f173c2b7SSean Bruno #define LIO_CMD_VERBOSE_DISABLE	0x15
209*f173c2b7SSean Bruno 
210*f173c2b7SSean Bruno #define LIO_CMD_VLAN_FILTER_CTL	0x16
211*f173c2b7SSean Bruno #define LIO_CMD_ADD_VLAN_FILTER	0x17
212*f173c2b7SSean Bruno #define LIO_CMD_DEL_VLAN_FILTER	0x18
213*f173c2b7SSean Bruno #define LIO_CMD_VXLAN_PORT_CONFIG	0x19
214*f173c2b7SSean Bruno 
215*f173c2b7SSean Bruno #define LIO_CMD_ID_ACTIVE	0x1a
216*f173c2b7SSean Bruno 
217*f173c2b7SSean Bruno #define LIO_CMD_SET_FNV	0x1d
218*f173c2b7SSean Bruno 
219*f173c2b7SSean Bruno #define LIO_CMD_PKT_STEERING_CTL	0x1e
220*f173c2b7SSean Bruno 
221*f173c2b7SSean Bruno #define LIO_CMD_QUEUE_COUNT_CTL	0x1f
222*f173c2b7SSean Bruno 
223*f173c2b7SSean Bruno #define LIO_CMD_VXLAN_PORT_ADD	0x0
224*f173c2b7SSean Bruno #define LIO_CMD_VXLAN_PORT_DEL	0x1
225*f173c2b7SSean Bruno #define LIO_CMD_RXCSUM_ENABLE	0x0
226*f173c2b7SSean Bruno #define LIO_CMD_RXCSUM_DISABLE	0x1
227*f173c2b7SSean Bruno #define LIO_CMD_TXCSUM_ENABLE	0x0
228*f173c2b7SSean Bruno #define LIO_CMD_TXCSUM_DISABLE	0x1
229*f173c2b7SSean Bruno #define LIO_CMD_FNV_ENABLE	0x1
230*f173c2b7SSean Bruno #define LIO_CMD_FNV_DISABLE	0x0
231*f173c2b7SSean Bruno #define LIO_CMD_PKT_STEERING_ENABLE	0x0
232*f173c2b7SSean Bruno #define LIO_CMD_PKT_STEERING_DISABLE	0x1
233*f173c2b7SSean Bruno 
234*f173c2b7SSean Bruno /* RX(packets coming from wire) Checksum verification flags */
235*f173c2b7SSean Bruno /* TCP/UDP csum */
236*f173c2b7SSean Bruno #define LIO_L4SUM_VERIFIED	0x1
237*f173c2b7SSean Bruno #define LIO_IPSUM_VERIFIED	0x2
238*f173c2b7SSean Bruno 
239*f173c2b7SSean Bruno /*LROIPV4 and LROIPV6 Flags*/
240*f173c2b7SSean Bruno #define LIO_LROIPV4	0x1
241*f173c2b7SSean Bruno #define LIO_LROIPV6	0x2
242*f173c2b7SSean Bruno 
243*f173c2b7SSean Bruno /* Interface flags communicated between host driver and core app. */
244*f173c2b7SSean Bruno enum lio_ifflags {
245*f173c2b7SSean Bruno 	LIO_IFFLAG_PROMISC	= 0x01,
246*f173c2b7SSean Bruno 	LIO_IFFLAG_ALLMULTI	= 0x02,
247*f173c2b7SSean Bruno 	LIO_IFFLAG_MULTICAST	= 0x04,
248*f173c2b7SSean Bruno 	LIO_IFFLAG_BROADCAST	= 0x08,
249*f173c2b7SSean Bruno 	LIO_IFFLAG_UNICAST	= 0x10
250*f173c2b7SSean Bruno };
251*f173c2b7SSean Bruno 
252*f173c2b7SSean Bruno /*
253*f173c2b7SSean Bruno  *   wqe
254*f173c2b7SSean Bruno  *  ---------------  0
255*f173c2b7SSean Bruno  * |  wqe  word0-3 |
256*f173c2b7SSean Bruno  *  ---------------  32
257*f173c2b7SSean Bruno  * |    PCI IH     |
258*f173c2b7SSean Bruno  *  ---------------  40
259*f173c2b7SSean Bruno  * |     RPTR      |
260*f173c2b7SSean Bruno  *  ---------------  48
261*f173c2b7SSean Bruno  * |    PCI IRH    |
262*f173c2b7SSean Bruno  *  ---------------  56
263*f173c2b7SSean Bruno  * |  OCT_NET_CMD  |
264*f173c2b7SSean Bruno  *  ---------------  64
265*f173c2b7SSean Bruno  * | Addtl 8-BData |
266*f173c2b7SSean Bruno  * |               |
267*f173c2b7SSean Bruno  *  ---------------
268*f173c2b7SSean Bruno  */
269*f173c2b7SSean Bruno union octeon_cmd {
270*f173c2b7SSean Bruno 	uint64_t	cmd64;
271*f173c2b7SSean Bruno 
272*f173c2b7SSean Bruno 	struct {
273*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
274*f173c2b7SSean Bruno 		uint64_t	cmd:5;
275*f173c2b7SSean Bruno 
276*f173c2b7SSean Bruno 		uint64_t	more:6;	/* How many udd words follow the command */
277*f173c2b7SSean Bruno 
278*f173c2b7SSean Bruno 		uint64_t	reserved:29;
279*f173c2b7SSean Bruno 
280*f173c2b7SSean Bruno 		uint64_t	param1:16;
281*f173c2b7SSean Bruno 
282*f173c2b7SSean Bruno 		uint64_t	param2:8;
283*f173c2b7SSean Bruno 
284*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
285*f173c2b7SSean Bruno 
286*f173c2b7SSean Bruno 		uint64_t	param2:8;
287*f173c2b7SSean Bruno 
288*f173c2b7SSean Bruno 		uint64_t	param1:16;
289*f173c2b7SSean Bruno 
290*f173c2b7SSean Bruno 		uint64_t	reserved:29;
291*f173c2b7SSean Bruno 
292*f173c2b7SSean Bruno 		uint64_t	more:6;
293*f173c2b7SSean Bruno 
294*f173c2b7SSean Bruno 		uint64_t	cmd:5;
295*f173c2b7SSean Bruno 
296*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
297*f173c2b7SSean Bruno 	}	s;
298*f173c2b7SSean Bruno 
299*f173c2b7SSean Bruno };
300*f173c2b7SSean Bruno 
301*f173c2b7SSean Bruno #define OCTEON_CMD_SIZE	(sizeof(union octeon_cmd))
302*f173c2b7SSean Bruno 
303*f173c2b7SSean Bruno /* pkiih3 + irh + ossp[0] + ossp[1] + rdp + rptr = 40 bytes */
304*f173c2b7SSean Bruno #define LIO_SOFTCMDRESP_IH3	(40 + 8)
305*f173c2b7SSean Bruno 
306*f173c2b7SSean Bruno #define LIO_PCICMD_O3		(24 + 8)
307*f173c2b7SSean Bruno 
308*f173c2b7SSean Bruno /* Instruction Header(DPI) - for OCTEON-III models */
309*f173c2b7SSean Bruno struct octeon_instr_ih3 {
310*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
311*f173c2b7SSean Bruno 
312*f173c2b7SSean Bruno 	/* Reserved3 */
313*f173c2b7SSean Bruno 	uint64_t	reserved3:1;
314*f173c2b7SSean Bruno 
315*f173c2b7SSean Bruno 	/* Gather indicator 1=gather */
316*f173c2b7SSean Bruno 	uint64_t	gather:1;
317*f173c2b7SSean Bruno 
318*f173c2b7SSean Bruno 	/* Data length OR no. of entries in gather list */
319*f173c2b7SSean Bruno 	uint64_t	dlengsz:14;
320*f173c2b7SSean Bruno 
321*f173c2b7SSean Bruno 	/* Front Data size */
322*f173c2b7SSean Bruno 	uint64_t	fsz:6;
323*f173c2b7SSean Bruno 
324*f173c2b7SSean Bruno 	/* Reserved2 */
325*f173c2b7SSean Bruno 	uint64_t	reserved2:4;
326*f173c2b7SSean Bruno 
327*f173c2b7SSean Bruno 	/* PKI port kind - PKIND */
328*f173c2b7SSean Bruno 	uint64_t	pkind:6;
329*f173c2b7SSean Bruno 
330*f173c2b7SSean Bruno 	/* Reserved1 */
331*f173c2b7SSean Bruno 	uint64_t	reserved1:32;
332*f173c2b7SSean Bruno 
333*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
334*f173c2b7SSean Bruno 
335*f173c2b7SSean Bruno 	/* Reserved1 */
336*f173c2b7SSean Bruno 	uint64_t	reserved1:32;
337*f173c2b7SSean Bruno 
338*f173c2b7SSean Bruno 	/* PKI port kind - PKIND */
339*f173c2b7SSean Bruno 	uint64_t	pkind:6;
340*f173c2b7SSean Bruno 
341*f173c2b7SSean Bruno 	/* Reserved2 */
342*f173c2b7SSean Bruno 	uint64_t	reserved2:4;
343*f173c2b7SSean Bruno 
344*f173c2b7SSean Bruno 	/* Front Data size */
345*f173c2b7SSean Bruno 	uint64_t	fsz:6;
346*f173c2b7SSean Bruno 
347*f173c2b7SSean Bruno 	/* Data length OR no. of entries in gather list */
348*f173c2b7SSean Bruno 	uint64_t	dlengsz:14;
349*f173c2b7SSean Bruno 
350*f173c2b7SSean Bruno 	/* Gather indicator 1=gather */
351*f173c2b7SSean Bruno 	uint64_t	gather:1;
352*f173c2b7SSean Bruno 
353*f173c2b7SSean Bruno 	/* Reserved3 */
354*f173c2b7SSean Bruno 	uint64_t	reserved3:1;
355*f173c2b7SSean Bruno 
356*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
357*f173c2b7SSean Bruno };
358*f173c2b7SSean Bruno 
359*f173c2b7SSean Bruno /* Optional PKI Instruction Header(PKI IH) - for OCTEON-III models */
360*f173c2b7SSean Bruno /* BIG ENDIAN format.   */
361*f173c2b7SSean Bruno struct octeon_instr_pki_ih3 {
362*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
363*f173c2b7SSean Bruno 
364*f173c2b7SSean Bruno 	/* Wider bit */
365*f173c2b7SSean Bruno 	uint64_t	w:1;
366*f173c2b7SSean Bruno 
367*f173c2b7SSean Bruno 	/* Raw mode indicator 1 = RAW */
368*f173c2b7SSean Bruno 	uint64_t	raw:1;
369*f173c2b7SSean Bruno 
370*f173c2b7SSean Bruno 	/* Use Tag */
371*f173c2b7SSean Bruno 	uint64_t	utag:1;
372*f173c2b7SSean Bruno 
373*f173c2b7SSean Bruno 	/* Use QPG */
374*f173c2b7SSean Bruno 	uint64_t	uqpg:1;
375*f173c2b7SSean Bruno 
376*f173c2b7SSean Bruno 	/* Reserved2 */
377*f173c2b7SSean Bruno 	uint64_t	reserved2:1;
378*f173c2b7SSean Bruno 
379*f173c2b7SSean Bruno 	/* Parse Mode */
380*f173c2b7SSean Bruno 	uint64_t	pm:3;
381*f173c2b7SSean Bruno 
382*f173c2b7SSean Bruno 	/* Skip Length */
383*f173c2b7SSean Bruno 	uint64_t	sl:8;
384*f173c2b7SSean Bruno 
385*f173c2b7SSean Bruno 	/* Use Tag Type */
386*f173c2b7SSean Bruno 	uint64_t	utt:1;
387*f173c2b7SSean Bruno 
388*f173c2b7SSean Bruno 	/* Tag type */
389*f173c2b7SSean Bruno 	uint64_t	tagtype:2;
390*f173c2b7SSean Bruno 
391*f173c2b7SSean Bruno 	/* Reserved1 */
392*f173c2b7SSean Bruno 	uint64_t	reserved1:2;
393*f173c2b7SSean Bruno 
394*f173c2b7SSean Bruno 	/* QPG Value */
395*f173c2b7SSean Bruno 	uint64_t	qpg:11;
396*f173c2b7SSean Bruno 
397*f173c2b7SSean Bruno 	/* Tag Value */
398*f173c2b7SSean Bruno 	uint64_t	tag:32;
399*f173c2b7SSean Bruno 
400*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
401*f173c2b7SSean Bruno 
402*f173c2b7SSean Bruno 	/* Tag Value */
403*f173c2b7SSean Bruno 	uint64_t	tag:32;
404*f173c2b7SSean Bruno 
405*f173c2b7SSean Bruno 	/* QPG Value */
406*f173c2b7SSean Bruno 	uint64_t	qpg:11;
407*f173c2b7SSean Bruno 
408*f173c2b7SSean Bruno 	/* Reserved1 */
409*f173c2b7SSean Bruno 	uint64_t	reserved1:2;
410*f173c2b7SSean Bruno 
411*f173c2b7SSean Bruno 	/* Tag type */
412*f173c2b7SSean Bruno 	uint64_t	tagtype:2;
413*f173c2b7SSean Bruno 
414*f173c2b7SSean Bruno 	/* Use Tag Type */
415*f173c2b7SSean Bruno 	uint64_t	utt:1;
416*f173c2b7SSean Bruno 
417*f173c2b7SSean Bruno 	/* Skip Length */
418*f173c2b7SSean Bruno 	uint64_t	sl:8;
419*f173c2b7SSean Bruno 
420*f173c2b7SSean Bruno 	/* Parse Mode */
421*f173c2b7SSean Bruno 	uint64_t	pm:3;
422*f173c2b7SSean Bruno 
423*f173c2b7SSean Bruno 	/* Reserved2 */
424*f173c2b7SSean Bruno 	uint64_t	reserved2:1;
425*f173c2b7SSean Bruno 
426*f173c2b7SSean Bruno 	/* Use QPG */
427*f173c2b7SSean Bruno 	uint64_t	uqpg:1;
428*f173c2b7SSean Bruno 
429*f173c2b7SSean Bruno 	/* Use Tag */
430*f173c2b7SSean Bruno 	uint64_t	utag:1;
431*f173c2b7SSean Bruno 
432*f173c2b7SSean Bruno 	/* Raw mode indicator 1 = RAW */
433*f173c2b7SSean Bruno 	uint64_t	raw:1;
434*f173c2b7SSean Bruno 
435*f173c2b7SSean Bruno 	/* Wider bit */
436*f173c2b7SSean Bruno 	uint64_t	w:1;
437*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
438*f173c2b7SSean Bruno 
439*f173c2b7SSean Bruno };
440*f173c2b7SSean Bruno 
441*f173c2b7SSean Bruno /* Input Request Header */
442*f173c2b7SSean Bruno struct octeon_instr_irh {
443*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
444*f173c2b7SSean Bruno 	uint64_t	opcode:4;
445*f173c2b7SSean Bruno 	uint64_t	rflag:1;
446*f173c2b7SSean Bruno 	uint64_t	subcode:7;
447*f173c2b7SSean Bruno 	uint64_t	vlan:12;
448*f173c2b7SSean Bruno 	uint64_t	priority:3;
449*f173c2b7SSean Bruno 	uint64_t	reserved:5;
450*f173c2b7SSean Bruno 	uint64_t	ossp:32;	/* opcode/subcode specific parameters */
451*f173c2b7SSean Bruno 
452*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
453*f173c2b7SSean Bruno 
454*f173c2b7SSean Bruno 	uint64_t	ossp:32;	/* opcode/subcode specific parameters */
455*f173c2b7SSean Bruno 	uint64_t	reserved:5;
456*f173c2b7SSean Bruno 	uint64_t	priority:3;
457*f173c2b7SSean Bruno 	uint64_t	vlan:12;
458*f173c2b7SSean Bruno 	uint64_t	subcode:7;
459*f173c2b7SSean Bruno 	uint64_t	rflag:1;
460*f173c2b7SSean Bruno 	uint64_t	opcode:4;
461*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
462*f173c2b7SSean Bruno };
463*f173c2b7SSean Bruno 
464*f173c2b7SSean Bruno /* Return Data Parameters */
465*f173c2b7SSean Bruno struct octeon_instr_rdp {
466*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
467*f173c2b7SSean Bruno 	uint64_t	reserved:49;
468*f173c2b7SSean Bruno 	uint64_t	pcie_port:3;
469*f173c2b7SSean Bruno 	uint64_t	rlen:12;
470*f173c2b7SSean Bruno 
471*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
472*f173c2b7SSean Bruno 
473*f173c2b7SSean Bruno 	uint64_t	rlen:12;
474*f173c2b7SSean Bruno 	uint64_t	pcie_port:3;
475*f173c2b7SSean Bruno 	uint64_t	reserved:49;
476*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
477*f173c2b7SSean Bruno };
478*f173c2b7SSean Bruno 
479*f173c2b7SSean Bruno /* Receive Header */
480*f173c2b7SSean Bruno union octeon_rh {
481*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
482*f173c2b7SSean Bruno 	uint64_t	rh64;
483*f173c2b7SSean Bruno 	struct {
484*f173c2b7SSean Bruno 		uint64_t	opcode:4;
485*f173c2b7SSean Bruno 		uint64_t	subcode:8;
486*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
487*f173c2b7SSean Bruno 		uint64_t	reserved:17;
488*f173c2b7SSean Bruno 		uint64_t	ossp:32;	/* opcode/subcode specific parameters */
489*f173c2b7SSean Bruno 	}	r;
490*f173c2b7SSean Bruno 	struct {
491*f173c2b7SSean Bruno 		uint64_t	opcode:4;
492*f173c2b7SSean Bruno 		uint64_t	subcode:8;
493*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
494*f173c2b7SSean Bruno 		uint64_t	extra:28;
495*f173c2b7SSean Bruno 		uint64_t	vlan:12;
496*f173c2b7SSean Bruno 		uint64_t	priority:3;
497*f173c2b7SSean Bruno 		uint64_t	csum_verified:3;/* checksum verified. */
498*f173c2b7SSean Bruno 		uint64_t	has_hwtstamp:1;	/* Has hardware timestamp. 1 = yes. */
499*f173c2b7SSean Bruno 		uint64_t	encap_on:1;
500*f173c2b7SSean Bruno 		uint64_t	has_hash:1;	/* Has hash (rth or rss). 1 = yes. */
501*f173c2b7SSean Bruno 	}	r_dh;
502*f173c2b7SSean Bruno 	struct {
503*f173c2b7SSean Bruno 		uint64_t	opcode:4;
504*f173c2b7SSean Bruno 		uint64_t	subcode:8;
505*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
506*f173c2b7SSean Bruno 		uint64_t	reserved:11;
507*f173c2b7SSean Bruno 		uint64_t	num_gmx_ports:8;
508*f173c2b7SSean Bruno 		uint64_t	max_nic_ports:10;
509*f173c2b7SSean Bruno 		uint64_t	app_cap_flags:4;
510*f173c2b7SSean Bruno 		uint64_t	app_mode:8;
511*f173c2b7SSean Bruno 		uint64_t	pkind:8;
512*f173c2b7SSean Bruno 	}	r_core_drv_init;
513*f173c2b7SSean Bruno 	struct {
514*f173c2b7SSean Bruno 		uint64_t	opcode:4;
515*f173c2b7SSean Bruno 		uint64_t	subcode:8;
516*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
517*f173c2b7SSean Bruno 		uint64_t	reserved:8;
518*f173c2b7SSean Bruno 		uint64_t	extra:25;
519*f173c2b7SSean Bruno 		uint64_t	gmxport:16;
520*f173c2b7SSean Bruno 	}	r_nic_info;
521*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
522*f173c2b7SSean Bruno 	uint64_t	rh64;
523*f173c2b7SSean Bruno 	struct {
524*f173c2b7SSean Bruno 		uint64_t	ossp:32;	/* opcode/subcode specific parameters */
525*f173c2b7SSean Bruno 		uint64_t	reserved:17;
526*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
527*f173c2b7SSean Bruno 		uint64_t	subcode:8;
528*f173c2b7SSean Bruno 		uint64_t	opcode:4;
529*f173c2b7SSean Bruno 	}	r;
530*f173c2b7SSean Bruno 	struct {
531*f173c2b7SSean Bruno 		uint64_t	has_hash:1;	/* Has hash (rth or rss). 1 = yes. */
532*f173c2b7SSean Bruno 		uint64_t	encap_on:1;
533*f173c2b7SSean Bruno 		uint64_t	has_hwtstamp:1;	/* 1 = has hwtstamp */
534*f173c2b7SSean Bruno 		uint64_t	csum_verified:3;	/* checksum verified. */
535*f173c2b7SSean Bruno 		uint64_t	priority:3;
536*f173c2b7SSean Bruno 		uint64_t	vlan:12;
537*f173c2b7SSean Bruno 		uint64_t	extra:28;
538*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
539*f173c2b7SSean Bruno 		uint64_t	subcode:8;
540*f173c2b7SSean Bruno 		uint64_t	opcode:4;
541*f173c2b7SSean Bruno 	}	r_dh;
542*f173c2b7SSean Bruno 	struct {
543*f173c2b7SSean Bruno 		uint64_t	pkind:8;
544*f173c2b7SSean Bruno 		uint64_t	app_mode:8;
545*f173c2b7SSean Bruno 		uint64_t	app_cap_flags:4;
546*f173c2b7SSean Bruno 		uint64_t	max_nic_ports:10;
547*f173c2b7SSean Bruno 		uint64_t	num_gmx_ports:8;
548*f173c2b7SSean Bruno 		uint64_t	reserved:11;
549*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
550*f173c2b7SSean Bruno 		uint64_t	subcode:8;
551*f173c2b7SSean Bruno 		uint64_t	opcode:4;
552*f173c2b7SSean Bruno 	}	r_core_drv_init;
553*f173c2b7SSean Bruno 	struct {
554*f173c2b7SSean Bruno 		uint64_t	gmxport:16;
555*f173c2b7SSean Bruno 		uint64_t	extra:25;
556*f173c2b7SSean Bruno 		uint64_t	reserved:8;
557*f173c2b7SSean Bruno 		uint64_t	len:3;		/* additional 64-bit words */
558*f173c2b7SSean Bruno 		uint64_t	subcode:8;
559*f173c2b7SSean Bruno 		uint64_t	opcode:4;
560*f173c2b7SSean Bruno 	}	r_nic_info;
561*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
562*f173c2b7SSean Bruno };
563*f173c2b7SSean Bruno 
564*f173c2b7SSean Bruno #define OCTEON_RH_SIZE (sizeof(union  octeon_rh))
565*f173c2b7SSean Bruno 
566*f173c2b7SSean Bruno union octeon_packet_params {
567*f173c2b7SSean Bruno 	uint32_t	pkt_params32;
568*f173c2b7SSean Bruno 	struct {
569*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
570*f173c2b7SSean Bruno 		uint32_t	reserved:24;
571*f173c2b7SSean Bruno 		uint32_t	ip_csum:1;	/* Perform IP header checksum(s) */
572*f173c2b7SSean Bruno 		/* Perform Outer transport header checksum */
573*f173c2b7SSean Bruno 		uint32_t	transport_csum:1;
574*f173c2b7SSean Bruno 		/* Find tunnel, and perform transport csum. */
575*f173c2b7SSean Bruno 		uint32_t	tnl_csum:1;
576*f173c2b7SSean Bruno 		uint32_t	tsflag:1;	/* Timestamp this packet */
577*f173c2b7SSean Bruno 		uint32_t	ipsec_ops:4;	/* IPsec operation */
578*f173c2b7SSean Bruno 
579*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
580*f173c2b7SSean Bruno 
581*f173c2b7SSean Bruno 		uint32_t	ipsec_ops:4;
582*f173c2b7SSean Bruno 		uint32_t	tsflag:1;
583*f173c2b7SSean Bruno 		uint32_t	tnl_csum:1;
584*f173c2b7SSean Bruno 		uint32_t	transport_csum:1;
585*f173c2b7SSean Bruno 		uint32_t	ip_csum:1;
586*f173c2b7SSean Bruno 		uint32_t	reserved:24;
587*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
588*f173c2b7SSean Bruno 	}	s;
589*f173c2b7SSean Bruno };
590*f173c2b7SSean Bruno 
591*f173c2b7SSean Bruno /* Status of a RGMII Link on Octeon as seen by core driver. */
592*f173c2b7SSean Bruno union octeon_link_status {
593*f173c2b7SSean Bruno 	uint64_t	link_status64;
594*f173c2b7SSean Bruno 
595*f173c2b7SSean Bruno 	struct {
596*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
597*f173c2b7SSean Bruno 		uint64_t	duplex:8;
598*f173c2b7SSean Bruno 		uint64_t	mtu:16;
599*f173c2b7SSean Bruno 		uint64_t	speed:16;
600*f173c2b7SSean Bruno 		uint64_t	link_up:1;
601*f173c2b7SSean Bruno 		uint64_t	autoneg:1;
602*f173c2b7SSean Bruno 		uint64_t	if_mode:5;
603*f173c2b7SSean Bruno 		uint64_t	pause:1;
604*f173c2b7SSean Bruno 		uint64_t	flashing:1;
605*f173c2b7SSean Bruno 		uint64_t	reserved:15;
606*f173c2b7SSean Bruno 
607*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
608*f173c2b7SSean Bruno 
609*f173c2b7SSean Bruno 		uint64_t	reserved:15;
610*f173c2b7SSean Bruno 		uint64_t	flashing:1;
611*f173c2b7SSean Bruno 		uint64_t	pause:1;
612*f173c2b7SSean Bruno 		uint64_t	if_mode:5;
613*f173c2b7SSean Bruno 		uint64_t	autoneg:1;
614*f173c2b7SSean Bruno 		uint64_t	link_up:1;
615*f173c2b7SSean Bruno 		uint64_t	speed:16;
616*f173c2b7SSean Bruno 		uint64_t	mtu:16;
617*f173c2b7SSean Bruno 		uint64_t	duplex:8;
618*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
619*f173c2b7SSean Bruno 	}	s;
620*f173c2b7SSean Bruno };
621*f173c2b7SSean Bruno 
622*f173c2b7SSean Bruno /* The txpciq info passed to host from the firmware */
623*f173c2b7SSean Bruno 
624*f173c2b7SSean Bruno union octeon_txpciq {
625*f173c2b7SSean Bruno 	uint64_t	txpciq64;
626*f173c2b7SSean Bruno 
627*f173c2b7SSean Bruno 	struct {
628*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
629*f173c2b7SSean Bruno 		uint64_t	q_no:8;
630*f173c2b7SSean Bruno 		uint64_t	port:8;
631*f173c2b7SSean Bruno 		uint64_t	pkind:6;
632*f173c2b7SSean Bruno 		uint64_t	use_qpg:1;
633*f173c2b7SSean Bruno 		uint64_t	qpg:11;
634*f173c2b7SSean Bruno 		uint64_t	aura_num:10;
635*f173c2b7SSean Bruno 		uint64_t	reserved:20;
636*f173c2b7SSean Bruno 
637*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
638*f173c2b7SSean Bruno 
639*f173c2b7SSean Bruno 		uint64_t	reserved:20;
640*f173c2b7SSean Bruno 		uint64_t	aura_num:10;
641*f173c2b7SSean Bruno 		uint64_t	qpg:11;
642*f173c2b7SSean Bruno 		uint64_t	use_qpg:1;
643*f173c2b7SSean Bruno 		uint64_t	pkind:6;
644*f173c2b7SSean Bruno 		uint64_t	port:8;
645*f173c2b7SSean Bruno 		uint64_t	q_no:8;
646*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
647*f173c2b7SSean Bruno 	}	s;
648*f173c2b7SSean Bruno };
649*f173c2b7SSean Bruno 
650*f173c2b7SSean Bruno /* The rxpciq info passed to host from the firmware */
651*f173c2b7SSean Bruno 
652*f173c2b7SSean Bruno union octeon_rxpciq {
653*f173c2b7SSean Bruno 	uint64_t	rxpciq64;
654*f173c2b7SSean Bruno 
655*f173c2b7SSean Bruno 	struct {
656*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
657*f173c2b7SSean Bruno 		uint64_t	q_no:8;
658*f173c2b7SSean Bruno 		uint64_t	reserved:56;
659*f173c2b7SSean Bruno 
660*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
661*f173c2b7SSean Bruno 
662*f173c2b7SSean Bruno 		uint64_t	reserved:56;
663*f173c2b7SSean Bruno 		uint64_t	q_no:8;
664*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
665*f173c2b7SSean Bruno 	}	s;
666*f173c2b7SSean Bruno };
667*f173c2b7SSean Bruno 
668*f173c2b7SSean Bruno /* Information for a OCTEON ethernet interface shared between core & host. */
669*f173c2b7SSean Bruno struct octeon_link_info {
670*f173c2b7SSean Bruno 	union octeon_link_status link;
671*f173c2b7SSean Bruno 	uint64_t	hw_addr;
672*f173c2b7SSean Bruno 
673*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
674*f173c2b7SSean Bruno 	uint64_t	gmxport:16;
675*f173c2b7SSean Bruno 	uint64_t	macaddr_is_admin_asgnd:1;
676*f173c2b7SSean Bruno 	uint64_t	vlan_is_admin_assigned:1;
677*f173c2b7SSean Bruno 	uint64_t	rsvd:30;
678*f173c2b7SSean Bruno 	uint64_t	num_txpciq:8;
679*f173c2b7SSean Bruno 	uint64_t	num_rxpciq:8;
680*f173c2b7SSean Bruno 
681*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
682*f173c2b7SSean Bruno 
683*f173c2b7SSean Bruno 	uint64_t	num_rxpciq:8;
684*f173c2b7SSean Bruno 	uint64_t	num_txpciq:8;
685*f173c2b7SSean Bruno 	uint64_t	rsvd:30;
686*f173c2b7SSean Bruno 	uint64_t	vlan_is_admin_assigned:1;
687*f173c2b7SSean Bruno 	uint64_t	macaddr_is_admin_asgnd:1;
688*f173c2b7SSean Bruno 	uint64_t	gmxport:16;
689*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
690*f173c2b7SSean Bruno 
691*f173c2b7SSean Bruno 	union octeon_txpciq txpciq[LIO_MAX_IOQS_PER_NICIF];
692*f173c2b7SSean Bruno 	union octeon_rxpciq rxpciq[LIO_MAX_IOQS_PER_NICIF];
693*f173c2b7SSean Bruno };
694*f173c2b7SSean Bruno 
695*f173c2b7SSean Bruno struct octeon_if_cfg_info {
696*f173c2b7SSean Bruno 	uint64_t		iqmask;		/* mask for IQs enabled for  the port */
697*f173c2b7SSean Bruno 	uint64_t		oqmask;		/* mask for OQs enabled for the port */
698*f173c2b7SSean Bruno 	struct octeon_link_info linfo;	/* initial link information */
699*f173c2b7SSean Bruno 	char			lio_firmware_version[32];
700*f173c2b7SSean Bruno };
701*f173c2b7SSean Bruno 
702*f173c2b7SSean Bruno /* Stats for each NIC port in RX direction. */
703*f173c2b7SSean Bruno struct octeon_rx_stats {
704*f173c2b7SSean Bruno 	/* link-level stats */
705*f173c2b7SSean Bruno 	uint64_t	total_rcvd;
706*f173c2b7SSean Bruno 	uint64_t	bytes_rcvd;
707*f173c2b7SSean Bruno 	uint64_t	total_bcst;
708*f173c2b7SSean Bruno 	uint64_t	total_mcst;
709*f173c2b7SSean Bruno 	uint64_t	runts;
710*f173c2b7SSean Bruno 	uint64_t	ctl_rcvd;
711*f173c2b7SSean Bruno 	uint64_t	fifo_err;		/* Accounts for over/under-run of buffers */
712*f173c2b7SSean Bruno 	uint64_t	dmac_drop;
713*f173c2b7SSean Bruno 	uint64_t	fcs_err;
714*f173c2b7SSean Bruno 	uint64_t	jabber_err;
715*f173c2b7SSean Bruno 	uint64_t	l2_err;
716*f173c2b7SSean Bruno 	uint64_t	frame_err;
717*f173c2b7SSean Bruno 
718*f173c2b7SSean Bruno 	/* firmware stats */
719*f173c2b7SSean Bruno 	uint64_t	fw_total_rcvd;
720*f173c2b7SSean Bruno 	uint64_t	fw_total_fwd;
721*f173c2b7SSean Bruno 	uint64_t	fw_total_fwd_bytes;
722*f173c2b7SSean Bruno 	uint64_t	fw_err_pko;
723*f173c2b7SSean Bruno 	uint64_t	fw_err_link;
724*f173c2b7SSean Bruno 	uint64_t	fw_err_drop;
725*f173c2b7SSean Bruno 	uint64_t	fw_rx_vxlan;
726*f173c2b7SSean Bruno 	uint64_t	fw_rx_vxlan_err;
727*f173c2b7SSean Bruno 
728*f173c2b7SSean Bruno 	/* LRO */
729*f173c2b7SSean Bruno 	uint64_t	fw_lro_pkts;		/* Number of packets that are LROed */
730*f173c2b7SSean Bruno 	uint64_t	fw_lro_octs;		/* Number of octets that are LROed */
731*f173c2b7SSean Bruno 	uint64_t	fw_total_lro;		/* Number of LRO packets formed */
732*f173c2b7SSean Bruno 	uint64_t	fw_lro_aborts;		/* Number of times lRO of packet aborted */
733*f173c2b7SSean Bruno 	uint64_t	fw_lro_aborts_port;
734*f173c2b7SSean Bruno 	uint64_t	fw_lro_aborts_seq;
735*f173c2b7SSean Bruno 	uint64_t	fw_lro_aborts_tsval;
736*f173c2b7SSean Bruno 	uint64_t	fw_lro_aborts_timer;
737*f173c2b7SSean Bruno 	/* intrmod: packet forward rate */
738*f173c2b7SSean Bruno 	uint64_t	fwd_rate;
739*f173c2b7SSean Bruno };
740*f173c2b7SSean Bruno 
741*f173c2b7SSean Bruno /* Stats for each NIC port in RX direction. */
742*f173c2b7SSean Bruno struct octeon_tx_stats {
743*f173c2b7SSean Bruno 	/* link-level stats */
744*f173c2b7SSean Bruno 	uint64_t	total_pkts_sent;
745*f173c2b7SSean Bruno 	uint64_t	total_bytes_sent;
746*f173c2b7SSean Bruno 	uint64_t	mcast_pkts_sent;
747*f173c2b7SSean Bruno 	uint64_t	bcast_pkts_sent;
748*f173c2b7SSean Bruno 	uint64_t	ctl_sent;
749*f173c2b7SSean Bruno 	uint64_t	one_collision_sent;	/* Packets sent after one collision */
750*f173c2b7SSean Bruno 	uint64_t	multi_collision_sent;	/* Packets sent after multiple collision */
751*f173c2b7SSean Bruno 	uint64_t	max_collision_fail;	/* Packets not sent due to max collisions */
752*f173c2b7SSean Bruno 	uint64_t	max_deferral_fail;	/* Packets not sent due to max deferrals */
753*f173c2b7SSean Bruno 	uint64_t	fifo_err;		/* Accounts for over/under-run of buffers */
754*f173c2b7SSean Bruno 	uint64_t	runts;
755*f173c2b7SSean Bruno 	uint64_t	total_collisions;	/* Total number of collisions detected */
756*f173c2b7SSean Bruno 
757*f173c2b7SSean Bruno 	/* firmware stats */
758*f173c2b7SSean Bruno 	uint64_t	fw_total_sent;
759*f173c2b7SSean Bruno 	uint64_t	fw_total_fwd;
760*f173c2b7SSean Bruno 	uint64_t	fw_total_fwd_bytes;
761*f173c2b7SSean Bruno 	uint64_t	fw_err_pko;
762*f173c2b7SSean Bruno 	uint64_t	fw_err_link;
763*f173c2b7SSean Bruno 	uint64_t	fw_err_drop;
764*f173c2b7SSean Bruno 	uint64_t	fw_err_tso;
765*f173c2b7SSean Bruno 	uint64_t	fw_tso;			/* number of tso requests */
766*f173c2b7SSean Bruno 	uint64_t	fw_tso_fwd;		/* number of packets segmented in tso */
767*f173c2b7SSean Bruno 	uint64_t	fw_tx_vxlan;
768*f173c2b7SSean Bruno 	uint64_t	fw_err_pki;
769*f173c2b7SSean Bruno };
770*f173c2b7SSean Bruno 
771*f173c2b7SSean Bruno struct octeon_link_stats {
772*f173c2b7SSean Bruno 	struct octeon_rx_stats	fromwire;
773*f173c2b7SSean Bruno 	struct octeon_tx_stats	fromhost;
774*f173c2b7SSean Bruno 
775*f173c2b7SSean Bruno };
776*f173c2b7SSean Bruno 
777*f173c2b7SSean Bruno static inline int
lio_opcode_slow_path(union octeon_rh * rh)778*f173c2b7SSean Bruno lio_opcode_slow_path(union octeon_rh *rh)
779*f173c2b7SSean Bruno {
780*f173c2b7SSean Bruno 	uint16_t	subcode1, subcode2;
781*f173c2b7SSean Bruno 
782*f173c2b7SSean Bruno 	subcode1 = LIO_OPCODE_SUBCODE((rh)->r.opcode, (rh)->r.subcode);
783*f173c2b7SSean Bruno 	subcode2 = LIO_OPCODE_SUBCODE(LIO_OPCODE_NIC, LIO_OPCODE_NIC_NW_DATA);
784*f173c2b7SSean Bruno 
785*f173c2b7SSean Bruno 	return (subcode2 != subcode1);
786*f173c2b7SSean Bruno }
787*f173c2b7SSean Bruno 
788*f173c2b7SSean Bruno struct octeon_mdio_cmd {
789*f173c2b7SSean Bruno 	uint64_t	op;
790*f173c2b7SSean Bruno 	uint64_t	mdio_addr;
791*f173c2b7SSean Bruno 	uint64_t	value1;
792*f173c2b7SSean Bruno 	uint64_t	value2;
793*f173c2b7SSean Bruno 	uint64_t	value3;
794*f173c2b7SSean Bruno };
795*f173c2b7SSean Bruno 
796*f173c2b7SSean Bruno struct octeon_intrmod_cfg {
797*f173c2b7SSean Bruno 	uint64_t	rx_enable;
798*f173c2b7SSean Bruno 	uint64_t	tx_enable;
799*f173c2b7SSean Bruno 	uint64_t	check_intrvl;
800*f173c2b7SSean Bruno 	uint64_t	maxpkt_ratethr;
801*f173c2b7SSean Bruno 	uint64_t	minpkt_ratethr;
802*f173c2b7SSean Bruno 	uint64_t	rx_maxcnt_trigger;
803*f173c2b7SSean Bruno 	uint64_t	rx_mincnt_trigger;
804*f173c2b7SSean Bruno 	uint64_t	rx_maxtmr_trigger;
805*f173c2b7SSean Bruno 	uint64_t	rx_mintmr_trigger;
806*f173c2b7SSean Bruno 	uint64_t	tx_mincnt_trigger;
807*f173c2b7SSean Bruno 	uint64_t	tx_maxcnt_trigger;
808*f173c2b7SSean Bruno 	uint64_t	rx_frames;
809*f173c2b7SSean Bruno 	uint64_t	tx_frames;
810*f173c2b7SSean Bruno 	uint64_t	rx_usecs;
811*f173c2b7SSean Bruno };
812*f173c2b7SSean Bruno 
813*f173c2b7SSean Bruno #define LIO_BASE_QUEUE_NOT_REQUESTED	65535
814*f173c2b7SSean Bruno 
815*f173c2b7SSean Bruno union octeon_if_cfg {
816*f173c2b7SSean Bruno 	uint64_t	if_cfg64;
817*f173c2b7SSean Bruno 	struct {
818*f173c2b7SSean Bruno #if BYTE_ORDER == BIG_ENDIAN
819*f173c2b7SSean Bruno 		uint64_t	base_queue:16;
820*f173c2b7SSean Bruno 		uint64_t	num_iqueues:16;
821*f173c2b7SSean Bruno 		uint64_t	num_oqueues:16;
822*f173c2b7SSean Bruno 		uint64_t	gmx_port_id:8;
823*f173c2b7SSean Bruno 		uint64_t	vf_id:8;
824*f173c2b7SSean Bruno 
825*f173c2b7SSean Bruno #else	/* BYTE_ORDER != BIG_ENDIAN */
826*f173c2b7SSean Bruno 
827*f173c2b7SSean Bruno 		uint64_t	vf_id:8;
828*f173c2b7SSean Bruno 		uint64_t	gmx_port_id:8;
829*f173c2b7SSean Bruno 		uint64_t	num_oqueues:16;
830*f173c2b7SSean Bruno 		uint64_t	num_iqueues:16;
831*f173c2b7SSean Bruno 		uint64_t	base_queue:16;
832*f173c2b7SSean Bruno #endif	/* BYTE_ORDER == BIG_ENDIAN */
833*f173c2b7SSean Bruno 	}	s;
834*f173c2b7SSean Bruno };
835*f173c2b7SSean Bruno 
836*f173c2b7SSean Bruno #endif	/* __LIO_COMMON_H__ */
837