xref: /dpdk/drivers/crypto/ionic/ionic_crypto_if.h (revision 25c896ea6c406f9b4c5c2fec111a34103dbbec5d)
1*25c896eaSAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause
2*25c896eaSAndrew Boyer  * Copyright 2021-2024 Advanced Micro Devices, Inc.
3*25c896eaSAndrew Boyer  */
4*25c896eaSAndrew Boyer 
5*25c896eaSAndrew Boyer #ifndef _IONIC_CRYPTO_IF_H_
6*25c896eaSAndrew Boyer #define _IONIC_CRYPTO_IF_H_
7*25c896eaSAndrew Boyer 
8*25c896eaSAndrew Boyer #define IOCPT_DEV_INFO_SIGNATURE		0x43585660      /* 'CRPT' */
9*25c896eaSAndrew Boyer #define IOCPT_DEV_INFO_VERSION			1
10*25c896eaSAndrew Boyer #define IOCPT_IFNAMSIZ				16
11*25c896eaSAndrew Boyer 
12*25c896eaSAndrew Boyer /**
13*25c896eaSAndrew Boyer  * enum iocpt_cmd_opcode - Device commands
14*25c896eaSAndrew Boyer  */
15*25c896eaSAndrew Boyer enum iocpt_cmd_opcode {
16*25c896eaSAndrew Boyer 	IOCPT_CMD_NOP				= 0,	/* D, A */
17*25c896eaSAndrew Boyer 
18*25c896eaSAndrew Boyer 	/* Device commands */
19*25c896eaSAndrew Boyer 	IOCPT_CMD_IDENTIFY			= 1,	/* D */
20*25c896eaSAndrew Boyer 	IOCPT_CMD_RESET				= 3,	/* D */
21*25c896eaSAndrew Boyer 
22*25c896eaSAndrew Boyer 	/* LIF commands */
23*25c896eaSAndrew Boyer 	IOCPT_CMD_LIF_IDENTIFY			= 20,	/* D */
24*25c896eaSAndrew Boyer 	IOCPT_CMD_LIF_INIT			= 21,	/* D */
25*25c896eaSAndrew Boyer 	IOCPT_CMD_LIF_RESET			= 22,	/* D */
26*25c896eaSAndrew Boyer 	IOCPT_CMD_LIF_GETATTR			= 23,	/* D, A */
27*25c896eaSAndrew Boyer 	IOCPT_CMD_LIF_SETATTR			= 24,	/* D, A */
28*25c896eaSAndrew Boyer 
29*25c896eaSAndrew Boyer 	/* Queue commands */
30*25c896eaSAndrew Boyer 	IOCPT_CMD_Q_IDENTIFY			= 39,	/* D, A */
31*25c896eaSAndrew Boyer 	IOCPT_CMD_Q_INIT			= 40,	/* D, A */
32*25c896eaSAndrew Boyer 	IOCPT_CMD_Q_CONTROL			= 41,	/* D, A */
33*25c896eaSAndrew Boyer 
34*25c896eaSAndrew Boyer 	/* Session commands */
35*25c896eaSAndrew Boyer 	IOCPT_CMD_SESS_CONTROL			= 45,	/* D, A */
36*25c896eaSAndrew Boyer };
37*25c896eaSAndrew Boyer 
38*25c896eaSAndrew Boyer /**
39*25c896eaSAndrew Boyer  * enum iocpt_status_code - Device command return codes
40*25c896eaSAndrew Boyer  */
41*25c896eaSAndrew Boyer enum iocpt_status_code {
42*25c896eaSAndrew Boyer 	IOCPT_RC_SUCCESS	= 0,	/* Success */
43*25c896eaSAndrew Boyer 	IOCPT_RC_EVERSION	= 1,	/* Incorrect version for request */
44*25c896eaSAndrew Boyer 	IOCPT_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
45*25c896eaSAndrew Boyer 	IOCPT_RC_EIO		= 3,	/* I/O error */
46*25c896eaSAndrew Boyer 	IOCPT_RC_EPERM		= 4,	/* Permission denied */
47*25c896eaSAndrew Boyer 	IOCPT_RC_EQID		= 5,	/* Bad qid */
48*25c896eaSAndrew Boyer 	IOCPT_RC_EQTYPE		= 6,	/* Bad qtype */
49*25c896eaSAndrew Boyer 	IOCPT_RC_ENOENT		= 7,	/* No such element */
50*25c896eaSAndrew Boyer 	IOCPT_RC_EINTR		= 8,	/* Operation interrupted */
51*25c896eaSAndrew Boyer 	IOCPT_RC_EAGAIN		= 9,	/* Try again */
52*25c896eaSAndrew Boyer 	IOCPT_RC_ENOMEM		= 10,	/* Out of memory */
53*25c896eaSAndrew Boyer 	IOCPT_RC_EFAULT		= 11,	/* Bad address */
54*25c896eaSAndrew Boyer 	IOCPT_RC_EBUSY		= 12,	/* Device or resource busy */
55*25c896eaSAndrew Boyer 	IOCPT_RC_EEXIST		= 13,	/* Object already exists */
56*25c896eaSAndrew Boyer 	IOCPT_RC_EINVAL		= 14,	/* Invalid argument */
57*25c896eaSAndrew Boyer 	IOCPT_RC_ENOSPC		= 15,	/* No space left or alloc failure */
58*25c896eaSAndrew Boyer 	IOCPT_RC_ERANGE		= 16,	/* Parameter out of range */
59*25c896eaSAndrew Boyer 	IOCPT_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
60*25c896eaSAndrew Boyer 	IOCPT_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
61*25c896eaSAndrew Boyer 	IOCPT_RC_ENOSUPP	= 19,	/* Operation not supported */
62*25c896eaSAndrew Boyer 	IOCPT_RC_ERROR		= 29,	/* Generic error */
63*25c896eaSAndrew Boyer };
64*25c896eaSAndrew Boyer 
65*25c896eaSAndrew Boyer enum iocpt_notifyq_opcode {
66*25c896eaSAndrew Boyer 	IOCPT_EVENT_RESET		= 1,
67*25c896eaSAndrew Boyer 	IOCPT_EVENT_HEARTBEAT		= 2,
68*25c896eaSAndrew Boyer 	IOCPT_EVENT_LOG			= 3,
69*25c896eaSAndrew Boyer };
70*25c896eaSAndrew Boyer 
71*25c896eaSAndrew Boyer enum iocpt_lif_type {
72*25c896eaSAndrew Boyer 	IOCPT_LIF_TYPE_DEFAULT = 0,
73*25c896eaSAndrew Boyer };
74*25c896eaSAndrew Boyer 
75*25c896eaSAndrew Boyer /**
76*25c896eaSAndrew Boyer  * struct iocpt_admin_cmd - General admin command format
77*25c896eaSAndrew Boyer  * @opcode:	Opcode for the command
78*25c896eaSAndrew Boyer  * @lif_index:	LIF index
79*25c896eaSAndrew Boyer  * @cmd_data:	Opcode-specific command bytes
80*25c896eaSAndrew Boyer  */
81*25c896eaSAndrew Boyer struct iocpt_admin_cmd {
82*25c896eaSAndrew Boyer 	u8     opcode;
83*25c896eaSAndrew Boyer 	u8     rsvd;
84*25c896eaSAndrew Boyer 	__le16 lif_index;
85*25c896eaSAndrew Boyer 	u8     cmd_data[60];
86*25c896eaSAndrew Boyer };
87*25c896eaSAndrew Boyer 
88*25c896eaSAndrew Boyer /**
89*25c896eaSAndrew Boyer  * struct iocpt_admin_comp - General admin command completion format
90*25c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
91*25c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
92*25c896eaSAndrew Boyer  * @cmd_data:   Command-specific bytes
93*25c896eaSAndrew Boyer  * @color:      Color bit (Always 0 for commands issued to the
94*25c896eaSAndrew Boyer  *              Device Cmd Registers)
95*25c896eaSAndrew Boyer  */
96*25c896eaSAndrew Boyer struct iocpt_admin_comp {
97*25c896eaSAndrew Boyer 	u8     status;
98*25c896eaSAndrew Boyer 	u8     rsvd;
99*25c896eaSAndrew Boyer 	__le16 comp_index;
100*25c896eaSAndrew Boyer 	u8     cmd_data[11];
101*25c896eaSAndrew Boyer 	u8     color;
102*25c896eaSAndrew Boyer #define IOCPT_COMP_COLOR_MASK  0x80
103*25c896eaSAndrew Boyer };
104*25c896eaSAndrew Boyer 
105*25c896eaSAndrew Boyer static inline u8 iocpt_color_match(u8 color, u8 done_color)
106*25c896eaSAndrew Boyer {
107*25c896eaSAndrew Boyer 	return (!!(color & IOCPT_COMP_COLOR_MASK)) == done_color;
108*25c896eaSAndrew Boyer }
109*25c896eaSAndrew Boyer 
110*25c896eaSAndrew Boyer /**
111*25c896eaSAndrew Boyer  * struct iocpt_nop_cmd - NOP command
112*25c896eaSAndrew Boyer  * @opcode:	Opcode
113*25c896eaSAndrew Boyer  */
114*25c896eaSAndrew Boyer struct iocpt_nop_cmd {
115*25c896eaSAndrew Boyer 	u8     opcode;
116*25c896eaSAndrew Boyer 	u8     rsvd[63];
117*25c896eaSAndrew Boyer };
118*25c896eaSAndrew Boyer 
119*25c896eaSAndrew Boyer /**
120*25c896eaSAndrew Boyer  * struct iocpt_nop_comp - NOP command completion
121*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
122*25c896eaSAndrew Boyer  */
123*25c896eaSAndrew Boyer struct iocpt_nop_comp {
124*25c896eaSAndrew Boyer 	u8     status;
125*25c896eaSAndrew Boyer 	u8     rsvd[15];
126*25c896eaSAndrew Boyer };
127*25c896eaSAndrew Boyer 
128*25c896eaSAndrew Boyer #define IOCPT_IDENTITY_VERSION_1	1
129*25c896eaSAndrew Boyer 
130*25c896eaSAndrew Boyer /**
131*25c896eaSAndrew Boyer  * struct iocpt_dev_identify_cmd - Driver/device identify command
132*25c896eaSAndrew Boyer  * @opcode:	Opcode
133*25c896eaSAndrew Boyer  * @ver:	Highest version of identify supported by driver
134*25c896eaSAndrew Boyer  */
135*25c896eaSAndrew Boyer struct iocpt_dev_identify_cmd {
136*25c896eaSAndrew Boyer 	u8     opcode;
137*25c896eaSAndrew Boyer 	u8     ver;
138*25c896eaSAndrew Boyer 	u8     rsvd[62];
139*25c896eaSAndrew Boyer };
140*25c896eaSAndrew Boyer 
141*25c896eaSAndrew Boyer /**
142*25c896eaSAndrew Boyer  * struct iocpt_dev_identify_comp - Device identify command completion
143*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
144*25c896eaSAndrew Boyer  * @ver:	Version of identify returned by device
145*25c896eaSAndrew Boyer  */
146*25c896eaSAndrew Boyer struct iocpt_dev_identify_comp {
147*25c896eaSAndrew Boyer 	u8     status;
148*25c896eaSAndrew Boyer 	u8     ver;
149*25c896eaSAndrew Boyer 	u8     rsvd[14];
150*25c896eaSAndrew Boyer };
151*25c896eaSAndrew Boyer 
152*25c896eaSAndrew Boyer /**
153*25c896eaSAndrew Boyer  * struct iocpt_dev_reset_cmd - Device reset command
154*25c896eaSAndrew Boyer  * Will reset all LIFs on the device.
155*25c896eaSAndrew Boyer  * @opcode:	Opcode
156*25c896eaSAndrew Boyer  */
157*25c896eaSAndrew Boyer struct iocpt_dev_reset_cmd {
158*25c896eaSAndrew Boyer 	u8     opcode;
159*25c896eaSAndrew Boyer 	u8     rsvd[63];
160*25c896eaSAndrew Boyer };
161*25c896eaSAndrew Boyer 
162*25c896eaSAndrew Boyer /**
163*25c896eaSAndrew Boyer  * struct iocpt_dev_reset_comp - Reset command completion
164*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
165*25c896eaSAndrew Boyer  */
166*25c896eaSAndrew Boyer struct iocpt_dev_reset_comp {
167*25c896eaSAndrew Boyer 	u8     status;
168*25c896eaSAndrew Boyer 	u8     rsvd[15];
169*25c896eaSAndrew Boyer };
170*25c896eaSAndrew Boyer 
171*25c896eaSAndrew Boyer /**
172*25c896eaSAndrew Boyer  * struct iocpt_lif_identify_cmd - LIF identify command
173*25c896eaSAndrew Boyer  * @opcode:	Opcode
174*25c896eaSAndrew Boyer  * @type:	LIF type (enum iocpt_lif_type)
175*25c896eaSAndrew Boyer  * @lif_index:	LIF index
176*25c896eaSAndrew Boyer  * @ver:	Version of identify returned by device
177*25c896eaSAndrew Boyer  */
178*25c896eaSAndrew Boyer struct iocpt_lif_identify_cmd {
179*25c896eaSAndrew Boyer 	u8     opcode;
180*25c896eaSAndrew Boyer 	u8     type;
181*25c896eaSAndrew Boyer 	__le16 lif_index;
182*25c896eaSAndrew Boyer 	u8     ver;
183*25c896eaSAndrew Boyer 	u8     rsvd[59];
184*25c896eaSAndrew Boyer };
185*25c896eaSAndrew Boyer 
186*25c896eaSAndrew Boyer /**
187*25c896eaSAndrew Boyer  * struct iocpt_lif_identify_comp - LIF identify command completion
188*25c896eaSAndrew Boyer  * @status:  Status of the command (enum iocpt_status_code)
189*25c896eaSAndrew Boyer  * @ver:     Version of identify returned by device
190*25c896eaSAndrew Boyer  */
191*25c896eaSAndrew Boyer struct iocpt_lif_identify_comp {
192*25c896eaSAndrew Boyer 	u8     status;
193*25c896eaSAndrew Boyer 	u8     ver;
194*25c896eaSAndrew Boyer 	u8     rsvd2[14];
195*25c896eaSAndrew Boyer };
196*25c896eaSAndrew Boyer 
197*25c896eaSAndrew Boyer /**
198*25c896eaSAndrew Boyer  * struct iocpt_lif_init_cmd - LIF init command
199*25c896eaSAndrew Boyer  * @opcode:	Opcode
200*25c896eaSAndrew Boyer  * @type:	LIF type (enum iocpt_lif_type)
201*25c896eaSAndrew Boyer  * @lif_index:	LIF index
202*25c896eaSAndrew Boyer  * @info_pa:	Destination address for LIF info (struct iocpt_lif_info)
203*25c896eaSAndrew Boyer  */
204*25c896eaSAndrew Boyer struct iocpt_lif_init_cmd {
205*25c896eaSAndrew Boyer 	u8     opcode;
206*25c896eaSAndrew Boyer 	u8     type;
207*25c896eaSAndrew Boyer 	__le16 lif_index;
208*25c896eaSAndrew Boyer 	__le32 rsvd;
209*25c896eaSAndrew Boyer 	__le64 info_pa;
210*25c896eaSAndrew Boyer 	u8     rsvd2[48];
211*25c896eaSAndrew Boyer };
212*25c896eaSAndrew Boyer 
213*25c896eaSAndrew Boyer /**
214*25c896eaSAndrew Boyer  * struct iocpt_lif_init_comp - LIF init command completion
215*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
216*25c896eaSAndrew Boyer  * @hw_index:	Hardware index of the initialized LIF
217*25c896eaSAndrew Boyer  */
218*25c896eaSAndrew Boyer struct iocpt_lif_init_comp {
219*25c896eaSAndrew Boyer 	u8     status;
220*25c896eaSAndrew Boyer 	u8     rsvd;
221*25c896eaSAndrew Boyer 	__le16 hw_index;
222*25c896eaSAndrew Boyer 	u8     rsvd2[12];
223*25c896eaSAndrew Boyer };
224*25c896eaSAndrew Boyer 
225*25c896eaSAndrew Boyer /**
226*25c896eaSAndrew Boyer  * struct iocpt_lif_reset_cmd - LIF reset command
227*25c896eaSAndrew Boyer  * Will reset only the specified LIF.
228*25c896eaSAndrew Boyer  * @opcode:	Opcode
229*25c896eaSAndrew Boyer  * @lif_index:	LIF index
230*25c896eaSAndrew Boyer  */
231*25c896eaSAndrew Boyer struct iocpt_lif_reset_cmd {
232*25c896eaSAndrew Boyer 	u8     opcode;
233*25c896eaSAndrew Boyer 	u8     rsvd;
234*25c896eaSAndrew Boyer 	__le16 lif_index;
235*25c896eaSAndrew Boyer 	__le32 rsvd2[15];
236*25c896eaSAndrew Boyer };
237*25c896eaSAndrew Boyer 
238*25c896eaSAndrew Boyer /**
239*25c896eaSAndrew Boyer  * enum iocpt_lif_attr - List of LIF attributes
240*25c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_STATE:	LIF state attribute
241*25c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_NAME:	LIF name attribute
242*25c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_FEATURES:	LIF features attribute
243*25c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_STATS_CTRL:	LIF statistics control attribute
244*25c896eaSAndrew Boyer  */
245*25c896eaSAndrew Boyer enum iocpt_lif_attr {
246*25c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_STATE	    = 0,
247*25c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_NAME	    = 1,
248*25c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_FEATURES	    = 4,
249*25c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_STATS_CTRL   = 6,
250*25c896eaSAndrew Boyer };
251*25c896eaSAndrew Boyer 
252*25c896eaSAndrew Boyer /**
253*25c896eaSAndrew Boyer  * struct iocpt_lif_setattr_cmd - Set LIF attributes on the NIC
254*25c896eaSAndrew Boyer  * @opcode:	Opcode
255*25c896eaSAndrew Boyer  * @attr:	Attribute type (enum iocpt_lif_attr)
256*25c896eaSAndrew Boyer  * @lif_index:	LIF index
257*25c896eaSAndrew Boyer  * @state:	LIF state (enum iocpt_lif_state)
258*25c896eaSAndrew Boyer  * @name:	The name string, 0 terminated
259*25c896eaSAndrew Boyer  * @features:	Features (enum iocpt_hw_features)
260*25c896eaSAndrew Boyer  * @stats_ctl:	Stats control commands (enum iocpt_stats_ctl_cmd)
261*25c896eaSAndrew Boyer  */
262*25c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd {
263*25c896eaSAndrew Boyer 	u8     opcode;
264*25c896eaSAndrew Boyer 	u8     attr;
265*25c896eaSAndrew Boyer 	__le16 lif_index;
266*25c896eaSAndrew Boyer 	union {
267*25c896eaSAndrew Boyer 		u8	state;
268*25c896eaSAndrew Boyer 		char	name[IOCPT_IFNAMSIZ];
269*25c896eaSAndrew Boyer 		__le64	features;
270*25c896eaSAndrew Boyer 		u8	stats_ctl;
271*25c896eaSAndrew Boyer 		u8	rsvd[60];
272*25c896eaSAndrew Boyer 	} __rte_packed;
273*25c896eaSAndrew Boyer };
274*25c896eaSAndrew Boyer 
275*25c896eaSAndrew Boyer /**
276*25c896eaSAndrew Boyer  * struct iocpt_lif_setattr_comp - LIF set attr command completion
277*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
278*25c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
279*25c896eaSAndrew Boyer  * @features:	Features (enum iocpt_hw_features)
280*25c896eaSAndrew Boyer  * @color:	Color bit
281*25c896eaSAndrew Boyer  */
282*25c896eaSAndrew Boyer struct iocpt_lif_setattr_comp {
283*25c896eaSAndrew Boyer 	u8     status;
284*25c896eaSAndrew Boyer 	u8     rsvd;
285*25c896eaSAndrew Boyer 	__le16 comp_index;
286*25c896eaSAndrew Boyer 	union {
287*25c896eaSAndrew Boyer 		__le64	features;
288*25c896eaSAndrew Boyer 		u8	rsvd2[11];
289*25c896eaSAndrew Boyer 	} __rte_packed;
290*25c896eaSAndrew Boyer 	u8     color;
291*25c896eaSAndrew Boyer };
292*25c896eaSAndrew Boyer 
293*25c896eaSAndrew Boyer /**
294*25c896eaSAndrew Boyer  * struct iocpt_lif_getattr_cmd - Get LIF attributes from the NIC
295*25c896eaSAndrew Boyer  * @opcode:	Opcode
296*25c896eaSAndrew Boyer  * @attr:	Attribute type (enum iocpt_lif_attr)
297*25c896eaSAndrew Boyer  * @lif_index:	LIF index
298*25c896eaSAndrew Boyer  */
299*25c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd {
300*25c896eaSAndrew Boyer 	u8     opcode;
301*25c896eaSAndrew Boyer 	u8     attr;
302*25c896eaSAndrew Boyer 	__le16 lif_index;
303*25c896eaSAndrew Boyer 	u8     rsvd[60];
304*25c896eaSAndrew Boyer };
305*25c896eaSAndrew Boyer 
306*25c896eaSAndrew Boyer /**
307*25c896eaSAndrew Boyer  * struct iocpt_lif_getattr_comp - LIF get attr command completion
308*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
309*25c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
310*25c896eaSAndrew Boyer  * @state:	LIF state (enum iocpt_lif_state)
311*25c896eaSAndrew Boyer  * @name:	LIF name string, 0 terminated
312*25c896eaSAndrew Boyer  * @features:	Features (enum iocpt_hw_features)
313*25c896eaSAndrew Boyer  * @color:	Color bit
314*25c896eaSAndrew Boyer  */
315*25c896eaSAndrew Boyer struct iocpt_lif_getattr_comp {
316*25c896eaSAndrew Boyer 	u8     status;
317*25c896eaSAndrew Boyer 	u8     rsvd;
318*25c896eaSAndrew Boyer 	__le16 comp_index;
319*25c896eaSAndrew Boyer 	union {
320*25c896eaSAndrew Boyer 		u8	state;
321*25c896eaSAndrew Boyer 		__le64	features;
322*25c896eaSAndrew Boyer 		u8	rsvd2[11];
323*25c896eaSAndrew Boyer 	} __rte_packed;
324*25c896eaSAndrew Boyer 	u8     color;
325*25c896eaSAndrew Boyer };
326*25c896eaSAndrew Boyer 
327*25c896eaSAndrew Boyer /**
328*25c896eaSAndrew Boyer  * enum iocpt_logical_qtype - Logical Queue Types
329*25c896eaSAndrew Boyer  * @IOCPT_QTYPE_ADMINQ:    Administrative Queue
330*25c896eaSAndrew Boyer  * @IOCPT_QTYPE_NOTIFYQ:   Notify Queue
331*25c896eaSAndrew Boyer  * @IOCPT_QTYPE_CRYPTOQ:   Cryptographic Queue
332*25c896eaSAndrew Boyer  * @IOCPT_QTYPE_MAX:       Max queue type supported
333*25c896eaSAndrew Boyer  */
334*25c896eaSAndrew Boyer enum iocpt_logical_qtype {
335*25c896eaSAndrew Boyer 	IOCPT_QTYPE_ADMINQ  = 0,
336*25c896eaSAndrew Boyer 	IOCPT_QTYPE_NOTIFYQ = 1,
337*25c896eaSAndrew Boyer 	IOCPT_QTYPE_CRYPTOQ = 2,
338*25c896eaSAndrew Boyer 	IOCPT_QTYPE_MAX     = 8,
339*25c896eaSAndrew Boyer };
340*25c896eaSAndrew Boyer 
341*25c896eaSAndrew Boyer /**
342*25c896eaSAndrew Boyer  * struct iocpt_q_identify_cmd - queue identify command
343*25c896eaSAndrew Boyer  * @opcode:     Opcode
344*25c896eaSAndrew Boyer  * @type:       Logical queue type (enum iocpt_logical_qtype)
345*25c896eaSAndrew Boyer  * @lif_index:  LIF index
346*25c896eaSAndrew Boyer  * @ver:        Highest queue type version that the driver supports
347*25c896eaSAndrew Boyer  */
348*25c896eaSAndrew Boyer struct iocpt_q_identify_cmd {
349*25c896eaSAndrew Boyer 	u8     opcode;
350*25c896eaSAndrew Boyer 	u8     type;
351*25c896eaSAndrew Boyer 	__le16 lif_index;
352*25c896eaSAndrew Boyer 	u8     ver;
353*25c896eaSAndrew Boyer 	u8     rsvd2[59];
354*25c896eaSAndrew Boyer };
355*25c896eaSAndrew Boyer 
356*25c896eaSAndrew Boyer /**
357*25c896eaSAndrew Boyer  * struct iocpt_q_identify_comp - queue identify command completion
358*25c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
359*25c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
360*25c896eaSAndrew Boyer  * @ver:        Queue type version that can be used with FW
361*25c896eaSAndrew Boyer  */
362*25c896eaSAndrew Boyer struct iocpt_q_identify_comp {
363*25c896eaSAndrew Boyer 	u8     status;
364*25c896eaSAndrew Boyer 	u8     rsvd;
365*25c896eaSAndrew Boyer 	__le16 comp_index;
366*25c896eaSAndrew Boyer 	u8     ver;
367*25c896eaSAndrew Boyer 	u8     rsvd2[11];
368*25c896eaSAndrew Boyer };
369*25c896eaSAndrew Boyer 
370*25c896eaSAndrew Boyer /**
371*25c896eaSAndrew Boyer  * struct iocpt_q_init_cmd - Queue init command
372*25c896eaSAndrew Boyer  * @opcode:       Opcode
373*25c896eaSAndrew Boyer  * @type:         Logical queue type
374*25c896eaSAndrew Boyer  * @lif_index:    LIF index
375*25c896eaSAndrew Boyer  * @ver:          Queue type version
376*25c896eaSAndrew Boyer  * @index:        (LIF, qtype) relative admin queue index
377*25c896eaSAndrew Boyer  * @intr_index:   Interrupt control register index, or Event queue index
378*25c896eaSAndrew Boyer  * @pid:          Process ID
379*25c896eaSAndrew Boyer  * @flags:
380*25c896eaSAndrew Boyer  *    IRQ:        Interrupt requested on completion
381*25c896eaSAndrew Boyer  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
382*25c896eaSAndrew Boyer  *                but remains disabled, to be later enabled with the
383*25c896eaSAndrew Boyer  *                Queue Enable command.  If ENA=1, then queue is
384*25c896eaSAndrew Boyer  *                initialized and then enabled.
385*25c896eaSAndrew Boyer  *    SG:         Enable Scatter-Gather on the queue.
386*25c896eaSAndrew Boyer  * @cos:          Class of service for this queue
387*25c896eaSAndrew Boyer  * @ring_size:    Queue ring size, encoded as a log2(size), in
388*25c896eaSAndrew Boyer  *                number of descriptors.  The actual ring size is
389*25c896eaSAndrew Boyer  *                (1 << ring_size).  For example, to select a ring size
390*25c896eaSAndrew Boyer  *                of 64 descriptors write ring_size = 6. The minimum
391*25c896eaSAndrew Boyer  *                ring_size value is 2 for a ring of 4 descriptors.
392*25c896eaSAndrew Boyer  *                The maximum ring_size value is 12 for a ring of 4k
393*25c896eaSAndrew Boyer  *                descriptors.  Values of ring_size <2 and >12 are
394*25c896eaSAndrew Boyer  *                reserved.
395*25c896eaSAndrew Boyer  * @ring_base:    Queue ring base address
396*25c896eaSAndrew Boyer  * @cq_ring_base: Completion queue ring base address
397*25c896eaSAndrew Boyer  * @sg_ring_base: Scatter/Gather ring base address
398*25c896eaSAndrew Boyer  */
399*25c896eaSAndrew Boyer struct iocpt_q_init_cmd {
400*25c896eaSAndrew Boyer 	u8     opcode;
401*25c896eaSAndrew Boyer 	u8     type;
402*25c896eaSAndrew Boyer 	__le16 lif_index;
403*25c896eaSAndrew Boyer 	u8     ver;
404*25c896eaSAndrew Boyer 	u8     rsvd[3];
405*25c896eaSAndrew Boyer 	__le32 index;
406*25c896eaSAndrew Boyer 	__le16 pid;
407*25c896eaSAndrew Boyer 	__le16 intr_index;
408*25c896eaSAndrew Boyer 	__le16 flags;
409*25c896eaSAndrew Boyer #define IOCPT_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
410*25c896eaSAndrew Boyer #define IOCPT_QINIT_F_ENA	0x02	/* Enable the queue */
411*25c896eaSAndrew Boyer #define IOCPT_QINIT_F_SG	0x04	/* Enable scatter/gather on queue */
412*25c896eaSAndrew Boyer 	u8     cos;
413*25c896eaSAndrew Boyer #define IOCPT_QSIZE_MIN_LG2	2
414*25c896eaSAndrew Boyer #define IOCPT_QSIZE_MAX_LG2	12
415*25c896eaSAndrew Boyer 	u8     ring_size;
416*25c896eaSAndrew Boyer 	__le64 ring_base;
417*25c896eaSAndrew Boyer 	__le64 cq_ring_base;
418*25c896eaSAndrew Boyer 	__le64 sg_ring_base;
419*25c896eaSAndrew Boyer 	u8     rsvd2[20];
420*25c896eaSAndrew Boyer } __rte_packed;
421*25c896eaSAndrew Boyer 
422*25c896eaSAndrew Boyer /**
423*25c896eaSAndrew Boyer  * struct iocpt_q_init_comp - Queue init command completion
424*25c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
425*25c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
426*25c896eaSAndrew Boyer  * @hw_index:   Hardware Queue ID
427*25c896eaSAndrew Boyer  * @hw_type:    Hardware Queue type
428*25c896eaSAndrew Boyer  * @color:      Color
429*25c896eaSAndrew Boyer  */
430*25c896eaSAndrew Boyer struct iocpt_q_init_comp {
431*25c896eaSAndrew Boyer 	u8     status;
432*25c896eaSAndrew Boyer 	u8     rsvd;
433*25c896eaSAndrew Boyer 	__le16 comp_index;
434*25c896eaSAndrew Boyer 	__le32 hw_index;
435*25c896eaSAndrew Boyer 	u8     hw_type;
436*25c896eaSAndrew Boyer 	u8     rsvd2[6];
437*25c896eaSAndrew Boyer 	u8     color;
438*25c896eaSAndrew Boyer };
439*25c896eaSAndrew Boyer 
440*25c896eaSAndrew Boyer enum iocpt_desc_opcode {
441*25c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT = 0,
442*25c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT = 1,
443*25c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_XTS_ENCRYPT = 2,
444*25c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_XTS_DECRYPT = 3,
445*25c896eaSAndrew Boyer };
446*25c896eaSAndrew Boyer 
447*25c896eaSAndrew Boyer #define IOCPT_DESC_F_AAD_VALID		0x1
448*25c896eaSAndrew Boyer 
449*25c896eaSAndrew Boyer /**
450*25c896eaSAndrew Boyer  * struct iocpt_desc - Crypto queue descriptor format
451*25c896eaSAndrew Boyer  * @opcode:
452*25c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT:
453*25c896eaSAndrew Boyer  *                   Perform a GCM-AES encrypt operation
454*25c896eaSAndrew Boyer  *
455*25c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT:
456*25c896eaSAndrew Boyer  *                   Perform a GCM-AES decrypt operation
457*25c896eaSAndrew Boyer  *
458*25c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_XTS_ENCRYPT:
459*25c896eaSAndrew Boyer  *                   Perform an XTS encrypt operation
460*25c896eaSAndrew Boyer  *
461*25c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_XTS_DECRYPT:
462*25c896eaSAndrew Boyer  *                   Perform an XTS decrypt operation
463*25c896eaSAndrew Boyer  * @flags:
464*25c896eaSAndrew Boyer  *         IOCPT_DESC_F_AAD_VALID:
465*25c896eaSAndrew Boyer  *                   Source SGL contains an AAD addr and length
466*25c896eaSAndrew Boyer  * @num_src_dst_sgs: Number of scatter-gather elements in SG
467*25c896eaSAndrew Boyer  *                   descriptor (4 bits for source, 4 bits for destination)
468*25c896eaSAndrew Boyer  * @session_tag:     Session tag (key index)
469*25c896eaSAndrew Boyer  * @intr_ctx_addr:   Completion interrupt context address
470*25c896eaSAndrew Boyer  * @intr_ctx_data:   Completion interrupt context data
471*25c896eaSAndrew Boyer  */
472*25c896eaSAndrew Boyer struct iocpt_crypto_desc {
473*25c896eaSAndrew Boyer 	uint8_t  opcode;
474*25c896eaSAndrew Boyer 	uint8_t  flags;
475*25c896eaSAndrew Boyer 	uint8_t  num_src_dst_sgs;
476*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_MASK	0xf
477*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_SHIFT	0
478*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_MASK	0xf
479*25c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_SHIFT	4
480*25c896eaSAndrew Boyer 	uint8_t  rsvd[9];
481*25c896eaSAndrew Boyer 	__le32   session_tag;
482*25c896eaSAndrew Boyer 	__le64   intr_ctx_addr;
483*25c896eaSAndrew Boyer 	__le64   intr_ctx_data;
484*25c896eaSAndrew Boyer } __rte_packed;
485*25c896eaSAndrew Boyer 
486*25c896eaSAndrew Boyer static inline uint8_t iocpt_encode_nsge_src_dst(uint8_t src, uint8_t dst)
487*25c896eaSAndrew Boyer {
488*25c896eaSAndrew Boyer 	uint8_t nsge_src_dst;
489*25c896eaSAndrew Boyer 
490*25c896eaSAndrew Boyer 	nsge_src_dst = (src & IOCPT_DESC_NSGE_SRC_MASK) <<
491*25c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_SRC_SHIFT;
492*25c896eaSAndrew Boyer 	nsge_src_dst |= (dst & IOCPT_DESC_NSGE_DST_MASK) <<
493*25c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_DST_SHIFT;
494*25c896eaSAndrew Boyer 
495*25c896eaSAndrew Boyer 	return nsge_src_dst;
496*25c896eaSAndrew Boyer };
497*25c896eaSAndrew Boyer 
498*25c896eaSAndrew Boyer static inline void iocpt_decode_nsge_src_dst(uint8_t nsge_src_dst,
499*25c896eaSAndrew Boyer 					     uint8_t *src, uint8_t *dst)
500*25c896eaSAndrew Boyer {
501*25c896eaSAndrew Boyer 	*src = (nsge_src_dst >> IOCPT_DESC_NSGE_SRC_SHIFT) &
502*25c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_SRC_MASK;
503*25c896eaSAndrew Boyer 	*dst = (nsge_src_dst >> IOCPT_DESC_NSGE_DST_SHIFT) &
504*25c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_DST_MASK;
505*25c896eaSAndrew Boyer };
506*25c896eaSAndrew Boyer 
507*25c896eaSAndrew Boyer /**
508*25c896eaSAndrew Boyer  * struct iocpt_crypto_sg_elem - Crypto scatter-gather (SG) descriptor element
509*25c896eaSAndrew Boyer  * @addr:	DMA address of SG element data buffer
510*25c896eaSAndrew Boyer  * @len:	Length of SG element data buffer, in bytes
511*25c896eaSAndrew Boyer  */
512*25c896eaSAndrew Boyer struct iocpt_crypto_sg_elem {
513*25c896eaSAndrew Boyer 	__le64  addr;
514*25c896eaSAndrew Boyer 	__le16  len;
515*25c896eaSAndrew Boyer 	uint8_t rsvd[6];
516*25c896eaSAndrew Boyer };
517*25c896eaSAndrew Boyer 
518*25c896eaSAndrew Boyer /**
519*25c896eaSAndrew Boyer  * struct iocpt_crypto_sg_desc - Crypto scatter-gather (SG) list
520*25c896eaSAndrew Boyer  * @src_elems: Source SG elements; also destination in IP case
521*25c896eaSAndrew Boyer  *     AES_GCM:
522*25c896eaSAndrew Boyer  *         SGE0: Nonce
523*25c896eaSAndrew Boyer  *         SGE1: AAD (see IOCPT_DESC_F_AAD_VALID)
524*25c896eaSAndrew Boyer  *         SGE2 to SGE(N): Payload
525*25c896eaSAndrew Boyer  *         SGE(N+1): Auth tag
526*25c896eaSAndrew Boyer  * @dst_elems: Destination SG elements for OOP case; unused in IP case
527*25c896eaSAndrew Boyer  */
528*25c896eaSAndrew Boyer struct iocpt_crypto_sg_desc {
529*25c896eaSAndrew Boyer #define IOCPT_CRYPTO_MAX_SG_ELEMS	8
530*25c896eaSAndrew Boyer #define IOCPT_CRYPTO_NONCE_ELEM		0
531*25c896eaSAndrew Boyer #define IOCPT_CRYPTO_AAD_ELEM		1
532*25c896eaSAndrew Boyer 	struct iocpt_crypto_sg_elem src_elems[IOCPT_CRYPTO_MAX_SG_ELEMS];
533*25c896eaSAndrew Boyer 	struct iocpt_crypto_sg_elem dst_elems[IOCPT_CRYPTO_MAX_SG_ELEMS];
534*25c896eaSAndrew Boyer };
535*25c896eaSAndrew Boyer 
536*25c896eaSAndrew Boyer /**
537*25c896eaSAndrew Boyer  * struct iocpt_crypto_comp - Crypto queue completion descriptor
538*25c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
539*25c896eaSAndrew Boyer  * @comp_index:	Index in the descriptor ring for which this is the completion
540*25c896eaSAndrew Boyer  * @color:	Color bit
541*25c896eaSAndrew Boyer  */
542*25c896eaSAndrew Boyer struct iocpt_crypto_comp {
543*25c896eaSAndrew Boyer #define IOCPT_COMP_SUCCESS			0
544*25c896eaSAndrew Boyer #define IOCPT_COMP_INVAL_OPCODE_ERROR		1
545*25c896eaSAndrew Boyer #define IOCPT_COMP_UNSUPP_OPCODE_ERROR		2
546*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_SG_ERROR		3
547*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_DST_SG_ERROR		4
548*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_DST_LEN_MISMATCH	5
549*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HW_QAVAIL_ERROR		6
550*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_AUTH_VERIFY_ERROR	7
551*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_OTHER_VERIFY_ERROR	8
552*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_PI_MODE_CHKSUM_ERROR	9
553*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HARDWARE_ERROR		10
554*25c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_KEY_IDX_ERROR		11
555*25c896eaSAndrew Boyer 	u8     status;
556*25c896eaSAndrew Boyer 	u8     rsvd;
557*25c896eaSAndrew Boyer 	__le16 comp_index;
558*25c896eaSAndrew Boyer 	u8     rsvd2[11];
559*25c896eaSAndrew Boyer 	u8     color;
560*25c896eaSAndrew Boyer };
561*25c896eaSAndrew Boyer 
562*25c896eaSAndrew Boyer /**
563*25c896eaSAndrew Boyer  * enum iocpt_hw_features - Feature flags supported by hardware
564*25c896eaSAndrew Boyer  * @IOCPT_HW_SYM:   Symmetric crypto operations
565*25c896eaSAndrew Boyer  * @IOCPT_HW_ASYM:  Asymmetric crypto operations
566*25c896eaSAndrew Boyer  * @IOCPT_HW_CHAIN: Chained crypto operations
567*25c896eaSAndrew Boyer  * @IOCPT_HW_IP:    In-Place (destination same as source)
568*25c896eaSAndrew Boyer  * @IOCPT_HW_OOP:   Out-Of-Place (destination differs from source)
569*25c896eaSAndrew Boyer  */
570*25c896eaSAndrew Boyer enum iocpt_hw_features {
571*25c896eaSAndrew Boyer 	IOCPT_HW_SYM             = BIT(0),
572*25c896eaSAndrew Boyer 	IOCPT_HW_ASYM            = BIT(1),
573*25c896eaSAndrew Boyer 	IOCPT_HW_CHAIN           = BIT(2),
574*25c896eaSAndrew Boyer 	IOCPT_HW_IP              = BIT(3),
575*25c896eaSAndrew Boyer 	IOCPT_HW_OOP             = BIT(4),
576*25c896eaSAndrew Boyer };
577*25c896eaSAndrew Boyer 
578*25c896eaSAndrew Boyer /**
579*25c896eaSAndrew Boyer  * struct iocpt_q_control_cmd - Queue control command
580*25c896eaSAndrew Boyer  * @opcode:	Opcode
581*25c896eaSAndrew Boyer  * @type:	Queue type
582*25c896eaSAndrew Boyer  * @lif_index:	LIF index
583*25c896eaSAndrew Boyer  * @index:	Queue index
584*25c896eaSAndrew Boyer  * @oper:	Operation (enum iocpt_q_control_oper)
585*25c896eaSAndrew Boyer  */
586*25c896eaSAndrew Boyer struct iocpt_q_control_cmd {
587*25c896eaSAndrew Boyer 	u8     opcode;
588*25c896eaSAndrew Boyer 	u8     type;
589*25c896eaSAndrew Boyer 	__le16 lif_index;
590*25c896eaSAndrew Boyer 	__le32 index;
591*25c896eaSAndrew Boyer 	u8     oper;
592*25c896eaSAndrew Boyer 	u8     rsvd2[55];
593*25c896eaSAndrew Boyer };
594*25c896eaSAndrew Boyer 
595*25c896eaSAndrew Boyer enum iocpt_q_control_oper {
596*25c896eaSAndrew Boyer 	IOCPT_Q_DISABLE		= 0,
597*25c896eaSAndrew Boyer 	IOCPT_Q_ENABLE		= 1,
598*25c896eaSAndrew Boyer };
599*25c896eaSAndrew Boyer 
600*25c896eaSAndrew Boyer /* NB: It will take 64 transfers to update a 2048B key */
601*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MIN		16
602*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_SYMM	32
603*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_ASYM	2048
604*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_LEN		32
605*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_SHFT		5
606*25c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_CNT		\
607*25c896eaSAndrew Boyer 	(IOCPT_SESS_KEY_LEN_MAX_SYMM >> IOCPT_SESS_KEY_SEG_SHFT)
608*25c896eaSAndrew Boyer 
609*25c896eaSAndrew Boyer enum iocpt_sess_type {
610*25c896eaSAndrew Boyer 	IOCPT_SESS_NONE			= 0,
611*25c896eaSAndrew Boyer 	IOCPT_SESS_AEAD_AES_GCM		= 1,
612*25c896eaSAndrew Boyer };
613*25c896eaSAndrew Boyer 
614*25c896eaSAndrew Boyer enum iocpt_sess_control_oper {
615*25c896eaSAndrew Boyer 	IOCPT_SESS_INIT			= 0,
616*25c896eaSAndrew Boyer 	IOCPT_SESS_UPDATE_KEY		= 2,
617*25c896eaSAndrew Boyer 	IOCPT_SESS_DISABLE		= 3,
618*25c896eaSAndrew Boyer };
619*25c896eaSAndrew Boyer 
620*25c896eaSAndrew Boyer /**
621*25c896eaSAndrew Boyer  * struct iocpt_sess_control_cmd - Session control command
622*25c896eaSAndrew Boyer  * @opcode:      Opcode
623*25c896eaSAndrew Boyer  * @type:        Session type (enum iocpt_sess_type)
624*25c896eaSAndrew Boyer  * @lif_index:   LIF index
625*25c896eaSAndrew Boyer  * @oper:        Operation (enum iocpt_sess_control_oper)
626*25c896eaSAndrew Boyer  * @flags:
627*25c896eaSAndrew Boyer  *    END:       Indicates that this is the final segment of the key.
628*25c896eaSAndrew Boyer  *               When this flag is set, a write will be triggered from the
629*25c896eaSAndrew Boyer  *               controller's memory into the dedicated key-storage area.
630*25c896eaSAndrew Boyer  * @key_len:     Crypto key length in bytes
631*25c896eaSAndrew Boyer  * @index:       Session index, as allocated by PMD
632*25c896eaSAndrew Boyer  * @key_seg_len: Crypto key segment length in bytes
633*25c896eaSAndrew Boyer  * @key_seg_idx: Crypto key segment index
634*25c896eaSAndrew Boyer  * @key:         Crypto key
635*25c896eaSAndrew Boyer  */
636*25c896eaSAndrew Boyer struct iocpt_sess_control_cmd {
637*25c896eaSAndrew Boyer 	u8     opcode;
638*25c896eaSAndrew Boyer 	u8     type;
639*25c896eaSAndrew Boyer 	__le16 lif_index;
640*25c896eaSAndrew Boyer 	u8     oper;
641*25c896eaSAndrew Boyer 	u8     flags;
642*25c896eaSAndrew Boyer #define IOCPT_SCTL_F_END	0x01	/* Final segment of key */
643*25c896eaSAndrew Boyer 	__le16 key_len;
644*25c896eaSAndrew Boyer 	__le32 index;
645*25c896eaSAndrew Boyer 	u8     key_seg_len;
646*25c896eaSAndrew Boyer 	u8     key_seg_idx;
647*25c896eaSAndrew Boyer 	u8     rsvd[18];
648*25c896eaSAndrew Boyer 	u8     key[IOCPT_SESS_KEY_SEG_LEN];
649*25c896eaSAndrew Boyer };
650*25c896eaSAndrew Boyer 
651*25c896eaSAndrew Boyer /**
652*25c896eaSAndrew Boyer  * struct iocpt_sess_control_comp - Session control command completion
653*25c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
654*25c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
655*25c896eaSAndrew Boyer  * @index:      Session index
656*25c896eaSAndrew Boyer  * @hw_type:    Hardware Session type
657*25c896eaSAndrew Boyer  * @color:      Color
658*25c896eaSAndrew Boyer  */
659*25c896eaSAndrew Boyer struct iocpt_sess_control_comp {
660*25c896eaSAndrew Boyer 	u8     status;
661*25c896eaSAndrew Boyer 	u8     rsvd;
662*25c896eaSAndrew Boyer 	__le16 comp_index;
663*25c896eaSAndrew Boyer 	__le32 index;
664*25c896eaSAndrew Boyer 	u8     hw_type;
665*25c896eaSAndrew Boyer 	u8     rsvd2[6];
666*25c896eaSAndrew Boyer 	u8     color;
667*25c896eaSAndrew Boyer };
668*25c896eaSAndrew Boyer 
669*25c896eaSAndrew Boyer /**
670*25c896eaSAndrew Boyer  * enum iocpt_stats_ctl_cmd - List of commands for stats control
671*25c896eaSAndrew Boyer  * @IOCPT_STATS_CTL_RESET:      Reset statistics
672*25c896eaSAndrew Boyer  */
673*25c896eaSAndrew Boyer enum iocpt_stats_ctl_cmd {
674*25c896eaSAndrew Boyer 	IOCPT_STATS_CTL_RESET		= 0,
675*25c896eaSAndrew Boyer };
676*25c896eaSAndrew Boyer 
677*25c896eaSAndrew Boyer /**
678*25c896eaSAndrew Boyer  * struct iocpt_dev_status - Device status register
679*25c896eaSAndrew Boyer  * @eid:             most recent NotifyQ event id
680*25c896eaSAndrew Boyer  */
681*25c896eaSAndrew Boyer struct iocpt_dev_status {
682*25c896eaSAndrew Boyer 	__le64 eid;
683*25c896eaSAndrew Boyer 	u8     rsvd2[56];
684*25c896eaSAndrew Boyer };
685*25c896eaSAndrew Boyer 
686*25c896eaSAndrew Boyer enum iocpt_dev_state {
687*25c896eaSAndrew Boyer 	IOCPT_DEV_DISABLE	= 0,
688*25c896eaSAndrew Boyer 	IOCPT_DEV_ENABLE	= 1,
689*25c896eaSAndrew Boyer 	IOCPT_DEV_HANG_RESET	= 2,
690*25c896eaSAndrew Boyer };
691*25c896eaSAndrew Boyer 
692*25c896eaSAndrew Boyer /**
693*25c896eaSAndrew Boyer  * enum iocpt_dev_attr - List of device attributes
694*25c896eaSAndrew Boyer  * @IOCPT_DEV_ATTR_STATE:     Device state attribute
695*25c896eaSAndrew Boyer  * @IOCPT_DEV_ATTR_NAME:      Device name attribute
696*25c896eaSAndrew Boyer  * @IOCPT_DEV_ATTR_FEATURES:  Device feature attributes
697*25c896eaSAndrew Boyer  */
698*25c896eaSAndrew Boyer enum iocpt_dev_attr {
699*25c896eaSAndrew Boyer 	IOCPT_DEV_ATTR_STATE    = 0,
700*25c896eaSAndrew Boyer 	IOCPT_DEV_ATTR_NAME     = 1,
701*25c896eaSAndrew Boyer 	IOCPT_DEV_ATTR_FEATURES = 2,
702*25c896eaSAndrew Boyer };
703*25c896eaSAndrew Boyer 
704*25c896eaSAndrew Boyer /**
705*25c896eaSAndrew Boyer  * struct iocpt_notify_event - Generic event reporting structure
706*25c896eaSAndrew Boyer  * @eid:   event number
707*25c896eaSAndrew Boyer  * @ecode: event code
708*25c896eaSAndrew Boyer  * @data:  unspecified data about the event
709*25c896eaSAndrew Boyer  *
710*25c896eaSAndrew Boyer  * This is the generic event report struct from which the other
711*25c896eaSAndrew Boyer  * actual events will be formed.
712*25c896eaSAndrew Boyer  */
713*25c896eaSAndrew Boyer struct iocpt_notify_event {
714*25c896eaSAndrew Boyer 	__le64 eid;
715*25c896eaSAndrew Boyer 	__le16 ecode;
716*25c896eaSAndrew Boyer 	u8     data[54];
717*25c896eaSAndrew Boyer };
718*25c896eaSAndrew Boyer 
719*25c896eaSAndrew Boyer /**
720*25c896eaSAndrew Boyer  * struct iocpt_reset_event - Reset event notification
721*25c896eaSAndrew Boyer  * @eid:		event number
722*25c896eaSAndrew Boyer  * @ecode:		event code = IOCPT_EVENT_RESET
723*25c896eaSAndrew Boyer  * @reset_code:		reset type
724*25c896eaSAndrew Boyer  * @state:		0=pending, 1=complete, 2=error
725*25c896eaSAndrew Boyer  *
726*25c896eaSAndrew Boyer  * Sent when the NIC or some subsystem is going to be or
727*25c896eaSAndrew Boyer  * has been reset.
728*25c896eaSAndrew Boyer  */
729*25c896eaSAndrew Boyer struct iocpt_reset_event {
730*25c896eaSAndrew Boyer 	__le64 eid;
731*25c896eaSAndrew Boyer 	__le16 ecode;
732*25c896eaSAndrew Boyer 	u8     reset_code;
733*25c896eaSAndrew Boyer 	u8     state;
734*25c896eaSAndrew Boyer 	u8     rsvd[52];
735*25c896eaSAndrew Boyer };
736*25c896eaSAndrew Boyer 
737*25c896eaSAndrew Boyer /**
738*25c896eaSAndrew Boyer  * struct iocpt_heartbeat_event - Sent periodically by NIC to indicate health
739*25c896eaSAndrew Boyer  * @eid:	event number
740*25c896eaSAndrew Boyer  * @ecode:	event code = IOCPT_EVENT_HEARTBEAT
741*25c896eaSAndrew Boyer  */
742*25c896eaSAndrew Boyer struct iocpt_heartbeat_event {
743*25c896eaSAndrew Boyer 	__le64 eid;
744*25c896eaSAndrew Boyer 	__le16 ecode;
745*25c896eaSAndrew Boyer 	u8     rsvd[54];
746*25c896eaSAndrew Boyer };
747*25c896eaSAndrew Boyer 
748*25c896eaSAndrew Boyer /**
749*25c896eaSAndrew Boyer  * struct iocpt_log_event - Sent to notify the driver of an internal error
750*25c896eaSAndrew Boyer  * @eid:	event number
751*25c896eaSAndrew Boyer  * @ecode:	event code = IOCPT_EVENT_LOG
752*25c896eaSAndrew Boyer  * @data:	log data
753*25c896eaSAndrew Boyer  */
754*25c896eaSAndrew Boyer struct iocpt_log_event {
755*25c896eaSAndrew Boyer 	__le64 eid;
756*25c896eaSAndrew Boyer 	__le16 ecode;
757*25c896eaSAndrew Boyer 	u8     data[54];
758*25c896eaSAndrew Boyer };
759*25c896eaSAndrew Boyer 
760*25c896eaSAndrew Boyer /**
761*25c896eaSAndrew Boyer  * union iocpt_lif_config - LIF configuration
762*25c896eaSAndrew Boyer  * @state:	    LIF state (enum iocpt_lif_state)
763*25c896eaSAndrew Boyer  * @name:	    LIF name
764*25c896eaSAndrew Boyer  * @features:	    LIF features active (enum iocpt_hw_features)
765*25c896eaSAndrew Boyer  * @queue_count:    Queue counts per queue-type
766*25c896eaSAndrew Boyer  */
767*25c896eaSAndrew Boyer union iocpt_lif_config {
768*25c896eaSAndrew Boyer 	struct {
769*25c896eaSAndrew Boyer 		u8     state;
770*25c896eaSAndrew Boyer 		u8     rsvd[3];
771*25c896eaSAndrew Boyer 		char   name[IOCPT_IFNAMSIZ];
772*25c896eaSAndrew Boyer 		u8     rsvd2[12];
773*25c896eaSAndrew Boyer 		__le64 features;
774*25c896eaSAndrew Boyer 		__le32 queue_count[IOCPT_QTYPE_MAX];
775*25c896eaSAndrew Boyer 	} __rte_packed;
776*25c896eaSAndrew Boyer 	__le32 words[56];
777*25c896eaSAndrew Boyer };
778*25c896eaSAndrew Boyer 
779*25c896eaSAndrew Boyer /**
780*25c896eaSAndrew Boyer  * struct iocpt_lif_status - LIF status register
781*25c896eaSAndrew Boyer  * @eid:	     most recent NotifyQ event id
782*25c896eaSAndrew Boyer  */
783*25c896eaSAndrew Boyer struct iocpt_lif_status {
784*25c896eaSAndrew Boyer 	__le64 eid;
785*25c896eaSAndrew Boyer 	u8     rsvd[56];
786*25c896eaSAndrew Boyer };
787*25c896eaSAndrew Boyer 
788*25c896eaSAndrew Boyer /**
789*25c896eaSAndrew Boyer  * struct iocpt_lif_info - LIF info structure
790*25c896eaSAndrew Boyer  * @config:	LIF configuration structure
791*25c896eaSAndrew Boyer  * @status:	LIF status structure
792*25c896eaSAndrew Boyer  * @stats:	LIF statistics structure
793*25c896eaSAndrew Boyer  */
794*25c896eaSAndrew Boyer struct iocpt_lif_info {
795*25c896eaSAndrew Boyer 	union iocpt_lif_config config;
796*25c896eaSAndrew Boyer 	struct iocpt_lif_status status;
797*25c896eaSAndrew Boyer };
798*25c896eaSAndrew Boyer 
799*25c896eaSAndrew Boyer union iocpt_dev_cmd {
800*25c896eaSAndrew Boyer 	u32    words[16];
801*25c896eaSAndrew Boyer 	struct iocpt_admin_cmd cmd;
802*25c896eaSAndrew Boyer 	struct iocpt_nop_cmd nop;
803*25c896eaSAndrew Boyer 
804*25c896eaSAndrew Boyer 	struct iocpt_dev_identify_cmd identify;
805*25c896eaSAndrew Boyer 	struct iocpt_dev_reset_cmd reset;
806*25c896eaSAndrew Boyer 
807*25c896eaSAndrew Boyer 	struct iocpt_lif_identify_cmd lif_identify;
808*25c896eaSAndrew Boyer 	struct iocpt_lif_init_cmd lif_init;
809*25c896eaSAndrew Boyer 	struct iocpt_lif_reset_cmd lif_reset;
810*25c896eaSAndrew Boyer 	struct iocpt_lif_getattr_cmd lif_getattr;
811*25c896eaSAndrew Boyer 	struct iocpt_lif_setattr_cmd lif_setattr;
812*25c896eaSAndrew Boyer 
813*25c896eaSAndrew Boyer 	struct iocpt_q_identify_cmd q_identify;
814*25c896eaSAndrew Boyer 	struct iocpt_q_init_cmd q_init;
815*25c896eaSAndrew Boyer 	struct iocpt_q_control_cmd q_control;
816*25c896eaSAndrew Boyer 
817*25c896eaSAndrew Boyer 	struct iocpt_sess_control_cmd sess_control;
818*25c896eaSAndrew Boyer };
819*25c896eaSAndrew Boyer 
820*25c896eaSAndrew Boyer union iocpt_dev_cmd_comp {
821*25c896eaSAndrew Boyer 	u32    words[4];
822*25c896eaSAndrew Boyer 	u8     status;
823*25c896eaSAndrew Boyer 	struct iocpt_admin_comp comp;
824*25c896eaSAndrew Boyer 	struct iocpt_nop_comp nop;
825*25c896eaSAndrew Boyer 
826*25c896eaSAndrew Boyer 	struct iocpt_dev_identify_comp identify;
827*25c896eaSAndrew Boyer 	struct iocpt_dev_reset_comp reset;
828*25c896eaSAndrew Boyer 
829*25c896eaSAndrew Boyer 	struct iocpt_lif_identify_comp lif_identify;
830*25c896eaSAndrew Boyer 	struct iocpt_lif_init_comp lif_init;
831*25c896eaSAndrew Boyer 	struct iocpt_lif_getattr_comp lif_getattr;
832*25c896eaSAndrew Boyer 	struct iocpt_lif_setattr_comp lif_setattr;
833*25c896eaSAndrew Boyer 
834*25c896eaSAndrew Boyer 	struct iocpt_q_identify_comp q_identify;
835*25c896eaSAndrew Boyer 	struct iocpt_q_init_comp q_init;
836*25c896eaSAndrew Boyer 
837*25c896eaSAndrew Boyer 	struct iocpt_sess_control_comp sess_control;
838*25c896eaSAndrew Boyer };
839*25c896eaSAndrew Boyer 
840*25c896eaSAndrew Boyer /**
841*25c896eaSAndrew Boyer  * union iocpt_dev_info_regs - Device info register format (read-only)
842*25c896eaSAndrew Boyer  * @signature:       Signature value of 0x43585660 ('CRPT')
843*25c896eaSAndrew Boyer  * @version:         Current version of info
844*25c896eaSAndrew Boyer  * @asic_type:       Asic type
845*25c896eaSAndrew Boyer  * @asic_rev:        Asic revision
846*25c896eaSAndrew Boyer  * @fw_status:       Firmware status
847*25c896eaSAndrew Boyer  * @fw_heartbeat:    Firmware heartbeat counter
848*25c896eaSAndrew Boyer  * @serial_num:      Serial number
849*25c896eaSAndrew Boyer  * @fw_version:      Firmware version
850*25c896eaSAndrew Boyer  */
851*25c896eaSAndrew Boyer union iocpt_dev_info_regs {
852*25c896eaSAndrew Boyer #define IOCPT_FWVERS_BUFLEN 32
853*25c896eaSAndrew Boyer #define IOCPT_SERIAL_BUFLEN 32
854*25c896eaSAndrew Boyer 	struct {
855*25c896eaSAndrew Boyer 		u32    signature;
856*25c896eaSAndrew Boyer 		u8     version;
857*25c896eaSAndrew Boyer 		u8     asic_type;
858*25c896eaSAndrew Boyer 		u8     asic_rev;
859*25c896eaSAndrew Boyer #define IOCPT_FW_STS_F_RUNNING	0x1
860*25c896eaSAndrew Boyer 		u8     fw_status;
861*25c896eaSAndrew Boyer 		u32    fw_heartbeat;
862*25c896eaSAndrew Boyer 		char   fw_version[IOCPT_FWVERS_BUFLEN];
863*25c896eaSAndrew Boyer 		char   serial_num[IOCPT_SERIAL_BUFLEN];
864*25c896eaSAndrew Boyer 	};
865*25c896eaSAndrew Boyer 	u32    words[512];
866*25c896eaSAndrew Boyer };
867*25c896eaSAndrew Boyer 
868*25c896eaSAndrew Boyer /**
869*25c896eaSAndrew Boyer  * union iocpt_dev_cmd_regs - Device command register format (read-write)
870*25c896eaSAndrew Boyer  * @doorbell:        Device Cmd Doorbell, write-only
871*25c896eaSAndrew Boyer  *                   Write a 1 to signal device to process cmd,
872*25c896eaSAndrew Boyer  *                   poll done for completion.
873*25c896eaSAndrew Boyer  * @done:            Done indicator, bit 0 == 1 when command is complete
874*25c896eaSAndrew Boyer  * @cmd:             Opcode-specific command bytes
875*25c896eaSAndrew Boyer  * @comp:            Opcode-specific response bytes
876*25c896eaSAndrew Boyer  * @data:            Opcode-specific side-data
877*25c896eaSAndrew Boyer  */
878*25c896eaSAndrew Boyer union iocpt_dev_cmd_regs {
879*25c896eaSAndrew Boyer 	struct {
880*25c896eaSAndrew Boyer 		u32    doorbell;
881*25c896eaSAndrew Boyer 		u32    done;
882*25c896eaSAndrew Boyer 		union iocpt_dev_cmd         cmd;
883*25c896eaSAndrew Boyer 		union iocpt_dev_cmd_comp    comp;
884*25c896eaSAndrew Boyer 		u8     rsvd[48];
885*25c896eaSAndrew Boyer 		u32    data[478];
886*25c896eaSAndrew Boyer 	} __rte_packed;
887*25c896eaSAndrew Boyer 	u32    words[512];
888*25c896eaSAndrew Boyer };
889*25c896eaSAndrew Boyer 
890*25c896eaSAndrew Boyer /**
891*25c896eaSAndrew Boyer  * union iocpt_dev_regs - Device register format for bar 0 page 0
892*25c896eaSAndrew Boyer  * @info:            Device info registers
893*25c896eaSAndrew Boyer  * @devcmd:          Device command registers
894*25c896eaSAndrew Boyer  */
895*25c896eaSAndrew Boyer union iocpt_dev_regs {
896*25c896eaSAndrew Boyer 	struct {
897*25c896eaSAndrew Boyer 		union iocpt_dev_info_regs info;
898*25c896eaSAndrew Boyer 		union iocpt_dev_cmd_regs  devcmd;
899*25c896eaSAndrew Boyer 	} __rte_packed;
900*25c896eaSAndrew Boyer 	__le32 words[1024];
901*25c896eaSAndrew Boyer };
902*25c896eaSAndrew Boyer 
903*25c896eaSAndrew Boyer union iocpt_adminq_cmd {
904*25c896eaSAndrew Boyer 	struct iocpt_admin_cmd cmd;
905*25c896eaSAndrew Boyer 	struct iocpt_nop_cmd nop;
906*25c896eaSAndrew Boyer 	struct iocpt_q_identify_cmd q_identify;
907*25c896eaSAndrew Boyer 	struct iocpt_q_init_cmd q_init;
908*25c896eaSAndrew Boyer 	struct iocpt_q_control_cmd q_control;
909*25c896eaSAndrew Boyer 	struct iocpt_lif_setattr_cmd lif_setattr;
910*25c896eaSAndrew Boyer 	struct iocpt_lif_getattr_cmd lif_getattr;
911*25c896eaSAndrew Boyer 	struct iocpt_sess_control_cmd sess_control;
912*25c896eaSAndrew Boyer };
913*25c896eaSAndrew Boyer 
914*25c896eaSAndrew Boyer union iocpt_adminq_comp {
915*25c896eaSAndrew Boyer 	struct iocpt_admin_comp comp;
916*25c896eaSAndrew Boyer 	struct iocpt_nop_comp nop;
917*25c896eaSAndrew Boyer 	struct iocpt_q_identify_comp q_identify;
918*25c896eaSAndrew Boyer 	struct iocpt_q_init_comp q_init;
919*25c896eaSAndrew Boyer 	struct iocpt_lif_setattr_comp lif_setattr;
920*25c896eaSAndrew Boyer 	struct iocpt_lif_getattr_comp lif_getattr;
921*25c896eaSAndrew Boyer 	struct iocpt_sess_control_comp sess_control;
922*25c896eaSAndrew Boyer };
923*25c896eaSAndrew Boyer 
924*25c896eaSAndrew Boyer union iocpt_notify_comp {
925*25c896eaSAndrew Boyer 	struct iocpt_notify_event event;
926*25c896eaSAndrew Boyer 	struct iocpt_reset_event reset;
927*25c896eaSAndrew Boyer 	struct iocpt_heartbeat_event heartbeat;
928*25c896eaSAndrew Boyer 	struct iocpt_log_event log;
929*25c896eaSAndrew Boyer };
930*25c896eaSAndrew Boyer 
931*25c896eaSAndrew Boyer /**
932*25c896eaSAndrew Boyer  * union iocpt_dev_identity - device identity information
933*25c896eaSAndrew Boyer  * @version:          Version of device identify
934*25c896eaSAndrew Boyer  * @type:             Identify type (0 for now)
935*25c896eaSAndrew Boyer  * @state:            Device state
936*25c896eaSAndrew Boyer  * @nlifs:            Number of LIFs provisioned
937*25c896eaSAndrew Boyer  * @nintrs:           Number of interrupts provisioned
938*25c896eaSAndrew Boyer  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
939*25c896eaSAndrew Boyer  * @intr_coal_mult:   Interrupt coalescing multiplication factor
940*25c896eaSAndrew Boyer  *                    Scale user-supplied interrupt coalescing
941*25c896eaSAndrew Boyer  *                    value in usecs to device units using:
942*25c896eaSAndrew Boyer  *                    device units = usecs * mult / div
943*25c896eaSAndrew Boyer  * @intr_coal_div:    Interrupt coalescing division factor
944*25c896eaSAndrew Boyer  *                    Scale user-supplied interrupt coalescing
945*25c896eaSAndrew Boyer  *                    value in usecs to device units using:
946*25c896eaSAndrew Boyer  *                    device units = usecs * mult / div
947*25c896eaSAndrew Boyer  */
948*25c896eaSAndrew Boyer union iocpt_dev_identity {
949*25c896eaSAndrew Boyer 	struct {
950*25c896eaSAndrew Boyer 		u8     version;
951*25c896eaSAndrew Boyer 		u8     type;
952*25c896eaSAndrew Boyer 		u8     state;
953*25c896eaSAndrew Boyer 		u8     rsvd;
954*25c896eaSAndrew Boyer 		__le32 nlifs;
955*25c896eaSAndrew Boyer 		__le32 nintrs;
956*25c896eaSAndrew Boyer 		__le32 ndbpgs_per_lif;
957*25c896eaSAndrew Boyer 		__le32 intr_coal_mult;
958*25c896eaSAndrew Boyer 		__le32 intr_coal_div;
959*25c896eaSAndrew Boyer 		u8     rsvd2[8];
960*25c896eaSAndrew Boyer 	};
961*25c896eaSAndrew Boyer 	__le32 words[8];
962*25c896eaSAndrew Boyer };
963*25c896eaSAndrew Boyer 
964*25c896eaSAndrew Boyer /**
965*25c896eaSAndrew Boyer  * union iocpt_lif_identity - LIF identity information (type-specific)
966*25c896eaSAndrew Boyer  *
967*25c896eaSAndrew Boyer  * @features:           LIF features (see enum iocpt_hw_features)
968*25c896eaSAndrew Boyer  * @version:            Identify structure version
969*25c896eaSAndrew Boyer  * @hw_index:           LIF hardware index
970*25c896eaSAndrew Boyer  * @max_nb_sessions:    Maximum number of sessions supported
971*25c896eaSAndrew Boyer  * @config:             LIF config struct with features, q counts
972*25c896eaSAndrew Boyer  */
973*25c896eaSAndrew Boyer union iocpt_lif_identity {
974*25c896eaSAndrew Boyer 	struct {
975*25c896eaSAndrew Boyer 		__le64 features;
976*25c896eaSAndrew Boyer 
977*25c896eaSAndrew Boyer 		u8 version;
978*25c896eaSAndrew Boyer 		u8 hw_index;
979*25c896eaSAndrew Boyer 		u8 rsvd[2];
980*25c896eaSAndrew Boyer 		__le32 max_nb_sessions;
981*25c896eaSAndrew Boyer 		u8 rsvd2[120];
982*25c896eaSAndrew Boyer 		union iocpt_lif_config config;
983*25c896eaSAndrew Boyer 	} __rte_packed;
984*25c896eaSAndrew Boyer 	__le32 words[90];
985*25c896eaSAndrew Boyer };
986*25c896eaSAndrew Boyer 
987*25c896eaSAndrew Boyer /**
988*25c896eaSAndrew Boyer  * union iocpt_q_identity - queue identity information
989*25c896eaSAndrew Boyer  *     @version:        Queue type version that can be used with FW
990*25c896eaSAndrew Boyer  *     @supported:      Bitfield of queue versions, first bit = ver 0
991*25c896eaSAndrew Boyer  *     @features:       Queue features
992*25c896eaSAndrew Boyer  *     @desc_sz:        Descriptor size
993*25c896eaSAndrew Boyer  *     @comp_sz:        Completion descriptor size
994*25c896eaSAndrew Boyer  *     @sg_desc_sz:     Scatter/Gather descriptor size
995*25c896eaSAndrew Boyer  *     @max_sg_elems:   Maximum number of Scatter/Gather elements
996*25c896eaSAndrew Boyer  *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
997*25c896eaSAndrew Boyer  */
998*25c896eaSAndrew Boyer union iocpt_q_identity {
999*25c896eaSAndrew Boyer 	struct {
1000*25c896eaSAndrew Boyer 		u8      version;
1001*25c896eaSAndrew Boyer 		u8      supported;
1002*25c896eaSAndrew Boyer 		u8      rsvd[6];
1003*25c896eaSAndrew Boyer #define IOCPT_QIDENT_F_CQ	0x01	/* queue has completion ring */
1004*25c896eaSAndrew Boyer #define IOCPT_QIDENT_F_SG	0x02	/* queue has scatter/gather ring */
1005*25c896eaSAndrew Boyer 		__le64  features;
1006*25c896eaSAndrew Boyer 		__le16  desc_sz;
1007*25c896eaSAndrew Boyer 		__le16  comp_sz;
1008*25c896eaSAndrew Boyer 		__le16  sg_desc_sz;
1009*25c896eaSAndrew Boyer 		__le16  max_sg_elems;
1010*25c896eaSAndrew Boyer 		__le16  sg_desc_stride;
1011*25c896eaSAndrew Boyer 	};
1012*25c896eaSAndrew Boyer 	__le32 words[20];
1013*25c896eaSAndrew Boyer };
1014*25c896eaSAndrew Boyer 
1015*25c896eaSAndrew Boyer struct iocpt_identity {
1016*25c896eaSAndrew Boyer 	union iocpt_dev_identity dev;
1017*25c896eaSAndrew Boyer 	union iocpt_lif_identity lif;
1018*25c896eaSAndrew Boyer 	union iocpt_q_identity q;
1019*25c896eaSAndrew Boyer };
1020*25c896eaSAndrew Boyer 
1021*25c896eaSAndrew Boyer #endif /* _IONIC_CRYPTO_IF_H_ */
1022