]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/sec/sec.h
gnu/dts: Update our copy of arm dts from Linux 4.16
[FreeBSD/FreeBSD.git] / sys / dev / sec / sec.h
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