xref: /freebsd-src/sys/dev/safexcel/safexcel_var.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1b356ddf0SMark Johnston /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3b356ddf0SMark Johnston  *
4b356ddf0SMark Johnston  * Copyright (c) 2020 Rubicon Communications, LLC (Netgate)
5b356ddf0SMark Johnston  *
6b356ddf0SMark Johnston  * Redistribution and use in source and binary forms, with or without
7b356ddf0SMark Johnston  * modification, are permitted provided that the following conditions
8b356ddf0SMark Johnston  * are met:
9b356ddf0SMark Johnston  * 1. Redistributions of source code must retain the above copyright
10b356ddf0SMark Johnston  *    notice, this list of conditions and the following disclaimer.
11b356ddf0SMark Johnston  * 2. Redistributions in binary form must reproduce the above copyright
12b356ddf0SMark Johnston  *    notice, this list of conditions and the following disclaimer in the
13b356ddf0SMark Johnston  *    documentation and/or other materials provided with the distribution.
14b356ddf0SMark Johnston  *
15b356ddf0SMark Johnston  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16b356ddf0SMark Johnston  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17b356ddf0SMark Johnston  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18b356ddf0SMark Johnston  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19b356ddf0SMark Johnston  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20b356ddf0SMark Johnston  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21b356ddf0SMark Johnston  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22b356ddf0SMark Johnston  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23b356ddf0SMark Johnston  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24b356ddf0SMark Johnston  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25b356ddf0SMark Johnston  */
26b356ddf0SMark Johnston 
27b356ddf0SMark Johnston #ifndef _SAFEXCEL_VAR_H_
28b356ddf0SMark Johnston #define	_SAFEXCEL_VAR_H_
29b356ddf0SMark Johnston 
300371c3faSMark Johnston #include <sys/counter.h>
310371c3faSMark Johnston 
32b356ddf0SMark Johnston #define	SAFEXCEL_MAX_RINGS			4
33b356ddf0SMark Johnston #define	SAFEXCEL_MAX_BATCH_SIZE			64
34b356ddf0SMark Johnston #define	SAFEXCEL_MAX_FRAGMENTS			64
35b356ddf0SMark Johnston #define	SAFEXCEL_MAX_IV_LEN			16
36b356ddf0SMark Johnston #define	SAFEXCEL_MAX_REQUEST_SIZE		65535
37b356ddf0SMark Johnston 
38b356ddf0SMark Johnston #define	SAFEXCEL_RING_SIZE			512
39b356ddf0SMark Johnston #define	SAFEXCEL_MAX_ITOKENS			4
40b356ddf0SMark Johnston #define	SAFEXCEL_MAX_ATOKENS			16
41b356ddf0SMark Johnston #define	SAFEXCEL_FETCH_COUNT			1
42b356ddf0SMark Johnston #define	SAFEXCEL_MAX_KEY_LEN			32
43b356ddf0SMark Johnston #define	SAFEXCEL_MAX_RING_AIC			14
44b356ddf0SMark Johnston 
45b356ddf0SMark Johnston /*
46b356ddf0SMark Johnston  * Context Record format.
47b356ddf0SMark Johnston  *
48b356ddf0SMark Johnston  * In this driver the context control words are always set in the control data.
491a6ffed5SMark Johnston  * This helps optimize fetching of the context record.  This is configured by
501a6ffed5SMark Johnston  * setting SAFEXCEL_OPTION_CTX_CTRL_IN_CMD.
51b356ddf0SMark Johnston  */
52b356ddf0SMark Johnston struct safexcel_context_record {
53b356ddf0SMark Johnston 	uint32_t control0;	/* Unused. */
54b356ddf0SMark Johnston 	uint32_t control1;	/* Unused. */
55b356ddf0SMark Johnston 	uint32_t data[40];	/* Key material. */
56b356ddf0SMark Johnston } __packed;
57b356ddf0SMark Johnston 
58b356ddf0SMark Johnston /* Processing Engine Control Data format. */
59b356ddf0SMark Johnston struct safexcel_control_data {
60b356ddf0SMark Johnston 	uint32_t packet_length	: 17;
61b356ddf0SMark Johnston 	uint32_t options	: 13;
62b356ddf0SMark Johnston 	uint32_t type		: 2;
63b356ddf0SMark Johnston 
64b356ddf0SMark Johnston 	uint16_t application_id;
65b356ddf0SMark Johnston 	uint16_t rsvd;
66b356ddf0SMark Johnston 
67b356ddf0SMark Johnston 	uint32_t context_lo;
68b356ddf0SMark Johnston 	uint32_t context_hi;
69b356ddf0SMark Johnston 
70b356ddf0SMark Johnston 	uint32_t control0;
71b356ddf0SMark Johnston 	uint32_t control1;
72b356ddf0SMark Johnston 
73b356ddf0SMark Johnston 	/* Inline instructions or IV. */
74b356ddf0SMark Johnston 	uint32_t token[SAFEXCEL_MAX_ITOKENS];
75b356ddf0SMark Johnston } __packed;
76b356ddf0SMark Johnston 
77b356ddf0SMark Johnston /*
78b356ddf0SMark Johnston  * Basic Command Descriptor.
79b356ddf0SMark Johnston  *
80b356ddf0SMark Johnston  * The Processing Engine and driver cooperate to maintain a set of command
81b356ddf0SMark Johnston  * rings, representing outstanding crypto operation requests.  Each descriptor
82b356ddf0SMark Johnston  * corresponds to an input data segment, and thus a single crypto(9) request may
83b356ddf0SMark Johnston  * span several contiguous command descriptors.
84b356ddf0SMark Johnston  *
85b356ddf0SMark Johnston  * The first command descriptor for a request stores the input token, which
86b356ddf0SMark Johnston  * encodes data specific to the requested operation, such as the encryption
87b356ddf0SMark Johnston  * mode.  For some operations data is passed outside the descriptor, in a
88b356ddf0SMark Johnston  * context record (e.g., encryption keys), or in an "additional token data"
89b356ddf0SMark Johnston  * region (e.g., instructions).
90b356ddf0SMark Johnston  */
91b356ddf0SMark Johnston struct safexcel_cmd_descr {
92b356ddf0SMark Johnston 	uint32_t particle_size	: 17;
93b356ddf0SMark Johnston 	uint32_t rsvd0		: 5;
94b356ddf0SMark Johnston 	uint32_t last_seg	: 1;
95b356ddf0SMark Johnston 	uint32_t first_seg	: 1;
96b356ddf0SMark Johnston 	uint32_t additional_cdata_size : 8;
97b356ddf0SMark Johnston 	uint32_t rsvd1;
98b356ddf0SMark Johnston 
99b356ddf0SMark Johnston 	uint32_t data_lo;
100b356ddf0SMark Johnston 	uint32_t data_hi;
101b356ddf0SMark Johnston 
102b356ddf0SMark Johnston 	uint32_t atok_lo;
103b356ddf0SMark Johnston 	uint32_t atok_hi;
104b356ddf0SMark Johnston 
105b356ddf0SMark Johnston 	struct safexcel_control_data control_data;
106b356ddf0SMark Johnston } __packed;
107b356ddf0SMark Johnston 
108b356ddf0SMark Johnston /* Context control word 0 fields. */
109b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_NULL_OUT		0x0
110b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_NULL_IN		0x1
111b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_HASH_OUT		0x2
112b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_HASH_IN		0x3
113b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_CRYPTO_OUT	0x4
114b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_CRYPTO_IN	0x5
115b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_ENCRYPT_HASH_OUT	0x6
116b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_DECRYPT_HASH_IN	0x7
117b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_HASH_ENCRYPT_OUT	0xe
118b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_TYPE_HASH_DECRYPT_IN	0xf
119b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_RESTART_HASH		(1 << 4)
120b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_NO_FINISH_HASH	(1 << 5)
121b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_SIZE(n)		(((n) & 0xff) << 8)
122b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_KEY_EN		(1 << 16)
123b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_CRYPTO_ALG_AES128	(0x5 << 17)
124b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_CRYPTO_ALG_AES192	(0x6 << 17)
125b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_CRYPTO_ALG_AES256	(0x7 << 17)
126b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_DIGEST_PRECOMPUTED	(0x1 << 21)
127b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_DIGEST_CCM		(0x2 << 21)
128b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_DIGEST_GMAC		(0x2 << 21)
129b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_DIGEST_HMAC		(0x3 << 21)
130b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_SHA1		(0x2 << 23)
131b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_SHA224	(0x4 << 23)
132b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_SHA256	(0x3 << 23)
133b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_SHA384	(0x6 << 23)
134b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_SHA512	(0x5 << 23)
135b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_XCBC128	(0x1 << 23)
136b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_XCBC192	(0x2 << 23)
137b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_XCBC256	(0x3 << 23)
138b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_HASH_ALG_GHASH	(0x4 << 23)
139b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_INV_FR		(0x5 << 24)
140b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL0_INV_TR		(0x6 << 24)
141b356ddf0SMark Johnston 
142b356ddf0SMark Johnston /* Context control word 1 fields. */
143b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_ECB	0x0
144b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_CBC	0x1
145b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_ICM	0x3
146b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_OFB	0x4
147b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_CFB128	0x5
148b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_CTR	0x6
149b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_XTS	0x7
150b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_CCM	(0x6 | (1 << 17))
151b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_CRYPTO_MODE_GCM	(0x6 | (1 << 17))
152b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_IV0			(1u << 5)
153b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_IV1			(1u << 6)
154b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_IV2			(1u << 7)
155b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_IV3			(1u << 8)
156b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_DIGEST_CNT		(1u << 9)
157b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_COUNTER_MODE		(1u << 10)
158b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_ENCRYPT_HASH_RES	(1u << 17)
159b356ddf0SMark Johnston #define	SAFEXCEL_CONTROL1_HASH_STORE		(1u << 19)
160b356ddf0SMark Johnston 
161b356ddf0SMark Johnston /* Control options. */
162b356ddf0SMark Johnston #define	SAFEXCEL_OPTION_IP			(1u << 0) /* must be set */
163b356ddf0SMark Johnston #define	SAFEXCEL_OPTION_CP			(1u << 1) /* 64-bit ctx addr */
164b356ddf0SMark Johnston #define	SAFEXCEL_OPTION_RC_AUTO			(2u << 3) /* auto ctx reuse */
165b356ddf0SMark Johnston #define	SAFEXCEL_OPTION_CTX_CTRL_IN_CMD		(1u << 8) /* ctx ctrl */
166b356ddf0SMark Johnston #define	SAFEXCEL_OPTION_4_TOKEN_IV_CMD		0xe00     /* IV in bypass */
167b356ddf0SMark Johnston 
168b356ddf0SMark Johnston struct safexcel_res_data {
169b356ddf0SMark Johnston 	uint32_t packet_length	: 17;
170b356ddf0SMark Johnston 	uint32_t error_code	: 15;
171b356ddf0SMark Johnston 
172b356ddf0SMark Johnston 	uint32_t bypass_length	: 4;
173b356ddf0SMark Johnston 	uint32_t e15		: 1;
174b356ddf0SMark Johnston 	uint32_t rsvd0		: 16;
175b356ddf0SMark Johnston 	uint32_t hash_bytes	: 1;
176b356ddf0SMark Johnston 	uint32_t hash_length	: 6;
177b356ddf0SMark Johnston 	uint32_t generic_bytes	: 1;
178b356ddf0SMark Johnston 	uint32_t checksum	: 1;
179b356ddf0SMark Johnston 	uint32_t next_header	: 1;
180b356ddf0SMark Johnston 	uint32_t length		: 1;
181b356ddf0SMark Johnston 
182b356ddf0SMark Johnston 	uint16_t application_id;
183b356ddf0SMark Johnston 	uint16_t rsvd1;
184b356ddf0SMark Johnston 
185b356ddf0SMark Johnston 	uint32_t rsvd2;
186b356ddf0SMark Johnston };
187b356ddf0SMark Johnston 
188b356ddf0SMark Johnston /* Basic Result Descriptor format */
189b356ddf0SMark Johnston struct safexcel_res_descr {
190b356ddf0SMark Johnston 	uint32_t particle_size	: 17;
191b356ddf0SMark Johnston 	uint32_t rsvd0		: 3;
192b356ddf0SMark Johnston 	uint32_t descriptor_overflow : 1;
193b356ddf0SMark Johnston 	uint32_t buffer_overflow : 1;
194b356ddf0SMark Johnston 	uint32_t last_seg	: 1;
195b356ddf0SMark Johnston 	uint32_t first_seg	: 1;
196b356ddf0SMark Johnston 	uint32_t result_size	: 8;
197b356ddf0SMark Johnston 
198b356ddf0SMark Johnston 	uint32_t rsvd1;
199b356ddf0SMark Johnston 
200b356ddf0SMark Johnston 	uint32_t data_lo;
201b356ddf0SMark Johnston 	uint32_t data_hi;
202b356ddf0SMark Johnston 
203b356ddf0SMark Johnston 	struct safexcel_res_data result_data;
204b356ddf0SMark Johnston } __packed;
205b356ddf0SMark Johnston 
206b356ddf0SMark Johnston /* Result data error codes. */
207b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_PACKET_LEN		(1u << 0)
208b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_TOKEN_ERROR		(1u << 1)
209b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_BYPASS		(1u << 2)
210b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_CRYPTO_BLOCK_SIZE	(1u << 3)
211b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_HASH_BLOCK_SIZE	(1u << 4)
212b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_INVALID_CMD		(1u << 5)
213b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_PROHIBITED_ALGO	(1u << 6)
214b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_HASH_INPUT_OVERFLOW	(1u << 7)
215b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_TTL_UNDERFLOW	(1u << 8)
216b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_AUTH_FAILED		(1u << 9)
217b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_SEQNO_CHECK_FAILED	(1u << 10)
218b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_SPI_CHECK		(1u << 11)
219b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_CHECKSUM		(1u << 12)
220b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_PAD_VERIFICATION	(1u << 13)
221b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_TIMEOUT		(1u << 14)
222b356ddf0SMark Johnston #define	SAFEXCEL_RESULT_ERR_OUTPUT_DMA		(1u << 15)
223b356ddf0SMark Johnston 
224b356ddf0SMark Johnston /*
225b356ddf0SMark Johnston  * The EIP-96 (crypto transform engine) is programmed using a set of
226b356ddf0SMark Johnston  * data processing instructions with the encodings defined below.
227b356ddf0SMark Johnston  */
228b356ddf0SMark Johnston struct safexcel_instr {
229b356ddf0SMark Johnston 	uint32_t length : 17;		/* bytes to be processed */
230b356ddf0SMark Johnston 	uint32_t status : 2;		/* stream status */
231b356ddf0SMark Johnston 	uint32_t instructions : 9;
232b356ddf0SMark Johnston 	uint32_t opcode : 4;
233b356ddf0SMark Johnston } __packed;
234b356ddf0SMark Johnston 
235b356ddf0SMark Johnston /* Type 1, operational data instructions. */
236b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_DIRECTION		0x0
237b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_PRE_CHECKSUM	0x1
238b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_INSERT		0x2
239b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_INSERT_CTX	0x9
240b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_REPLACE		0x3
241b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_RETRIEVE		0x4
242b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_MUTE		0x5
243b356ddf0SMark Johnston /* Type 2, IP header instructions. */
244b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_IPV4		0x7
245b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_IPV4_CHECKSUM	0x6
246b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_IPV6		0x8
247b356ddf0SMark Johnston /* Type 3, postprocessing instructions. */
248b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_INSERT_REMOVE_RESULT 0xa
249b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_REPLACE_BYTE	0xb
250b356ddf0SMark Johnston /* Type 4, result instructions. */
251b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_VERIFY_FIELDS	0xd
252b356ddf0SMark Johnston /* Type 5, context control instructions. */
253b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_CONTEXT_ACCESS	0xe
254b356ddf0SMark Johnston /* Type 6, context control instructions. */
255b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_OPCODE_BYPASS_TOKEN_DATA	0xf
256b356ddf0SMark Johnston 
257b356ddf0SMark Johnston /* Status bits for type 1 and 2 instructions. */
258b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_STATUS_LAST_HASH		(1u << 0)
259b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_STATUS_LAST_PACKET	(1u << 1)
260b356ddf0SMark Johnston /* Status bits for type 3 instructions. */
261b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_STATUS_NO_CKSUM_MOD	(1u << 0)
262b356ddf0SMark Johnston 
263b356ddf0SMark Johnston /* Instruction-dependent flags. */
264b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_INSERT_HASH_DIGEST	0x1c
265b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_INSERT_IMMEDIATE		0x1b
266b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_DEST_OUTPUT		(1u << 5)
267b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_DEST_HASH		(1u << 6)
268b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_DEST_CRYPTO		(1u << 7)
269b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_INS_LAST			(1u << 8)
270b356ddf0SMark Johnston 
271b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_VERIFY_HASH		(1u << 16)
272b356ddf0SMark Johnston #define	SAFEXCEL_INSTR_VERIFY_PADDING		(1u << 5)
273b356ddf0SMark Johnston 
274b356ddf0SMark Johnston #define	SAFEXCEL_TOKEN_TYPE_BYPASS	0x0
275b356ddf0SMark Johnston #define	SAFEXCEL_TOKEN_TYPE_AUTONOMOUS	0x3
276b356ddf0SMark Johnston 
277b356ddf0SMark Johnston #define	SAFEXCEL_CONTEXT_SMALL		0x2
278b356ddf0SMark Johnston #define	SAFEXCEL_CONTEXT_LARGE		0x3
279b356ddf0SMark Johnston 
280b356ddf0SMark Johnston struct safexcel_reg_offsets {
281b356ddf0SMark Johnston 	uint32_t hia_aic;
282b356ddf0SMark Johnston 	uint32_t hia_aic_g;
283b356ddf0SMark Johnston 	uint32_t hia_aic_r;
284b356ddf0SMark Johnston 	uint32_t hia_aic_xdr;
285b356ddf0SMark Johnston 	uint32_t hia_dfe;
286b356ddf0SMark Johnston 	uint32_t hia_dfe_thr;
287b356ddf0SMark Johnston 	uint32_t hia_dse;
288b356ddf0SMark Johnston 	uint32_t hia_dse_thr;
289b356ddf0SMark Johnston 	uint32_t hia_gen_cfg;
290b356ddf0SMark Johnston 	uint32_t pe;
291b356ddf0SMark Johnston };
292b356ddf0SMark Johnston 
293b356ddf0SMark Johnston struct safexcel_config {
294b356ddf0SMark Johnston 	uint32_t	hdw;		/* Host interface Data Width. */
295b356ddf0SMark Johnston 	uint32_t	aic_rings;	/* Number of AIC rings. */
296b356ddf0SMark Johnston 	uint32_t	pes;		/* Number of PEs. */
297b356ddf0SMark Johnston 	uint32_t	rings;		/* Number of rings. */
298b356ddf0SMark Johnston 
299b356ddf0SMark Johnston 	uint32_t	cd_size;	/* CDR descriptor size. */
300b356ddf0SMark Johnston 	uint32_t	cd_offset;	/* CDR offset (size + alignment). */
301b356ddf0SMark Johnston 
302b356ddf0SMark Johnston 	uint32_t	rd_size;	/* RDR descriptor size. */
303b356ddf0SMark Johnston 	uint32_t	rd_offset;	/* RDR offset. */
304b356ddf0SMark Johnston 
305b356ddf0SMark Johnston 	uint32_t	atok_offset;	/* Additional token offset. */
306b356ddf0SMark Johnston 
307b356ddf0SMark Johnston 	uint32_t	caps;		/* Device capabilities. */
308b356ddf0SMark Johnston };
309b356ddf0SMark Johnston 
310b356ddf0SMark Johnston #define	SAFEXCEL_DPRINTF(sc, lvl, ...) do {				\
311b356ddf0SMark Johnston 	if ((sc)->sc_debug >= (lvl))					\
312b356ddf0SMark Johnston 		device_printf((sc)->sc_dev, __VA_ARGS__);		\
313b356ddf0SMark Johnston } while (0)
314b356ddf0SMark Johnston 
315b356ddf0SMark Johnston struct safexcel_dma_mem {
316b356ddf0SMark Johnston 	caddr_t		vaddr;
317b356ddf0SMark Johnston 	bus_addr_t	paddr;
318b356ddf0SMark Johnston 	bus_dma_tag_t	tag;
319b356ddf0SMark Johnston 	bus_dmamap_t	map;
320b356ddf0SMark Johnston };
321b356ddf0SMark Johnston 
322b356ddf0SMark Johnston struct safexcel_cmd_descr_ring {
323b356ddf0SMark Johnston 	struct safexcel_dma_mem		dma;
324b356ddf0SMark Johnston 	struct safexcel_cmd_descr	*desc;
325b356ddf0SMark Johnston 	int				write;
326b356ddf0SMark Johnston 	int				read;
327b356ddf0SMark Johnston };
328b356ddf0SMark Johnston 
329b356ddf0SMark Johnston struct safexcel_res_descr_ring {
330b356ddf0SMark Johnston 	struct safexcel_dma_mem		dma;
331b356ddf0SMark Johnston 	struct safexcel_res_descr	*desc;
332b356ddf0SMark Johnston 	int				write;
333b356ddf0SMark Johnston 	int				read;
334b356ddf0SMark Johnston };
335b356ddf0SMark Johnston 
3365bdb8b27SMark Johnston struct safexcel_context_template {
3375bdb8b27SMark Johnston 	struct safexcel_context_record	ctx;
3385bdb8b27SMark Johnston 	int				len;
3395bdb8b27SMark Johnston };
3405bdb8b27SMark Johnston 
341b356ddf0SMark Johnston struct safexcel_session {
3425bdb8b27SMark Johnston 	crypto_session_t	cses;
343b356ddf0SMark Johnston 	uint32_t		alg;		/* cipher algorithm */
344b356ddf0SMark Johnston 	uint32_t		digest;		/* digest type */
345b356ddf0SMark Johnston 	uint32_t		hash;		/* hash algorithm */
346b356ddf0SMark Johnston 	uint32_t		mode;		/* cipher mode of operation */
347b356ddf0SMark Johnston 	unsigned int		digestlen;	/* digest length */
348b356ddf0SMark Johnston 	unsigned int		statelen;	/* HMAC hash state length */
3495bdb8b27SMark Johnston 
3505bdb8b27SMark Johnston 	struct safexcel_context_template encctx, decctx;
351b356ddf0SMark Johnston };
352b356ddf0SMark Johnston 
353b356ddf0SMark Johnston struct safexcel_softc;
354b356ddf0SMark Johnston 
355b356ddf0SMark Johnston struct safexcel_request {
356b356ddf0SMark Johnston 	STAILQ_ENTRY(safexcel_request)	link;
357b356ddf0SMark Johnston 	bool				dmap_loaded;
358e934d455SMark Johnston 	int				ringidx;
359b356ddf0SMark Johnston 	bus_dmamap_t			dmap;
360b356ddf0SMark Johnston 	int				error;
361b356ddf0SMark Johnston 	int				cdescs, rdescs;
362b356ddf0SMark Johnston 	uint8_t				iv[SAFEXCEL_MAX_IV_LEN];
363b356ddf0SMark Johnston 	struct safexcel_cmd_descr	*cdesc;
364b356ddf0SMark Johnston 	struct safexcel_dma_mem		ctx;
365b356ddf0SMark Johnston 	struct safexcel_session		*sess;
366b356ddf0SMark Johnston 	struct cryptop			*crp;
367b356ddf0SMark Johnston 	struct safexcel_softc		*sc;
368b356ddf0SMark Johnston };
369b356ddf0SMark Johnston 
370b356ddf0SMark Johnston struct safexcel_ring {
371b356ddf0SMark Johnston 	struct mtx			mtx;
372b356ddf0SMark Johnston 	struct sglist			*cmd_data;
373b356ddf0SMark Johnston 	struct safexcel_cmd_descr_ring	cdr;
374b356ddf0SMark Johnston 	struct sglist			*res_data;
375b356ddf0SMark Johnston 	struct safexcel_res_descr_ring	rdr;
376b356ddf0SMark Johnston 
3771a6ffed5SMark Johnston 	/* Shadows the command descriptor ring. */
3781a6ffed5SMark Johnston 	struct safexcel_request		requests[SAFEXCEL_RING_SIZE];
379092cf8d6SMark Johnston 
3801a6ffed5SMark Johnston 	/* Count of requests pending submission. */
3811a6ffed5SMark Johnston 	int				pending;
3821a6ffed5SMark Johnston 	int				pending_cdesc, pending_rdesc;
3831a6ffed5SMark Johnston 
3841a6ffed5SMark Johnston 	/* Count of outstanding requests. */
3851a6ffed5SMark Johnston 	int				queued;
3861a6ffed5SMark Johnston 
3871a6ffed5SMark Johnston 	/* Requests were deferred due to a resource shortage. */
3881a6ffed5SMark Johnston 	int				blocked;
389b356ddf0SMark Johnston 
390b356ddf0SMark Johnston 	struct safexcel_dma_mem		dma_atok;
391b356ddf0SMark Johnston 	bus_dma_tag_t   		data_dtag;
3928ba6acbbSMark Johnston 
3938ba6acbbSMark Johnston 	char				lockname[32];
394b356ddf0SMark Johnston };
395b356ddf0SMark Johnston 
396b356ddf0SMark Johnston struct safexcel_intr_handle {
397b356ddf0SMark Johnston 	struct safexcel_softc		*sc;
398b356ddf0SMark Johnston 	void				*handle;
399b356ddf0SMark Johnston 	int				ring;
400b356ddf0SMark Johnston };
401b356ddf0SMark Johnston 
402b356ddf0SMark Johnston struct safexcel_softc {
403b356ddf0SMark Johnston 	device_t			sc_dev;
404b356ddf0SMark Johnston 	uint32_t			sc_type;	/* EIP-97 or 197 */
405b356ddf0SMark Johnston 	int				sc_debug;
406b356ddf0SMark Johnston 
407b356ddf0SMark Johnston 	struct resource			*sc_res;
408b356ddf0SMark Johnston 	struct resource			*sc_intr[SAFEXCEL_MAX_RINGS];
409b356ddf0SMark Johnston 	struct safexcel_intr_handle	sc_ih[SAFEXCEL_MAX_RINGS];
410b356ddf0SMark Johnston 
4110371c3faSMark Johnston 	counter_u64_t			sc_req_alloc_failures;
4120371c3faSMark Johnston 	counter_u64_t			sc_cdesc_alloc_failures;
4130371c3faSMark Johnston 	counter_u64_t			sc_rdesc_alloc_failures;
4140371c3faSMark Johnston 
415b356ddf0SMark Johnston 	struct safexcel_ring 		sc_ring[SAFEXCEL_MAX_RINGS];
416b356ddf0SMark Johnston 
417b356ddf0SMark Johnston 	int32_t				sc_cid;
418b356ddf0SMark Johnston 	struct safexcel_reg_offsets 	sc_offsets;
419b356ddf0SMark Johnston 	struct safexcel_config		sc_config;
420b356ddf0SMark Johnston };
421b356ddf0SMark Johnston 
422b356ddf0SMark Johnston #define	SAFEXCEL_WRITE(sc, off, val)	bus_write_4((sc)->sc_res, (off), (val))
423b356ddf0SMark Johnston #define	SAFEXCEL_READ(sc, off)		bus_read_4((sc)->sc_res, (off))
424b356ddf0SMark Johnston 
425b356ddf0SMark Johnston #define	SAFEXCEL_ADDR_LO(addr)		((uint64_t)(addr) & 0xffffffffu)
426b356ddf0SMark Johnston #define	SAFEXCEL_ADDR_HI(addr)		(((uint64_t)(addr) >> 32) & 0xffffffffu)
427b356ddf0SMark Johnston 
428b356ddf0SMark Johnston #endif /* _SAFEXCEL_VAR_H_ */
429