1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright 2021 Aspeed Technology Inc.
4 */
5 #include <crypto/akcipher.h>
6 #include <crypto/algapi.h>
7 #include <crypto/engine.h>
8 #include <crypto/internal/akcipher.h>
9 #include <crypto/internal/rsa.h>
10 #include <crypto/scatterwalk.h>
11 #include <linux/clk.h>
12 #include <linux/platform_device.h>
13 #include <linux/module.h>
14 #include <linux/of_address.h>
15 #include <linux/of_irq.h>
16 #include <linux/of.h>
17 #include <linux/of_device.h>
18 #include <linux/mfd/syscon.h>
19 #include <linux/interrupt.h>
20 #include <linux/count_zeros.h>
21 #include <linux/err.h>
22 #include <linux/dma-mapping.h>
23 #include <linux/regmap.h>
24
25 #ifdef CONFIG_CRYPTO_DEV_ASPEED_DEBUG
26 #define ACRY_DBG(d, fmt, ...) \
27 dev_info((d)->dev, "%s() " fmt, __func__, ##__VA_ARGS__)
28 #else
29 #define ACRY_DBG(d, fmt, ...) \
30 dev_dbg((d)->dev, "%s() " fmt, __func__, ##__VA_ARGS__)
31 #endif
32
33 /*****************************
34 * *
35 * ACRY register definitions *
36 * *
37 * ***************************/
38 #define ASPEED_ACRY_TRIGGER 0x000 /* ACRY Engine Control: trigger */
39 #define ASPEED_ACRY_DMA_CMD 0x048 /* ACRY Engine Control: Command */
40 #define ASPEED_ACRY_DMA_SRC_BASE 0x04C /* ACRY DRAM base address for DMA */
41 #define ASPEED_ACRY_DMA_LEN 0x050 /* ACRY Data Length of DMA */
42 #define ASPEED_ACRY_RSA_KEY_LEN 0x058 /* ACRY RSA Exp/Mod Key Length (Bits) */
43 #define ASPEED_ACRY_INT_MASK 0x3F8 /* ACRY Interrupt Mask */
44 #define ASPEED_ACRY_STATUS 0x3FC /* ACRY Interrupt Status */
45
46 /* rsa trigger */
47 #define ACRY_CMD_RSA_TRIGGER BIT(0)
48 #define ACRY_CMD_DMA_RSA_TRIGGER BIT(1)
49
50 /* rsa dma cmd */
51 #define ACRY_CMD_DMA_SRAM_MODE_RSA (0x3 << 4)
52 #define ACRY_CMD_DMEM_AHB BIT(8)
53 #define ACRY_CMD_DMA_SRAM_AHB_ENGINE 0
54
55 /* rsa key len */
56 #define RSA_E_BITS_LEN(x) ((x) << 16)
57 #define RSA_M_BITS_LEN(x) (x)
58
59 /* acry isr */
60 #define ACRY_RSA_ISR BIT(1)
61
62 #define ASPEED_ACRY_BUFF_SIZE 0x1800 /* DMA buffer size */
63 #define ASPEED_ACRY_SRAM_MAX_LEN 2048 /* ACRY SRAM maximum length (Bytes) */
64 #define ASPEED_ACRY_RSA_MAX_KEY_LEN 512 /* ACRY RSA maximum key length (Bytes) */
65
66 #define CRYPTO_FLAGS_BUSY BIT(1)
67 #define BYTES_PER_DWORD 4
68
69 /*****************************
70 * *
71 * AHBC register definitions *
72 * *
73 * ***************************/
74 #define AHBC_REGION_PROT 0x240
75 #define REGION_ACRYM BIT(23)
76
77 #define ast_acry_write(acry, val, offset) \
78 writel((val), (acry)->regs + (offset))
79
80 #define ast_acry_read(acry, offset) \
81 readl((acry)->regs + (offset))
82
83 struct aspeed_acry_dev;
84
85 typedef int (*aspeed_acry_fn_t)(struct aspeed_acry_dev *);
86
87 struct aspeed_acry_dev {
88 void __iomem *regs;
89 struct device *dev;
90 int irq;
91 struct clk *clk;
92 struct regmap *ahbc;
93
94 struct akcipher_request *req;
95 struct tasklet_struct done_task;
96 aspeed_acry_fn_t resume;
97 unsigned long flags;
98
99 /* ACRY output SRAM buffer */
100 void __iomem *acry_sram;
101
102 /* ACRY input DMA buffer */
103 void *buf_addr;
104 dma_addr_t buf_dma_addr;
105
106 struct crypto_engine *crypt_engine_rsa;
107
108 /* ACRY SRAM memory mapped */
109 int exp_dw_mapping[ASPEED_ACRY_RSA_MAX_KEY_LEN];
110 int mod_dw_mapping[ASPEED_ACRY_RSA_MAX_KEY_LEN];
111 int data_byte_mapping[ASPEED_ACRY_SRAM_MAX_LEN];
112 };
113
114 struct aspeed_acry_ctx {
115 struct crypto_engine_ctx enginectx;
116 struct aspeed_acry_dev *acry_dev;
117
118 struct rsa_key key;
119 int enc;
120 u8 *n;
121 u8 *e;
122 u8 *d;
123 size_t n_sz;
124 size_t e_sz;
125 size_t d_sz;
126
127 aspeed_acry_fn_t trigger;
128
129 struct crypto_akcipher *fallback_tfm;
130 };
131
132 struct aspeed_acry_alg {
133 struct aspeed_acry_dev *acry_dev;
134 struct akcipher_alg akcipher;
135 };
136
137 enum aspeed_rsa_key_mode {
138 ASPEED_RSA_EXP_MODE = 0,
139 ASPEED_RSA_MOD_MODE,
140 ASPEED_RSA_DATA_MODE,
141 };
142
143 static inline struct akcipher_request *
akcipher_request_cast(struct crypto_async_request * req)144 akcipher_request_cast(struct crypto_async_request *req)
145 {
146 return container_of(req, struct akcipher_request, base);
147 }
148
aspeed_acry_do_fallback(struct akcipher_request * req)149 static int aspeed_acry_do_fallback(struct akcipher_request *req)
150 {
151 struct crypto_akcipher *cipher = crypto_akcipher_reqtfm(req);
152 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(cipher);
153 int err;
154
155 akcipher_request_set_tfm(req, ctx->fallback_tfm);
156
157 if (ctx->enc)
158 err = crypto_akcipher_encrypt(req);
159 else
160 err = crypto_akcipher_decrypt(req);
161
162 akcipher_request_set_tfm(req, cipher);
163
164 return err;
165 }
166
aspeed_acry_need_fallback(struct akcipher_request * req)167 static bool aspeed_acry_need_fallback(struct akcipher_request *req)
168 {
169 struct crypto_akcipher *cipher = crypto_akcipher_reqtfm(req);
170 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(cipher);
171
172 return ctx->key.n_sz > ASPEED_ACRY_RSA_MAX_KEY_LEN;
173 }
174
aspeed_acry_handle_queue(struct aspeed_acry_dev * acry_dev,struct akcipher_request * req)175 static int aspeed_acry_handle_queue(struct aspeed_acry_dev *acry_dev,
176 struct akcipher_request *req)
177 {
178 if (aspeed_acry_need_fallback(req)) {
179 ACRY_DBG(acry_dev, "SW fallback\n");
180 return aspeed_acry_do_fallback(req);
181 }
182
183 return crypto_transfer_akcipher_request_to_engine(acry_dev->crypt_engine_rsa, req);
184 }
185
aspeed_acry_do_request(struct crypto_engine * engine,void * areq)186 static int aspeed_acry_do_request(struct crypto_engine *engine, void *areq)
187 {
188 struct akcipher_request *req = akcipher_request_cast(areq);
189 struct crypto_akcipher *cipher = crypto_akcipher_reqtfm(req);
190 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(cipher);
191 struct aspeed_acry_dev *acry_dev = ctx->acry_dev;
192
193 acry_dev->req = req;
194 acry_dev->flags |= CRYPTO_FLAGS_BUSY;
195
196 return ctx->trigger(acry_dev);
197 }
198
aspeed_acry_complete(struct aspeed_acry_dev * acry_dev,int err)199 static int aspeed_acry_complete(struct aspeed_acry_dev *acry_dev, int err)
200 {
201 struct akcipher_request *req = acry_dev->req;
202
203 acry_dev->flags &= ~CRYPTO_FLAGS_BUSY;
204
205 crypto_finalize_akcipher_request(acry_dev->crypt_engine_rsa, req, err);
206
207 return err;
208 }
209
210 /*
211 * Copy Data to DMA buffer for engine used.
212 */
aspeed_acry_rsa_sg_copy_to_buffer(struct aspeed_acry_dev * acry_dev,u8 * buf,struct scatterlist * src,size_t nbytes)213 static void aspeed_acry_rsa_sg_copy_to_buffer(struct aspeed_acry_dev *acry_dev,
214 u8 *buf, struct scatterlist *src,
215 size_t nbytes)
216 {
217 static u8 dram_buffer[ASPEED_ACRY_SRAM_MAX_LEN];
218 int i = 0, j;
219 int data_idx;
220
221 ACRY_DBG(acry_dev, "\n");
222
223 scatterwalk_map_and_copy(dram_buffer, src, 0, nbytes, 0);
224
225 for (j = nbytes - 1; j >= 0; j--) {
226 data_idx = acry_dev->data_byte_mapping[i];
227 buf[data_idx] = dram_buffer[j];
228 i++;
229 }
230
231 for (; i < ASPEED_ACRY_SRAM_MAX_LEN; i++) {
232 data_idx = acry_dev->data_byte_mapping[i];
233 buf[data_idx] = 0;
234 }
235 }
236
237 /*
238 * Copy Exp/Mod to DMA buffer for engine used.
239 *
240 * Params:
241 * - mode 0 : Exponential
242 * - mode 1 : Modulus
243 *
244 * Example:
245 * - DRAM memory layout:
246 * D[0], D[4], D[8], D[12]
247 * - ACRY SRAM memory layout should reverse the order of source data:
248 * D[12], D[8], D[4], D[0]
249 */
aspeed_acry_rsa_ctx_copy(struct aspeed_acry_dev * acry_dev,void * buf,const void * xbuf,size_t nbytes,enum aspeed_rsa_key_mode mode)250 static int aspeed_acry_rsa_ctx_copy(struct aspeed_acry_dev *acry_dev, void *buf,
251 const void *xbuf, size_t nbytes,
252 enum aspeed_rsa_key_mode mode)
253 {
254 const u8 *src = xbuf;
255 __le32 *dw_buf = buf;
256 int nbits, ndw;
257 int i, j, idx;
258 u32 data = 0;
259
260 ACRY_DBG(acry_dev, "nbytes:%zu, mode:%d\n", nbytes, mode);
261
262 if (nbytes > ASPEED_ACRY_RSA_MAX_KEY_LEN)
263 return -ENOMEM;
264
265 /* Remove the leading zeros */
266 while (nbytes > 0 && src[0] == 0) {
267 src++;
268 nbytes--;
269 }
270
271 nbits = nbytes * 8;
272 if (nbytes > 0)
273 nbits -= count_leading_zeros(src[0]) - (BITS_PER_LONG - 8);
274
275 /* double-world alignment */
276 ndw = DIV_ROUND_UP(nbytes, BYTES_PER_DWORD);
277
278 if (nbytes > 0) {
279 i = BYTES_PER_DWORD - nbytes % BYTES_PER_DWORD;
280 i %= BYTES_PER_DWORD;
281
282 for (j = ndw; j > 0; j--) {
283 for (; i < BYTES_PER_DWORD; i++) {
284 data <<= 8;
285 data |= *src++;
286 }
287
288 i = 0;
289
290 if (mode == ASPEED_RSA_EXP_MODE)
291 idx = acry_dev->exp_dw_mapping[j - 1];
292 else if (mode == ASPEED_RSA_MOD_MODE)
293 idx = acry_dev->mod_dw_mapping[j - 1];
294
295 dw_buf[idx] = cpu_to_le32(data);
296 }
297 }
298
299 return nbits;
300 }
301
aspeed_acry_rsa_transfer(struct aspeed_acry_dev * acry_dev)302 static int aspeed_acry_rsa_transfer(struct aspeed_acry_dev *acry_dev)
303 {
304 struct akcipher_request *req = acry_dev->req;
305 u8 __iomem *sram_buffer = acry_dev->acry_sram;
306 struct scatterlist *out_sg = req->dst;
307 static u8 dram_buffer[ASPEED_ACRY_SRAM_MAX_LEN];
308 int leading_zero = 1;
309 int result_nbytes;
310 int i = 0, j;
311 int data_idx;
312
313 /* Set Data Memory to AHB(CPU) Access Mode */
314 ast_acry_write(acry_dev, ACRY_CMD_DMEM_AHB, ASPEED_ACRY_DMA_CMD);
315
316 /* Disable ACRY SRAM protection */
317 regmap_update_bits(acry_dev->ahbc, AHBC_REGION_PROT,
318 REGION_ACRYM, 0);
319
320 result_nbytes = ASPEED_ACRY_SRAM_MAX_LEN;
321
322 for (j = ASPEED_ACRY_SRAM_MAX_LEN - 1; j >= 0; j--) {
323 data_idx = acry_dev->data_byte_mapping[j];
324 if (readb(sram_buffer + data_idx) == 0 && leading_zero) {
325 result_nbytes--;
326 } else {
327 leading_zero = 0;
328 dram_buffer[i] = readb(sram_buffer + data_idx);
329 i++;
330 }
331 }
332
333 ACRY_DBG(acry_dev, "result_nbytes:%d, req->dst_len:%d\n",
334 result_nbytes, req->dst_len);
335
336 if (result_nbytes <= req->dst_len) {
337 scatterwalk_map_and_copy(dram_buffer, out_sg, 0, result_nbytes,
338 1);
339 req->dst_len = result_nbytes;
340
341 } else {
342 dev_err(acry_dev->dev, "RSA engine error!\n");
343 }
344
345 memzero_explicit(acry_dev->buf_addr, ASPEED_ACRY_BUFF_SIZE);
346
347 return aspeed_acry_complete(acry_dev, 0);
348 }
349
aspeed_acry_rsa_trigger(struct aspeed_acry_dev * acry_dev)350 static int aspeed_acry_rsa_trigger(struct aspeed_acry_dev *acry_dev)
351 {
352 struct akcipher_request *req = acry_dev->req;
353 struct crypto_akcipher *cipher = crypto_akcipher_reqtfm(req);
354 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(cipher);
355 int ne, nm;
356
357 if (!ctx->n || !ctx->n_sz) {
358 dev_err(acry_dev->dev, "%s: key n is not set\n", __func__);
359 return -EINVAL;
360 }
361
362 memzero_explicit(acry_dev->buf_addr, ASPEED_ACRY_BUFF_SIZE);
363
364 /* Copy source data to DMA buffer */
365 aspeed_acry_rsa_sg_copy_to_buffer(acry_dev, acry_dev->buf_addr,
366 req->src, req->src_len);
367
368 nm = aspeed_acry_rsa_ctx_copy(acry_dev, acry_dev->buf_addr, ctx->n,
369 ctx->n_sz, ASPEED_RSA_MOD_MODE);
370 if (ctx->enc) {
371 if (!ctx->e || !ctx->e_sz) {
372 dev_err(acry_dev->dev, "%s: key e is not set\n",
373 __func__);
374 return -EINVAL;
375 }
376 /* Copy key e to DMA buffer */
377 ne = aspeed_acry_rsa_ctx_copy(acry_dev, acry_dev->buf_addr,
378 ctx->e, ctx->e_sz,
379 ASPEED_RSA_EXP_MODE);
380 } else {
381 if (!ctx->d || !ctx->d_sz) {
382 dev_err(acry_dev->dev, "%s: key d is not set\n",
383 __func__);
384 return -EINVAL;
385 }
386 /* Copy key d to DMA buffer */
387 ne = aspeed_acry_rsa_ctx_copy(acry_dev, acry_dev->buf_addr,
388 ctx->key.d, ctx->key.d_sz,
389 ASPEED_RSA_EXP_MODE);
390 }
391
392 ast_acry_write(acry_dev, acry_dev->buf_dma_addr,
393 ASPEED_ACRY_DMA_SRC_BASE);
394 ast_acry_write(acry_dev, (ne << 16) + nm,
395 ASPEED_ACRY_RSA_KEY_LEN);
396 ast_acry_write(acry_dev, ASPEED_ACRY_BUFF_SIZE,
397 ASPEED_ACRY_DMA_LEN);
398
399 acry_dev->resume = aspeed_acry_rsa_transfer;
400
401 /* Enable ACRY SRAM protection */
402 regmap_update_bits(acry_dev->ahbc, AHBC_REGION_PROT,
403 REGION_ACRYM, REGION_ACRYM);
404
405 ast_acry_write(acry_dev, ACRY_RSA_ISR, ASPEED_ACRY_INT_MASK);
406 ast_acry_write(acry_dev, ACRY_CMD_DMA_SRAM_MODE_RSA |
407 ACRY_CMD_DMA_SRAM_AHB_ENGINE, ASPEED_ACRY_DMA_CMD);
408
409 /* Trigger RSA engines */
410 ast_acry_write(acry_dev, ACRY_CMD_RSA_TRIGGER |
411 ACRY_CMD_DMA_RSA_TRIGGER, ASPEED_ACRY_TRIGGER);
412
413 return 0;
414 }
415
aspeed_acry_rsa_enc(struct akcipher_request * req)416 static int aspeed_acry_rsa_enc(struct akcipher_request *req)
417 {
418 struct crypto_akcipher *cipher = crypto_akcipher_reqtfm(req);
419 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(cipher);
420 struct aspeed_acry_dev *acry_dev = ctx->acry_dev;
421
422 ctx->trigger = aspeed_acry_rsa_trigger;
423 ctx->enc = 1;
424
425 return aspeed_acry_handle_queue(acry_dev, req);
426 }
427
aspeed_acry_rsa_dec(struct akcipher_request * req)428 static int aspeed_acry_rsa_dec(struct akcipher_request *req)
429 {
430 struct crypto_akcipher *cipher = crypto_akcipher_reqtfm(req);
431 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(cipher);
432 struct aspeed_acry_dev *acry_dev = ctx->acry_dev;
433
434 ctx->trigger = aspeed_acry_rsa_trigger;
435 ctx->enc = 0;
436
437 return aspeed_acry_handle_queue(acry_dev, req);
438 }
439
aspeed_rsa_key_copy(u8 * src,size_t len)440 static u8 *aspeed_rsa_key_copy(u8 *src, size_t len)
441 {
442 return kmemdup(src, len, GFP_KERNEL);
443 }
444
aspeed_rsa_set_n(struct aspeed_acry_ctx * ctx,u8 * value,size_t len)445 static int aspeed_rsa_set_n(struct aspeed_acry_ctx *ctx, u8 *value,
446 size_t len)
447 {
448 ctx->n_sz = len;
449 ctx->n = aspeed_rsa_key_copy(value, len);
450 if (!ctx->n)
451 return -ENOMEM;
452
453 return 0;
454 }
455
aspeed_rsa_set_e(struct aspeed_acry_ctx * ctx,u8 * value,size_t len)456 static int aspeed_rsa_set_e(struct aspeed_acry_ctx *ctx, u8 *value,
457 size_t len)
458 {
459 ctx->e_sz = len;
460 ctx->e = aspeed_rsa_key_copy(value, len);
461 if (!ctx->e)
462 return -ENOMEM;
463
464 return 0;
465 }
466
aspeed_rsa_set_d(struct aspeed_acry_ctx * ctx,u8 * value,size_t len)467 static int aspeed_rsa_set_d(struct aspeed_acry_ctx *ctx, u8 *value,
468 size_t len)
469 {
470 ctx->d_sz = len;
471 ctx->d = aspeed_rsa_key_copy(value, len);
472 if (!ctx->d)
473 return -ENOMEM;
474
475 return 0;
476 }
477
aspeed_rsa_key_free(struct aspeed_acry_ctx * ctx)478 static void aspeed_rsa_key_free(struct aspeed_acry_ctx *ctx)
479 {
480 kfree_sensitive(ctx->n);
481 kfree_sensitive(ctx->e);
482 kfree_sensitive(ctx->d);
483 ctx->n_sz = 0;
484 ctx->e_sz = 0;
485 ctx->d_sz = 0;
486 }
487
aspeed_acry_rsa_setkey(struct crypto_akcipher * tfm,const void * key,unsigned int keylen,int priv)488 static int aspeed_acry_rsa_setkey(struct crypto_akcipher *tfm, const void *key,
489 unsigned int keylen, int priv)
490 {
491 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(tfm);
492 struct aspeed_acry_dev *acry_dev = ctx->acry_dev;
493 int ret;
494
495 if (priv)
496 ret = rsa_parse_priv_key(&ctx->key, key, keylen);
497 else
498 ret = rsa_parse_pub_key(&ctx->key, key, keylen);
499
500 if (ret) {
501 dev_err(acry_dev->dev, "rsa parse key failed, ret:0x%x\n",
502 ret);
503 return ret;
504 }
505
506 /* Aspeed engine supports up to 4096 bits,
507 * Use software fallback instead.
508 */
509 if (ctx->key.n_sz > ASPEED_ACRY_RSA_MAX_KEY_LEN)
510 return 0;
511
512 ret = aspeed_rsa_set_n(ctx, (u8 *)ctx->key.n, ctx->key.n_sz);
513 if (ret)
514 goto err;
515
516 ret = aspeed_rsa_set_e(ctx, (u8 *)ctx->key.e, ctx->key.e_sz);
517 if (ret)
518 goto err;
519
520 if (priv) {
521 ret = aspeed_rsa_set_d(ctx, (u8 *)ctx->key.d, ctx->key.d_sz);
522 if (ret)
523 goto err;
524 }
525
526 return 0;
527
528 err:
529 dev_err(acry_dev->dev, "rsa set key failed\n");
530 aspeed_rsa_key_free(ctx);
531
532 return ret;
533 }
534
aspeed_acry_rsa_set_pub_key(struct crypto_akcipher * tfm,const void * key,unsigned int keylen)535 static int aspeed_acry_rsa_set_pub_key(struct crypto_akcipher *tfm,
536 const void *key,
537 unsigned int keylen)
538 {
539 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(tfm);
540 int ret;
541
542 ret = crypto_akcipher_set_pub_key(ctx->fallback_tfm, key, keylen);
543 if (ret)
544 return ret;
545
546 return aspeed_acry_rsa_setkey(tfm, key, keylen, 0);
547 }
548
aspeed_acry_rsa_set_priv_key(struct crypto_akcipher * tfm,const void * key,unsigned int keylen)549 static int aspeed_acry_rsa_set_priv_key(struct crypto_akcipher *tfm,
550 const void *key,
551 unsigned int keylen)
552 {
553 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(tfm);
554 int ret;
555
556 ret = crypto_akcipher_set_priv_key(ctx->fallback_tfm, key, keylen);
557 if (ret)
558 return ret;
559
560 return aspeed_acry_rsa_setkey(tfm, key, keylen, 1);
561 }
562
aspeed_acry_rsa_max_size(struct crypto_akcipher * tfm)563 static unsigned int aspeed_acry_rsa_max_size(struct crypto_akcipher *tfm)
564 {
565 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(tfm);
566
567 if (ctx->key.n_sz > ASPEED_ACRY_RSA_MAX_KEY_LEN)
568 return crypto_akcipher_maxsize(ctx->fallback_tfm);
569
570 return ctx->n_sz;
571 }
572
aspeed_acry_rsa_init_tfm(struct crypto_akcipher * tfm)573 static int aspeed_acry_rsa_init_tfm(struct crypto_akcipher *tfm)
574 {
575 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(tfm);
576 struct akcipher_alg *alg = crypto_akcipher_alg(tfm);
577 const char *name = crypto_tfm_alg_name(&tfm->base);
578 struct aspeed_acry_alg *acry_alg;
579
580 acry_alg = container_of(alg, struct aspeed_acry_alg, akcipher);
581
582 ctx->acry_dev = acry_alg->acry_dev;
583
584 ctx->fallback_tfm = crypto_alloc_akcipher(name, 0, CRYPTO_ALG_ASYNC |
585 CRYPTO_ALG_NEED_FALLBACK);
586 if (IS_ERR(ctx->fallback_tfm)) {
587 dev_err(ctx->acry_dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
588 name, PTR_ERR(ctx->fallback_tfm));
589 return PTR_ERR(ctx->fallback_tfm);
590 }
591
592 ctx->enginectx.op.do_one_request = aspeed_acry_do_request;
593 ctx->enginectx.op.prepare_request = NULL;
594 ctx->enginectx.op.unprepare_request = NULL;
595
596 return 0;
597 }
598
aspeed_acry_rsa_exit_tfm(struct crypto_akcipher * tfm)599 static void aspeed_acry_rsa_exit_tfm(struct crypto_akcipher *tfm)
600 {
601 struct aspeed_acry_ctx *ctx = akcipher_tfm_ctx(tfm);
602
603 crypto_free_akcipher(ctx->fallback_tfm);
604 }
605
606 static struct aspeed_acry_alg aspeed_acry_akcipher_algs[] = {
607 {
608 .akcipher = {
609 .encrypt = aspeed_acry_rsa_enc,
610 .decrypt = aspeed_acry_rsa_dec,
611 .sign = aspeed_acry_rsa_dec,
612 .verify = aspeed_acry_rsa_enc,
613 .set_pub_key = aspeed_acry_rsa_set_pub_key,
614 .set_priv_key = aspeed_acry_rsa_set_priv_key,
615 .max_size = aspeed_acry_rsa_max_size,
616 .init = aspeed_acry_rsa_init_tfm,
617 .exit = aspeed_acry_rsa_exit_tfm,
618 .base = {
619 .cra_name = "rsa",
620 .cra_driver_name = "aspeed-rsa",
621 .cra_priority = 300,
622 .cra_flags = CRYPTO_ALG_TYPE_AKCIPHER |
623 CRYPTO_ALG_ASYNC |
624 CRYPTO_ALG_KERN_DRIVER_ONLY |
625 CRYPTO_ALG_NEED_FALLBACK,
626 .cra_module = THIS_MODULE,
627 .cra_ctxsize = sizeof(struct aspeed_acry_ctx),
628 },
629 },
630 },
631 };
632
aspeed_acry_register(struct aspeed_acry_dev * acry_dev)633 static void aspeed_acry_register(struct aspeed_acry_dev *acry_dev)
634 {
635 int i, rc;
636
637 for (i = 0; i < ARRAY_SIZE(aspeed_acry_akcipher_algs); i++) {
638 aspeed_acry_akcipher_algs[i].acry_dev = acry_dev;
639 rc = crypto_register_akcipher(&aspeed_acry_akcipher_algs[i].akcipher);
640 if (rc) {
641 ACRY_DBG(acry_dev, "Failed to register %s\n",
642 aspeed_acry_akcipher_algs[i].akcipher.base.cra_name);
643 }
644 }
645 }
646
aspeed_acry_unregister(struct aspeed_acry_dev * acry_dev)647 static void aspeed_acry_unregister(struct aspeed_acry_dev *acry_dev)
648 {
649 int i;
650
651 for (i = 0; i < ARRAY_SIZE(aspeed_acry_akcipher_algs); i++)
652 crypto_unregister_akcipher(&aspeed_acry_akcipher_algs[i].akcipher);
653 }
654
655 /* ACRY interrupt service routine. */
aspeed_acry_irq(int irq,void * dev)656 static irqreturn_t aspeed_acry_irq(int irq, void *dev)
657 {
658 struct aspeed_acry_dev *acry_dev = (struct aspeed_acry_dev *)dev;
659 u32 sts;
660
661 sts = ast_acry_read(acry_dev, ASPEED_ACRY_STATUS);
662 ast_acry_write(acry_dev, sts, ASPEED_ACRY_STATUS);
663
664 ACRY_DBG(acry_dev, "irq sts:0x%x\n", sts);
665
666 if (sts & ACRY_RSA_ISR) {
667 /* Stop RSA engine */
668 ast_acry_write(acry_dev, 0, ASPEED_ACRY_TRIGGER);
669
670 if (acry_dev->flags & CRYPTO_FLAGS_BUSY)
671 tasklet_schedule(&acry_dev->done_task);
672 else
673 dev_err(acry_dev->dev, "RSA no active requests.\n");
674 }
675
676 return IRQ_HANDLED;
677 }
678
679 /*
680 * ACRY SRAM has its own memory layout.
681 * Set the DRAM to SRAM indexing for future used.
682 */
aspeed_acry_sram_mapping(struct aspeed_acry_dev * acry_dev)683 static void aspeed_acry_sram_mapping(struct aspeed_acry_dev *acry_dev)
684 {
685 int i, j = 0;
686
687 for (i = 0; i < (ASPEED_ACRY_SRAM_MAX_LEN / BYTES_PER_DWORD); i++) {
688 acry_dev->exp_dw_mapping[i] = j;
689 acry_dev->mod_dw_mapping[i] = j + 4;
690 acry_dev->data_byte_mapping[(i * 4)] = (j + 8) * 4;
691 acry_dev->data_byte_mapping[(i * 4) + 1] = (j + 8) * 4 + 1;
692 acry_dev->data_byte_mapping[(i * 4) + 2] = (j + 8) * 4 + 2;
693 acry_dev->data_byte_mapping[(i * 4) + 3] = (j + 8) * 4 + 3;
694 j++;
695 j = j % 4 ? j : j + 8;
696 }
697 }
698
aspeed_acry_done_task(unsigned long data)699 static void aspeed_acry_done_task(unsigned long data)
700 {
701 struct aspeed_acry_dev *acry_dev = (struct aspeed_acry_dev *)data;
702
703 (void)acry_dev->resume(acry_dev);
704 }
705
706 static const struct of_device_id aspeed_acry_of_matches[] = {
707 { .compatible = "aspeed,ast2600-acry", },
708 {},
709 };
710
aspeed_acry_probe(struct platform_device * pdev)711 static int aspeed_acry_probe(struct platform_device *pdev)
712 {
713 struct aspeed_acry_dev *acry_dev;
714 struct device *dev = &pdev->dev;
715 struct resource *res;
716 int rc;
717
718 acry_dev = devm_kzalloc(dev, sizeof(struct aspeed_acry_dev),
719 GFP_KERNEL);
720 if (!acry_dev)
721 return -ENOMEM;
722
723 acry_dev->dev = dev;
724
725 platform_set_drvdata(pdev, acry_dev);
726
727 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
728 acry_dev->regs = devm_ioremap_resource(dev, res);
729 if (IS_ERR(acry_dev->regs))
730 return PTR_ERR(acry_dev->regs);
731
732 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
733 acry_dev->acry_sram = devm_ioremap_resource(dev, res);
734 if (IS_ERR(acry_dev->acry_sram))
735 return PTR_ERR(acry_dev->acry_sram);
736
737 /* Get irq number and register it */
738 acry_dev->irq = platform_get_irq(pdev, 0);
739 if (acry_dev->irq < 0)
740 return -ENXIO;
741
742 rc = devm_request_irq(dev, acry_dev->irq, aspeed_acry_irq, 0,
743 dev_name(dev), acry_dev);
744 if (rc) {
745 dev_err(dev, "Failed to request irq.\n");
746 return rc;
747 }
748
749 acry_dev->clk = devm_clk_get_enabled(dev, NULL);
750 if (IS_ERR(acry_dev->clk)) {
751 dev_err(dev, "Failed to get acry clk\n");
752 return PTR_ERR(acry_dev->clk);
753 }
754
755 acry_dev->ahbc = syscon_regmap_lookup_by_phandle(dev->of_node,
756 "aspeed,ahbc");
757 if (IS_ERR(acry_dev->ahbc)) {
758 dev_err(dev, "Failed to get AHBC regmap\n");
759 return -ENODEV;
760 }
761
762 /* Initialize crypto hardware engine structure for RSA */
763 acry_dev->crypt_engine_rsa = crypto_engine_alloc_init(dev, true);
764 if (!acry_dev->crypt_engine_rsa) {
765 rc = -ENOMEM;
766 goto clk_exit;
767 }
768
769 rc = crypto_engine_start(acry_dev->crypt_engine_rsa);
770 if (rc)
771 goto err_engine_rsa_start;
772
773 tasklet_init(&acry_dev->done_task, aspeed_acry_done_task,
774 (unsigned long)acry_dev);
775
776 /* Set Data Memory to AHB(CPU) Access Mode */
777 ast_acry_write(acry_dev, ACRY_CMD_DMEM_AHB, ASPEED_ACRY_DMA_CMD);
778
779 /* Initialize ACRY SRAM index */
780 aspeed_acry_sram_mapping(acry_dev);
781
782 acry_dev->buf_addr = dmam_alloc_coherent(dev, ASPEED_ACRY_BUFF_SIZE,
783 &acry_dev->buf_dma_addr,
784 GFP_KERNEL);
785 memzero_explicit(acry_dev->buf_addr, ASPEED_ACRY_BUFF_SIZE);
786
787 aspeed_acry_register(acry_dev);
788
789 dev_info(dev, "Aspeed ACRY Accelerator successfully registered\n");
790
791 return 0;
792
793 err_engine_rsa_start:
794 crypto_engine_exit(acry_dev->crypt_engine_rsa);
795 clk_exit:
796 clk_disable_unprepare(acry_dev->clk);
797
798 return rc;
799 }
800
aspeed_acry_remove(struct platform_device * pdev)801 static int aspeed_acry_remove(struct platform_device *pdev)
802 {
803 struct aspeed_acry_dev *acry_dev = platform_get_drvdata(pdev);
804
805 aspeed_acry_unregister(acry_dev);
806 crypto_engine_exit(acry_dev->crypt_engine_rsa);
807 tasklet_kill(&acry_dev->done_task);
808 clk_disable_unprepare(acry_dev->clk);
809
810 return 0;
811 }
812
813 MODULE_DEVICE_TABLE(of, aspeed_acry_of_matches);
814
815 static struct platform_driver aspeed_acry_driver = {
816 .probe = aspeed_acry_probe,
817 .remove = aspeed_acry_remove,
818 .driver = {
819 .name = KBUILD_MODNAME,
820 .of_match_table = aspeed_acry_of_matches,
821 },
822 };
823
824 module_platform_driver(aspeed_acry_driver);
825
826 MODULE_AUTHOR("Neal Liu <neal_liu@aspeedtech.com>");
827 MODULE_DESCRIPTION("ASPEED ACRY driver for hardware RSA Engine");
828 MODULE_LICENSE("GPL");
829