Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/crypto/hisilicon/sec/sec_drv.h
26292 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/* Copyright (c) 2016-2017 HiSilicon Limited. */
3
4
#ifndef _SEC_DRV_H_
5
#define _SEC_DRV_H_
6
7
#include <crypto/algapi.h>
8
#include <linux/kfifo.h>
9
10
#define SEC_MAX_SGE_NUM 64
11
#define SEC_HW_RING_NUM 3
12
13
#define SEC_CMD_RING 0
14
#define SEC_OUTORDER_RING 1
15
#define SEC_DBG_RING 2
16
17
/* A reasonable length to balance memory use against flexibility */
18
#define SEC_QUEUE_LEN 512
19
20
#define SEC_MAX_SGE_NUM 64
21
22
struct sec_bd_info {
23
#define SEC_BD_W0_T_LEN_M GENMASK(4, 0)
24
#define SEC_BD_W0_T_LEN_S 0
25
26
#define SEC_BD_W0_C_WIDTH_M GENMASK(6, 5)
27
#define SEC_BD_W0_C_WIDTH_S 5
28
#define SEC_C_WIDTH_AES_128BIT 0
29
#define SEC_C_WIDTH_AES_8BIT 1
30
#define SEC_C_WIDTH_AES_1BIT 2
31
#define SEC_C_WIDTH_DES_64BIT 0
32
#define SEC_C_WIDTH_DES_8BIT 1
33
#define SEC_C_WIDTH_DES_1BIT 2
34
35
#define SEC_BD_W0_C_MODE_M GENMASK(9, 7)
36
#define SEC_BD_W0_C_MODE_S 7
37
#define SEC_C_MODE_ECB 0
38
#define SEC_C_MODE_CBC 1
39
#define SEC_C_MODE_CTR 4
40
#define SEC_C_MODE_CCM 5
41
#define SEC_C_MODE_GCM 6
42
#define SEC_C_MODE_XTS 7
43
44
#define SEC_BD_W0_SEQ BIT(10)
45
#define SEC_BD_W0_DE BIT(11)
46
#define SEC_BD_W0_DAT_SKIP_M GENMASK(13, 12)
47
#define SEC_BD_W0_DAT_SKIP_S 12
48
#define SEC_BD_W0_C_GRAN_SIZE_19_16_M GENMASK(17, 14)
49
#define SEC_BD_W0_C_GRAN_SIZE_19_16_S 14
50
51
#define SEC_BD_W0_CIPHER_M GENMASK(19, 18)
52
#define SEC_BD_W0_CIPHER_S 18
53
#define SEC_CIPHER_NULL 0
54
#define SEC_CIPHER_ENCRYPT 1
55
#define SEC_CIPHER_DECRYPT 2
56
57
#define SEC_BD_W0_AUTH_M GENMASK(21, 20)
58
#define SEC_BD_W0_AUTH_S 20
59
#define SEC_AUTH_NULL 0
60
#define SEC_AUTH_MAC 1
61
#define SEC_AUTH_VERIF 2
62
63
#define SEC_BD_W0_AI_GEN BIT(22)
64
#define SEC_BD_W0_CI_GEN BIT(23)
65
#define SEC_BD_W0_NO_HPAD BIT(24)
66
#define SEC_BD_W0_HM_M GENMASK(26, 25)
67
#define SEC_BD_W0_HM_S 25
68
#define SEC_BD_W0_ICV_OR_SKEY_EN_M GENMASK(28, 27)
69
#define SEC_BD_W0_ICV_OR_SKEY_EN_S 27
70
71
/* Multi purpose field - gran size bits for send, flag for recv */
72
#define SEC_BD_W0_FLAG_M GENMASK(30, 29)
73
#define SEC_BD_W0_C_GRAN_SIZE_21_20_M GENMASK(30, 29)
74
#define SEC_BD_W0_FLAG_S 29
75
#define SEC_BD_W0_C_GRAN_SIZE_21_20_S 29
76
77
#define SEC_BD_W0_DONE BIT(31)
78
u32 w0;
79
80
#define SEC_BD_W1_AUTH_GRAN_SIZE_M GENMASK(21, 0)
81
#define SEC_BD_W1_AUTH_GRAN_SIZE_S 0
82
#define SEC_BD_W1_M_KEY_EN BIT(22)
83
#define SEC_BD_W1_BD_INVALID BIT(23)
84
#define SEC_BD_W1_ADDR_TYPE BIT(24)
85
86
#define SEC_BD_W1_A_ALG_M GENMASK(28, 25)
87
#define SEC_BD_W1_A_ALG_S 25
88
#define SEC_A_ALG_SHA1 0
89
#define SEC_A_ALG_SHA256 1
90
#define SEC_A_ALG_MD5 2
91
#define SEC_A_ALG_SHA224 3
92
#define SEC_A_ALG_HMAC_SHA1 8
93
#define SEC_A_ALG_HMAC_SHA224 10
94
#define SEC_A_ALG_HMAC_SHA256 11
95
#define SEC_A_ALG_HMAC_MD5 12
96
#define SEC_A_ALG_AES_XCBC 13
97
#define SEC_A_ALG_AES_CMAC 14
98
99
#define SEC_BD_W1_C_ALG_M GENMASK(31, 29)
100
#define SEC_BD_W1_C_ALG_S 29
101
#define SEC_C_ALG_DES 0
102
#define SEC_C_ALG_3DES 1
103
#define SEC_C_ALG_AES 2
104
105
u32 w1;
106
107
#define SEC_BD_W2_C_GRAN_SIZE_15_0_M GENMASK(15, 0)
108
#define SEC_BD_W2_C_GRAN_SIZE_15_0_S 0
109
#define SEC_BD_W2_GRAN_NUM_M GENMASK(31, 16)
110
#define SEC_BD_W2_GRAN_NUM_S 16
111
u32 w2;
112
113
#define SEC_BD_W3_AUTH_LEN_OFFSET_M GENMASK(9, 0)
114
#define SEC_BD_W3_AUTH_LEN_OFFSET_S 0
115
#define SEC_BD_W3_CIPHER_LEN_OFFSET_M GENMASK(19, 10)
116
#define SEC_BD_W3_CIPHER_LEN_OFFSET_S 10
117
#define SEC_BD_W3_MAC_LEN_M GENMASK(24, 20)
118
#define SEC_BD_W3_MAC_LEN_S 20
119
#define SEC_BD_W3_A_KEY_LEN_M GENMASK(29, 25)
120
#define SEC_BD_W3_A_KEY_LEN_S 25
121
#define SEC_BD_W3_C_KEY_LEN_M GENMASK(31, 30)
122
#define SEC_BD_W3_C_KEY_LEN_S 30
123
#define SEC_KEY_LEN_AES_128 0
124
#define SEC_KEY_LEN_AES_192 1
125
#define SEC_KEY_LEN_AES_256 2
126
#define SEC_KEY_LEN_DES 1
127
#define SEC_KEY_LEN_3DES_3_KEY 1
128
#define SEC_KEY_LEN_3DES_2_KEY 3
129
u32 w3;
130
131
/* W4,5 */
132
union {
133
u32 authkey_addr_lo;
134
u32 authiv_addr_lo;
135
};
136
union {
137
u32 authkey_addr_hi;
138
u32 authiv_addr_hi;
139
};
140
141
/* W6,7 */
142
u32 cipher_key_addr_lo;
143
u32 cipher_key_addr_hi;
144
145
/* W8,9 */
146
u32 cipher_iv_addr_lo;
147
u32 cipher_iv_addr_hi;
148
149
/* W10,11 */
150
u32 data_addr_lo;
151
u32 data_addr_hi;
152
153
/* W12,13 */
154
u32 mac_addr_lo;
155
u32 mac_addr_hi;
156
157
/* W14,15 */
158
u32 cipher_destin_addr_lo;
159
u32 cipher_destin_addr_hi;
160
};
161
162
enum sec_mem_region {
163
SEC_COMMON = 0,
164
SEC_SAA,
165
SEC_NUM_ADDR_REGIONS
166
};
167
168
#define SEC_NAME_SIZE 64
169
#define SEC_Q_NUM 16
170
171
172
/**
173
* struct sec_queue_ring_cmd - store information about a SEC HW cmd ring
174
* @used: Local counter used to cheaply establish if the ring is empty.
175
* @lock: Protect against simultaneous adjusting of the read and write pointers.
176
* @vaddr: Virtual address for the ram pages used for the ring.
177
* @paddr: Physical address of the dma mapped region of ram used for the ring.
178
* @callback: Callback function called on a ring element completing.
179
*/
180
struct sec_queue_ring_cmd {
181
atomic_t used;
182
struct mutex lock;
183
struct sec_bd_info *vaddr;
184
dma_addr_t paddr;
185
void (*callback)(struct sec_bd_info *resp, void *ctx);
186
};
187
188
struct sec_debug_bd_info;
189
struct sec_queue_ring_db {
190
struct sec_debug_bd_info *vaddr;
191
dma_addr_t paddr;
192
};
193
194
struct sec_out_bd_info;
195
struct sec_queue_ring_cq {
196
struct sec_out_bd_info *vaddr;
197
dma_addr_t paddr;
198
};
199
200
struct sec_dev_info;
201
202
enum sec_cipher_alg {
203
SEC_C_DES_ECB_64,
204
SEC_C_DES_CBC_64,
205
206
SEC_C_3DES_ECB_192_3KEY,
207
SEC_C_3DES_ECB_192_2KEY,
208
209
SEC_C_3DES_CBC_192_3KEY,
210
SEC_C_3DES_CBC_192_2KEY,
211
212
SEC_C_AES_ECB_128,
213
SEC_C_AES_ECB_192,
214
SEC_C_AES_ECB_256,
215
216
SEC_C_AES_CBC_128,
217
SEC_C_AES_CBC_192,
218
SEC_C_AES_CBC_256,
219
220
SEC_C_AES_CTR_128,
221
SEC_C_AES_CTR_192,
222
SEC_C_AES_CTR_256,
223
224
SEC_C_AES_XTS_128,
225
SEC_C_AES_XTS_256,
226
227
SEC_C_NULL,
228
};
229
230
/**
231
* struct sec_alg_tfm_ctx - hardware specific tranformation context
232
* @cipher_alg: Cipher algorithm enabled include encryption mode.
233
* @key: Key storage if required.
234
* @pkey: DMA address for the key storage.
235
* @req_template: Request template to save time on setup.
236
* @queue: The hardware queue associated with this tfm context.
237
* @lock: Protect key and pkey to ensure they are consistent
238
* @auth_buf: Current context buffer for auth operations.
239
* @backlog: The backlog queue used for cases where our buffers aren't
240
* large enough.
241
*/
242
struct sec_alg_tfm_ctx {
243
enum sec_cipher_alg cipher_alg;
244
u8 *key;
245
dma_addr_t pkey;
246
struct sec_bd_info req_template;
247
struct sec_queue *queue;
248
struct mutex lock;
249
u8 *auth_buf;
250
struct list_head backlog;
251
};
252
253
/**
254
* struct sec_request - data associate with a single crypto request
255
* @elements: List of subparts of this request (hardware size restriction)
256
* @num_elements: The number of subparts (used as an optimization)
257
* @lock: Protect elements of this structure against concurrent change.
258
* @tfm_ctx: hardware specific context.
259
* @len_in: length of in sgl from upper layers
260
* @len_out: length of out sgl from upper layers
261
* @dma_iv: initialization vector - phsyical address
262
* @err: store used to track errors across subelements of this request.
263
* @req_base: pointer to base element of associate crypto context.
264
* This is needed to allow shared handling skcipher, ahash etc.
265
* @cb: completion callback.
266
* @backlog_head: list head to allow backlog maintenance.
267
*
268
* The hardware is limited in the maximum size of data that it can
269
* process from a single BD. Typically this is fairly large (32MB)
270
* but still requires the complexity of splitting the incoming
271
* skreq up into a number of elements complete with appropriate
272
* iv chaining.
273
*/
274
struct sec_request {
275
struct list_head elements;
276
int num_elements;
277
struct mutex lock;
278
struct sec_alg_tfm_ctx *tfm_ctx;
279
int len_in;
280
int len_out;
281
dma_addr_t dma_iv;
282
int err;
283
struct crypto_async_request *req_base;
284
void (*cb)(struct sec_bd_info *resp, struct crypto_async_request *req);
285
struct list_head backlog_head;
286
};
287
288
/**
289
* struct sec_request_el - A subpart of a request.
290
* @head: allow us to attach this to the list in the sec_request
291
* @req: hardware block descriptor corresponding to this request subpart
292
* @in: hardware sgl for input - virtual address
293
* @dma_in: hardware sgl for input - physical address
294
* @sgl_in: scatterlist for this request subpart
295
* @out: hardware sgl for output - virtual address
296
* @dma_out: hardware sgl for output - physical address
297
* @sgl_out: scatterlist for this request subpart
298
* @sec_req: The request which this subpart forms a part of
299
* @el_length: Number of bytes in this subpart. Needed to locate
300
* last ivsize chunk for iv chaining.
301
*/
302
struct sec_request_el {
303
struct list_head head;
304
struct sec_bd_info req;
305
struct sec_hw_sgl *in;
306
dma_addr_t dma_in;
307
struct scatterlist *sgl_in;
308
struct sec_hw_sgl *out;
309
dma_addr_t dma_out;
310
struct scatterlist *sgl_out;
311
struct sec_request *sec_req;
312
size_t el_length;
313
};
314
315
/**
316
* struct sec_queue - All the information about a HW queue
317
* @dev_info: The parent SEC device to which this queue belongs.
318
* @task_irq: Completion interrupt for the queue.
319
* @name: Human readable queue description also used as irq name.
320
* @ring: The several HW rings associated with one queue.
321
* @regs: The iomapped device registers
322
* @queue_id: Index of the queue used for naming and resource selection.
323
* @in_use: Flag to say if the queue is in use.
324
* @expected: The next expected element to finish assuming we were in order.
325
* @uprocessed: A bitmap to track which OoO elements are done but not handled.
326
* @softqueue: A software queue used when chaining requirements prevent direct
327
* use of the hardware queues.
328
* @havesoftqueue: A flag to say we have a queues - as we may need one for the
329
* current mode.
330
* @queuelock: Protect the soft queue from concurrent changes to avoid some
331
* potential loss of data races.
332
* @shadow: Pointers back to the shadow copy of the hardware ring element
333
* need because we can't store any context reference in the bd element.
334
*/
335
struct sec_queue {
336
struct sec_dev_info *dev_info;
337
int task_irq;
338
char name[SEC_NAME_SIZE];
339
struct sec_queue_ring_cmd ring_cmd;
340
struct sec_queue_ring_cq ring_cq;
341
struct sec_queue_ring_db ring_db;
342
void __iomem *regs;
343
u32 queue_id;
344
bool in_use;
345
int expected;
346
347
DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN);
348
DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *));
349
bool havesoftqueue;
350
spinlock_t queuelock;
351
void *shadow[SEC_QUEUE_LEN];
352
};
353
354
/**
355
* struct sec_hw_sge: Track each of the 64 element SEC HW SGL entries
356
* @buf: The IOV dma address for this entry.
357
* @len: Length of this IOV.
358
* @pad: Reserved space.
359
*/
360
struct sec_hw_sge {
361
dma_addr_t buf;
362
unsigned int len;
363
unsigned int pad;
364
};
365
366
/**
367
* struct sec_hw_sgl: One hardware SGL entry.
368
* @next_sgl: The next entry if we need to chain dma address. Null if last.
369
* @entry_sum_in_chain: The full count of SGEs - only matters for first SGL.
370
* @entry_sum_in_sgl: The number of SGEs in this SGL element.
371
* @flag: Unused in skciphers.
372
* @serial_num: Unsued in skciphers.
373
* @cpuid: Currently unused.
374
* @data_bytes_in_sgl: Count of bytes from all SGEs in this SGL.
375
* @next: Virtual address used to stash the next sgl - useful in completion.
376
* @reserved: A reserved field not currently used.
377
* @sge_entries: The (up to) 64 Scatter Gather Entries, representing IOVs.
378
* @node: Currently unused.
379
*/
380
struct sec_hw_sgl {
381
dma_addr_t next_sgl;
382
u16 entry_sum_in_chain;
383
u16 entry_sum_in_sgl;
384
u32 flag;
385
u64 serial_num;
386
u32 cpuid;
387
u32 data_bytes_in_sgl;
388
struct sec_hw_sgl *next;
389
u64 reserved;
390
struct sec_hw_sge sge_entries[SEC_MAX_SGE_NUM];
391
u8 node[16];
392
};
393
394
struct dma_pool;
395
396
/**
397
* struct sec_dev_info: The full SEC unit comprising queues and processors.
398
* @sec_id: Index used to track which SEC this is when more than one is present.
399
* @num_saas: The number of backed processors enabled.
400
* @regs: iomapped register regions shared by whole SEC unit.
401
* @dev_lock: Protects concurrent queue allocation / freeing for the SEC.
402
* @queues: The 16 queues that this SEC instance provides.
403
* @dev: Device pointer.
404
* @hw_sgl_pool: DMA pool used to mimise mapping for the scatter gather lists.
405
*/
406
struct sec_dev_info {
407
int sec_id;
408
int num_saas;
409
void __iomem *regs[SEC_NUM_ADDR_REGIONS];
410
struct mutex dev_lock;
411
int queues_in_use;
412
struct sec_queue queues[SEC_Q_NUM];
413
struct device *dev;
414
struct dma_pool *hw_sgl_pool;
415
};
416
417
int sec_queue_send(struct sec_queue *queue, struct sec_bd_info *msg, void *ctx);
418
bool sec_queue_can_enqueue(struct sec_queue *queue, int num);
419
int sec_queue_stop_release(struct sec_queue *queue);
420
struct sec_queue *sec_queue_alloc_start_safe(void);
421
bool sec_queue_empty(struct sec_queue *queue);
422
423
/* Algorithm specific elements from sec_algs.c */
424
void sec_alg_callback(struct sec_bd_info *resp, void *ctx);
425
int sec_algs_register(void);
426
void sec_algs_unregister(void);
427
428
#endif /* _SEC_DRV_H_ */
429
430