xref: /freebsd/sys/dev/sec/sec.h (revision 780fb4a2)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (C) 2008-2009 Semihalf, Piotr Ziecik
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
19  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29 
30 #ifndef	_SEC_H
31 #define _SEC_H
32 
33 /*
34  * Each SEC channel can hold up to 24 descriptors. All 4 channels can be
35  * simultaneously active holding 96 descriptors. Each descriptor can use 0 or
36  * more link table entries depending of size and granulation of input/output
37  * data. One link table entry is needed for each 65535 bytes of data.
38  */
39 
40 /* Driver settings */
41 #define SEC_TIMEOUT			100000
42 #define SEC_MAX_SESSIONS		256
43 #define SEC_DESCRIPTORS			256	/* Must be power of 2 */
44 #define SEC_LT_ENTRIES			1024	/* Must be power of 2 */
45 #define SEC_MAX_IV_LEN			16
46 #define SEC_MAX_KEY_LEN			64
47 
48 /* SEC information */
49 #define SEC_20_ID			0x0000000000000040ULL
50 #define SEC_30_ID			0x0030030000000000ULL
51 #define SEC_31_ID			0x0030030100000000ULL
52 #define SEC_CHANNELS			4
53 #define SEC_POINTERS			7
54 #define SEC_MAX_DMA_BLOCK_SIZE		0xFFFF
55 #define SEC_MAX_FIFO_LEVEL		24
56 #define SEC_DMA_ALIGNMENT		8
57 
58 #define __packed__			__attribute__ ((__packed__))
59 
60 struct sec_softc;
61 struct sec_session;
62 
63 /* SEC descriptor definition */
64 struct sec_hw_desc_ptr {
65 	u_int		shdp_length		: 16;
66 	u_int		shdp_j			: 1;
67 	u_int		shdp_extent		: 7;
68 	u_int		__padding0		: 4;
69 	uint64_t	shdp_ptr		: 36;
70 } __packed__;
71 
72 struct sec_hw_desc {
73 	union __packed__ {
74 		struct __packed__ {
75 			u_int	eu_sel0		: 4;
76 			u_int	mode0		: 8;
77 			u_int	eu_sel1		: 4;
78 			u_int	mode1		: 8;
79 			u_int	desc_type	: 5;
80 			u_int	__padding0	: 1;
81 			u_int	dir		: 1;
82 			u_int	dn		: 1;
83 			u_int	__padding1	: 32;
84 		} request;
85 		struct __packed__ {
86 			u_int	done		: 8;
87 			u_int	__padding0	: 27;
88 			u_int	iccr0		: 2;
89 			u_int	__padding1	: 6;
90 			u_int	iccr1		: 2;
91 			u_int	__padding2	: 19;
92 		} feedback;
93 	} shd_control;
94 
95 	struct sec_hw_desc_ptr	shd_pointer[SEC_POINTERS];
96 
97 	/* Data below is mapped to descriptor pointers */
98 	uint8_t			shd_iv[SEC_MAX_IV_LEN];
99 	uint8_t			shd_key[SEC_MAX_KEY_LEN];
100 	uint8_t			shd_mkey[SEC_MAX_KEY_LEN];
101 } __packed__;
102 
103 #define shd_eu_sel0		shd_control.request.eu_sel0
104 #define shd_mode0		shd_control.request.mode0
105 #define shd_eu_sel1		shd_control.request.eu_sel1
106 #define shd_mode1		shd_control.request.mode1
107 #define shd_desc_type		shd_control.request.desc_type
108 #define shd_dir			shd_control.request.dir
109 #define shd_dn			shd_control.request.dn
110 #define shd_done		shd_control.feedback.done
111 #define shd_iccr0		shd_control.feedback.iccr0
112 #define shd_iccr1		shd_control.feedback.iccr1
113 
114 /* SEC link table entries definition */
115 struct sec_hw_lt {
116 	u_int			shl_length	: 16;
117 	u_int			__padding0	: 6;
118 	u_int			shl_r		: 1;
119 	u_int			shl_n		: 1;
120 	u_int			__padding1	: 4;
121 	uint64_t		shl_ptr		: 36;
122 } __packed__;
123 
124 struct sec_dma_mem {
125 	void			*dma_vaddr;
126 	bus_addr_t		dma_paddr;
127 	bus_dma_tag_t		dma_tag;
128 	bus_dmamap_t		dma_map;
129 	u_int			dma_is_map;
130 };
131 
132 struct sec_desc {
133 	struct sec_hw_desc	*sd_desc;
134 	bus_addr_t		sd_desc_paddr;
135 	struct sec_dma_mem	sd_ptr_dmem[SEC_POINTERS];
136 	struct cryptop		*sd_crp;
137 	u_int			sd_lt_used;
138 	u_int			sd_error;
139 };
140 
141 struct sec_lt {
142 	struct sec_hw_lt	*sl_lt;
143 	bus_addr_t		sl_lt_paddr;
144 };
145 
146 struct sec_eu_methods {
147 	int	(*sem_newsession)(struct sec_softc *sc,
148 	    struct sec_session *ses, struct cryptoini *enc,
149 	    struct cryptoini *mac);
150 	int	(*sem_make_desc)(struct sec_softc *sc,
151 	    struct sec_session *ses, struct sec_desc *desc,
152 	    struct cryptop *crp, int buftype);
153 };
154 
155 struct sec_session {
156 	u_int			ss_used;
157 	struct sec_eu_methods	*ss_eu;
158 	uint8_t			ss_key[SEC_MAX_KEY_LEN];
159 	uint8_t			ss_mkey[SEC_MAX_KEY_LEN];
160 	u_int			ss_klen;
161 	u_int			ss_mklen;
162 	u_int			ss_ivlen;
163 };
164 
165 struct sec_desc_map_info {
166 	struct sec_softc	*sdmi_sc;
167 	bus_size_t		sdmi_size;
168 	bus_size_t		sdmi_offset;
169 	struct sec_lt		*sdmi_lt_first;
170 	struct sec_lt		*sdmi_lt_last;
171 	u_int			sdmi_lt_used;
172 };
173 
174 struct sec_softc {
175 	device_t		sc_dev;
176 	int32_t			sc_cid;
177 	int			sc_blocked;
178 	int			sc_shutdown;
179 	u_int			sc_version;
180 
181 	uint64_t		sc_int_error_mask;
182 	uint64_t		sc_channel_idle_mask;
183 
184 	struct sec_session	sc_sessions[SEC_MAX_SESSIONS];
185 
186 	struct mtx		sc_controller_lock;
187 	struct mtx		sc_descriptors_lock;
188 	struct mtx		sc_sessions_lock;
189 
190 	struct sec_desc		sc_desc[SEC_DESCRIPTORS];
191 	u_int			sc_free_desc_get_cnt;
192 	u_int			sc_free_desc_put_cnt;
193 	u_int			sc_ready_desc_get_cnt;
194 	u_int			sc_ready_desc_put_cnt;
195 	u_int			sc_queued_desc_get_cnt;
196 	u_int			sc_queued_desc_put_cnt;
197 
198 	struct sec_lt		sc_lt[SEC_LT_ENTRIES + 1];
199 	u_int			sc_lt_alloc_cnt;
200 	u_int			sc_lt_free_cnt;
201 
202 	struct sec_dma_mem	sc_desc_dmem;	/* descriptors DMA memory */
203 	struct sec_dma_mem	sc_lt_dmem;	/* link tables DMA memory */
204 
205 	struct resource		*sc_rres;	/* register resource */
206         int			sc_rrid;	/* register rid */
207 	struct {
208 		bus_space_tag_t	bst;
209 		bus_space_handle_t bsh;
210 	} sc_bas;
211 
212 	struct resource		*sc_pri_ires;	/* primary irq resource */
213 	void			*sc_pri_ihand;	/* primary irq handler */
214 	int			sc_pri_irid;	/* primary irq resource id */
215 
216 	struct resource		*sc_sec_ires;	/* secondary irq resource */
217 	void			*sc_sec_ihand;	/* secondary irq handler */
218 	int			sc_sec_irid;	/* secondary irq resource id */
219 };
220 
221 /* Locking macros */
222 #define SEC_LOCK(sc, what)						\
223 	mtx_lock(&(sc)->sc_ ## what ## _lock)
224 #define SEC_UNLOCK(sc, what)						\
225 	mtx_unlock(&(sc)->sc_ ## what ## _lock)
226 #define SEC_LOCK_ASSERT(sc, what)					\
227 	mtx_assert(&(sc)->sc_ ## what ## _lock, MA_OWNED)
228 
229 /* Read/Write definitions */
230 #define SEC_READ(sc, reg)						\
231 	bus_space_read_8((sc)->sc_bas.bst, (sc)->sc_bas.bsh, (reg))
232 #define SEC_WRITE(sc, reg, val)						\
233 	bus_space_write_8((sc)->sc_bas.bst, (sc)->sc_bas.bsh, (reg), (val))
234 
235 /* Base allocation macros (warning: wrap must be 2^n) */
236 #define SEC_CNT_INIT(sc, cnt, wrap)					\
237 	(((sc)->cnt) = ((wrap) - 1))
238 #define SEC_ADD(sc, cnt, wrap, val)					\
239 	((sc)->cnt = (((sc)->cnt) + (val)) & ((wrap) - 1))
240 #define SEC_INC(sc, cnt, wrap)						\
241 	SEC_ADD(sc, cnt, wrap, 1)
242 #define SEC_DEC(sc, cnt, wrap)						\
243 	SEC_ADD(sc, cnt, wrap, -1)
244 #define SEC_GET_GENERIC(sc, tab, cnt, wrap)				\
245 	((sc)->tab[SEC_INC(sc, cnt, wrap)])
246 #define SEC_PUT_GENERIC(sc, tab, cnt, wrap, val)			\
247 	((sc)->tab[SEC_INC(sc, cnt, wrap)] = val)
248 
249 /* Interface for descriptors */
250 #define SEC_GET_FREE_DESC(sc)						\
251 	&SEC_GET_GENERIC(sc, sc_desc, sc_free_desc_get_cnt, SEC_DESCRIPTORS)
252 
253 #define SEC_PUT_BACK_FREE_DESC(sc)					\
254 	SEC_DEC(sc, sc_free_desc_get_cnt, SEC_DESCRIPTORS)
255 
256 #define SEC_DESC_FREE2READY(sc)						\
257 	SEC_INC(sc, sc_ready_desc_put_cnt, SEC_DESCRIPTORS)
258 
259 #define SEC_GET_READY_DESC(sc)						\
260 	&SEC_GET_GENERIC(sc, sc_desc, sc_ready_desc_get_cnt, SEC_DESCRIPTORS)
261 
262 #define SEC_PUT_BACK_READY_DESC(sc)					\
263 	SEC_DEC(sc, sc_ready_desc_get_cnt, SEC_DESCRIPTORS)
264 
265 #define SEC_DESC_READY2QUEUED(sc)					\
266 	SEC_INC(sc, sc_queued_desc_put_cnt, SEC_DESCRIPTORS)
267 
268 #define SEC_GET_QUEUED_DESC(sc)						\
269 	&SEC_GET_GENERIC(sc, sc_desc, sc_queued_desc_get_cnt, SEC_DESCRIPTORS)
270 
271 #define SEC_PUT_BACK_QUEUED_DESC(sc)					\
272 	SEC_DEC(sc, sc_queued_desc_get_cnt, SEC_DESCRIPTORS)
273 
274 #define SEC_DESC_QUEUED2FREE(sc)					\
275 	SEC_INC(sc, sc_free_desc_put_cnt, SEC_DESCRIPTORS)
276 
277 #define SEC_FREE_DESC_CNT(sc)						\
278 	(((sc)->sc_free_desc_put_cnt - (sc)->sc_free_desc_get_cnt - 1)	\
279 	& (SEC_DESCRIPTORS - 1))
280 
281 #define SEC_READY_DESC_CNT(sc)						\
282 	(((sc)->sc_ready_desc_put_cnt - (sc)->sc_ready_desc_get_cnt) &	\
283 	(SEC_DESCRIPTORS - 1))
284 
285 #define SEC_QUEUED_DESC_CNT(sc)						\
286 	(((sc)->sc_queued_desc_put_cnt - (sc)->sc_queued_desc_get_cnt)	\
287 	& (SEC_DESCRIPTORS - 1))
288 
289 #define SEC_DESC_SYNC(sc, mode) do {					\
290 	sec_sync_dma_mem(&((sc)->sc_desc_dmem), (mode));		\
291 	sec_sync_dma_mem(&((sc)->sc_lt_dmem), (mode));			\
292 } while (0)
293 
294 #define SEC_DESC_SYNC_POINTERS(desc, mode) do {				\
295 	u_int i;							\
296 	for (i = 0; i < SEC_POINTERS; i++)				\
297 		sec_sync_dma_mem(&((desc)->sd_ptr_dmem[i]), (mode));	\
298 } while (0)
299 
300 #define SEC_DESC_FREE_POINTERS(desc) do {				\
301 	u_int i;							\
302 	for (i = 0; i < SEC_POINTERS; i++)				\
303 		sec_free_dma_mem(&(desc)->sd_ptr_dmem[i]);		\
304 } while (0);
305 
306 #define SEC_DESC_PUT_BACK_LT(sc, desc)					\
307 	SEC_PUT_BACK_LT(sc, (desc)->sd_lt_used)
308 
309 #define SEC_DESC_FREE_LT(sc, desc)					\
310 	SEC_FREE_LT(sc, (desc)->sd_lt_used)
311 
312 /* Interface for link tables */
313 #define SEC_ALLOC_LT_ENTRY(sc)						\
314 	&SEC_GET_GENERIC(sc, sc_lt, sc_lt_alloc_cnt, SEC_LT_ENTRIES)
315 
316 #define SEC_PUT_BACK_LT(sc, num)					\
317 	SEC_ADD(sc, sc_lt_alloc_cnt, SEC_LT_ENTRIES, -(num))
318 
319 #define SEC_FREE_LT(sc, num)						\
320 	SEC_ADD(sc, sc_lt_free_cnt, SEC_LT_ENTRIES, num)
321 
322 #define SEC_FREE_LT_CNT(sc)						\
323 	(((sc)->sc_lt_free_cnt - (sc)->sc_lt_alloc_cnt - 1)		\
324 	& (SEC_LT_ENTRIES - 1))
325 
326 /* DMA Maping defines */
327 #define SEC_MEMORY		0
328 #define SEC_UIO			1
329 #define SEC_MBUF		2
330 
331 /* Size of SEC registers area */
332 #define SEC_IO_SIZE		0x10000
333 
334 /* SEC Controller registers */
335 #define SEC_IER			0x1008
336 #define SEC_INT_CH_DN(n)	(1ULL << (((n) * 2) + 32))
337 #define SEC_INT_CH_ERR(n)	(1ULL << (((n) * 2) + 33))
338 #define SEC_INT_ITO		(1ULL << 55)
339 
340 #define SEC_ISR			0x1010
341 #define SEC_ICR			0x1018
342 #define SEC_ID			0x1020
343 
344 #define SEC_EUASR		0x1028
345 #define SEC_EUASR_RNGU(r)	(((r) >> 0) & 0xF)
346 #define SEC_EUASR_PKEU(r)	(((r) >> 8) & 0xF)
347 #define SEC_EUASR_KEU(r)	(((r) >> 16) & 0xF)
348 #define SEC_EUASR_CRCU(r)	(((r) >> 20) & 0xF)
349 #define SEC_EUASR_DEU(r)	(((r) >> 32) & 0xF)
350 #define SEC_EUASR_AESU(r)	(((r) >> 40) & 0xF)
351 #define SEC_EUASR_MDEU(r)	(((r) >> 48) & 0xF)
352 #define SEC_EUASR_AFEU(r)	(((r) >> 56) & 0xF)
353 
354 #define SEC_MCR			0x1030
355 #define SEC_MCR_SWR		(1ULL << 32)
356 
357 /* SEC Channel registers */
358 #define SEC_CHAN_CCR(n)		(((n) * 0x100) + 0x1108)
359 #define SEC_CHAN_CCR_CDIE	(1ULL << 1)
360 #define SEC_CHAN_CCR_NT		(1ULL << 2)
361 #define SEC_CHAN_CCR_AWSE	(1ULL << 3)
362 #define SEC_CHAN_CCR_CDWE	(1ULL << 4)
363 #define SEC_CHAN_CCR_BS		(1ULL << 8)
364 #define SEC_CHAN_CCR_WGN	(1ULL << 13)
365 #define SEC_CHAN_CCR_R		(1ULL << 32)
366 #define SEC_CHAN_CCR_CON	(1ULL << 33)
367 
368 #define SEC_CHAN_CSR(n)		(((n) * 0x100) + 0x1110)
369 #define SEC_CHAN_CSR2_FFLVL_M	0x1FULL
370 #define SEC_CHAN_CSR2_FFLVL_S	56
371 #define SEC_CHAN_CSR2_GSTATE_M	0x0FULL
372 #define SEC_CHAN_CSR2_GSTATE_S	48
373 #define SEC_CHAN_CSR2_PSTATE_M	0x0FULL
374 #define SEC_CHAN_CSR2_PSTATE_S	40
375 #define SEC_CHAN_CSR2_MSTATE_M	0x3FULL
376 #define SEC_CHAN_CSR2_MSTATE_S	32
377 #define SEC_CHAN_CSR3_FFLVL_M	0x1FULL
378 #define SEC_CHAN_CSR3_FFLVL_S	24
379 #define SEC_CHAN_CSR3_MSTATE_M	0x1FFULL
380 #define SEC_CHAN_CSR3_MSTATE_S	32
381 #define SEC_CHAN_CSR3_PSTATE_M	0x7FULL
382 #define SEC_CHAN_CSR3_PSTATE_S	48
383 #define SEC_CHAN_CSR3_GSTATE_M	0x7FULL
384 #define SEC_CHAN_CSR3_GSTATE_S	56
385 
386 #define SEC_CHAN_CDPR(n)	(((n) * 0x100) + 0x1140)
387 #define SEC_CHAN_FF(n)		(((n) * 0x100) + 0x1148)
388 
389 /* SEC Execution Units numbers */
390 #define SEC_EU_NONE		0x0
391 #define SEC_EU_AFEU		0x1
392 #define SEC_EU_DEU		0x2
393 #define SEC_EU_MDEU_A		0x3
394 #define SEC_EU_MDEU_B		0xB
395 #define SEC_EU_RNGU		0x4
396 #define SEC_EU_PKEU		0x5
397 #define SEC_EU_AESU		0x6
398 #define SEC_EU_KEU		0x7
399 #define SEC_EU_CRCU		0x8
400 
401 /* SEC descriptor types */
402 #define SEC_DT_COMMON_NONSNOOP	0x02
403 #define SEC_DT_HMAC_SNOOP	0x04
404 
405 /* SEC AESU declarations and definitions */
406 #define SEC_AESU_MODE_ED	(1ULL << 0)
407 #define SEC_AESU_MODE_CBC	(1ULL << 1)
408 
409 /* SEC DEU declarations and definitions */
410 #define SEC_DEU_MODE_ED		(1ULL << 0)
411 #define SEC_DEU_MODE_TS		(1ULL << 1)
412 #define SEC_DEU_MODE_CBC	(1ULL << 2)
413 
414 /* SEC MDEU declarations and definitions */
415 #define SEC_HMAC_HASH_LEN	12
416 #define SEC_MDEU_MODE_SHA1	0x00	/* MDEU A */
417 #define SEC_MDEU_MODE_SHA384	0x00	/* MDEU B */
418 #define SEC_MDEU_MODE_SHA256	0x01
419 #define SEC_MDEU_MODE_MD5	0x02	/* MDEU A */
420 #define SEC_MDEU_MODE_SHA512	0x02	/* MDEU B */
421 #define SEC_MDEU_MODE_SHA224	0x03
422 #define SEC_MDEU_MODE_PD	(1ULL << 2)
423 #define SEC_MDEU_MODE_HMAC	(1ULL << 3)
424 #define SEC_MDEU_MODE_INIT	(1ULL << 4)
425 #define SEC_MDEU_MODE_SMAC	(1ULL << 5)
426 #define SEC_MDEU_MODE_CICV	(1ULL << 6)
427 #define SEC_MDEU_MODE_CONT	(1ULL << 7)
428 
429 #endif
430