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