xref: /openbmc/linux/drivers/crypto/sahara.c (revision 61bf3293)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Cryptographic API.
4  *
5  * Support for SAHARA cryptographic accelerator.
6  *
7  * Copyright (c) 2014 Steffen Trumtrar <s.trumtrar@pengutronix.de>
8  * Copyright (c) 2013 Vista Silicon S.L.
9  * Author: Javier Martin <javier.martin@vista-silicon.com>
10  *
11  * Based on omap-aes.c and tegra-aes.c
12  */
13 
14 #include <crypto/aes.h>
15 #include <crypto/internal/hash.h>
16 #include <crypto/internal/skcipher.h>
17 #include <crypto/scatterwalk.h>
18 #include <crypto/sha.h>
19 
20 #include <linux/clk.h>
21 #include <linux/crypto.h>
22 #include <linux/interrupt.h>
23 #include <linux/io.h>
24 #include <linux/irq.h>
25 #include <linux/kernel.h>
26 #include <linux/kthread.h>
27 #include <linux/module.h>
28 #include <linux/mutex.h>
29 #include <linux/of.h>
30 #include <linux/of_device.h>
31 #include <linux/platform_device.h>
32 
33 #define SHA_BUFFER_LEN		PAGE_SIZE
34 #define SAHARA_MAX_SHA_BLOCK_SIZE	SHA256_BLOCK_SIZE
35 
36 #define SAHARA_NAME "sahara"
37 #define SAHARA_VERSION_3	3
38 #define SAHARA_VERSION_4	4
39 #define SAHARA_TIMEOUT_MS	1000
40 #define SAHARA_MAX_HW_DESC	2
41 #define SAHARA_MAX_HW_LINK	20
42 
43 #define FLAGS_MODE_MASK		0x000f
44 #define FLAGS_ENCRYPT		BIT(0)
45 #define FLAGS_CBC		BIT(1)
46 #define FLAGS_NEW_KEY		BIT(3)
47 
48 #define SAHARA_HDR_BASE			0x00800000
49 #define SAHARA_HDR_SKHA_ALG_AES	0
50 #define SAHARA_HDR_SKHA_OP_ENC		(1 << 2)
51 #define SAHARA_HDR_SKHA_MODE_ECB	(0 << 3)
52 #define SAHARA_HDR_SKHA_MODE_CBC	(1 << 3)
53 #define SAHARA_HDR_FORM_DATA		(5 << 16)
54 #define SAHARA_HDR_FORM_KEY		(8 << 16)
55 #define SAHARA_HDR_LLO			(1 << 24)
56 #define SAHARA_HDR_CHA_SKHA		(1 << 28)
57 #define SAHARA_HDR_CHA_MDHA		(2 << 28)
58 #define SAHARA_HDR_PARITY_BIT		(1 << 31)
59 
60 #define SAHARA_HDR_MDHA_SET_MODE_MD_KEY	0x20880000
61 #define SAHARA_HDR_MDHA_SET_MODE_HASH	0x208D0000
62 #define SAHARA_HDR_MDHA_HASH		0xA0850000
63 #define SAHARA_HDR_MDHA_STORE_DIGEST	0x20820000
64 #define SAHARA_HDR_MDHA_ALG_SHA1	0
65 #define SAHARA_HDR_MDHA_ALG_MD5		1
66 #define SAHARA_HDR_MDHA_ALG_SHA256	2
67 #define SAHARA_HDR_MDHA_ALG_SHA224	3
68 #define SAHARA_HDR_MDHA_PDATA		(1 << 2)
69 #define SAHARA_HDR_MDHA_HMAC		(1 << 3)
70 #define SAHARA_HDR_MDHA_INIT		(1 << 5)
71 #define SAHARA_HDR_MDHA_IPAD		(1 << 6)
72 #define SAHARA_HDR_MDHA_OPAD		(1 << 7)
73 #define SAHARA_HDR_MDHA_SWAP		(1 << 8)
74 #define SAHARA_HDR_MDHA_MAC_FULL	(1 << 9)
75 #define SAHARA_HDR_MDHA_SSL		(1 << 10)
76 
77 /* SAHARA can only process one request at a time */
78 #define SAHARA_QUEUE_LENGTH	1
79 
80 #define SAHARA_REG_VERSION	0x00
81 #define SAHARA_REG_DAR		0x04
82 #define SAHARA_REG_CONTROL	0x08
83 #define		SAHARA_CONTROL_SET_THROTTLE(x)	(((x) & 0xff) << 24)
84 #define		SAHARA_CONTROL_SET_MAXBURST(x)	(((x) & 0xff) << 16)
85 #define		SAHARA_CONTROL_RNG_AUTORSD	(1 << 7)
86 #define		SAHARA_CONTROL_ENABLE_INT	(1 << 4)
87 #define SAHARA_REG_CMD		0x0C
88 #define		SAHARA_CMD_RESET		(1 << 0)
89 #define		SAHARA_CMD_CLEAR_INT		(1 << 8)
90 #define		SAHARA_CMD_CLEAR_ERR		(1 << 9)
91 #define		SAHARA_CMD_SINGLE_STEP		(1 << 10)
92 #define		SAHARA_CMD_MODE_BATCH		(1 << 16)
93 #define		SAHARA_CMD_MODE_DEBUG		(1 << 18)
94 #define	SAHARA_REG_STATUS	0x10
95 #define		SAHARA_STATUS_GET_STATE(x)	((x) & 0x7)
96 #define			SAHARA_STATE_IDLE	0
97 #define			SAHARA_STATE_BUSY	1
98 #define			SAHARA_STATE_ERR	2
99 #define			SAHARA_STATE_FAULT	3
100 #define			SAHARA_STATE_COMPLETE	4
101 #define			SAHARA_STATE_COMP_FLAG	(1 << 2)
102 #define		SAHARA_STATUS_DAR_FULL		(1 << 3)
103 #define		SAHARA_STATUS_ERROR		(1 << 4)
104 #define		SAHARA_STATUS_SECURE		(1 << 5)
105 #define		SAHARA_STATUS_FAIL		(1 << 6)
106 #define		SAHARA_STATUS_INIT		(1 << 7)
107 #define		SAHARA_STATUS_RNG_RESEED	(1 << 8)
108 #define		SAHARA_STATUS_ACTIVE_RNG	(1 << 9)
109 #define		SAHARA_STATUS_ACTIVE_MDHA	(1 << 10)
110 #define		SAHARA_STATUS_ACTIVE_SKHA	(1 << 11)
111 #define		SAHARA_STATUS_MODE_BATCH	(1 << 16)
112 #define		SAHARA_STATUS_MODE_DEDICATED	(1 << 17)
113 #define		SAHARA_STATUS_MODE_DEBUG	(1 << 18)
114 #define		SAHARA_STATUS_GET_ISTATE(x)	(((x) >> 24) & 0xff)
115 #define SAHARA_REG_ERRSTATUS	0x14
116 #define		SAHARA_ERRSTATUS_GET_SOURCE(x)	((x) & 0xf)
117 #define			SAHARA_ERRSOURCE_CHA	14
118 #define			SAHARA_ERRSOURCE_DMA	15
119 #define		SAHARA_ERRSTATUS_DMA_DIR	(1 << 8)
120 #define		SAHARA_ERRSTATUS_GET_DMASZ(x)(((x) >> 9) & 0x3)
121 #define		SAHARA_ERRSTATUS_GET_DMASRC(x) (((x) >> 13) & 0x7)
122 #define		SAHARA_ERRSTATUS_GET_CHASRC(x)	(((x) >> 16) & 0xfff)
123 #define		SAHARA_ERRSTATUS_GET_CHAERR(x)	(((x) >> 28) & 0x3)
124 #define SAHARA_REG_FADDR	0x18
125 #define SAHARA_REG_CDAR		0x1C
126 #define SAHARA_REG_IDAR		0x20
127 
128 struct sahara_hw_desc {
129 	u32	hdr;
130 	u32	len1;
131 	u32	p1;
132 	u32	len2;
133 	u32	p2;
134 	u32	next;
135 };
136 
137 struct sahara_hw_link {
138 	u32	len;
139 	u32	p;
140 	u32	next;
141 };
142 
143 struct sahara_ctx {
144 	unsigned long flags;
145 
146 	/* AES-specific context */
147 	int keylen;
148 	u8 key[AES_KEYSIZE_128];
149 	struct crypto_sync_skcipher *fallback;
150 };
151 
152 struct sahara_aes_reqctx {
153 	unsigned long mode;
154 };
155 
156 /*
157  * struct sahara_sha_reqctx - private data per request
158  * @buf: holds data for requests smaller than block_size
159  * @rembuf: used to prepare one block_size-aligned request
160  * @context: hw-specific context for request. Digest is extracted from this
161  * @mode: specifies what type of hw-descriptor needs to be built
162  * @digest_size: length of digest for this request
163  * @context_size: length of hw-context for this request.
164  *                Always digest_size + 4
165  * @buf_cnt: number of bytes saved in buf
166  * @sg_in_idx: number of hw links
167  * @in_sg: scatterlist for input data
168  * @in_sg_chain: scatterlists for chained input data
169  * @total: total number of bytes for transfer
170  * @last: is this the last block
171  * @first: is this the first block
172  * @active: inside a transfer
173  */
174 struct sahara_sha_reqctx {
175 	u8			buf[SAHARA_MAX_SHA_BLOCK_SIZE];
176 	u8			rembuf[SAHARA_MAX_SHA_BLOCK_SIZE];
177 	u8			context[SHA256_DIGEST_SIZE + 4];
178 	unsigned int		mode;
179 	unsigned int		digest_size;
180 	unsigned int		context_size;
181 	unsigned int		buf_cnt;
182 	unsigned int		sg_in_idx;
183 	struct scatterlist	*in_sg;
184 	struct scatterlist	in_sg_chain[2];
185 	size_t			total;
186 	unsigned int		last;
187 	unsigned int		first;
188 	unsigned int		active;
189 };
190 
191 struct sahara_dev {
192 	struct device		*device;
193 	unsigned int		version;
194 	void __iomem		*regs_base;
195 	struct clk		*clk_ipg;
196 	struct clk		*clk_ahb;
197 	struct mutex		queue_mutex;
198 	struct task_struct	*kthread;
199 	struct completion	dma_completion;
200 
201 	struct sahara_ctx	*ctx;
202 	struct crypto_queue	queue;
203 	unsigned long		flags;
204 
205 	struct sahara_hw_desc	*hw_desc[SAHARA_MAX_HW_DESC];
206 	dma_addr_t		hw_phys_desc[SAHARA_MAX_HW_DESC];
207 
208 	u8			*key_base;
209 	dma_addr_t		key_phys_base;
210 
211 	u8			*iv_base;
212 	dma_addr_t		iv_phys_base;
213 
214 	u8			*context_base;
215 	dma_addr_t		context_phys_base;
216 
217 	struct sahara_hw_link	*hw_link[SAHARA_MAX_HW_LINK];
218 	dma_addr_t		hw_phys_link[SAHARA_MAX_HW_LINK];
219 
220 	size_t			total;
221 	struct scatterlist	*in_sg;
222 	int		nb_in_sg;
223 	struct scatterlist	*out_sg;
224 	int		nb_out_sg;
225 
226 	u32			error;
227 };
228 
229 static struct sahara_dev *dev_ptr;
230 
231 static inline void sahara_write(struct sahara_dev *dev, u32 data, u32 reg)
232 {
233 	writel(data, dev->regs_base + reg);
234 }
235 
236 static inline unsigned int sahara_read(struct sahara_dev *dev, u32 reg)
237 {
238 	return readl(dev->regs_base + reg);
239 }
240 
241 static u32 sahara_aes_key_hdr(struct sahara_dev *dev)
242 {
243 	u32 hdr = SAHARA_HDR_BASE | SAHARA_HDR_SKHA_ALG_AES |
244 			SAHARA_HDR_FORM_KEY | SAHARA_HDR_LLO |
245 			SAHARA_HDR_CHA_SKHA | SAHARA_HDR_PARITY_BIT;
246 
247 	if (dev->flags & FLAGS_CBC) {
248 		hdr |= SAHARA_HDR_SKHA_MODE_CBC;
249 		hdr ^= SAHARA_HDR_PARITY_BIT;
250 	}
251 
252 	if (dev->flags & FLAGS_ENCRYPT) {
253 		hdr |= SAHARA_HDR_SKHA_OP_ENC;
254 		hdr ^= SAHARA_HDR_PARITY_BIT;
255 	}
256 
257 	return hdr;
258 }
259 
260 static u32 sahara_aes_data_link_hdr(struct sahara_dev *dev)
261 {
262 	return SAHARA_HDR_BASE | SAHARA_HDR_FORM_DATA |
263 			SAHARA_HDR_CHA_SKHA | SAHARA_HDR_PARITY_BIT;
264 }
265 
266 static const char *sahara_err_src[16] = {
267 	"No error",
268 	"Header error",
269 	"Descriptor length error",
270 	"Descriptor length or pointer error",
271 	"Link length error",
272 	"Link pointer error",
273 	"Input buffer error",
274 	"Output buffer error",
275 	"Output buffer starvation",
276 	"Internal state fault",
277 	"General descriptor problem",
278 	"Reserved",
279 	"Descriptor address error",
280 	"Link address error",
281 	"CHA error",
282 	"DMA error"
283 };
284 
285 static const char *sahara_err_dmasize[4] = {
286 	"Byte transfer",
287 	"Half-word transfer",
288 	"Word transfer",
289 	"Reserved"
290 };
291 
292 static const char *sahara_err_dmasrc[8] = {
293 	"No error",
294 	"AHB bus error",
295 	"Internal IP bus error",
296 	"Parity error",
297 	"DMA crosses 256 byte boundary",
298 	"DMA is busy",
299 	"Reserved",
300 	"DMA HW error"
301 };
302 
303 static const char *sahara_cha_errsrc[12] = {
304 	"Input buffer non-empty",
305 	"Illegal address",
306 	"Illegal mode",
307 	"Illegal data size",
308 	"Illegal key size",
309 	"Write during processing",
310 	"CTX read during processing",
311 	"HW error",
312 	"Input buffer disabled/underflow",
313 	"Output buffer disabled/overflow",
314 	"DES key parity error",
315 	"Reserved"
316 };
317 
318 static const char *sahara_cha_err[4] = { "No error", "SKHA", "MDHA", "RNG" };
319 
320 static void sahara_decode_error(struct sahara_dev *dev, unsigned int error)
321 {
322 	u8 source = SAHARA_ERRSTATUS_GET_SOURCE(error);
323 	u16 chasrc = ffs(SAHARA_ERRSTATUS_GET_CHASRC(error));
324 
325 	dev_err(dev->device, "%s: Error Register = 0x%08x\n", __func__, error);
326 
327 	dev_err(dev->device, "	- %s.\n", sahara_err_src[source]);
328 
329 	if (source == SAHARA_ERRSOURCE_DMA) {
330 		if (error & SAHARA_ERRSTATUS_DMA_DIR)
331 			dev_err(dev->device, "		* DMA read.\n");
332 		else
333 			dev_err(dev->device, "		* DMA write.\n");
334 
335 		dev_err(dev->device, "		* %s.\n",
336 		       sahara_err_dmasize[SAHARA_ERRSTATUS_GET_DMASZ(error)]);
337 		dev_err(dev->device, "		* %s.\n",
338 		       sahara_err_dmasrc[SAHARA_ERRSTATUS_GET_DMASRC(error)]);
339 	} else if (source == SAHARA_ERRSOURCE_CHA) {
340 		dev_err(dev->device, "		* %s.\n",
341 			sahara_cha_errsrc[chasrc]);
342 		dev_err(dev->device, "		* %s.\n",
343 		       sahara_cha_err[SAHARA_ERRSTATUS_GET_CHAERR(error)]);
344 	}
345 	dev_err(dev->device, "\n");
346 }
347 
348 static const char *sahara_state[4] = { "Idle", "Busy", "Error", "HW Fault" };
349 
350 static void sahara_decode_status(struct sahara_dev *dev, unsigned int status)
351 {
352 	u8 state;
353 
354 	if (!__is_defined(DEBUG))
355 		return;
356 
357 	state = SAHARA_STATUS_GET_STATE(status);
358 
359 	dev_dbg(dev->device, "%s: Status Register = 0x%08x\n",
360 		__func__, status);
361 
362 	dev_dbg(dev->device, "	- State = %d:\n", state);
363 	if (state & SAHARA_STATE_COMP_FLAG)
364 		dev_dbg(dev->device, "		* Descriptor completed. IRQ pending.\n");
365 
366 	dev_dbg(dev->device, "		* %s.\n",
367 	       sahara_state[state & ~SAHARA_STATE_COMP_FLAG]);
368 
369 	if (status & SAHARA_STATUS_DAR_FULL)
370 		dev_dbg(dev->device, "	- DAR Full.\n");
371 	if (status & SAHARA_STATUS_ERROR)
372 		dev_dbg(dev->device, "	- Error.\n");
373 	if (status & SAHARA_STATUS_SECURE)
374 		dev_dbg(dev->device, "	- Secure.\n");
375 	if (status & SAHARA_STATUS_FAIL)
376 		dev_dbg(dev->device, "	- Fail.\n");
377 	if (status & SAHARA_STATUS_RNG_RESEED)
378 		dev_dbg(dev->device, "	- RNG Reseed Request.\n");
379 	if (status & SAHARA_STATUS_ACTIVE_RNG)
380 		dev_dbg(dev->device, "	- RNG Active.\n");
381 	if (status & SAHARA_STATUS_ACTIVE_MDHA)
382 		dev_dbg(dev->device, "	- MDHA Active.\n");
383 	if (status & SAHARA_STATUS_ACTIVE_SKHA)
384 		dev_dbg(dev->device, "	- SKHA Active.\n");
385 
386 	if (status & SAHARA_STATUS_MODE_BATCH)
387 		dev_dbg(dev->device, "	- Batch Mode.\n");
388 	else if (status & SAHARA_STATUS_MODE_DEDICATED)
389 		dev_dbg(dev->device, "	- Dedicated Mode.\n");
390 	else if (status & SAHARA_STATUS_MODE_DEBUG)
391 		dev_dbg(dev->device, "	- Debug Mode.\n");
392 
393 	dev_dbg(dev->device, "	- Internal state = 0x%02x\n",
394 	       SAHARA_STATUS_GET_ISTATE(status));
395 
396 	dev_dbg(dev->device, "Current DAR: 0x%08x\n",
397 		sahara_read(dev, SAHARA_REG_CDAR));
398 	dev_dbg(dev->device, "Initial DAR: 0x%08x\n\n",
399 		sahara_read(dev, SAHARA_REG_IDAR));
400 }
401 
402 static void sahara_dump_descriptors(struct sahara_dev *dev)
403 {
404 	int i;
405 
406 	if (!__is_defined(DEBUG))
407 		return;
408 
409 	for (i = 0; i < SAHARA_MAX_HW_DESC; i++) {
410 		dev_dbg(dev->device, "Descriptor (%d) (%pad):\n",
411 			i, &dev->hw_phys_desc[i]);
412 		dev_dbg(dev->device, "\thdr = 0x%08x\n", dev->hw_desc[i]->hdr);
413 		dev_dbg(dev->device, "\tlen1 = %u\n", dev->hw_desc[i]->len1);
414 		dev_dbg(dev->device, "\tp1 = 0x%08x\n", dev->hw_desc[i]->p1);
415 		dev_dbg(dev->device, "\tlen2 = %u\n", dev->hw_desc[i]->len2);
416 		dev_dbg(dev->device, "\tp2 = 0x%08x\n", dev->hw_desc[i]->p2);
417 		dev_dbg(dev->device, "\tnext = 0x%08x\n",
418 			dev->hw_desc[i]->next);
419 	}
420 	dev_dbg(dev->device, "\n");
421 }
422 
423 static void sahara_dump_links(struct sahara_dev *dev)
424 {
425 	int i;
426 
427 	if (!__is_defined(DEBUG))
428 		return;
429 
430 	for (i = 0; i < SAHARA_MAX_HW_LINK; i++) {
431 		dev_dbg(dev->device, "Link (%d) (%pad):\n",
432 			i, &dev->hw_phys_link[i]);
433 		dev_dbg(dev->device, "\tlen = %u\n", dev->hw_link[i]->len);
434 		dev_dbg(dev->device, "\tp = 0x%08x\n", dev->hw_link[i]->p);
435 		dev_dbg(dev->device, "\tnext = 0x%08x\n",
436 			dev->hw_link[i]->next);
437 	}
438 	dev_dbg(dev->device, "\n");
439 }
440 
441 static int sahara_hw_descriptor_create(struct sahara_dev *dev)
442 {
443 	struct sahara_ctx *ctx = dev->ctx;
444 	struct scatterlist *sg;
445 	int ret;
446 	int i, j;
447 	int idx = 0;
448 
449 	/* Copy new key if necessary */
450 	if (ctx->flags & FLAGS_NEW_KEY) {
451 		memcpy(dev->key_base, ctx->key, ctx->keylen);
452 		ctx->flags &= ~FLAGS_NEW_KEY;
453 
454 		if (dev->flags & FLAGS_CBC) {
455 			dev->hw_desc[idx]->len1 = AES_BLOCK_SIZE;
456 			dev->hw_desc[idx]->p1 = dev->iv_phys_base;
457 		} else {
458 			dev->hw_desc[idx]->len1 = 0;
459 			dev->hw_desc[idx]->p1 = 0;
460 		}
461 		dev->hw_desc[idx]->len2 = ctx->keylen;
462 		dev->hw_desc[idx]->p2 = dev->key_phys_base;
463 		dev->hw_desc[idx]->next = dev->hw_phys_desc[1];
464 
465 		dev->hw_desc[idx]->hdr = sahara_aes_key_hdr(dev);
466 
467 		idx++;
468 	}
469 
470 	dev->nb_in_sg = sg_nents_for_len(dev->in_sg, dev->total);
471 	if (dev->nb_in_sg < 0) {
472 		dev_err(dev->device, "Invalid numbers of src SG.\n");
473 		return dev->nb_in_sg;
474 	}
475 	dev->nb_out_sg = sg_nents_for_len(dev->out_sg, dev->total);
476 	if (dev->nb_out_sg < 0) {
477 		dev_err(dev->device, "Invalid numbers of dst SG.\n");
478 		return dev->nb_out_sg;
479 	}
480 	if ((dev->nb_in_sg + dev->nb_out_sg) > SAHARA_MAX_HW_LINK) {
481 		dev_err(dev->device, "not enough hw links (%d)\n",
482 			dev->nb_in_sg + dev->nb_out_sg);
483 		return -EINVAL;
484 	}
485 
486 	ret = dma_map_sg(dev->device, dev->in_sg, dev->nb_in_sg,
487 			 DMA_TO_DEVICE);
488 	if (ret != dev->nb_in_sg) {
489 		dev_err(dev->device, "couldn't map in sg\n");
490 		goto unmap_in;
491 	}
492 	ret = dma_map_sg(dev->device, dev->out_sg, dev->nb_out_sg,
493 			 DMA_FROM_DEVICE);
494 	if (ret != dev->nb_out_sg) {
495 		dev_err(dev->device, "couldn't map out sg\n");
496 		goto unmap_out;
497 	}
498 
499 	/* Create input links */
500 	dev->hw_desc[idx]->p1 = dev->hw_phys_link[0];
501 	sg = dev->in_sg;
502 	for (i = 0; i < dev->nb_in_sg; i++) {
503 		dev->hw_link[i]->len = sg->length;
504 		dev->hw_link[i]->p = sg->dma_address;
505 		if (i == (dev->nb_in_sg - 1)) {
506 			dev->hw_link[i]->next = 0;
507 		} else {
508 			dev->hw_link[i]->next = dev->hw_phys_link[i + 1];
509 			sg = sg_next(sg);
510 		}
511 	}
512 
513 	/* Create output links */
514 	dev->hw_desc[idx]->p2 = dev->hw_phys_link[i];
515 	sg = dev->out_sg;
516 	for (j = i; j < dev->nb_out_sg + i; j++) {
517 		dev->hw_link[j]->len = sg->length;
518 		dev->hw_link[j]->p = sg->dma_address;
519 		if (j == (dev->nb_out_sg + i - 1)) {
520 			dev->hw_link[j]->next = 0;
521 		} else {
522 			dev->hw_link[j]->next = dev->hw_phys_link[j + 1];
523 			sg = sg_next(sg);
524 		}
525 	}
526 
527 	/* Fill remaining fields of hw_desc[1] */
528 	dev->hw_desc[idx]->hdr = sahara_aes_data_link_hdr(dev);
529 	dev->hw_desc[idx]->len1 = dev->total;
530 	dev->hw_desc[idx]->len2 = dev->total;
531 	dev->hw_desc[idx]->next = 0;
532 
533 	sahara_dump_descriptors(dev);
534 	sahara_dump_links(dev);
535 
536 	sahara_write(dev, dev->hw_phys_desc[0], SAHARA_REG_DAR);
537 
538 	return 0;
539 
540 unmap_out:
541 	dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg,
542 		DMA_FROM_DEVICE);
543 unmap_in:
544 	dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
545 		DMA_TO_DEVICE);
546 
547 	return -EINVAL;
548 }
549 
550 static int sahara_aes_process(struct skcipher_request *req)
551 {
552 	struct sahara_dev *dev = dev_ptr;
553 	struct sahara_ctx *ctx;
554 	struct sahara_aes_reqctx *rctx;
555 	int ret;
556 	unsigned long timeout;
557 
558 	/* Request is ready to be dispatched by the device */
559 	dev_dbg(dev->device,
560 		"dispatch request (nbytes=%d, src=%p, dst=%p)\n",
561 		req->cryptlen, req->src, req->dst);
562 
563 	/* assign new request to device */
564 	dev->total = req->cryptlen;
565 	dev->in_sg = req->src;
566 	dev->out_sg = req->dst;
567 
568 	rctx = skcipher_request_ctx(req);
569 	ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
570 	rctx->mode &= FLAGS_MODE_MASK;
571 	dev->flags = (dev->flags & ~FLAGS_MODE_MASK) | rctx->mode;
572 
573 	if ((dev->flags & FLAGS_CBC) && req->iv)
574 		memcpy(dev->iv_base, req->iv, AES_KEYSIZE_128);
575 
576 	/* assign new context to device */
577 	dev->ctx = ctx;
578 
579 	reinit_completion(&dev->dma_completion);
580 
581 	ret = sahara_hw_descriptor_create(dev);
582 	if (ret)
583 		return -EINVAL;
584 
585 	timeout = wait_for_completion_timeout(&dev->dma_completion,
586 				msecs_to_jiffies(SAHARA_TIMEOUT_MS));
587 	if (!timeout) {
588 		dev_err(dev->device, "AES timeout\n");
589 		return -ETIMEDOUT;
590 	}
591 
592 	dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg,
593 		DMA_FROM_DEVICE);
594 	dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
595 		DMA_TO_DEVICE);
596 
597 	return 0;
598 }
599 
600 static int sahara_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
601 			     unsigned int keylen)
602 {
603 	struct sahara_ctx *ctx = crypto_skcipher_ctx(tfm);
604 
605 	ctx->keylen = keylen;
606 
607 	/* SAHARA only supports 128bit keys */
608 	if (keylen == AES_KEYSIZE_128) {
609 		memcpy(ctx->key, key, keylen);
610 		ctx->flags |= FLAGS_NEW_KEY;
611 		return 0;
612 	}
613 
614 	if (keylen != AES_KEYSIZE_192 && keylen != AES_KEYSIZE_256)
615 		return -EINVAL;
616 
617 	/*
618 	 * The requested key size is not supported by HW, do a fallback.
619 	 */
620 	crypto_sync_skcipher_clear_flags(ctx->fallback, CRYPTO_TFM_REQ_MASK);
621 	crypto_sync_skcipher_set_flags(ctx->fallback, tfm->base.crt_flags &
622 						 CRYPTO_TFM_REQ_MASK);
623 	return crypto_sync_skcipher_setkey(ctx->fallback, key, keylen);
624 }
625 
626 static int sahara_aes_crypt(struct skcipher_request *req, unsigned long mode)
627 {
628 	struct sahara_aes_reqctx *rctx = skcipher_request_ctx(req);
629 	struct sahara_dev *dev = dev_ptr;
630 	int err = 0;
631 
632 	dev_dbg(dev->device, "nbytes: %d, enc: %d, cbc: %d\n",
633 		req->cryptlen, !!(mode & FLAGS_ENCRYPT), !!(mode & FLAGS_CBC));
634 
635 	if (!IS_ALIGNED(req->cryptlen, AES_BLOCK_SIZE)) {
636 		dev_err(dev->device,
637 			"request size is not exact amount of AES blocks\n");
638 		return -EINVAL;
639 	}
640 
641 	rctx->mode = mode;
642 
643 	mutex_lock(&dev->queue_mutex);
644 	err = crypto_enqueue_request(&dev->queue, &req->base);
645 	mutex_unlock(&dev->queue_mutex);
646 
647 	wake_up_process(dev->kthread);
648 
649 	return err;
650 }
651 
652 static int sahara_aes_ecb_encrypt(struct skcipher_request *req)
653 {
654 	struct sahara_ctx *ctx = crypto_skcipher_ctx(
655 		crypto_skcipher_reqtfm(req));
656 	int err;
657 
658 	if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
659 		SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
660 
661 		skcipher_request_set_sync_tfm(subreq, ctx->fallback);
662 		skcipher_request_set_callback(subreq, req->base.flags,
663 					      NULL, NULL);
664 		skcipher_request_set_crypt(subreq, req->src, req->dst,
665 					   req->cryptlen, req->iv);
666 		err = crypto_skcipher_encrypt(subreq);
667 		skcipher_request_zero(subreq);
668 		return err;
669 	}
670 
671 	return sahara_aes_crypt(req, FLAGS_ENCRYPT);
672 }
673 
674 static int sahara_aes_ecb_decrypt(struct skcipher_request *req)
675 {
676 	struct sahara_ctx *ctx = crypto_skcipher_ctx(
677 		crypto_skcipher_reqtfm(req));
678 	int err;
679 
680 	if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
681 		SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
682 
683 		skcipher_request_set_sync_tfm(subreq, ctx->fallback);
684 		skcipher_request_set_callback(subreq, req->base.flags,
685 					      NULL, NULL);
686 		skcipher_request_set_crypt(subreq, req->src, req->dst,
687 					   req->cryptlen, req->iv);
688 		err = crypto_skcipher_decrypt(subreq);
689 		skcipher_request_zero(subreq);
690 		return err;
691 	}
692 
693 	return sahara_aes_crypt(req, 0);
694 }
695 
696 static int sahara_aes_cbc_encrypt(struct skcipher_request *req)
697 {
698 	struct sahara_ctx *ctx = crypto_skcipher_ctx(
699 		crypto_skcipher_reqtfm(req));
700 	int err;
701 
702 	if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
703 		SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
704 
705 		skcipher_request_set_sync_tfm(subreq, ctx->fallback);
706 		skcipher_request_set_callback(subreq, req->base.flags,
707 					      NULL, NULL);
708 		skcipher_request_set_crypt(subreq, req->src, req->dst,
709 					   req->cryptlen, req->iv);
710 		err = crypto_skcipher_encrypt(subreq);
711 		skcipher_request_zero(subreq);
712 		return err;
713 	}
714 
715 	return sahara_aes_crypt(req, FLAGS_ENCRYPT | FLAGS_CBC);
716 }
717 
718 static int sahara_aes_cbc_decrypt(struct skcipher_request *req)
719 {
720 	struct sahara_ctx *ctx = crypto_skcipher_ctx(
721 		crypto_skcipher_reqtfm(req));
722 	int err;
723 
724 	if (unlikely(ctx->keylen != AES_KEYSIZE_128)) {
725 		SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
726 
727 		skcipher_request_set_sync_tfm(subreq, ctx->fallback);
728 		skcipher_request_set_callback(subreq, req->base.flags,
729 					      NULL, NULL);
730 		skcipher_request_set_crypt(subreq, req->src, req->dst,
731 					   req->cryptlen, req->iv);
732 		err = crypto_skcipher_decrypt(subreq);
733 		skcipher_request_zero(subreq);
734 		return err;
735 	}
736 
737 	return sahara_aes_crypt(req, FLAGS_CBC);
738 }
739 
740 static int sahara_aes_init_tfm(struct crypto_skcipher *tfm)
741 {
742 	const char *name = crypto_tfm_alg_name(&tfm->base);
743 	struct sahara_ctx *ctx = crypto_skcipher_ctx(tfm);
744 
745 	ctx->fallback = crypto_alloc_sync_skcipher(name, 0,
746 					      CRYPTO_ALG_NEED_FALLBACK);
747 	if (IS_ERR(ctx->fallback)) {
748 		pr_err("Error allocating fallback algo %s\n", name);
749 		return PTR_ERR(ctx->fallback);
750 	}
751 
752 	crypto_skcipher_set_reqsize(tfm, sizeof(struct sahara_aes_reqctx));
753 
754 	return 0;
755 }
756 
757 static void sahara_aes_exit_tfm(struct crypto_skcipher *tfm)
758 {
759 	struct sahara_ctx *ctx = crypto_skcipher_ctx(tfm);
760 
761 	crypto_free_sync_skcipher(ctx->fallback);
762 }
763 
764 static u32 sahara_sha_init_hdr(struct sahara_dev *dev,
765 			      struct sahara_sha_reqctx *rctx)
766 {
767 	u32 hdr = 0;
768 
769 	hdr = rctx->mode;
770 
771 	if (rctx->first) {
772 		hdr |= SAHARA_HDR_MDHA_SET_MODE_HASH;
773 		hdr |= SAHARA_HDR_MDHA_INIT;
774 	} else {
775 		hdr |= SAHARA_HDR_MDHA_SET_MODE_MD_KEY;
776 	}
777 
778 	if (rctx->last)
779 		hdr |= SAHARA_HDR_MDHA_PDATA;
780 
781 	if (hweight_long(hdr) % 2 == 0)
782 		hdr |= SAHARA_HDR_PARITY_BIT;
783 
784 	return hdr;
785 }
786 
787 static int sahara_sha_hw_links_create(struct sahara_dev *dev,
788 				       struct sahara_sha_reqctx *rctx,
789 				       int start)
790 {
791 	struct scatterlist *sg;
792 	unsigned int i;
793 	int ret;
794 
795 	dev->in_sg = rctx->in_sg;
796 
797 	dev->nb_in_sg = sg_nents_for_len(dev->in_sg, rctx->total);
798 	if (dev->nb_in_sg < 0) {
799 		dev_err(dev->device, "Invalid numbers of src SG.\n");
800 		return dev->nb_in_sg;
801 	}
802 	if ((dev->nb_in_sg) > SAHARA_MAX_HW_LINK) {
803 		dev_err(dev->device, "not enough hw links (%d)\n",
804 			dev->nb_in_sg + dev->nb_out_sg);
805 		return -EINVAL;
806 	}
807 
808 	sg = dev->in_sg;
809 	ret = dma_map_sg(dev->device, dev->in_sg, dev->nb_in_sg, DMA_TO_DEVICE);
810 	if (!ret)
811 		return -EFAULT;
812 
813 	for (i = start; i < dev->nb_in_sg + start; i++) {
814 		dev->hw_link[i]->len = sg->length;
815 		dev->hw_link[i]->p = sg->dma_address;
816 		if (i == (dev->nb_in_sg + start - 1)) {
817 			dev->hw_link[i]->next = 0;
818 		} else {
819 			dev->hw_link[i]->next = dev->hw_phys_link[i + 1];
820 			sg = sg_next(sg);
821 		}
822 	}
823 
824 	return i;
825 }
826 
827 static int sahara_sha_hw_data_descriptor_create(struct sahara_dev *dev,
828 						struct sahara_sha_reqctx *rctx,
829 						struct ahash_request *req,
830 						int index)
831 {
832 	unsigned result_len;
833 	int i = index;
834 
835 	if (rctx->first)
836 		/* Create initial descriptor: #8*/
837 		dev->hw_desc[index]->hdr = sahara_sha_init_hdr(dev, rctx);
838 	else
839 		/* Create hash descriptor: #10. Must follow #6. */
840 		dev->hw_desc[index]->hdr = SAHARA_HDR_MDHA_HASH;
841 
842 	dev->hw_desc[index]->len1 = rctx->total;
843 	if (dev->hw_desc[index]->len1 == 0) {
844 		/* if len1 is 0, p1 must be 0, too */
845 		dev->hw_desc[index]->p1 = 0;
846 		rctx->sg_in_idx = 0;
847 	} else {
848 		/* Create input links */
849 		dev->hw_desc[index]->p1 = dev->hw_phys_link[index];
850 		i = sahara_sha_hw_links_create(dev, rctx, index);
851 
852 		rctx->sg_in_idx = index;
853 		if (i < 0)
854 			return i;
855 	}
856 
857 	dev->hw_desc[index]->p2 = dev->hw_phys_link[i];
858 
859 	/* Save the context for the next operation */
860 	result_len = rctx->context_size;
861 	dev->hw_link[i]->p = dev->context_phys_base;
862 
863 	dev->hw_link[i]->len = result_len;
864 	dev->hw_desc[index]->len2 = result_len;
865 
866 	dev->hw_link[i]->next = 0;
867 
868 	return 0;
869 }
870 
871 /*
872  * Load descriptor aka #6
873  *
874  * To load a previously saved context back to the MDHA unit
875  *
876  * p1: Saved Context
877  * p2: NULL
878  *
879  */
880 static int sahara_sha_hw_context_descriptor_create(struct sahara_dev *dev,
881 						struct sahara_sha_reqctx *rctx,
882 						struct ahash_request *req,
883 						int index)
884 {
885 	dev->hw_desc[index]->hdr = sahara_sha_init_hdr(dev, rctx);
886 
887 	dev->hw_desc[index]->len1 = rctx->context_size;
888 	dev->hw_desc[index]->p1 = dev->hw_phys_link[index];
889 	dev->hw_desc[index]->len2 = 0;
890 	dev->hw_desc[index]->p2 = 0;
891 
892 	dev->hw_link[index]->len = rctx->context_size;
893 	dev->hw_link[index]->p = dev->context_phys_base;
894 	dev->hw_link[index]->next = 0;
895 
896 	return 0;
897 }
898 
899 static int sahara_walk_and_recalc(struct scatterlist *sg, unsigned int nbytes)
900 {
901 	if (!sg || !sg->length)
902 		return nbytes;
903 
904 	while (nbytes && sg) {
905 		if (nbytes <= sg->length) {
906 			sg->length = nbytes;
907 			sg_mark_end(sg);
908 			break;
909 		}
910 		nbytes -= sg->length;
911 		sg = sg_next(sg);
912 	}
913 
914 	return nbytes;
915 }
916 
917 static int sahara_sha_prepare_request(struct ahash_request *req)
918 {
919 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
920 	struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
921 	unsigned int hash_later;
922 	unsigned int block_size;
923 	unsigned int len;
924 
925 	block_size = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
926 
927 	/* append bytes from previous operation */
928 	len = rctx->buf_cnt + req->nbytes;
929 
930 	/* only the last transfer can be padded in hardware */
931 	if (!rctx->last && (len < block_size)) {
932 		/* to few data, save for next operation */
933 		scatterwalk_map_and_copy(rctx->buf + rctx->buf_cnt, req->src,
934 					 0, req->nbytes, 0);
935 		rctx->buf_cnt += req->nbytes;
936 
937 		return 0;
938 	}
939 
940 	/* add data from previous operation first */
941 	if (rctx->buf_cnt)
942 		memcpy(rctx->rembuf, rctx->buf, rctx->buf_cnt);
943 
944 	/* data must always be a multiple of block_size */
945 	hash_later = rctx->last ? 0 : len & (block_size - 1);
946 	if (hash_later) {
947 		unsigned int offset = req->nbytes - hash_later;
948 		/* Save remaining bytes for later use */
949 		scatterwalk_map_and_copy(rctx->buf, req->src, offset,
950 					hash_later, 0);
951 	}
952 
953 	/* nbytes should now be multiple of blocksize */
954 	req->nbytes = req->nbytes - hash_later;
955 
956 	sahara_walk_and_recalc(req->src, req->nbytes);
957 
958 	/* have data from previous operation and current */
959 	if (rctx->buf_cnt && req->nbytes) {
960 		sg_init_table(rctx->in_sg_chain, 2);
961 		sg_set_buf(rctx->in_sg_chain, rctx->rembuf, rctx->buf_cnt);
962 
963 		sg_chain(rctx->in_sg_chain, 2, req->src);
964 
965 		rctx->total = req->nbytes + rctx->buf_cnt;
966 		rctx->in_sg = rctx->in_sg_chain;
967 
968 		req->src = rctx->in_sg_chain;
969 	/* only data from previous operation */
970 	} else if (rctx->buf_cnt) {
971 		if (req->src)
972 			rctx->in_sg = req->src;
973 		else
974 			rctx->in_sg = rctx->in_sg_chain;
975 		/* buf was copied into rembuf above */
976 		sg_init_one(rctx->in_sg, rctx->rembuf, rctx->buf_cnt);
977 		rctx->total = rctx->buf_cnt;
978 	/* no data from previous operation */
979 	} else {
980 		rctx->in_sg = req->src;
981 		rctx->total = req->nbytes;
982 		req->src = rctx->in_sg;
983 	}
984 
985 	/* on next call, we only have the remaining data in the buffer */
986 	rctx->buf_cnt = hash_later;
987 
988 	return -EINPROGRESS;
989 }
990 
991 static int sahara_sha_process(struct ahash_request *req)
992 {
993 	struct sahara_dev *dev = dev_ptr;
994 	struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
995 	int ret;
996 	unsigned long timeout;
997 
998 	ret = sahara_sha_prepare_request(req);
999 	if (!ret)
1000 		return ret;
1001 
1002 	if (rctx->first) {
1003 		sahara_sha_hw_data_descriptor_create(dev, rctx, req, 0);
1004 		dev->hw_desc[0]->next = 0;
1005 		rctx->first = 0;
1006 	} else {
1007 		memcpy(dev->context_base, rctx->context, rctx->context_size);
1008 
1009 		sahara_sha_hw_context_descriptor_create(dev, rctx, req, 0);
1010 		dev->hw_desc[0]->next = dev->hw_phys_desc[1];
1011 		sahara_sha_hw_data_descriptor_create(dev, rctx, req, 1);
1012 		dev->hw_desc[1]->next = 0;
1013 	}
1014 
1015 	sahara_dump_descriptors(dev);
1016 	sahara_dump_links(dev);
1017 
1018 	reinit_completion(&dev->dma_completion);
1019 
1020 	sahara_write(dev, dev->hw_phys_desc[0], SAHARA_REG_DAR);
1021 
1022 	timeout = wait_for_completion_timeout(&dev->dma_completion,
1023 				msecs_to_jiffies(SAHARA_TIMEOUT_MS));
1024 	if (!timeout) {
1025 		dev_err(dev->device, "SHA timeout\n");
1026 		return -ETIMEDOUT;
1027 	}
1028 
1029 	if (rctx->sg_in_idx)
1030 		dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
1031 			     DMA_TO_DEVICE);
1032 
1033 	memcpy(rctx->context, dev->context_base, rctx->context_size);
1034 
1035 	if (req->result)
1036 		memcpy(req->result, rctx->context, rctx->digest_size);
1037 
1038 	return 0;
1039 }
1040 
1041 static int sahara_queue_manage(void *data)
1042 {
1043 	struct sahara_dev *dev = (struct sahara_dev *)data;
1044 	struct crypto_async_request *async_req;
1045 	struct crypto_async_request *backlog;
1046 	int ret = 0;
1047 
1048 	do {
1049 		__set_current_state(TASK_INTERRUPTIBLE);
1050 
1051 		mutex_lock(&dev->queue_mutex);
1052 		backlog = crypto_get_backlog(&dev->queue);
1053 		async_req = crypto_dequeue_request(&dev->queue);
1054 		mutex_unlock(&dev->queue_mutex);
1055 
1056 		if (backlog)
1057 			backlog->complete(backlog, -EINPROGRESS);
1058 
1059 		if (async_req) {
1060 			if (crypto_tfm_alg_type(async_req->tfm) ==
1061 			    CRYPTO_ALG_TYPE_AHASH) {
1062 				struct ahash_request *req =
1063 					ahash_request_cast(async_req);
1064 
1065 				ret = sahara_sha_process(req);
1066 			} else {
1067 				struct skcipher_request *req =
1068 					skcipher_request_cast(async_req);
1069 
1070 				ret = sahara_aes_process(req);
1071 			}
1072 
1073 			async_req->complete(async_req, ret);
1074 
1075 			continue;
1076 		}
1077 
1078 		schedule();
1079 	} while (!kthread_should_stop());
1080 
1081 	return 0;
1082 }
1083 
1084 static int sahara_sha_enqueue(struct ahash_request *req, int last)
1085 {
1086 	struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1087 	struct sahara_dev *dev = dev_ptr;
1088 	int ret;
1089 
1090 	if (!req->nbytes && !last)
1091 		return 0;
1092 
1093 	rctx->last = last;
1094 
1095 	if (!rctx->active) {
1096 		rctx->active = 1;
1097 		rctx->first = 1;
1098 	}
1099 
1100 	mutex_lock(&dev->queue_mutex);
1101 	ret = crypto_enqueue_request(&dev->queue, &req->base);
1102 	mutex_unlock(&dev->queue_mutex);
1103 
1104 	wake_up_process(dev->kthread);
1105 
1106 	return ret;
1107 }
1108 
1109 static int sahara_sha_init(struct ahash_request *req)
1110 {
1111 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1112 	struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1113 
1114 	memset(rctx, 0, sizeof(*rctx));
1115 
1116 	switch (crypto_ahash_digestsize(tfm)) {
1117 	case SHA1_DIGEST_SIZE:
1118 		rctx->mode |= SAHARA_HDR_MDHA_ALG_SHA1;
1119 		rctx->digest_size = SHA1_DIGEST_SIZE;
1120 		break;
1121 	case SHA256_DIGEST_SIZE:
1122 		rctx->mode |= SAHARA_HDR_MDHA_ALG_SHA256;
1123 		rctx->digest_size = SHA256_DIGEST_SIZE;
1124 		break;
1125 	default:
1126 		return -EINVAL;
1127 	}
1128 
1129 	rctx->context_size = rctx->digest_size + 4;
1130 	rctx->active = 0;
1131 
1132 	return 0;
1133 }
1134 
1135 static int sahara_sha_update(struct ahash_request *req)
1136 {
1137 	return sahara_sha_enqueue(req, 0);
1138 }
1139 
1140 static int sahara_sha_final(struct ahash_request *req)
1141 {
1142 	req->nbytes = 0;
1143 	return sahara_sha_enqueue(req, 1);
1144 }
1145 
1146 static int sahara_sha_finup(struct ahash_request *req)
1147 {
1148 	return sahara_sha_enqueue(req, 1);
1149 }
1150 
1151 static int sahara_sha_digest(struct ahash_request *req)
1152 {
1153 	sahara_sha_init(req);
1154 
1155 	return sahara_sha_finup(req);
1156 }
1157 
1158 static int sahara_sha_export(struct ahash_request *req, void *out)
1159 {
1160 	struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1161 
1162 	memcpy(out, rctx, sizeof(struct sahara_sha_reqctx));
1163 
1164 	return 0;
1165 }
1166 
1167 static int sahara_sha_import(struct ahash_request *req, const void *in)
1168 {
1169 	struct sahara_sha_reqctx *rctx = ahash_request_ctx(req);
1170 
1171 	memcpy(rctx, in, sizeof(struct sahara_sha_reqctx));
1172 
1173 	return 0;
1174 }
1175 
1176 static int sahara_sha_cra_init(struct crypto_tfm *tfm)
1177 {
1178 	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1179 				 sizeof(struct sahara_sha_reqctx) +
1180 				 SHA_BUFFER_LEN + SHA256_BLOCK_SIZE);
1181 
1182 	return 0;
1183 }
1184 
1185 static struct skcipher_alg aes_algs[] = {
1186 {
1187 	.base.cra_name		= "ecb(aes)",
1188 	.base.cra_driver_name	= "sahara-ecb-aes",
1189 	.base.cra_priority	= 300,
1190 	.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
1191 	.base.cra_blocksize	= AES_BLOCK_SIZE,
1192 	.base.cra_ctxsize	= sizeof(struct sahara_ctx),
1193 	.base.cra_alignmask	= 0x0,
1194 	.base.cra_module	= THIS_MODULE,
1195 
1196 	.init			= sahara_aes_init_tfm,
1197 	.exit			= sahara_aes_exit_tfm,
1198 	.min_keysize		= AES_MIN_KEY_SIZE ,
1199 	.max_keysize		= AES_MAX_KEY_SIZE,
1200 	.setkey			= sahara_aes_setkey,
1201 	.encrypt		= sahara_aes_ecb_encrypt,
1202 	.decrypt		= sahara_aes_ecb_decrypt,
1203 }, {
1204 	.base.cra_name		= "cbc(aes)",
1205 	.base.cra_driver_name	= "sahara-cbc-aes",
1206 	.base.cra_priority	= 300,
1207 	.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
1208 	.base.cra_blocksize	= AES_BLOCK_SIZE,
1209 	.base.cra_ctxsize	= sizeof(struct sahara_ctx),
1210 	.base.cra_alignmask	= 0x0,
1211 	.base.cra_module	= THIS_MODULE,
1212 
1213 	.init			= sahara_aes_init_tfm,
1214 	.exit			= sahara_aes_exit_tfm,
1215 	.min_keysize		= AES_MIN_KEY_SIZE ,
1216 	.max_keysize		= AES_MAX_KEY_SIZE,
1217 	.ivsize			= AES_BLOCK_SIZE,
1218 	.setkey			= sahara_aes_setkey,
1219 	.encrypt		= sahara_aes_cbc_encrypt,
1220 	.decrypt		= sahara_aes_cbc_decrypt,
1221 }
1222 };
1223 
1224 static struct ahash_alg sha_v3_algs[] = {
1225 {
1226 	.init		= sahara_sha_init,
1227 	.update		= sahara_sha_update,
1228 	.final		= sahara_sha_final,
1229 	.finup		= sahara_sha_finup,
1230 	.digest		= sahara_sha_digest,
1231 	.export		= sahara_sha_export,
1232 	.import		= sahara_sha_import,
1233 	.halg.digestsize	= SHA1_DIGEST_SIZE,
1234 	.halg.statesize         = sizeof(struct sahara_sha_reqctx),
1235 	.halg.base	= {
1236 		.cra_name		= "sha1",
1237 		.cra_driver_name	= "sahara-sha1",
1238 		.cra_priority		= 300,
1239 		.cra_flags		= CRYPTO_ALG_ASYNC |
1240 						CRYPTO_ALG_NEED_FALLBACK,
1241 		.cra_blocksize		= SHA1_BLOCK_SIZE,
1242 		.cra_ctxsize		= sizeof(struct sahara_ctx),
1243 		.cra_alignmask		= 0,
1244 		.cra_module		= THIS_MODULE,
1245 		.cra_init		= sahara_sha_cra_init,
1246 	}
1247 },
1248 };
1249 
1250 static struct ahash_alg sha_v4_algs[] = {
1251 {
1252 	.init		= sahara_sha_init,
1253 	.update		= sahara_sha_update,
1254 	.final		= sahara_sha_final,
1255 	.finup		= sahara_sha_finup,
1256 	.digest		= sahara_sha_digest,
1257 	.export		= sahara_sha_export,
1258 	.import		= sahara_sha_import,
1259 	.halg.digestsize	= SHA256_DIGEST_SIZE,
1260 	.halg.statesize         = sizeof(struct sahara_sha_reqctx),
1261 	.halg.base	= {
1262 		.cra_name		= "sha256",
1263 		.cra_driver_name	= "sahara-sha256",
1264 		.cra_priority		= 300,
1265 		.cra_flags		= CRYPTO_ALG_ASYNC |
1266 						CRYPTO_ALG_NEED_FALLBACK,
1267 		.cra_blocksize		= SHA256_BLOCK_SIZE,
1268 		.cra_ctxsize		= sizeof(struct sahara_ctx),
1269 		.cra_alignmask		= 0,
1270 		.cra_module		= THIS_MODULE,
1271 		.cra_init		= sahara_sha_cra_init,
1272 	}
1273 },
1274 };
1275 
1276 static irqreturn_t sahara_irq_handler(int irq, void *data)
1277 {
1278 	struct sahara_dev *dev = (struct sahara_dev *)data;
1279 	unsigned int stat = sahara_read(dev, SAHARA_REG_STATUS);
1280 	unsigned int err = sahara_read(dev, SAHARA_REG_ERRSTATUS);
1281 
1282 	sahara_write(dev, SAHARA_CMD_CLEAR_INT | SAHARA_CMD_CLEAR_ERR,
1283 		     SAHARA_REG_CMD);
1284 
1285 	sahara_decode_status(dev, stat);
1286 
1287 	if (SAHARA_STATUS_GET_STATE(stat) == SAHARA_STATE_BUSY) {
1288 		return IRQ_NONE;
1289 	} else if (SAHARA_STATUS_GET_STATE(stat) == SAHARA_STATE_COMPLETE) {
1290 		dev->error = 0;
1291 	} else {
1292 		sahara_decode_error(dev, err);
1293 		dev->error = -EINVAL;
1294 	}
1295 
1296 	complete(&dev->dma_completion);
1297 
1298 	return IRQ_HANDLED;
1299 }
1300 
1301 
1302 static int sahara_register_algs(struct sahara_dev *dev)
1303 {
1304 	int err;
1305 	unsigned int i, j, k, l;
1306 
1307 	for (i = 0; i < ARRAY_SIZE(aes_algs); i++) {
1308 		err = crypto_register_skcipher(&aes_algs[i]);
1309 		if (err)
1310 			goto err_aes_algs;
1311 	}
1312 
1313 	for (k = 0; k < ARRAY_SIZE(sha_v3_algs); k++) {
1314 		err = crypto_register_ahash(&sha_v3_algs[k]);
1315 		if (err)
1316 			goto err_sha_v3_algs;
1317 	}
1318 
1319 	if (dev->version > SAHARA_VERSION_3)
1320 		for (l = 0; l < ARRAY_SIZE(sha_v4_algs); l++) {
1321 			err = crypto_register_ahash(&sha_v4_algs[l]);
1322 			if (err)
1323 				goto err_sha_v4_algs;
1324 		}
1325 
1326 	return 0;
1327 
1328 err_sha_v4_algs:
1329 	for (j = 0; j < l; j++)
1330 		crypto_unregister_ahash(&sha_v4_algs[j]);
1331 
1332 err_sha_v3_algs:
1333 	for (j = 0; j < k; j++)
1334 		crypto_unregister_ahash(&sha_v3_algs[j]);
1335 
1336 err_aes_algs:
1337 	for (j = 0; j < i; j++)
1338 		crypto_unregister_skcipher(&aes_algs[j]);
1339 
1340 	return err;
1341 }
1342 
1343 static void sahara_unregister_algs(struct sahara_dev *dev)
1344 {
1345 	unsigned int i;
1346 
1347 	for (i = 0; i < ARRAY_SIZE(aes_algs); i++)
1348 		crypto_unregister_skcipher(&aes_algs[i]);
1349 
1350 	for (i = 0; i < ARRAY_SIZE(sha_v3_algs); i++)
1351 		crypto_unregister_ahash(&sha_v3_algs[i]);
1352 
1353 	if (dev->version > SAHARA_VERSION_3)
1354 		for (i = 0; i < ARRAY_SIZE(sha_v4_algs); i++)
1355 			crypto_unregister_ahash(&sha_v4_algs[i]);
1356 }
1357 
1358 static const struct platform_device_id sahara_platform_ids[] = {
1359 	{ .name = "sahara-imx27" },
1360 	{ /* sentinel */ }
1361 };
1362 MODULE_DEVICE_TABLE(platform, sahara_platform_ids);
1363 
1364 static const struct of_device_id sahara_dt_ids[] = {
1365 	{ .compatible = "fsl,imx53-sahara" },
1366 	{ .compatible = "fsl,imx27-sahara" },
1367 	{ /* sentinel */ }
1368 };
1369 MODULE_DEVICE_TABLE(of, sahara_dt_ids);
1370 
1371 static int sahara_probe(struct platform_device *pdev)
1372 {
1373 	struct sahara_dev *dev;
1374 	u32 version;
1375 	int irq;
1376 	int err;
1377 	int i;
1378 
1379 	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
1380 	if (!dev)
1381 		return -ENOMEM;
1382 
1383 	dev->device = &pdev->dev;
1384 	platform_set_drvdata(pdev, dev);
1385 
1386 	/* Get the base address */
1387 	dev->regs_base = devm_platform_ioremap_resource(pdev, 0);
1388 	if (IS_ERR(dev->regs_base))
1389 		return PTR_ERR(dev->regs_base);
1390 
1391 	/* Get the IRQ */
1392 	irq = platform_get_irq(pdev,  0);
1393 	if (irq < 0)
1394 		return irq;
1395 
1396 	err = devm_request_irq(&pdev->dev, irq, sahara_irq_handler,
1397 			       0, dev_name(&pdev->dev), dev);
1398 	if (err) {
1399 		dev_err(&pdev->dev, "failed to request irq\n");
1400 		return err;
1401 	}
1402 
1403 	/* clocks */
1404 	dev->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
1405 	if (IS_ERR(dev->clk_ipg)) {
1406 		dev_err(&pdev->dev, "Could not get ipg clock\n");
1407 		return PTR_ERR(dev->clk_ipg);
1408 	}
1409 
1410 	dev->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
1411 	if (IS_ERR(dev->clk_ahb)) {
1412 		dev_err(&pdev->dev, "Could not get ahb clock\n");
1413 		return PTR_ERR(dev->clk_ahb);
1414 	}
1415 
1416 	/* Allocate HW descriptors */
1417 	dev->hw_desc[0] = dmam_alloc_coherent(&pdev->dev,
1418 			SAHARA_MAX_HW_DESC * sizeof(struct sahara_hw_desc),
1419 			&dev->hw_phys_desc[0], GFP_KERNEL);
1420 	if (!dev->hw_desc[0]) {
1421 		dev_err(&pdev->dev, "Could not allocate hw descriptors\n");
1422 		return -ENOMEM;
1423 	}
1424 	dev->hw_desc[1] = dev->hw_desc[0] + 1;
1425 	dev->hw_phys_desc[1] = dev->hw_phys_desc[0] +
1426 				sizeof(struct sahara_hw_desc);
1427 
1428 	/* Allocate space for iv and key */
1429 	dev->key_base = dmam_alloc_coherent(&pdev->dev, 2 * AES_KEYSIZE_128,
1430 				&dev->key_phys_base, GFP_KERNEL);
1431 	if (!dev->key_base) {
1432 		dev_err(&pdev->dev, "Could not allocate memory for key\n");
1433 		return -ENOMEM;
1434 	}
1435 	dev->iv_base = dev->key_base + AES_KEYSIZE_128;
1436 	dev->iv_phys_base = dev->key_phys_base + AES_KEYSIZE_128;
1437 
1438 	/* Allocate space for context: largest digest + message length field */
1439 	dev->context_base = dmam_alloc_coherent(&pdev->dev,
1440 					SHA256_DIGEST_SIZE + 4,
1441 					&dev->context_phys_base, GFP_KERNEL);
1442 	if (!dev->context_base) {
1443 		dev_err(&pdev->dev, "Could not allocate memory for MDHA context\n");
1444 		return -ENOMEM;
1445 	}
1446 
1447 	/* Allocate space for HW links */
1448 	dev->hw_link[0] = dmam_alloc_coherent(&pdev->dev,
1449 			SAHARA_MAX_HW_LINK * sizeof(struct sahara_hw_link),
1450 			&dev->hw_phys_link[0], GFP_KERNEL);
1451 	if (!dev->hw_link[0]) {
1452 		dev_err(&pdev->dev, "Could not allocate hw links\n");
1453 		return -ENOMEM;
1454 	}
1455 	for (i = 1; i < SAHARA_MAX_HW_LINK; i++) {
1456 		dev->hw_phys_link[i] = dev->hw_phys_link[i - 1] +
1457 					sizeof(struct sahara_hw_link);
1458 		dev->hw_link[i] = dev->hw_link[i - 1] + 1;
1459 	}
1460 
1461 	crypto_init_queue(&dev->queue, SAHARA_QUEUE_LENGTH);
1462 
1463 	mutex_init(&dev->queue_mutex);
1464 
1465 	dev_ptr = dev;
1466 
1467 	dev->kthread = kthread_run(sahara_queue_manage, dev, "sahara_crypto");
1468 	if (IS_ERR(dev->kthread)) {
1469 		return PTR_ERR(dev->kthread);
1470 	}
1471 
1472 	init_completion(&dev->dma_completion);
1473 
1474 	err = clk_prepare_enable(dev->clk_ipg);
1475 	if (err)
1476 		return err;
1477 	err = clk_prepare_enable(dev->clk_ahb);
1478 	if (err)
1479 		goto clk_ipg_disable;
1480 
1481 	version = sahara_read(dev, SAHARA_REG_VERSION);
1482 	if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx27-sahara")) {
1483 		if (version != SAHARA_VERSION_3)
1484 			err = -ENODEV;
1485 	} else if (of_device_is_compatible(pdev->dev.of_node,
1486 			"fsl,imx53-sahara")) {
1487 		if (((version >> 8) & 0xff) != SAHARA_VERSION_4)
1488 			err = -ENODEV;
1489 		version = (version >> 8) & 0xff;
1490 	}
1491 	if (err == -ENODEV) {
1492 		dev_err(&pdev->dev, "SAHARA version %d not supported\n",
1493 				version);
1494 		goto err_algs;
1495 	}
1496 
1497 	dev->version = version;
1498 
1499 	sahara_write(dev, SAHARA_CMD_RESET | SAHARA_CMD_MODE_BATCH,
1500 		     SAHARA_REG_CMD);
1501 	sahara_write(dev, SAHARA_CONTROL_SET_THROTTLE(0) |
1502 			SAHARA_CONTROL_SET_MAXBURST(8) |
1503 			SAHARA_CONTROL_RNG_AUTORSD |
1504 			SAHARA_CONTROL_ENABLE_INT,
1505 			SAHARA_REG_CONTROL);
1506 
1507 	err = sahara_register_algs(dev);
1508 	if (err)
1509 		goto err_algs;
1510 
1511 	dev_info(&pdev->dev, "SAHARA version %d initialized\n", version);
1512 
1513 	return 0;
1514 
1515 err_algs:
1516 	kthread_stop(dev->kthread);
1517 	dev_ptr = NULL;
1518 	clk_disable_unprepare(dev->clk_ahb);
1519 clk_ipg_disable:
1520 	clk_disable_unprepare(dev->clk_ipg);
1521 
1522 	return err;
1523 }
1524 
1525 static int sahara_remove(struct platform_device *pdev)
1526 {
1527 	struct sahara_dev *dev = platform_get_drvdata(pdev);
1528 
1529 	kthread_stop(dev->kthread);
1530 
1531 	sahara_unregister_algs(dev);
1532 
1533 	clk_disable_unprepare(dev->clk_ipg);
1534 	clk_disable_unprepare(dev->clk_ahb);
1535 
1536 	dev_ptr = NULL;
1537 
1538 	return 0;
1539 }
1540 
1541 static struct platform_driver sahara_driver = {
1542 	.probe		= sahara_probe,
1543 	.remove		= sahara_remove,
1544 	.driver		= {
1545 		.name	= SAHARA_NAME,
1546 		.of_match_table = sahara_dt_ids,
1547 	},
1548 	.id_table = sahara_platform_ids,
1549 };
1550 
1551 module_platform_driver(sahara_driver);
1552 
1553 MODULE_LICENSE("GPL");
1554 MODULE_AUTHOR("Javier Martin <javier.martin@vista-silicon.com>");
1555 MODULE_AUTHOR("Steffen Trumtrar <s.trumtrar@pengutronix.de>");
1556 MODULE_DESCRIPTION("SAHARA2 HW crypto accelerator");
1557