xref: /dpdk/drivers/crypto/ionic/ionic_crypto_if.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
125c896eaSAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause
225c896eaSAndrew Boyer  * Copyright 2021-2024 Advanced Micro Devices, Inc.
325c896eaSAndrew Boyer  */
425c896eaSAndrew Boyer 
525c896eaSAndrew Boyer #ifndef _IONIC_CRYPTO_IF_H_
625c896eaSAndrew Boyer #define _IONIC_CRYPTO_IF_H_
725c896eaSAndrew Boyer 
825c896eaSAndrew Boyer #define IOCPT_DEV_INFO_SIGNATURE		0x43585660      /* 'CRPT' */
925c896eaSAndrew Boyer #define IOCPT_DEV_INFO_VERSION			1
1025c896eaSAndrew Boyer #define IOCPT_IFNAMSIZ				16
1125c896eaSAndrew Boyer 
1225c896eaSAndrew Boyer /**
1325c896eaSAndrew Boyer  * enum iocpt_cmd_opcode - Device commands
1425c896eaSAndrew Boyer  */
1525c896eaSAndrew Boyer enum iocpt_cmd_opcode {
1625c896eaSAndrew Boyer 	IOCPT_CMD_NOP				= 0,	/* D, A */
1725c896eaSAndrew Boyer 
1825c896eaSAndrew Boyer 	/* Device commands */
1925c896eaSAndrew Boyer 	IOCPT_CMD_IDENTIFY			= 1,	/* D */
2025c896eaSAndrew Boyer 	IOCPT_CMD_RESET				= 3,	/* D */
2125c896eaSAndrew Boyer 
2225c896eaSAndrew Boyer 	/* LIF commands */
2325c896eaSAndrew Boyer 	IOCPT_CMD_LIF_IDENTIFY			= 20,	/* D */
2425c896eaSAndrew Boyer 	IOCPT_CMD_LIF_INIT			= 21,	/* D */
2525c896eaSAndrew Boyer 	IOCPT_CMD_LIF_RESET			= 22,	/* D */
2625c896eaSAndrew Boyer 	IOCPT_CMD_LIF_GETATTR			= 23,	/* D, A */
2725c896eaSAndrew Boyer 	IOCPT_CMD_LIF_SETATTR			= 24,	/* D, A */
2825c896eaSAndrew Boyer 
2925c896eaSAndrew Boyer 	/* Queue commands */
3025c896eaSAndrew Boyer 	IOCPT_CMD_Q_IDENTIFY			= 39,	/* D, A */
3125c896eaSAndrew Boyer 	IOCPT_CMD_Q_INIT			= 40,	/* D, A */
3225c896eaSAndrew Boyer 	IOCPT_CMD_Q_CONTROL			= 41,	/* D, A */
3325c896eaSAndrew Boyer 
3425c896eaSAndrew Boyer 	/* Session commands */
3525c896eaSAndrew Boyer 	IOCPT_CMD_SESS_CONTROL			= 45,	/* D, A */
3625c896eaSAndrew Boyer };
3725c896eaSAndrew Boyer 
3825c896eaSAndrew Boyer /**
3925c896eaSAndrew Boyer  * enum iocpt_status_code - Device command return codes
4025c896eaSAndrew Boyer  */
4125c896eaSAndrew Boyer enum iocpt_status_code {
4225c896eaSAndrew Boyer 	IOCPT_RC_SUCCESS	= 0,	/* Success */
4325c896eaSAndrew Boyer 	IOCPT_RC_EVERSION	= 1,	/* Incorrect version for request */
4425c896eaSAndrew Boyer 	IOCPT_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
4525c896eaSAndrew Boyer 	IOCPT_RC_EIO		= 3,	/* I/O error */
4625c896eaSAndrew Boyer 	IOCPT_RC_EPERM		= 4,	/* Permission denied */
4725c896eaSAndrew Boyer 	IOCPT_RC_EQID		= 5,	/* Bad qid */
4825c896eaSAndrew Boyer 	IOCPT_RC_EQTYPE		= 6,	/* Bad qtype */
4925c896eaSAndrew Boyer 	IOCPT_RC_ENOENT		= 7,	/* No such element */
5025c896eaSAndrew Boyer 	IOCPT_RC_EINTR		= 8,	/* Operation interrupted */
5125c896eaSAndrew Boyer 	IOCPT_RC_EAGAIN		= 9,	/* Try again */
5225c896eaSAndrew Boyer 	IOCPT_RC_ENOMEM		= 10,	/* Out of memory */
5325c896eaSAndrew Boyer 	IOCPT_RC_EFAULT		= 11,	/* Bad address */
5425c896eaSAndrew Boyer 	IOCPT_RC_EBUSY		= 12,	/* Device or resource busy */
5525c896eaSAndrew Boyer 	IOCPT_RC_EEXIST		= 13,	/* Object already exists */
5625c896eaSAndrew Boyer 	IOCPT_RC_EINVAL		= 14,	/* Invalid argument */
5725c896eaSAndrew Boyer 	IOCPT_RC_ENOSPC		= 15,	/* No space left or alloc failure */
5825c896eaSAndrew Boyer 	IOCPT_RC_ERANGE		= 16,	/* Parameter out of range */
5925c896eaSAndrew Boyer 	IOCPT_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
6025c896eaSAndrew Boyer 	IOCPT_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
6125c896eaSAndrew Boyer 	IOCPT_RC_ENOSUPP	= 19,	/* Operation not supported */
6225c896eaSAndrew Boyer 	IOCPT_RC_ERROR		= 29,	/* Generic error */
6325c896eaSAndrew Boyer };
6425c896eaSAndrew Boyer 
6525c896eaSAndrew Boyer enum iocpt_notifyq_opcode {
6625c896eaSAndrew Boyer 	IOCPT_EVENT_RESET		= 1,
6725c896eaSAndrew Boyer 	IOCPT_EVENT_HEARTBEAT		= 2,
6825c896eaSAndrew Boyer 	IOCPT_EVENT_LOG			= 3,
6925c896eaSAndrew Boyer };
7025c896eaSAndrew Boyer 
7125c896eaSAndrew Boyer enum iocpt_lif_type {
7225c896eaSAndrew Boyer 	IOCPT_LIF_TYPE_DEFAULT = 0,
7325c896eaSAndrew Boyer };
7425c896eaSAndrew Boyer 
7525c896eaSAndrew Boyer /**
7625c896eaSAndrew Boyer  * struct iocpt_admin_cmd - General admin command format
7725c896eaSAndrew Boyer  * @opcode:	Opcode for the command
7825c896eaSAndrew Boyer  * @lif_index:	LIF index
7925c896eaSAndrew Boyer  * @cmd_data:	Opcode-specific command bytes
8025c896eaSAndrew Boyer  */
8125c896eaSAndrew Boyer struct iocpt_admin_cmd {
8225c896eaSAndrew Boyer 	u8     opcode;
8325c896eaSAndrew Boyer 	u8     rsvd;
8425c896eaSAndrew Boyer 	__le16 lif_index;
8525c896eaSAndrew Boyer 	u8     cmd_data[60];
8625c896eaSAndrew Boyer };
8725c896eaSAndrew Boyer 
8825c896eaSAndrew Boyer /**
8925c896eaSAndrew Boyer  * struct iocpt_admin_comp - General admin command completion format
9025c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
9125c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
9225c896eaSAndrew Boyer  * @cmd_data:   Command-specific bytes
9325c896eaSAndrew Boyer  * @color:      Color bit (Always 0 for commands issued to the
9425c896eaSAndrew Boyer  *              Device Cmd Registers)
9525c896eaSAndrew Boyer  */
9625c896eaSAndrew Boyer struct iocpt_admin_comp {
9725c896eaSAndrew Boyer 	u8     status;
9825c896eaSAndrew Boyer 	u8     rsvd;
9925c896eaSAndrew Boyer 	__le16 comp_index;
10025c896eaSAndrew Boyer 	u8     cmd_data[11];
10125c896eaSAndrew Boyer 	u8     color;
10225c896eaSAndrew Boyer #define IOCPT_COMP_COLOR_MASK  0x80
10325c896eaSAndrew Boyer };
10425c896eaSAndrew Boyer 
10525c896eaSAndrew Boyer static inline u8 iocpt_color_match(u8 color, u8 done_color)
10625c896eaSAndrew Boyer {
10725c896eaSAndrew Boyer 	return (!!(color & IOCPT_COMP_COLOR_MASK)) == done_color;
10825c896eaSAndrew Boyer }
10925c896eaSAndrew Boyer 
11025c896eaSAndrew Boyer /**
11125c896eaSAndrew Boyer  * struct iocpt_nop_cmd - NOP command
11225c896eaSAndrew Boyer  * @opcode:	Opcode
11325c896eaSAndrew Boyer  */
11425c896eaSAndrew Boyer struct iocpt_nop_cmd {
11525c896eaSAndrew Boyer 	u8     opcode;
11625c896eaSAndrew Boyer 	u8     rsvd[63];
11725c896eaSAndrew Boyer };
11825c896eaSAndrew Boyer 
11925c896eaSAndrew Boyer /**
12025c896eaSAndrew Boyer  * struct iocpt_nop_comp - NOP command completion
12125c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
12225c896eaSAndrew Boyer  */
12325c896eaSAndrew Boyer struct iocpt_nop_comp {
12425c896eaSAndrew Boyer 	u8     status;
12525c896eaSAndrew Boyer 	u8     rsvd[15];
12625c896eaSAndrew Boyer };
12725c896eaSAndrew Boyer 
12825c896eaSAndrew Boyer #define IOCPT_IDENTITY_VERSION_1	1
12925c896eaSAndrew Boyer 
13025c896eaSAndrew Boyer /**
13125c896eaSAndrew Boyer  * struct iocpt_dev_identify_cmd - Driver/device identify command
13225c896eaSAndrew Boyer  * @opcode:	Opcode
13325c896eaSAndrew Boyer  * @ver:	Highest version of identify supported by driver
13425c896eaSAndrew Boyer  */
13525c896eaSAndrew Boyer struct iocpt_dev_identify_cmd {
13625c896eaSAndrew Boyer 	u8     opcode;
13725c896eaSAndrew Boyer 	u8     ver;
13825c896eaSAndrew Boyer 	u8     rsvd[62];
13925c896eaSAndrew Boyer };
14025c896eaSAndrew Boyer 
14125c896eaSAndrew Boyer /**
14225c896eaSAndrew Boyer  * struct iocpt_dev_identify_comp - Device identify command completion
14325c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
14425c896eaSAndrew Boyer  * @ver:	Version of identify returned by device
14525c896eaSAndrew Boyer  */
14625c896eaSAndrew Boyer struct iocpt_dev_identify_comp {
14725c896eaSAndrew Boyer 	u8     status;
14825c896eaSAndrew Boyer 	u8     ver;
14925c896eaSAndrew Boyer 	u8     rsvd[14];
15025c896eaSAndrew Boyer };
15125c896eaSAndrew Boyer 
15225c896eaSAndrew Boyer /**
15325c896eaSAndrew Boyer  * struct iocpt_dev_reset_cmd - Device reset command
15425c896eaSAndrew Boyer  * Will reset all LIFs on the device.
15525c896eaSAndrew Boyer  * @opcode:	Opcode
15625c896eaSAndrew Boyer  */
15725c896eaSAndrew Boyer struct iocpt_dev_reset_cmd {
15825c896eaSAndrew Boyer 	u8     opcode;
15925c896eaSAndrew Boyer 	u8     rsvd[63];
16025c896eaSAndrew Boyer };
16125c896eaSAndrew Boyer 
16225c896eaSAndrew Boyer /**
16325c896eaSAndrew Boyer  * struct iocpt_dev_reset_comp - Reset command completion
16425c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
16525c896eaSAndrew Boyer  */
16625c896eaSAndrew Boyer struct iocpt_dev_reset_comp {
16725c896eaSAndrew Boyer 	u8     status;
16825c896eaSAndrew Boyer 	u8     rsvd[15];
16925c896eaSAndrew Boyer };
17025c896eaSAndrew Boyer 
17125c896eaSAndrew Boyer /**
17225c896eaSAndrew Boyer  * struct iocpt_lif_identify_cmd - LIF identify command
17325c896eaSAndrew Boyer  * @opcode:	Opcode
17425c896eaSAndrew Boyer  * @type:	LIF type (enum iocpt_lif_type)
17525c896eaSAndrew Boyer  * @lif_index:	LIF index
17625c896eaSAndrew Boyer  * @ver:	Version of identify returned by device
17725c896eaSAndrew Boyer  */
17825c896eaSAndrew Boyer struct iocpt_lif_identify_cmd {
17925c896eaSAndrew Boyer 	u8     opcode;
18025c896eaSAndrew Boyer 	u8     type;
18125c896eaSAndrew Boyer 	__le16 lif_index;
18225c896eaSAndrew Boyer 	u8     ver;
18325c896eaSAndrew Boyer 	u8     rsvd[59];
18425c896eaSAndrew Boyer };
18525c896eaSAndrew Boyer 
18625c896eaSAndrew Boyer /**
18725c896eaSAndrew Boyer  * struct iocpt_lif_identify_comp - LIF identify command completion
18825c896eaSAndrew Boyer  * @status:  Status of the command (enum iocpt_status_code)
18925c896eaSAndrew Boyer  * @ver:     Version of identify returned by device
19025c896eaSAndrew Boyer  */
19125c896eaSAndrew Boyer struct iocpt_lif_identify_comp {
19225c896eaSAndrew Boyer 	u8     status;
19325c896eaSAndrew Boyer 	u8     ver;
19425c896eaSAndrew Boyer 	u8     rsvd2[14];
19525c896eaSAndrew Boyer };
19625c896eaSAndrew Boyer 
19725c896eaSAndrew Boyer /**
19825c896eaSAndrew Boyer  * struct iocpt_lif_init_cmd - LIF init command
19925c896eaSAndrew Boyer  * @opcode:	Opcode
20025c896eaSAndrew Boyer  * @type:	LIF type (enum iocpt_lif_type)
20125c896eaSAndrew Boyer  * @lif_index:	LIF index
20225c896eaSAndrew Boyer  * @info_pa:	Destination address for LIF info (struct iocpt_lif_info)
20325c896eaSAndrew Boyer  */
20425c896eaSAndrew Boyer struct iocpt_lif_init_cmd {
20525c896eaSAndrew Boyer 	u8     opcode;
20625c896eaSAndrew Boyer 	u8     type;
20725c896eaSAndrew Boyer 	__le16 lif_index;
20825c896eaSAndrew Boyer 	__le32 rsvd;
20925c896eaSAndrew Boyer 	__le64 info_pa;
21025c896eaSAndrew Boyer 	u8     rsvd2[48];
21125c896eaSAndrew Boyer };
21225c896eaSAndrew Boyer 
21325c896eaSAndrew Boyer /**
21425c896eaSAndrew Boyer  * struct iocpt_lif_init_comp - LIF init command completion
21525c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
21625c896eaSAndrew Boyer  * @hw_index:	Hardware index of the initialized LIF
21725c896eaSAndrew Boyer  */
21825c896eaSAndrew Boyer struct iocpt_lif_init_comp {
21925c896eaSAndrew Boyer 	u8     status;
22025c896eaSAndrew Boyer 	u8     rsvd;
22125c896eaSAndrew Boyer 	__le16 hw_index;
22225c896eaSAndrew Boyer 	u8     rsvd2[12];
22325c896eaSAndrew Boyer };
22425c896eaSAndrew Boyer 
22525c896eaSAndrew Boyer /**
22625c896eaSAndrew Boyer  * struct iocpt_lif_reset_cmd - LIF reset command
22725c896eaSAndrew Boyer  * Will reset only the specified LIF.
22825c896eaSAndrew Boyer  * @opcode:	Opcode
22925c896eaSAndrew Boyer  * @lif_index:	LIF index
23025c896eaSAndrew Boyer  */
23125c896eaSAndrew Boyer struct iocpt_lif_reset_cmd {
23225c896eaSAndrew Boyer 	u8     opcode;
23325c896eaSAndrew Boyer 	u8     rsvd;
23425c896eaSAndrew Boyer 	__le16 lif_index;
23525c896eaSAndrew Boyer 	__le32 rsvd2[15];
23625c896eaSAndrew Boyer };
23725c896eaSAndrew Boyer 
23825c896eaSAndrew Boyer /**
23925c896eaSAndrew Boyer  * enum iocpt_lif_attr - List of LIF attributes
24025c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_STATE:	LIF state attribute
24125c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_NAME:	LIF name attribute
24225c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_FEATURES:	LIF features attribute
24325c896eaSAndrew Boyer  * @IOCPT_LIF_ATTR_STATS_CTRL:	LIF statistics control attribute
24425c896eaSAndrew Boyer  */
24525c896eaSAndrew Boyer enum iocpt_lif_attr {
24625c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_STATE	    = 0,
24725c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_NAME	    = 1,
24825c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_FEATURES	    = 4,
24925c896eaSAndrew Boyer 	IOCPT_LIF_ATTR_STATS_CTRL   = 6,
25025c896eaSAndrew Boyer };
25125c896eaSAndrew Boyer 
25225c896eaSAndrew Boyer /**
25325c896eaSAndrew Boyer  * struct iocpt_lif_setattr_cmd - Set LIF attributes on the NIC
25425c896eaSAndrew Boyer  * @opcode:	Opcode
25525c896eaSAndrew Boyer  * @attr:	Attribute type (enum iocpt_lif_attr)
25625c896eaSAndrew Boyer  * @lif_index:	LIF index
25725c896eaSAndrew Boyer  * @state:	LIF state (enum iocpt_lif_state)
25825c896eaSAndrew Boyer  * @name:	The name string, 0 terminated
25925c896eaSAndrew Boyer  * @features:	Features (enum iocpt_hw_features)
26025c896eaSAndrew Boyer  * @stats_ctl:	Stats control commands (enum iocpt_stats_ctl_cmd)
26125c896eaSAndrew Boyer  */
26225c896eaSAndrew Boyer struct iocpt_lif_setattr_cmd {
26325c896eaSAndrew Boyer 	u8     opcode;
26425c896eaSAndrew Boyer 	u8     attr;
26525c896eaSAndrew Boyer 	__le16 lif_index;
266*e7750639SAndre Muezerie 	union __rte_packed_begin {
26725c896eaSAndrew Boyer 		u8	state;
26825c896eaSAndrew Boyer 		char	name[IOCPT_IFNAMSIZ];
26925c896eaSAndrew Boyer 		__le64	features;
27025c896eaSAndrew Boyer 		u8	stats_ctl;
27125c896eaSAndrew Boyer 		u8	rsvd[60];
272*e7750639SAndre Muezerie 	} __rte_packed_end;
27325c896eaSAndrew Boyer };
27425c896eaSAndrew Boyer 
27525c896eaSAndrew Boyer /**
27625c896eaSAndrew Boyer  * struct iocpt_lif_setattr_comp - LIF set attr command completion
27725c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
27825c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
27925c896eaSAndrew Boyer  * @features:	Features (enum iocpt_hw_features)
28025c896eaSAndrew Boyer  * @color:	Color bit
28125c896eaSAndrew Boyer  */
28225c896eaSAndrew Boyer struct iocpt_lif_setattr_comp {
28325c896eaSAndrew Boyer 	u8     status;
28425c896eaSAndrew Boyer 	u8     rsvd;
28525c896eaSAndrew Boyer 	__le16 comp_index;
286*e7750639SAndre Muezerie 	union __rte_packed_begin {
28725c896eaSAndrew Boyer 		__le64	features;
28825c896eaSAndrew Boyer 		u8	rsvd2[11];
289*e7750639SAndre Muezerie 	} __rte_packed_end;
29025c896eaSAndrew Boyer 	u8     color;
29125c896eaSAndrew Boyer };
29225c896eaSAndrew Boyer 
29325c896eaSAndrew Boyer /**
29425c896eaSAndrew Boyer  * struct iocpt_lif_getattr_cmd - Get LIF attributes from the NIC
29525c896eaSAndrew Boyer  * @opcode:	Opcode
29625c896eaSAndrew Boyer  * @attr:	Attribute type (enum iocpt_lif_attr)
29725c896eaSAndrew Boyer  * @lif_index:	LIF index
29825c896eaSAndrew Boyer  */
29925c896eaSAndrew Boyer struct iocpt_lif_getattr_cmd {
30025c896eaSAndrew Boyer 	u8     opcode;
30125c896eaSAndrew Boyer 	u8     attr;
30225c896eaSAndrew Boyer 	__le16 lif_index;
30325c896eaSAndrew Boyer 	u8     rsvd[60];
30425c896eaSAndrew Boyer };
30525c896eaSAndrew Boyer 
30625c896eaSAndrew Boyer /**
30725c896eaSAndrew Boyer  * struct iocpt_lif_getattr_comp - LIF get attr command completion
30825c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
30925c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
31025c896eaSAndrew Boyer  * @state:	LIF state (enum iocpt_lif_state)
31125c896eaSAndrew Boyer  * @name:	LIF name string, 0 terminated
31225c896eaSAndrew Boyer  * @features:	Features (enum iocpt_hw_features)
31325c896eaSAndrew Boyer  * @color:	Color bit
31425c896eaSAndrew Boyer  */
31525c896eaSAndrew Boyer struct iocpt_lif_getattr_comp {
31625c896eaSAndrew Boyer 	u8     status;
31725c896eaSAndrew Boyer 	u8     rsvd;
31825c896eaSAndrew Boyer 	__le16 comp_index;
319*e7750639SAndre Muezerie 	union __rte_packed_begin {
32025c896eaSAndrew Boyer 		u8	state;
32125c896eaSAndrew Boyer 		__le64	features;
32225c896eaSAndrew Boyer 		u8	rsvd2[11];
323*e7750639SAndre Muezerie 	} __rte_packed_end;
32425c896eaSAndrew Boyer 	u8     color;
32525c896eaSAndrew Boyer };
32625c896eaSAndrew Boyer 
32725c896eaSAndrew Boyer /**
32825c896eaSAndrew Boyer  * enum iocpt_logical_qtype - Logical Queue Types
32925c896eaSAndrew Boyer  * @IOCPT_QTYPE_ADMINQ:    Administrative Queue
33025c896eaSAndrew Boyer  * @IOCPT_QTYPE_NOTIFYQ:   Notify Queue
33125c896eaSAndrew Boyer  * @IOCPT_QTYPE_CRYPTOQ:   Cryptographic Queue
33225c896eaSAndrew Boyer  * @IOCPT_QTYPE_MAX:       Max queue type supported
33325c896eaSAndrew Boyer  */
33425c896eaSAndrew Boyer enum iocpt_logical_qtype {
33525c896eaSAndrew Boyer 	IOCPT_QTYPE_ADMINQ  = 0,
33625c896eaSAndrew Boyer 	IOCPT_QTYPE_NOTIFYQ = 1,
33725c896eaSAndrew Boyer 	IOCPT_QTYPE_CRYPTOQ = 2,
33825c896eaSAndrew Boyer 	IOCPT_QTYPE_MAX     = 8,
33925c896eaSAndrew Boyer };
34025c896eaSAndrew Boyer 
34125c896eaSAndrew Boyer /**
34225c896eaSAndrew Boyer  * struct iocpt_q_identify_cmd - queue identify command
34325c896eaSAndrew Boyer  * @opcode:     Opcode
34425c896eaSAndrew Boyer  * @type:       Logical queue type (enum iocpt_logical_qtype)
34525c896eaSAndrew Boyer  * @lif_index:  LIF index
34625c896eaSAndrew Boyer  * @ver:        Highest queue type version that the driver supports
34725c896eaSAndrew Boyer  */
34825c896eaSAndrew Boyer struct iocpt_q_identify_cmd {
34925c896eaSAndrew Boyer 	u8     opcode;
35025c896eaSAndrew Boyer 	u8     type;
35125c896eaSAndrew Boyer 	__le16 lif_index;
35225c896eaSAndrew Boyer 	u8     ver;
35325c896eaSAndrew Boyer 	u8     rsvd2[59];
35425c896eaSAndrew Boyer };
35525c896eaSAndrew Boyer 
35625c896eaSAndrew Boyer /**
35725c896eaSAndrew Boyer  * struct iocpt_q_identify_comp - queue identify command completion
35825c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
35925c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
36025c896eaSAndrew Boyer  * @ver:        Queue type version that can be used with FW
36125c896eaSAndrew Boyer  */
36225c896eaSAndrew Boyer struct iocpt_q_identify_comp {
36325c896eaSAndrew Boyer 	u8     status;
36425c896eaSAndrew Boyer 	u8     rsvd;
36525c896eaSAndrew Boyer 	__le16 comp_index;
36625c896eaSAndrew Boyer 	u8     ver;
36725c896eaSAndrew Boyer 	u8     rsvd2[11];
36825c896eaSAndrew Boyer };
36925c896eaSAndrew Boyer 
37025c896eaSAndrew Boyer /**
37125c896eaSAndrew Boyer  * struct iocpt_q_init_cmd - Queue init command
37225c896eaSAndrew Boyer  * @opcode:       Opcode
37325c896eaSAndrew Boyer  * @type:         Logical queue type
37425c896eaSAndrew Boyer  * @lif_index:    LIF index
37525c896eaSAndrew Boyer  * @ver:          Queue type version
37625c896eaSAndrew Boyer  * @index:        (LIF, qtype) relative admin queue index
37725c896eaSAndrew Boyer  * @intr_index:   Interrupt control register index, or Event queue index
37825c896eaSAndrew Boyer  * @pid:          Process ID
37925c896eaSAndrew Boyer  * @flags:
38025c896eaSAndrew Boyer  *    IRQ:        Interrupt requested on completion
38125c896eaSAndrew Boyer  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
38225c896eaSAndrew Boyer  *                but remains disabled, to be later enabled with the
38325c896eaSAndrew Boyer  *                Queue Enable command.  If ENA=1, then queue is
38425c896eaSAndrew Boyer  *                initialized and then enabled.
38525c896eaSAndrew Boyer  *    SG:         Enable Scatter-Gather on the queue.
38625c896eaSAndrew Boyer  * @cos:          Class of service for this queue
38725c896eaSAndrew Boyer  * @ring_size:    Queue ring size, encoded as a log2(size), in
38825c896eaSAndrew Boyer  *                number of descriptors.  The actual ring size is
38925c896eaSAndrew Boyer  *                (1 << ring_size).  For example, to select a ring size
39025c896eaSAndrew Boyer  *                of 64 descriptors write ring_size = 6. The minimum
39125c896eaSAndrew Boyer  *                ring_size value is 2 for a ring of 4 descriptors.
39225c896eaSAndrew Boyer  *                The maximum ring_size value is 12 for a ring of 4k
39325c896eaSAndrew Boyer  *                descriptors.  Values of ring_size <2 and >12 are
39425c896eaSAndrew Boyer  *                reserved.
39525c896eaSAndrew Boyer  * @ring_base:    Queue ring base address
39625c896eaSAndrew Boyer  * @cq_ring_base: Completion queue ring base address
39725c896eaSAndrew Boyer  * @sg_ring_base: Scatter/Gather ring base address
39825c896eaSAndrew Boyer  */
399*e7750639SAndre Muezerie struct __rte_packed_begin iocpt_q_init_cmd {
40025c896eaSAndrew Boyer 	u8     opcode;
40125c896eaSAndrew Boyer 	u8     type;
40225c896eaSAndrew Boyer 	__le16 lif_index;
40325c896eaSAndrew Boyer 	u8     ver;
40425c896eaSAndrew Boyer 	u8     rsvd[3];
40525c896eaSAndrew Boyer 	__le32 index;
40625c896eaSAndrew Boyer 	__le16 pid;
40725c896eaSAndrew Boyer 	__le16 intr_index;
40825c896eaSAndrew Boyer 	__le16 flags;
40925c896eaSAndrew Boyer #define IOCPT_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
41025c896eaSAndrew Boyer #define IOCPT_QINIT_F_ENA	0x02	/* Enable the queue */
41125c896eaSAndrew Boyer #define IOCPT_QINIT_F_SG	0x04	/* Enable scatter/gather on queue */
41225c896eaSAndrew Boyer 	u8     cos;
41325c896eaSAndrew Boyer #define IOCPT_QSIZE_MIN_LG2	2
41425c896eaSAndrew Boyer #define IOCPT_QSIZE_MAX_LG2	12
41525c896eaSAndrew Boyer 	u8     ring_size;
41625c896eaSAndrew Boyer 	__le64 ring_base;
41725c896eaSAndrew Boyer 	__le64 cq_ring_base;
41825c896eaSAndrew Boyer 	__le64 sg_ring_base;
41925c896eaSAndrew Boyer 	u8     rsvd2[20];
420*e7750639SAndre Muezerie } __rte_packed_end;
42125c896eaSAndrew Boyer 
42225c896eaSAndrew Boyer /**
42325c896eaSAndrew Boyer  * struct iocpt_q_init_comp - Queue init command completion
42425c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
42525c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
42625c896eaSAndrew Boyer  * @hw_index:   Hardware Queue ID
42725c896eaSAndrew Boyer  * @hw_type:    Hardware Queue type
42825c896eaSAndrew Boyer  * @color:      Color
42925c896eaSAndrew Boyer  */
43025c896eaSAndrew Boyer struct iocpt_q_init_comp {
43125c896eaSAndrew Boyer 	u8     status;
43225c896eaSAndrew Boyer 	u8     rsvd;
43325c896eaSAndrew Boyer 	__le16 comp_index;
43425c896eaSAndrew Boyer 	__le32 hw_index;
43525c896eaSAndrew Boyer 	u8     hw_type;
43625c896eaSAndrew Boyer 	u8     rsvd2[6];
43725c896eaSAndrew Boyer 	u8     color;
43825c896eaSAndrew Boyer };
43925c896eaSAndrew Boyer 
44025c896eaSAndrew Boyer enum iocpt_desc_opcode {
44125c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT = 0,
44225c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT = 1,
44325c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_XTS_ENCRYPT = 2,
44425c896eaSAndrew Boyer 	IOCPT_DESC_OPCODE_XTS_DECRYPT = 3,
44525c896eaSAndrew Boyer };
44625c896eaSAndrew Boyer 
44725c896eaSAndrew Boyer #define IOCPT_DESC_F_AAD_VALID		0x1
44825c896eaSAndrew Boyer 
44925c896eaSAndrew Boyer /**
45025c896eaSAndrew Boyer  * struct iocpt_desc - Crypto queue descriptor format
45125c896eaSAndrew Boyer  * @opcode:
45225c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_GCM_AEAD_ENCRYPT:
45325c896eaSAndrew Boyer  *                   Perform a GCM-AES encrypt operation
45425c896eaSAndrew Boyer  *
45525c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_GCM_AEAD_DECRYPT:
45625c896eaSAndrew Boyer  *                   Perform a GCM-AES decrypt operation
45725c896eaSAndrew Boyer  *
45825c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_XTS_ENCRYPT:
45925c896eaSAndrew Boyer  *                   Perform an XTS encrypt operation
46025c896eaSAndrew Boyer  *
46125c896eaSAndrew Boyer  *         IOCPT_DESC_OPCODE_XTS_DECRYPT:
46225c896eaSAndrew Boyer  *                   Perform an XTS decrypt operation
46325c896eaSAndrew Boyer  * @flags:
46425c896eaSAndrew Boyer  *         IOCPT_DESC_F_AAD_VALID:
46525c896eaSAndrew Boyer  *                   Source SGL contains an AAD addr and length
46625c896eaSAndrew Boyer  * @num_src_dst_sgs: Number of scatter-gather elements in SG
46725c896eaSAndrew Boyer  *                   descriptor (4 bits for source, 4 bits for destination)
46825c896eaSAndrew Boyer  * @session_tag:     Session tag (key index)
46925c896eaSAndrew Boyer  * @intr_ctx_addr:   Completion interrupt context address
47025c896eaSAndrew Boyer  * @intr_ctx_data:   Completion interrupt context data
47125c896eaSAndrew Boyer  */
472*e7750639SAndre Muezerie struct __rte_packed_begin iocpt_crypto_desc {
47325c896eaSAndrew Boyer 	uint8_t  opcode;
47425c896eaSAndrew Boyer 	uint8_t  flags;
47525c896eaSAndrew Boyer 	uint8_t  num_src_dst_sgs;
47625c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_MASK	0xf
47725c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_SRC_SHIFT	0
47825c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_MASK	0xf
47925c896eaSAndrew Boyer #define IOCPT_DESC_NSGE_DST_SHIFT	4
48025c896eaSAndrew Boyer 	uint8_t  rsvd[9];
48125c896eaSAndrew Boyer 	__le32   session_tag;
48225c896eaSAndrew Boyer 	__le64   intr_ctx_addr;
48325c896eaSAndrew Boyer 	__le64   intr_ctx_data;
484*e7750639SAndre Muezerie } __rte_packed_end;
48525c896eaSAndrew Boyer 
48625c896eaSAndrew Boyer static inline uint8_t iocpt_encode_nsge_src_dst(uint8_t src, uint8_t dst)
48725c896eaSAndrew Boyer {
48825c896eaSAndrew Boyer 	uint8_t nsge_src_dst;
48925c896eaSAndrew Boyer 
49025c896eaSAndrew Boyer 	nsge_src_dst = (src & IOCPT_DESC_NSGE_SRC_MASK) <<
49125c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_SRC_SHIFT;
49225c896eaSAndrew Boyer 	nsge_src_dst |= (dst & IOCPT_DESC_NSGE_DST_MASK) <<
49325c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_DST_SHIFT;
49425c896eaSAndrew Boyer 
49525c896eaSAndrew Boyer 	return nsge_src_dst;
49625c896eaSAndrew Boyer };
49725c896eaSAndrew Boyer 
49825c896eaSAndrew Boyer static inline void iocpt_decode_nsge_src_dst(uint8_t nsge_src_dst,
49925c896eaSAndrew Boyer 					     uint8_t *src, uint8_t *dst)
50025c896eaSAndrew Boyer {
50125c896eaSAndrew Boyer 	*src = (nsge_src_dst >> IOCPT_DESC_NSGE_SRC_SHIFT) &
50225c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_SRC_MASK;
50325c896eaSAndrew Boyer 	*dst = (nsge_src_dst >> IOCPT_DESC_NSGE_DST_SHIFT) &
50425c896eaSAndrew Boyer 		IOCPT_DESC_NSGE_DST_MASK;
50525c896eaSAndrew Boyer };
50625c896eaSAndrew Boyer 
50725c896eaSAndrew Boyer /**
50825c896eaSAndrew Boyer  * struct iocpt_crypto_sg_elem - Crypto scatter-gather (SG) descriptor element
50925c896eaSAndrew Boyer  * @addr:	DMA address of SG element data buffer
51025c896eaSAndrew Boyer  * @len:	Length of SG element data buffer, in bytes
51125c896eaSAndrew Boyer  */
51225c896eaSAndrew Boyer struct iocpt_crypto_sg_elem {
51325c896eaSAndrew Boyer 	__le64  addr;
51425c896eaSAndrew Boyer 	__le16  len;
51525c896eaSAndrew Boyer 	uint8_t rsvd[6];
51625c896eaSAndrew Boyer };
51725c896eaSAndrew Boyer 
51825c896eaSAndrew Boyer /**
51925c896eaSAndrew Boyer  * struct iocpt_crypto_sg_desc - Crypto scatter-gather (SG) list
52025c896eaSAndrew Boyer  * @src_elems: Source SG elements; also destination in IP case
52125c896eaSAndrew Boyer  *     AES_GCM:
52225c896eaSAndrew Boyer  *         SGE0: Nonce
52325c896eaSAndrew Boyer  *         SGE1: AAD (see IOCPT_DESC_F_AAD_VALID)
52425c896eaSAndrew Boyer  *         SGE2 to SGE(N): Payload
52525c896eaSAndrew Boyer  *         SGE(N+1): Auth tag
52625c896eaSAndrew Boyer  * @dst_elems: Destination SG elements for OOP case; unused in IP case
52725c896eaSAndrew Boyer  */
52825c896eaSAndrew Boyer struct iocpt_crypto_sg_desc {
52925c896eaSAndrew Boyer #define IOCPT_CRYPTO_MAX_SG_ELEMS	8
53025c896eaSAndrew Boyer #define IOCPT_CRYPTO_NONCE_ELEM		0
53125c896eaSAndrew Boyer #define IOCPT_CRYPTO_AAD_ELEM		1
53225c896eaSAndrew Boyer 	struct iocpt_crypto_sg_elem src_elems[IOCPT_CRYPTO_MAX_SG_ELEMS];
53325c896eaSAndrew Boyer 	struct iocpt_crypto_sg_elem dst_elems[IOCPT_CRYPTO_MAX_SG_ELEMS];
53425c896eaSAndrew Boyer };
53525c896eaSAndrew Boyer 
53625c896eaSAndrew Boyer /**
53725c896eaSAndrew Boyer  * struct iocpt_crypto_comp - Crypto queue completion descriptor
53825c896eaSAndrew Boyer  * @status:	Status of the command (enum iocpt_status_code)
53925c896eaSAndrew Boyer  * @comp_index:	Index in the descriptor ring for which this is the completion
54025c896eaSAndrew Boyer  * @color:	Color bit
54125c896eaSAndrew Boyer  */
54225c896eaSAndrew Boyer struct iocpt_crypto_comp {
54325c896eaSAndrew Boyer #define IOCPT_COMP_SUCCESS			0
54425c896eaSAndrew Boyer #define IOCPT_COMP_INVAL_OPCODE_ERROR		1
54525c896eaSAndrew Boyer #define IOCPT_COMP_UNSUPP_OPCODE_ERROR		2
54625c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_SG_ERROR		3
54725c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_DST_SG_ERROR		4
54825c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_SRC_DST_LEN_MISMATCH	5
54925c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HW_QAVAIL_ERROR		6
55025c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_AUTH_VERIFY_ERROR	7
55125c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_OTHER_VERIFY_ERROR	8
55225c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_PI_MODE_CHKSUM_ERROR	9
55325c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_HARDWARE_ERROR		10
55425c896eaSAndrew Boyer #define IOCPT_COMP_SYMM_KEY_IDX_ERROR		11
55525c896eaSAndrew Boyer 	u8     status;
55625c896eaSAndrew Boyer 	u8     rsvd;
55725c896eaSAndrew Boyer 	__le16 comp_index;
55825c896eaSAndrew Boyer 	u8     rsvd2[11];
55925c896eaSAndrew Boyer 	u8     color;
56025c896eaSAndrew Boyer };
56125c896eaSAndrew Boyer 
56225c896eaSAndrew Boyer /**
56325c896eaSAndrew Boyer  * enum iocpt_hw_features - Feature flags supported by hardware
56425c896eaSAndrew Boyer  * @IOCPT_HW_SYM:   Symmetric crypto operations
56525c896eaSAndrew Boyer  * @IOCPT_HW_ASYM:  Asymmetric crypto operations
56625c896eaSAndrew Boyer  * @IOCPT_HW_CHAIN: Chained crypto operations
56725c896eaSAndrew Boyer  * @IOCPT_HW_IP:    In-Place (destination same as source)
56825c896eaSAndrew Boyer  * @IOCPT_HW_OOP:   Out-Of-Place (destination differs from source)
56925c896eaSAndrew Boyer  */
57025c896eaSAndrew Boyer enum iocpt_hw_features {
57125c896eaSAndrew Boyer 	IOCPT_HW_SYM             = BIT(0),
57225c896eaSAndrew Boyer 	IOCPT_HW_ASYM            = BIT(1),
57325c896eaSAndrew Boyer 	IOCPT_HW_CHAIN           = BIT(2),
57425c896eaSAndrew Boyer 	IOCPT_HW_IP              = BIT(3),
57525c896eaSAndrew Boyer 	IOCPT_HW_OOP             = BIT(4),
57625c896eaSAndrew Boyer };
57725c896eaSAndrew Boyer 
57825c896eaSAndrew Boyer /**
57925c896eaSAndrew Boyer  * struct iocpt_q_control_cmd - Queue control command
58025c896eaSAndrew Boyer  * @opcode:	Opcode
58125c896eaSAndrew Boyer  * @type:	Queue type
58225c896eaSAndrew Boyer  * @lif_index:	LIF index
58325c896eaSAndrew Boyer  * @index:	Queue index
58425c896eaSAndrew Boyer  * @oper:	Operation (enum iocpt_q_control_oper)
58525c896eaSAndrew Boyer  */
58625c896eaSAndrew Boyer struct iocpt_q_control_cmd {
58725c896eaSAndrew Boyer 	u8     opcode;
58825c896eaSAndrew Boyer 	u8     type;
58925c896eaSAndrew Boyer 	__le16 lif_index;
59025c896eaSAndrew Boyer 	__le32 index;
59125c896eaSAndrew Boyer 	u8     oper;
59225c896eaSAndrew Boyer 	u8     rsvd2[55];
59325c896eaSAndrew Boyer };
59425c896eaSAndrew Boyer 
59525c896eaSAndrew Boyer enum iocpt_q_control_oper {
59625c896eaSAndrew Boyer 	IOCPT_Q_DISABLE		= 0,
59725c896eaSAndrew Boyer 	IOCPT_Q_ENABLE		= 1,
59825c896eaSAndrew Boyer };
59925c896eaSAndrew Boyer 
60025c896eaSAndrew Boyer /* NB: It will take 64 transfers to update a 2048B key */
60125c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MIN		16
60225c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_SYMM	32
60325c896eaSAndrew Boyer #define IOCPT_SESS_KEY_LEN_MAX_ASYM	2048
60425c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_LEN		32
60525c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_SHFT		5
60625c896eaSAndrew Boyer #define IOCPT_SESS_KEY_SEG_CNT		\
60725c896eaSAndrew Boyer 	(IOCPT_SESS_KEY_LEN_MAX_SYMM >> IOCPT_SESS_KEY_SEG_SHFT)
60825c896eaSAndrew Boyer 
60925c896eaSAndrew Boyer enum iocpt_sess_type {
61025c896eaSAndrew Boyer 	IOCPT_SESS_NONE			= 0,
61125c896eaSAndrew Boyer 	IOCPT_SESS_AEAD_AES_GCM		= 1,
61225c896eaSAndrew Boyer };
61325c896eaSAndrew Boyer 
61425c896eaSAndrew Boyer enum iocpt_sess_control_oper {
61525c896eaSAndrew Boyer 	IOCPT_SESS_INIT			= 0,
61625c896eaSAndrew Boyer 	IOCPT_SESS_UPDATE_KEY		= 2,
61725c896eaSAndrew Boyer 	IOCPT_SESS_DISABLE		= 3,
61825c896eaSAndrew Boyer };
61925c896eaSAndrew Boyer 
62025c896eaSAndrew Boyer /**
62125c896eaSAndrew Boyer  * struct iocpt_sess_control_cmd - Session control command
62225c896eaSAndrew Boyer  * @opcode:      Opcode
62325c896eaSAndrew Boyer  * @type:        Session type (enum iocpt_sess_type)
62425c896eaSAndrew Boyer  * @lif_index:   LIF index
62525c896eaSAndrew Boyer  * @oper:        Operation (enum iocpt_sess_control_oper)
62625c896eaSAndrew Boyer  * @flags:
62725c896eaSAndrew Boyer  *    END:       Indicates that this is the final segment of the key.
62825c896eaSAndrew Boyer  *               When this flag is set, a write will be triggered from the
62925c896eaSAndrew Boyer  *               controller's memory into the dedicated key-storage area.
63025c896eaSAndrew Boyer  * @key_len:     Crypto key length in bytes
63125c896eaSAndrew Boyer  * @index:       Session index, as allocated by PMD
63225c896eaSAndrew Boyer  * @key_seg_len: Crypto key segment length in bytes
63325c896eaSAndrew Boyer  * @key_seg_idx: Crypto key segment index
63425c896eaSAndrew Boyer  * @key:         Crypto key
63525c896eaSAndrew Boyer  */
63625c896eaSAndrew Boyer struct iocpt_sess_control_cmd {
63725c896eaSAndrew Boyer 	u8     opcode;
63825c896eaSAndrew Boyer 	u8     type;
63925c896eaSAndrew Boyer 	__le16 lif_index;
64025c896eaSAndrew Boyer 	u8     oper;
64125c896eaSAndrew Boyer 	u8     flags;
64225c896eaSAndrew Boyer #define IOCPT_SCTL_F_END	0x01	/* Final segment of key */
64325c896eaSAndrew Boyer 	__le16 key_len;
64425c896eaSAndrew Boyer 	__le32 index;
64525c896eaSAndrew Boyer 	u8     key_seg_len;
64625c896eaSAndrew Boyer 	u8     key_seg_idx;
64725c896eaSAndrew Boyer 	u8     rsvd[18];
64825c896eaSAndrew Boyer 	u8     key[IOCPT_SESS_KEY_SEG_LEN];
64925c896eaSAndrew Boyer };
65025c896eaSAndrew Boyer 
65125c896eaSAndrew Boyer /**
65225c896eaSAndrew Boyer  * struct iocpt_sess_control_comp - Session control command completion
65325c896eaSAndrew Boyer  * @status:     Status of the command (enum iocpt_status_code)
65425c896eaSAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
65525c896eaSAndrew Boyer  * @index:      Session index
65625c896eaSAndrew Boyer  * @hw_type:    Hardware Session type
65725c896eaSAndrew Boyer  * @color:      Color
65825c896eaSAndrew Boyer  */
65925c896eaSAndrew Boyer struct iocpt_sess_control_comp {
66025c896eaSAndrew Boyer 	u8     status;
66125c896eaSAndrew Boyer 	u8     rsvd;
66225c896eaSAndrew Boyer 	__le16 comp_index;
66325c896eaSAndrew Boyer 	__le32 index;
66425c896eaSAndrew Boyer 	u8     hw_type;
66525c896eaSAndrew Boyer 	u8     rsvd2[6];
66625c896eaSAndrew Boyer 	u8     color;
66725c896eaSAndrew Boyer };
66825c896eaSAndrew Boyer 
66925c896eaSAndrew Boyer /**
67025c896eaSAndrew Boyer  * enum iocpt_stats_ctl_cmd - List of commands for stats control
67125c896eaSAndrew Boyer  * @IOCPT_STATS_CTL_RESET:      Reset statistics
67225c896eaSAndrew Boyer  */
67325c896eaSAndrew Boyer enum iocpt_stats_ctl_cmd {
67425c896eaSAndrew Boyer 	IOCPT_STATS_CTL_RESET		= 0,
67525c896eaSAndrew Boyer };
67625c896eaSAndrew Boyer 
67725c896eaSAndrew Boyer /**
67825c896eaSAndrew Boyer  * struct iocpt_dev_status - Device status register
67925c896eaSAndrew Boyer  * @eid:             most recent NotifyQ event id
68025c896eaSAndrew Boyer  */
68125c896eaSAndrew Boyer struct iocpt_dev_status {
68225c896eaSAndrew Boyer 	__le64 eid;
68325c896eaSAndrew Boyer 	u8     rsvd2[56];
68425c896eaSAndrew Boyer };
68525c896eaSAndrew Boyer 
68625c896eaSAndrew Boyer enum iocpt_dev_state {
68725c896eaSAndrew Boyer 	IOCPT_DEV_DISABLE	= 0,
68825c896eaSAndrew Boyer 	IOCPT_DEV_ENABLE	= 1,
68925c896eaSAndrew Boyer 	IOCPT_DEV_HANG_RESET	= 2,
69025c896eaSAndrew Boyer };
69125c896eaSAndrew Boyer 
69225c896eaSAndrew Boyer /**
69325c896eaSAndrew Boyer  * enum iocpt_dev_attr - List of device attributes
69425c896eaSAndrew Boyer  * @IOCPT_DEV_ATTR_STATE:     Device state attribute
69525c896eaSAndrew Boyer  * @IOCPT_DEV_ATTR_NAME:      Device name attribute
69625c896eaSAndrew Boyer  * @IOCPT_DEV_ATTR_FEATURES:  Device feature attributes
69725c896eaSAndrew Boyer  */
69825c896eaSAndrew Boyer enum iocpt_dev_attr {
69925c896eaSAndrew Boyer 	IOCPT_DEV_ATTR_STATE    = 0,
70025c896eaSAndrew Boyer 	IOCPT_DEV_ATTR_NAME     = 1,
70125c896eaSAndrew Boyer 	IOCPT_DEV_ATTR_FEATURES = 2,
70225c896eaSAndrew Boyer };
70325c896eaSAndrew Boyer 
70425c896eaSAndrew Boyer /**
70525c896eaSAndrew Boyer  * struct iocpt_notify_event - Generic event reporting structure
70625c896eaSAndrew Boyer  * @eid:   event number
70725c896eaSAndrew Boyer  * @ecode: event code
70825c896eaSAndrew Boyer  * @data:  unspecified data about the event
70925c896eaSAndrew Boyer  *
71025c896eaSAndrew Boyer  * This is the generic event report struct from which the other
71125c896eaSAndrew Boyer  * actual events will be formed.
71225c896eaSAndrew Boyer  */
71325c896eaSAndrew Boyer struct iocpt_notify_event {
71425c896eaSAndrew Boyer 	__le64 eid;
71525c896eaSAndrew Boyer 	__le16 ecode;
71625c896eaSAndrew Boyer 	u8     data[54];
71725c896eaSAndrew Boyer };
71825c896eaSAndrew Boyer 
71925c896eaSAndrew Boyer /**
72025c896eaSAndrew Boyer  * struct iocpt_reset_event - Reset event notification
72125c896eaSAndrew Boyer  * @eid:		event number
72225c896eaSAndrew Boyer  * @ecode:		event code = IOCPT_EVENT_RESET
72325c896eaSAndrew Boyer  * @reset_code:		reset type
72425c896eaSAndrew Boyer  * @state:		0=pending, 1=complete, 2=error
72525c896eaSAndrew Boyer  *
72625c896eaSAndrew Boyer  * Sent when the NIC or some subsystem is going to be or
72725c896eaSAndrew Boyer  * has been reset.
72825c896eaSAndrew Boyer  */
72925c896eaSAndrew Boyer struct iocpt_reset_event {
73025c896eaSAndrew Boyer 	__le64 eid;
73125c896eaSAndrew Boyer 	__le16 ecode;
73225c896eaSAndrew Boyer 	u8     reset_code;
73325c896eaSAndrew Boyer 	u8     state;
73425c896eaSAndrew Boyer 	u8     rsvd[52];
73525c896eaSAndrew Boyer };
73625c896eaSAndrew Boyer 
73725c896eaSAndrew Boyer /**
73825c896eaSAndrew Boyer  * struct iocpt_heartbeat_event - Sent periodically by NIC to indicate health
73925c896eaSAndrew Boyer  * @eid:	event number
74025c896eaSAndrew Boyer  * @ecode:	event code = IOCPT_EVENT_HEARTBEAT
74125c896eaSAndrew Boyer  */
74225c896eaSAndrew Boyer struct iocpt_heartbeat_event {
74325c896eaSAndrew Boyer 	__le64 eid;
74425c896eaSAndrew Boyer 	__le16 ecode;
74525c896eaSAndrew Boyer 	u8     rsvd[54];
74625c896eaSAndrew Boyer };
74725c896eaSAndrew Boyer 
74825c896eaSAndrew Boyer /**
74925c896eaSAndrew Boyer  * struct iocpt_log_event - Sent to notify the driver of an internal error
75025c896eaSAndrew Boyer  * @eid:	event number
75125c896eaSAndrew Boyer  * @ecode:	event code = IOCPT_EVENT_LOG
75225c896eaSAndrew Boyer  * @data:	log data
75325c896eaSAndrew Boyer  */
75425c896eaSAndrew Boyer struct iocpt_log_event {
75525c896eaSAndrew Boyer 	__le64 eid;
75625c896eaSAndrew Boyer 	__le16 ecode;
75725c896eaSAndrew Boyer 	u8     data[54];
75825c896eaSAndrew Boyer };
75925c896eaSAndrew Boyer 
76025c896eaSAndrew Boyer /**
76125c896eaSAndrew Boyer  * union iocpt_lif_config - LIF configuration
76225c896eaSAndrew Boyer  * @state:	    LIF state (enum iocpt_lif_state)
76325c896eaSAndrew Boyer  * @name:	    LIF name
76425c896eaSAndrew Boyer  * @features:	    LIF features active (enum iocpt_hw_features)
76525c896eaSAndrew Boyer  * @queue_count:    Queue counts per queue-type
76625c896eaSAndrew Boyer  */
76725c896eaSAndrew Boyer union iocpt_lif_config {
768*e7750639SAndre Muezerie 	struct __rte_packed_begin {
76925c896eaSAndrew Boyer 		u8     state;
77025c896eaSAndrew Boyer 		u8     rsvd[3];
77125c896eaSAndrew Boyer 		char   name[IOCPT_IFNAMSIZ];
77225c896eaSAndrew Boyer 		u8     rsvd2[12];
77325c896eaSAndrew Boyer 		__le64 features;
77425c896eaSAndrew Boyer 		__le32 queue_count[IOCPT_QTYPE_MAX];
775*e7750639SAndre Muezerie 	} __rte_packed_end;
77625c896eaSAndrew Boyer 	__le32 words[56];
77725c896eaSAndrew Boyer };
77825c896eaSAndrew Boyer 
77925c896eaSAndrew Boyer /**
78025c896eaSAndrew Boyer  * struct iocpt_lif_status - LIF status register
78125c896eaSAndrew Boyer  * @eid:	     most recent NotifyQ event id
78225c896eaSAndrew Boyer  */
78325c896eaSAndrew Boyer struct iocpt_lif_status {
78425c896eaSAndrew Boyer 	__le64 eid;
78525c896eaSAndrew Boyer 	u8     rsvd[56];
78625c896eaSAndrew Boyer };
78725c896eaSAndrew Boyer 
78825c896eaSAndrew Boyer /**
78925c896eaSAndrew Boyer  * struct iocpt_lif_info - LIF info structure
79025c896eaSAndrew Boyer  * @config:	LIF configuration structure
79125c896eaSAndrew Boyer  * @status:	LIF status structure
79225c896eaSAndrew Boyer  * @stats:	LIF statistics structure
79325c896eaSAndrew Boyer  */
79425c896eaSAndrew Boyer struct iocpt_lif_info {
79525c896eaSAndrew Boyer 	union iocpt_lif_config config;
79625c896eaSAndrew Boyer 	struct iocpt_lif_status status;
79725c896eaSAndrew Boyer };
79825c896eaSAndrew Boyer 
79925c896eaSAndrew Boyer union iocpt_dev_cmd {
80025c896eaSAndrew Boyer 	u32    words[16];
80125c896eaSAndrew Boyer 	struct iocpt_admin_cmd cmd;
80225c896eaSAndrew Boyer 	struct iocpt_nop_cmd nop;
80325c896eaSAndrew Boyer 
80425c896eaSAndrew Boyer 	struct iocpt_dev_identify_cmd identify;
80525c896eaSAndrew Boyer 	struct iocpt_dev_reset_cmd reset;
80625c896eaSAndrew Boyer 
80725c896eaSAndrew Boyer 	struct iocpt_lif_identify_cmd lif_identify;
80825c896eaSAndrew Boyer 	struct iocpt_lif_init_cmd lif_init;
80925c896eaSAndrew Boyer 	struct iocpt_lif_reset_cmd lif_reset;
81025c896eaSAndrew Boyer 	struct iocpt_lif_getattr_cmd lif_getattr;
81125c896eaSAndrew Boyer 	struct iocpt_lif_setattr_cmd lif_setattr;
81225c896eaSAndrew Boyer 
81325c896eaSAndrew Boyer 	struct iocpt_q_identify_cmd q_identify;
81425c896eaSAndrew Boyer 	struct iocpt_q_init_cmd q_init;
81525c896eaSAndrew Boyer 	struct iocpt_q_control_cmd q_control;
81625c896eaSAndrew Boyer 
81725c896eaSAndrew Boyer 	struct iocpt_sess_control_cmd sess_control;
81825c896eaSAndrew Boyer };
81925c896eaSAndrew Boyer 
82025c896eaSAndrew Boyer union iocpt_dev_cmd_comp {
82125c896eaSAndrew Boyer 	u32    words[4];
82225c896eaSAndrew Boyer 	u8     status;
82325c896eaSAndrew Boyer 	struct iocpt_admin_comp comp;
82425c896eaSAndrew Boyer 	struct iocpt_nop_comp nop;
82525c896eaSAndrew Boyer 
82625c896eaSAndrew Boyer 	struct iocpt_dev_identify_comp identify;
82725c896eaSAndrew Boyer 	struct iocpt_dev_reset_comp reset;
82825c896eaSAndrew Boyer 
82925c896eaSAndrew Boyer 	struct iocpt_lif_identify_comp lif_identify;
83025c896eaSAndrew Boyer 	struct iocpt_lif_init_comp lif_init;
83125c896eaSAndrew Boyer 	struct iocpt_lif_getattr_comp lif_getattr;
83225c896eaSAndrew Boyer 	struct iocpt_lif_setattr_comp lif_setattr;
83325c896eaSAndrew Boyer 
83425c896eaSAndrew Boyer 	struct iocpt_q_identify_comp q_identify;
83525c896eaSAndrew Boyer 	struct iocpt_q_init_comp q_init;
83625c896eaSAndrew Boyer 
83725c896eaSAndrew Boyer 	struct iocpt_sess_control_comp sess_control;
83825c896eaSAndrew Boyer };
83925c896eaSAndrew Boyer 
84025c896eaSAndrew Boyer /**
84125c896eaSAndrew Boyer  * union iocpt_dev_info_regs - Device info register format (read-only)
84225c896eaSAndrew Boyer  * @signature:       Signature value of 0x43585660 ('CRPT')
84325c896eaSAndrew Boyer  * @version:         Current version of info
84425c896eaSAndrew Boyer  * @asic_type:       Asic type
84525c896eaSAndrew Boyer  * @asic_rev:        Asic revision
84625c896eaSAndrew Boyer  * @fw_status:       Firmware status
84725c896eaSAndrew Boyer  * @fw_heartbeat:    Firmware heartbeat counter
84825c896eaSAndrew Boyer  * @serial_num:      Serial number
84925c896eaSAndrew Boyer  * @fw_version:      Firmware version
85025c896eaSAndrew Boyer  */
85125c896eaSAndrew Boyer union iocpt_dev_info_regs {
85225c896eaSAndrew Boyer #define IOCPT_FWVERS_BUFLEN 32
85325c896eaSAndrew Boyer #define IOCPT_SERIAL_BUFLEN 32
85425c896eaSAndrew Boyer 	struct {
85525c896eaSAndrew Boyer 		u32    signature;
85625c896eaSAndrew Boyer 		u8     version;
85725c896eaSAndrew Boyer 		u8     asic_type;
85825c896eaSAndrew Boyer 		u8     asic_rev;
85925c896eaSAndrew Boyer #define IOCPT_FW_STS_F_RUNNING	0x1
86025c896eaSAndrew Boyer 		u8     fw_status;
86125c896eaSAndrew Boyer 		u32    fw_heartbeat;
86225c896eaSAndrew Boyer 		char   fw_version[IOCPT_FWVERS_BUFLEN];
86325c896eaSAndrew Boyer 		char   serial_num[IOCPT_SERIAL_BUFLEN];
86425c896eaSAndrew Boyer 	};
86525c896eaSAndrew Boyer 	u32    words[512];
86625c896eaSAndrew Boyer };
86725c896eaSAndrew Boyer 
86825c896eaSAndrew Boyer /**
86925c896eaSAndrew Boyer  * union iocpt_dev_cmd_regs - Device command register format (read-write)
87025c896eaSAndrew Boyer  * @doorbell:        Device Cmd Doorbell, write-only
87125c896eaSAndrew Boyer  *                   Write a 1 to signal device to process cmd,
87225c896eaSAndrew Boyer  *                   poll done for completion.
87325c896eaSAndrew Boyer  * @done:            Done indicator, bit 0 == 1 when command is complete
87425c896eaSAndrew Boyer  * @cmd:             Opcode-specific command bytes
87525c896eaSAndrew Boyer  * @comp:            Opcode-specific response bytes
87625c896eaSAndrew Boyer  * @data:            Opcode-specific side-data
87725c896eaSAndrew Boyer  */
87825c896eaSAndrew Boyer union iocpt_dev_cmd_regs {
879*e7750639SAndre Muezerie 	struct __rte_packed_begin {
88025c896eaSAndrew Boyer 		u32    doorbell;
88125c896eaSAndrew Boyer 		u32    done;
88225c896eaSAndrew Boyer 		union iocpt_dev_cmd         cmd;
88325c896eaSAndrew Boyer 		union iocpt_dev_cmd_comp    comp;
88425c896eaSAndrew Boyer 		u8     rsvd[48];
88525c896eaSAndrew Boyer 		u32    data[478];
886*e7750639SAndre Muezerie 	} __rte_packed_end;
88725c896eaSAndrew Boyer 	u32    words[512];
88825c896eaSAndrew Boyer };
88925c896eaSAndrew Boyer 
89025c896eaSAndrew Boyer /**
89125c896eaSAndrew Boyer  * union iocpt_dev_regs - Device register format for bar 0 page 0
89225c896eaSAndrew Boyer  * @info:            Device info registers
89325c896eaSAndrew Boyer  * @devcmd:          Device command registers
89425c896eaSAndrew Boyer  */
89525c896eaSAndrew Boyer union iocpt_dev_regs {
896*e7750639SAndre Muezerie 	struct __rte_packed_begin {
89725c896eaSAndrew Boyer 		union iocpt_dev_info_regs info;
89825c896eaSAndrew Boyer 		union iocpt_dev_cmd_regs  devcmd;
899*e7750639SAndre Muezerie 	} __rte_packed_end;
90025c896eaSAndrew Boyer 	__le32 words[1024];
90125c896eaSAndrew Boyer };
90225c896eaSAndrew Boyer 
90325c896eaSAndrew Boyer union iocpt_adminq_cmd {
90425c896eaSAndrew Boyer 	struct iocpt_admin_cmd cmd;
90525c896eaSAndrew Boyer 	struct iocpt_nop_cmd nop;
90625c896eaSAndrew Boyer 	struct iocpt_q_identify_cmd q_identify;
90725c896eaSAndrew Boyer 	struct iocpt_q_init_cmd q_init;
90825c896eaSAndrew Boyer 	struct iocpt_q_control_cmd q_control;
90925c896eaSAndrew Boyer 	struct iocpt_lif_setattr_cmd lif_setattr;
91025c896eaSAndrew Boyer 	struct iocpt_lif_getattr_cmd lif_getattr;
91125c896eaSAndrew Boyer 	struct iocpt_sess_control_cmd sess_control;
91225c896eaSAndrew Boyer };
91325c896eaSAndrew Boyer 
91425c896eaSAndrew Boyer union iocpt_adminq_comp {
91525c896eaSAndrew Boyer 	struct iocpt_admin_comp comp;
91625c896eaSAndrew Boyer 	struct iocpt_nop_comp nop;
91725c896eaSAndrew Boyer 	struct iocpt_q_identify_comp q_identify;
91825c896eaSAndrew Boyer 	struct iocpt_q_init_comp q_init;
91925c896eaSAndrew Boyer 	struct iocpt_lif_setattr_comp lif_setattr;
92025c896eaSAndrew Boyer 	struct iocpt_lif_getattr_comp lif_getattr;
92125c896eaSAndrew Boyer 	struct iocpt_sess_control_comp sess_control;
92225c896eaSAndrew Boyer };
92325c896eaSAndrew Boyer 
92425c896eaSAndrew Boyer union iocpt_notify_comp {
92525c896eaSAndrew Boyer 	struct iocpt_notify_event event;
92625c896eaSAndrew Boyer 	struct iocpt_reset_event reset;
92725c896eaSAndrew Boyer 	struct iocpt_heartbeat_event heartbeat;
92825c896eaSAndrew Boyer 	struct iocpt_log_event log;
92925c896eaSAndrew Boyer };
93025c896eaSAndrew Boyer 
93125c896eaSAndrew Boyer /**
93225c896eaSAndrew Boyer  * union iocpt_dev_identity - device identity information
93325c896eaSAndrew Boyer  * @version:          Version of device identify
93425c896eaSAndrew Boyer  * @type:             Identify type (0 for now)
93525c896eaSAndrew Boyer  * @state:            Device state
93625c896eaSAndrew Boyer  * @nlifs:            Number of LIFs provisioned
93725c896eaSAndrew Boyer  * @nintrs:           Number of interrupts provisioned
93825c896eaSAndrew Boyer  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
93925c896eaSAndrew Boyer  * @intr_coal_mult:   Interrupt coalescing multiplication factor
94025c896eaSAndrew Boyer  *                    Scale user-supplied interrupt coalescing
94125c896eaSAndrew Boyer  *                    value in usecs to device units using:
94225c896eaSAndrew Boyer  *                    device units = usecs * mult / div
94325c896eaSAndrew Boyer  * @intr_coal_div:    Interrupt coalescing division factor
94425c896eaSAndrew Boyer  *                    Scale user-supplied interrupt coalescing
94525c896eaSAndrew Boyer  *                    value in usecs to device units using:
94625c896eaSAndrew Boyer  *                    device units = usecs * mult / div
94725c896eaSAndrew Boyer  */
94825c896eaSAndrew Boyer union iocpt_dev_identity {
94925c896eaSAndrew Boyer 	struct {
95025c896eaSAndrew Boyer 		u8     version;
95125c896eaSAndrew Boyer 		u8     type;
95225c896eaSAndrew Boyer 		u8     state;
95325c896eaSAndrew Boyer 		u8     rsvd;
95425c896eaSAndrew Boyer 		__le32 nlifs;
95525c896eaSAndrew Boyer 		__le32 nintrs;
95625c896eaSAndrew Boyer 		__le32 ndbpgs_per_lif;
95725c896eaSAndrew Boyer 		__le32 intr_coal_mult;
95825c896eaSAndrew Boyer 		__le32 intr_coal_div;
95925c896eaSAndrew Boyer 		u8     rsvd2[8];
96025c896eaSAndrew Boyer 	};
96125c896eaSAndrew Boyer 	__le32 words[8];
96225c896eaSAndrew Boyer };
96325c896eaSAndrew Boyer 
96425c896eaSAndrew Boyer /**
96525c896eaSAndrew Boyer  * union iocpt_lif_identity - LIF identity information (type-specific)
96625c896eaSAndrew Boyer  *
96725c896eaSAndrew Boyer  * @features:           LIF features (see enum iocpt_hw_features)
96825c896eaSAndrew Boyer  * @version:            Identify structure version
96925c896eaSAndrew Boyer  * @hw_index:           LIF hardware index
97025c896eaSAndrew Boyer  * @max_nb_sessions:    Maximum number of sessions supported
97125c896eaSAndrew Boyer  * @config:             LIF config struct with features, q counts
97225c896eaSAndrew Boyer  */
97325c896eaSAndrew Boyer union iocpt_lif_identity {
974*e7750639SAndre Muezerie 	struct __rte_packed_begin {
97525c896eaSAndrew Boyer 		__le64 features;
97625c896eaSAndrew Boyer 
97725c896eaSAndrew Boyer 		u8 version;
97825c896eaSAndrew Boyer 		u8 hw_index;
97925c896eaSAndrew Boyer 		u8 rsvd[2];
98025c896eaSAndrew Boyer 		__le32 max_nb_sessions;
98125c896eaSAndrew Boyer 		u8 rsvd2[120];
98225c896eaSAndrew Boyer 		union iocpt_lif_config config;
983*e7750639SAndre Muezerie 	} __rte_packed_end;
98425c896eaSAndrew Boyer 	__le32 words[90];
98525c896eaSAndrew Boyer };
98625c896eaSAndrew Boyer 
98725c896eaSAndrew Boyer /**
98825c896eaSAndrew Boyer  * union iocpt_q_identity - queue identity information
98925c896eaSAndrew Boyer  *     @version:        Queue type version that can be used with FW
99025c896eaSAndrew Boyer  *     @supported:      Bitfield of queue versions, first bit = ver 0
99125c896eaSAndrew Boyer  *     @features:       Queue features
99225c896eaSAndrew Boyer  *     @desc_sz:        Descriptor size
99325c896eaSAndrew Boyer  *     @comp_sz:        Completion descriptor size
99425c896eaSAndrew Boyer  *     @sg_desc_sz:     Scatter/Gather descriptor size
99525c896eaSAndrew Boyer  *     @max_sg_elems:   Maximum number of Scatter/Gather elements
99625c896eaSAndrew Boyer  *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
99725c896eaSAndrew Boyer  */
99825c896eaSAndrew Boyer union iocpt_q_identity {
99925c896eaSAndrew Boyer 	struct {
100025c896eaSAndrew Boyer 		u8      version;
100125c896eaSAndrew Boyer 		u8      supported;
100225c896eaSAndrew Boyer 		u8      rsvd[6];
100325c896eaSAndrew Boyer #define IOCPT_QIDENT_F_CQ	0x01	/* queue has completion ring */
100425c896eaSAndrew Boyer #define IOCPT_QIDENT_F_SG	0x02	/* queue has scatter/gather ring */
100525c896eaSAndrew Boyer 		__le64  features;
100625c896eaSAndrew Boyer 		__le16  desc_sz;
100725c896eaSAndrew Boyer 		__le16  comp_sz;
100825c896eaSAndrew Boyer 		__le16  sg_desc_sz;
100925c896eaSAndrew Boyer 		__le16  max_sg_elems;
101025c896eaSAndrew Boyer 		__le16  sg_desc_stride;
101125c896eaSAndrew Boyer 	};
101225c896eaSAndrew Boyer 	__le32 words[20];
101325c896eaSAndrew Boyer };
101425c896eaSAndrew Boyer 
101525c896eaSAndrew Boyer struct iocpt_identity {
101625c896eaSAndrew Boyer 	union iocpt_dev_identity dev;
101725c896eaSAndrew Boyer 	union iocpt_lif_identity lif;
101825c896eaSAndrew Boyer 	union iocpt_q_identity q;
101925c896eaSAndrew Boyer };
102025c896eaSAndrew Boyer 
102125c896eaSAndrew Boyer #endif /* _IONIC_CRYPTO_IF_H_ */
1022