atmel-sha.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. /*
  2. * Cryptographic API.
  3. *
  4. * Support for ATMEL SHA1/SHA256 HW acceleration.
  5. *
  6. * Copyright (c) 2012 Eukréa Electromatique - ATMEL
  7. * Author: Nicolas Royer <nicolas@eukrea.com>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as published
  11. * by the Free Software Foundation.
  12. *
  13. * Some ideas are from omap-sham.c drivers.
  14. */
  15. #include <linux/kernel.h>
  16. #include <linux/module.h>
  17. #include <linux/slab.h>
  18. #include <linux/err.h>
  19. #include <linux/clk.h>
  20. #include <linux/io.h>
  21. #include <linux/hw_random.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/device.h>
  24. #include <linux/init.h>
  25. #include <linux/errno.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/irq.h>
  28. #include <linux/scatterlist.h>
  29. #include <linux/dma-mapping.h>
  30. #include <linux/delay.h>
  31. #include <linux/crypto.h>
  32. #include <linux/cryptohash.h>
  33. #include <crypto/scatterwalk.h>
  34. #include <crypto/algapi.h>
  35. #include <crypto/sha.h>
  36. #include <crypto/hash.h>
  37. #include <crypto/internal/hash.h>
  38. #include "atmel-sha-regs.h"
  39. /* SHA flags */
  40. #define SHA_FLAGS_BUSY BIT(0)
  41. #define SHA_FLAGS_FINAL BIT(1)
  42. #define SHA_FLAGS_DMA_ACTIVE BIT(2)
  43. #define SHA_FLAGS_OUTPUT_READY BIT(3)
  44. #define SHA_FLAGS_INIT BIT(4)
  45. #define SHA_FLAGS_CPU BIT(5)
  46. #define SHA_FLAGS_DMA_READY BIT(6)
  47. #define SHA_FLAGS_FINUP BIT(16)
  48. #define SHA_FLAGS_SG BIT(17)
  49. #define SHA_FLAGS_SHA1 BIT(18)
  50. #define SHA_FLAGS_SHA256 BIT(19)
  51. #define SHA_FLAGS_ERROR BIT(20)
  52. #define SHA_FLAGS_PAD BIT(21)
  53. #define SHA_FLAGS_DUALBUFF BIT(24)
  54. #define SHA_OP_UPDATE 1
  55. #define SHA_OP_FINAL 2
  56. #define SHA_BUFFER_LEN PAGE_SIZE
  57. #define ATMEL_SHA_DMA_THRESHOLD 56
  58. struct atmel_sha_dev;
  59. struct atmel_sha_reqctx {
  60. struct atmel_sha_dev *dd;
  61. unsigned long flags;
  62. unsigned long op;
  63. u8 digest[SHA256_DIGEST_SIZE] __aligned(sizeof(u32));
  64. size_t digcnt;
  65. size_t bufcnt;
  66. size_t buflen;
  67. dma_addr_t dma_addr;
  68. /* walk state */
  69. struct scatterlist *sg;
  70. unsigned int offset; /* offset in current sg */
  71. unsigned int total; /* total request */
  72. u8 buffer[0] __aligned(sizeof(u32));
  73. };
  74. struct atmel_sha_ctx {
  75. struct atmel_sha_dev *dd;
  76. unsigned long flags;
  77. /* fallback stuff */
  78. struct crypto_shash *fallback;
  79. };
  80. #define ATMEL_SHA_QUEUE_LENGTH 1
  81. struct atmel_sha_dev {
  82. struct list_head list;
  83. unsigned long phys_base;
  84. struct device *dev;
  85. struct clk *iclk;
  86. int irq;
  87. void __iomem *io_base;
  88. spinlock_t lock;
  89. int err;
  90. struct tasklet_struct done_task;
  91. unsigned long flags;
  92. struct crypto_queue queue;
  93. struct ahash_request *req;
  94. };
  95. struct atmel_sha_drv {
  96. struct list_head dev_list;
  97. spinlock_t lock;
  98. };
  99. static struct atmel_sha_drv atmel_sha = {
  100. .dev_list = LIST_HEAD_INIT(atmel_sha.dev_list),
  101. .lock = __SPIN_LOCK_UNLOCKED(atmel_sha.lock),
  102. };
  103. static inline u32 atmel_sha_read(struct atmel_sha_dev *dd, u32 offset)
  104. {
  105. return readl_relaxed(dd->io_base + offset);
  106. }
  107. static inline void atmel_sha_write(struct atmel_sha_dev *dd,
  108. u32 offset, u32 value)
  109. {
  110. writel_relaxed(value, dd->io_base + offset);
  111. }
  112. static void atmel_sha_dualbuff_test(struct atmel_sha_dev *dd)
  113. {
  114. atmel_sha_write(dd, SHA_MR, SHA_MR_DUALBUFF);
  115. if (atmel_sha_read(dd, SHA_MR) & SHA_MR_DUALBUFF)
  116. dd->flags |= SHA_FLAGS_DUALBUFF;
  117. }
  118. static size_t atmel_sha_append_sg(struct atmel_sha_reqctx *ctx)
  119. {
  120. size_t count;
  121. while ((ctx->bufcnt < ctx->buflen) && ctx->total) {
  122. count = min(ctx->sg->length - ctx->offset, ctx->total);
  123. count = min(count, ctx->buflen - ctx->bufcnt);
  124. if (count <= 0)
  125. break;
  126. scatterwalk_map_and_copy(ctx->buffer + ctx->bufcnt, ctx->sg,
  127. ctx->offset, count, 0);
  128. ctx->bufcnt += count;
  129. ctx->offset += count;
  130. ctx->total -= count;
  131. if (ctx->offset == ctx->sg->length) {
  132. ctx->sg = sg_next(ctx->sg);
  133. if (ctx->sg)
  134. ctx->offset = 0;
  135. else
  136. ctx->total = 0;
  137. }
  138. }
  139. return 0;
  140. }
  141. /*
  142. * The purpose of this padding is to ensure that the padded message
  143. * is a multiple of 512 bits. The bit "1" is appended at the end of
  144. * the message followed by "padlen-1" zero bits. Then a 64 bits block
  145. * equals to the message length in bits is appended.
  146. *
  147. * padlen is calculated as followed:
  148. * - if message length < 56 bytes then padlen = 56 - message length
  149. * - else padlen = 64 + 56 - message length
  150. */
  151. static void atmel_sha_fill_padding(struct atmel_sha_reqctx *ctx, int length)
  152. {
  153. unsigned int index, padlen;
  154. u64 bits;
  155. u64 size;
  156. bits = (ctx->bufcnt + ctx->digcnt + length) << 3;
  157. size = cpu_to_be64(bits);
  158. index = ctx->bufcnt & 0x3f;
  159. padlen = (index < 56) ? (56 - index) : ((64+56) - index);
  160. *(ctx->buffer + ctx->bufcnt) = 0x80;
  161. memset(ctx->buffer + ctx->bufcnt + 1, 0, padlen-1);
  162. memcpy(ctx->buffer + ctx->bufcnt + padlen, &size, 8);
  163. ctx->bufcnt += padlen + 8;
  164. ctx->flags |= SHA_FLAGS_PAD;
  165. }
  166. static int atmel_sha_init(struct ahash_request *req)
  167. {
  168. struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
  169. struct atmel_sha_ctx *tctx = crypto_ahash_ctx(tfm);
  170. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  171. struct atmel_sha_dev *dd = NULL;
  172. struct atmel_sha_dev *tmp;
  173. spin_lock_bh(&atmel_sha.lock);
  174. if (!tctx->dd) {
  175. list_for_each_entry(tmp, &atmel_sha.dev_list, list) {
  176. dd = tmp;
  177. break;
  178. }
  179. tctx->dd = dd;
  180. } else {
  181. dd = tctx->dd;
  182. }
  183. spin_unlock_bh(&atmel_sha.lock);
  184. ctx->dd = dd;
  185. ctx->flags = 0;
  186. dev_dbg(dd->dev, "init: digest size: %d\n",
  187. crypto_ahash_digestsize(tfm));
  188. if (crypto_ahash_digestsize(tfm) == SHA1_DIGEST_SIZE)
  189. ctx->flags |= SHA_FLAGS_SHA1;
  190. else if (crypto_ahash_digestsize(tfm) == SHA256_DIGEST_SIZE)
  191. ctx->flags |= SHA_FLAGS_SHA256;
  192. ctx->bufcnt = 0;
  193. ctx->digcnt = 0;
  194. ctx->buflen = SHA_BUFFER_LEN;
  195. return 0;
  196. }
  197. static void atmel_sha_write_ctrl(struct atmel_sha_dev *dd, int dma)
  198. {
  199. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  200. u32 valcr = 0, valmr = SHA_MR_MODE_AUTO;
  201. if (likely(dma)) {
  202. atmel_sha_write(dd, SHA_IER, SHA_INT_TXBUFE);
  203. valmr = SHA_MR_MODE_PDC;
  204. if (dd->flags & SHA_FLAGS_DUALBUFF)
  205. valmr = SHA_MR_DUALBUFF;
  206. } else {
  207. atmel_sha_write(dd, SHA_IER, SHA_INT_DATARDY);
  208. }
  209. if (ctx->flags & SHA_FLAGS_SHA256)
  210. valmr |= SHA_MR_ALGO_SHA256;
  211. /* Setting CR_FIRST only for the first iteration */
  212. if (!ctx->digcnt)
  213. valcr = SHA_CR_FIRST;
  214. atmel_sha_write(dd, SHA_CR, valcr);
  215. atmel_sha_write(dd, SHA_MR, valmr);
  216. }
  217. static int atmel_sha_xmit_cpu(struct atmel_sha_dev *dd, const u8 *buf,
  218. size_t length, int final)
  219. {
  220. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  221. int count, len32;
  222. const u32 *buffer = (const u32 *)buf;
  223. dev_dbg(dd->dev, "xmit_cpu: digcnt: %d, length: %d, final: %d\n",
  224. ctx->digcnt, length, final);
  225. atmel_sha_write_ctrl(dd, 0);
  226. /* should be non-zero before next lines to disable clocks later */
  227. ctx->digcnt += length;
  228. if (final)
  229. dd->flags |= SHA_FLAGS_FINAL; /* catch last interrupt */
  230. len32 = DIV_ROUND_UP(length, sizeof(u32));
  231. dd->flags |= SHA_FLAGS_CPU;
  232. for (count = 0; count < len32; count++)
  233. atmel_sha_write(dd, SHA_REG_DIN(count), buffer[count]);
  234. return -EINPROGRESS;
  235. }
  236. static int atmel_sha_xmit_pdc(struct atmel_sha_dev *dd, dma_addr_t dma_addr1,
  237. size_t length1, dma_addr_t dma_addr2, size_t length2, int final)
  238. {
  239. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  240. int len32;
  241. dev_dbg(dd->dev, "xmit_pdc: digcnt: %d, length: %d, final: %d\n",
  242. ctx->digcnt, length1, final);
  243. len32 = DIV_ROUND_UP(length1, sizeof(u32));
  244. atmel_sha_write(dd, SHA_PTCR, SHA_PTCR_TXTDIS);
  245. atmel_sha_write(dd, SHA_TPR, dma_addr1);
  246. atmel_sha_write(dd, SHA_TCR, len32);
  247. len32 = DIV_ROUND_UP(length2, sizeof(u32));
  248. atmel_sha_write(dd, SHA_TNPR, dma_addr2);
  249. atmel_sha_write(dd, SHA_TNCR, len32);
  250. atmel_sha_write_ctrl(dd, 1);
  251. /* should be non-zero before next lines to disable clocks later */
  252. ctx->digcnt += length1;
  253. if (final)
  254. dd->flags |= SHA_FLAGS_FINAL; /* catch last interrupt */
  255. dd->flags |= SHA_FLAGS_DMA_ACTIVE;
  256. /* Start DMA transfer */
  257. atmel_sha_write(dd, SHA_PTCR, SHA_PTCR_TXTEN);
  258. return -EINPROGRESS;
  259. }
  260. static int atmel_sha_update_cpu(struct atmel_sha_dev *dd)
  261. {
  262. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  263. int bufcnt;
  264. atmel_sha_append_sg(ctx);
  265. atmel_sha_fill_padding(ctx, 0);
  266. bufcnt = ctx->bufcnt;
  267. ctx->bufcnt = 0;
  268. return atmel_sha_xmit_cpu(dd, ctx->buffer, bufcnt, 1);
  269. }
  270. static int atmel_sha_xmit_dma_map(struct atmel_sha_dev *dd,
  271. struct atmel_sha_reqctx *ctx,
  272. size_t length, int final)
  273. {
  274. ctx->dma_addr = dma_map_single(dd->dev, ctx->buffer,
  275. ctx->buflen + SHA1_BLOCK_SIZE, DMA_TO_DEVICE);
  276. if (dma_mapping_error(dd->dev, ctx->dma_addr)) {
  277. dev_err(dd->dev, "dma %u bytes error\n", ctx->buflen +
  278. SHA1_BLOCK_SIZE);
  279. return -EINVAL;
  280. }
  281. ctx->flags &= ~SHA_FLAGS_SG;
  282. /* next call does not fail... so no unmap in the case of error */
  283. return atmel_sha_xmit_pdc(dd, ctx->dma_addr, length, 0, 0, final);
  284. }
  285. static int atmel_sha_update_dma_slow(struct atmel_sha_dev *dd)
  286. {
  287. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  288. unsigned int final;
  289. size_t count;
  290. atmel_sha_append_sg(ctx);
  291. final = (ctx->flags & SHA_FLAGS_FINUP) && !ctx->total;
  292. dev_dbg(dd->dev, "slow: bufcnt: %u, digcnt: %d, final: %d\n",
  293. ctx->bufcnt, ctx->digcnt, final);
  294. if (final)
  295. atmel_sha_fill_padding(ctx, 0);
  296. if (final || (ctx->bufcnt == ctx->buflen && ctx->total)) {
  297. count = ctx->bufcnt;
  298. ctx->bufcnt = 0;
  299. return atmel_sha_xmit_dma_map(dd, ctx, count, final);
  300. }
  301. return 0;
  302. }
  303. static int atmel_sha_update_dma_start(struct atmel_sha_dev *dd)
  304. {
  305. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  306. unsigned int length, final, tail;
  307. struct scatterlist *sg;
  308. unsigned int count;
  309. if (!ctx->total)
  310. return 0;
  311. if (ctx->bufcnt || ctx->offset)
  312. return atmel_sha_update_dma_slow(dd);
  313. dev_dbg(dd->dev, "fast: digcnt: %d, bufcnt: %u, total: %u\n",
  314. ctx->digcnt, ctx->bufcnt, ctx->total);
  315. sg = ctx->sg;
  316. if (!IS_ALIGNED(sg->offset, sizeof(u32)))
  317. return atmel_sha_update_dma_slow(dd);
  318. if (!sg_is_last(sg) && !IS_ALIGNED(sg->length, SHA1_BLOCK_SIZE))
  319. /* size is not SHA1_BLOCK_SIZE aligned */
  320. return atmel_sha_update_dma_slow(dd);
  321. length = min(ctx->total, sg->length);
  322. if (sg_is_last(sg)) {
  323. if (!(ctx->flags & SHA_FLAGS_FINUP)) {
  324. /* not last sg must be SHA1_BLOCK_SIZE aligned */
  325. tail = length & (SHA1_BLOCK_SIZE - 1);
  326. length -= tail;
  327. if (length == 0) {
  328. /* offset where to start slow */
  329. ctx->offset = length;
  330. return atmel_sha_update_dma_slow(dd);
  331. }
  332. }
  333. }
  334. ctx->total -= length;
  335. ctx->offset = length; /* offset where to start slow */
  336. final = (ctx->flags & SHA_FLAGS_FINUP) && !ctx->total;
  337. /* Add padding */
  338. if (final) {
  339. tail = length & (SHA1_BLOCK_SIZE - 1);
  340. length -= tail;
  341. ctx->total += tail;
  342. ctx->offset = length; /* offset where to start slow */
  343. sg = ctx->sg;
  344. atmel_sha_append_sg(ctx);
  345. atmel_sha_fill_padding(ctx, length);
  346. ctx->dma_addr = dma_map_single(dd->dev, ctx->buffer,
  347. ctx->buflen + SHA1_BLOCK_SIZE, DMA_TO_DEVICE);
  348. if (dma_mapping_error(dd->dev, ctx->dma_addr)) {
  349. dev_err(dd->dev, "dma %u bytes error\n",
  350. ctx->buflen + SHA1_BLOCK_SIZE);
  351. return -EINVAL;
  352. }
  353. if (length == 0) {
  354. ctx->flags &= ~SHA_FLAGS_SG;
  355. count = ctx->bufcnt;
  356. ctx->bufcnt = 0;
  357. return atmel_sha_xmit_pdc(dd, ctx->dma_addr, count, 0,
  358. 0, final);
  359. } else {
  360. ctx->sg = sg;
  361. if (!dma_map_sg(dd->dev, ctx->sg, 1,
  362. DMA_TO_DEVICE)) {
  363. dev_err(dd->dev, "dma_map_sg error\n");
  364. return -EINVAL;
  365. }
  366. ctx->flags |= SHA_FLAGS_SG;
  367. count = ctx->bufcnt;
  368. ctx->bufcnt = 0;
  369. return atmel_sha_xmit_pdc(dd, sg_dma_address(ctx->sg),
  370. length, ctx->dma_addr, count, final);
  371. }
  372. }
  373. if (!dma_map_sg(dd->dev, ctx->sg, 1, DMA_TO_DEVICE)) {
  374. dev_err(dd->dev, "dma_map_sg error\n");
  375. return -EINVAL;
  376. }
  377. ctx->flags |= SHA_FLAGS_SG;
  378. /* next call does not fail... so no unmap in the case of error */
  379. return atmel_sha_xmit_pdc(dd, sg_dma_address(ctx->sg), length, 0,
  380. 0, final);
  381. }
  382. static int atmel_sha_update_dma_stop(struct atmel_sha_dev *dd)
  383. {
  384. struct atmel_sha_reqctx *ctx = ahash_request_ctx(dd->req);
  385. if (ctx->flags & SHA_FLAGS_SG) {
  386. dma_unmap_sg(dd->dev, ctx->sg, 1, DMA_TO_DEVICE);
  387. if (ctx->sg->length == ctx->offset) {
  388. ctx->sg = sg_next(ctx->sg);
  389. if (ctx->sg)
  390. ctx->offset = 0;
  391. }
  392. if (ctx->flags & SHA_FLAGS_PAD)
  393. dma_unmap_single(dd->dev, ctx->dma_addr,
  394. ctx->buflen + SHA1_BLOCK_SIZE, DMA_TO_DEVICE);
  395. } else {
  396. dma_unmap_single(dd->dev, ctx->dma_addr, ctx->buflen +
  397. SHA1_BLOCK_SIZE, DMA_TO_DEVICE);
  398. }
  399. return 0;
  400. }
  401. static int atmel_sha_update_req(struct atmel_sha_dev *dd)
  402. {
  403. struct ahash_request *req = dd->req;
  404. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  405. int err;
  406. dev_dbg(dd->dev, "update_req: total: %u, digcnt: %d, finup: %d\n",
  407. ctx->total, ctx->digcnt, (ctx->flags & SHA_FLAGS_FINUP) != 0);
  408. if (ctx->flags & SHA_FLAGS_CPU)
  409. err = atmel_sha_update_cpu(dd);
  410. else
  411. err = atmel_sha_update_dma_start(dd);
  412. /* wait for dma completion before can take more data */
  413. dev_dbg(dd->dev, "update: err: %d, digcnt: %d\n",
  414. err, ctx->digcnt);
  415. return err;
  416. }
  417. static int atmel_sha_final_req(struct atmel_sha_dev *dd)
  418. {
  419. struct ahash_request *req = dd->req;
  420. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  421. int err = 0;
  422. int count;
  423. if (ctx->bufcnt >= ATMEL_SHA_DMA_THRESHOLD) {
  424. atmel_sha_fill_padding(ctx, 0);
  425. count = ctx->bufcnt;
  426. ctx->bufcnt = 0;
  427. err = atmel_sha_xmit_dma_map(dd, ctx, count, 1);
  428. }
  429. /* faster to handle last block with cpu */
  430. else {
  431. atmel_sha_fill_padding(ctx, 0);
  432. count = ctx->bufcnt;
  433. ctx->bufcnt = 0;
  434. err = atmel_sha_xmit_cpu(dd, ctx->buffer, count, 1);
  435. }
  436. dev_dbg(dd->dev, "final_req: err: %d\n", err);
  437. return err;
  438. }
  439. static void atmel_sha_copy_hash(struct ahash_request *req)
  440. {
  441. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  442. u32 *hash = (u32 *)ctx->digest;
  443. int i;
  444. if (likely(ctx->flags & SHA_FLAGS_SHA1))
  445. for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++)
  446. hash[i] = atmel_sha_read(ctx->dd, SHA_REG_DIGEST(i));
  447. else
  448. for (i = 0; i < SHA256_DIGEST_SIZE / sizeof(u32); i++)
  449. hash[i] = atmel_sha_read(ctx->dd, SHA_REG_DIGEST(i));
  450. }
  451. static void atmel_sha_copy_ready_hash(struct ahash_request *req)
  452. {
  453. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  454. if (!req->result)
  455. return;
  456. if (likely(ctx->flags & SHA_FLAGS_SHA1))
  457. memcpy(req->result, ctx->digest, SHA1_DIGEST_SIZE);
  458. else
  459. memcpy(req->result, ctx->digest, SHA256_DIGEST_SIZE);
  460. }
  461. static int atmel_sha_finish(struct ahash_request *req)
  462. {
  463. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  464. struct atmel_sha_dev *dd = ctx->dd;
  465. int err = 0;
  466. if (ctx->digcnt)
  467. atmel_sha_copy_ready_hash(req);
  468. dev_dbg(dd->dev, "digcnt: %d, bufcnt: %d\n", ctx->digcnt,
  469. ctx->bufcnt);
  470. return err;
  471. }
  472. static void atmel_sha_finish_req(struct ahash_request *req, int err)
  473. {
  474. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  475. struct atmel_sha_dev *dd = ctx->dd;
  476. if (!err) {
  477. atmel_sha_copy_hash(req);
  478. if (SHA_FLAGS_FINAL & dd->flags)
  479. err = atmel_sha_finish(req);
  480. } else {
  481. ctx->flags |= SHA_FLAGS_ERROR;
  482. }
  483. /* atomic operation is not needed here */
  484. dd->flags &= ~(SHA_FLAGS_BUSY | SHA_FLAGS_FINAL | SHA_FLAGS_CPU |
  485. SHA_FLAGS_DMA_READY | SHA_FLAGS_OUTPUT_READY);
  486. clk_disable_unprepare(dd->iclk);
  487. if (req->base.complete)
  488. req->base.complete(&req->base, err);
  489. /* handle new request */
  490. tasklet_schedule(&dd->done_task);
  491. }
  492. static int atmel_sha_hw_init(struct atmel_sha_dev *dd)
  493. {
  494. clk_prepare_enable(dd->iclk);
  495. if (SHA_FLAGS_INIT & dd->flags) {
  496. atmel_sha_write(dd, SHA_CR, SHA_CR_SWRST);
  497. atmel_sha_dualbuff_test(dd);
  498. dd->flags |= SHA_FLAGS_INIT;
  499. dd->err = 0;
  500. }
  501. return 0;
  502. }
  503. static int atmel_sha_handle_queue(struct atmel_sha_dev *dd,
  504. struct ahash_request *req)
  505. {
  506. struct crypto_async_request *async_req, *backlog;
  507. struct atmel_sha_reqctx *ctx;
  508. unsigned long flags;
  509. int err = 0, ret = 0;
  510. spin_lock_irqsave(&dd->lock, flags);
  511. if (req)
  512. ret = ahash_enqueue_request(&dd->queue, req);
  513. if (SHA_FLAGS_BUSY & dd->flags) {
  514. spin_unlock_irqrestore(&dd->lock, flags);
  515. return ret;
  516. }
  517. backlog = crypto_get_backlog(&dd->queue);
  518. async_req = crypto_dequeue_request(&dd->queue);
  519. if (async_req)
  520. dd->flags |= SHA_FLAGS_BUSY;
  521. spin_unlock_irqrestore(&dd->lock, flags);
  522. if (!async_req)
  523. return ret;
  524. if (backlog)
  525. backlog->complete(backlog, -EINPROGRESS);
  526. req = ahash_request_cast(async_req);
  527. dd->req = req;
  528. ctx = ahash_request_ctx(req);
  529. dev_dbg(dd->dev, "handling new req, op: %lu, nbytes: %d\n",
  530. ctx->op, req->nbytes);
  531. err = atmel_sha_hw_init(dd);
  532. if (err)
  533. goto err1;
  534. if (ctx->op == SHA_OP_UPDATE) {
  535. err = atmel_sha_update_req(dd);
  536. if (err != -EINPROGRESS && (ctx->flags & SHA_FLAGS_FINUP)) {
  537. /* no final() after finup() */
  538. err = atmel_sha_final_req(dd);
  539. }
  540. } else if (ctx->op == SHA_OP_FINAL) {
  541. err = atmel_sha_final_req(dd);
  542. }
  543. err1:
  544. if (err != -EINPROGRESS)
  545. /* done_task will not finish it, so do it here */
  546. atmel_sha_finish_req(req, err);
  547. dev_dbg(dd->dev, "exit, err: %d\n", err);
  548. return ret;
  549. }
  550. static int atmel_sha_enqueue(struct ahash_request *req, unsigned int op)
  551. {
  552. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  553. struct atmel_sha_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
  554. struct atmel_sha_dev *dd = tctx->dd;
  555. ctx->op = op;
  556. return atmel_sha_handle_queue(dd, req);
  557. }
  558. static int atmel_sha_update(struct ahash_request *req)
  559. {
  560. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  561. if (!req->nbytes)
  562. return 0;
  563. ctx->total = req->nbytes;
  564. ctx->sg = req->src;
  565. ctx->offset = 0;
  566. if (ctx->flags & SHA_FLAGS_FINUP) {
  567. if (ctx->bufcnt + ctx->total < ATMEL_SHA_DMA_THRESHOLD)
  568. /* faster to use CPU for short transfers */
  569. ctx->flags |= SHA_FLAGS_CPU;
  570. } else if (ctx->bufcnt + ctx->total < ctx->buflen) {
  571. atmel_sha_append_sg(ctx);
  572. return 0;
  573. }
  574. return atmel_sha_enqueue(req, SHA_OP_UPDATE);
  575. }
  576. static int atmel_sha_final(struct ahash_request *req)
  577. {
  578. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  579. struct atmel_sha_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
  580. struct atmel_sha_dev *dd = tctx->dd;
  581. int err = 0;
  582. ctx->flags |= SHA_FLAGS_FINUP;
  583. if (ctx->flags & SHA_FLAGS_ERROR)
  584. return 0; /* uncompleted hash is not needed */
  585. if (ctx->bufcnt) {
  586. return atmel_sha_enqueue(req, SHA_OP_FINAL);
  587. } else if (!(ctx->flags & SHA_FLAGS_PAD)) { /* add padding */
  588. err = atmel_sha_hw_init(dd);
  589. if (err)
  590. goto err1;
  591. dd->flags |= SHA_FLAGS_BUSY;
  592. err = atmel_sha_final_req(dd);
  593. } else {
  594. /* copy ready hash (+ finalize hmac) */
  595. return atmel_sha_finish(req);
  596. }
  597. err1:
  598. if (err != -EINPROGRESS)
  599. /* done_task will not finish it, so do it here */
  600. atmel_sha_finish_req(req, err);
  601. return err;
  602. }
  603. static int atmel_sha_finup(struct ahash_request *req)
  604. {
  605. struct atmel_sha_reqctx *ctx = ahash_request_ctx(req);
  606. int err1, err2;
  607. ctx->flags |= SHA_FLAGS_FINUP;
  608. err1 = atmel_sha_update(req);
  609. if (err1 == -EINPROGRESS || err1 == -EBUSY)
  610. return err1;
  611. /*
  612. * final() has to be always called to cleanup resources
  613. * even if udpate() failed, except EINPROGRESS
  614. */
  615. err2 = atmel_sha_final(req);
  616. return err1 ?: err2;
  617. }
  618. static int atmel_sha_digest(struct ahash_request *req)
  619. {
  620. return atmel_sha_init(req) ?: atmel_sha_finup(req);
  621. }
  622. static int atmel_sha_cra_init_alg(struct crypto_tfm *tfm, const char *alg_base)
  623. {
  624. struct atmel_sha_ctx *tctx = crypto_tfm_ctx(tfm);
  625. const char *alg_name = crypto_tfm_alg_name(tfm);
  626. /* Allocate a fallback and abort if it failed. */
  627. tctx->fallback = crypto_alloc_shash(alg_name, 0,
  628. CRYPTO_ALG_NEED_FALLBACK);
  629. if (IS_ERR(tctx->fallback)) {
  630. pr_err("atmel-sha: fallback driver '%s' could not be loaded.\n",
  631. alg_name);
  632. return PTR_ERR(tctx->fallback);
  633. }
  634. crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
  635. sizeof(struct atmel_sha_reqctx) +
  636. SHA_BUFFER_LEN + SHA256_BLOCK_SIZE);
  637. return 0;
  638. }
  639. static int atmel_sha_cra_init(struct crypto_tfm *tfm)
  640. {
  641. return atmel_sha_cra_init_alg(tfm, NULL);
  642. }
  643. static void atmel_sha_cra_exit(struct crypto_tfm *tfm)
  644. {
  645. struct atmel_sha_ctx *tctx = crypto_tfm_ctx(tfm);
  646. crypto_free_shash(tctx->fallback);
  647. tctx->fallback = NULL;
  648. }
  649. static struct ahash_alg sha_algs[] = {
  650. {
  651. .init = atmel_sha_init,
  652. .update = atmel_sha_update,
  653. .final = atmel_sha_final,
  654. .finup = atmel_sha_finup,
  655. .digest = atmel_sha_digest,
  656. .halg = {
  657. .digestsize = SHA1_DIGEST_SIZE,
  658. .base = {
  659. .cra_name = "sha1",
  660. .cra_driver_name = "atmel-sha1",
  661. .cra_priority = 100,
  662. .cra_flags = CRYPTO_ALG_ASYNC |
  663. CRYPTO_ALG_NEED_FALLBACK,
  664. .cra_blocksize = SHA1_BLOCK_SIZE,
  665. .cra_ctxsize = sizeof(struct atmel_sha_ctx),
  666. .cra_alignmask = 0,
  667. .cra_module = THIS_MODULE,
  668. .cra_init = atmel_sha_cra_init,
  669. .cra_exit = atmel_sha_cra_exit,
  670. }
  671. }
  672. },
  673. {
  674. .init = atmel_sha_init,
  675. .update = atmel_sha_update,
  676. .final = atmel_sha_final,
  677. .finup = atmel_sha_finup,
  678. .digest = atmel_sha_digest,
  679. .halg = {
  680. .digestsize = SHA256_DIGEST_SIZE,
  681. .base = {
  682. .cra_name = "sha256",
  683. .cra_driver_name = "atmel-sha256",
  684. .cra_priority = 100,
  685. .cra_flags = CRYPTO_ALG_ASYNC |
  686. CRYPTO_ALG_NEED_FALLBACK,
  687. .cra_blocksize = SHA256_BLOCK_SIZE,
  688. .cra_ctxsize = sizeof(struct atmel_sha_ctx),
  689. .cra_alignmask = 0,
  690. .cra_module = THIS_MODULE,
  691. .cra_init = atmel_sha_cra_init,
  692. .cra_exit = atmel_sha_cra_exit,
  693. }
  694. }
  695. },
  696. };
  697. static void atmel_sha_done_task(unsigned long data)
  698. {
  699. struct atmel_sha_dev *dd = (struct atmel_sha_dev *)data;
  700. int err = 0;
  701. if (!(SHA_FLAGS_BUSY & dd->flags)) {
  702. atmel_sha_handle_queue(dd, NULL);
  703. return;
  704. }
  705. if (SHA_FLAGS_CPU & dd->flags) {
  706. if (SHA_FLAGS_OUTPUT_READY & dd->flags) {
  707. dd->flags &= ~SHA_FLAGS_OUTPUT_READY;
  708. goto finish;
  709. }
  710. } else if (SHA_FLAGS_DMA_READY & dd->flags) {
  711. if (SHA_FLAGS_DMA_ACTIVE & dd->flags) {
  712. dd->flags &= ~SHA_FLAGS_DMA_ACTIVE;
  713. atmel_sha_update_dma_stop(dd);
  714. if (dd->err) {
  715. err = dd->err;
  716. goto finish;
  717. }
  718. }
  719. if (SHA_FLAGS_OUTPUT_READY & dd->flags) {
  720. /* hash or semi-hash ready */
  721. dd->flags &= ~(SHA_FLAGS_DMA_READY |
  722. SHA_FLAGS_OUTPUT_READY);
  723. err = atmel_sha_update_dma_start(dd);
  724. if (err != -EINPROGRESS)
  725. goto finish;
  726. }
  727. }
  728. return;
  729. finish:
  730. /* finish curent request */
  731. atmel_sha_finish_req(dd->req, err);
  732. }
  733. static irqreturn_t atmel_sha_irq(int irq, void *dev_id)
  734. {
  735. struct atmel_sha_dev *sha_dd = dev_id;
  736. u32 reg;
  737. reg = atmel_sha_read(sha_dd, SHA_ISR);
  738. if (reg & atmel_sha_read(sha_dd, SHA_IMR)) {
  739. atmel_sha_write(sha_dd, SHA_IDR, reg);
  740. if (SHA_FLAGS_BUSY & sha_dd->flags) {
  741. sha_dd->flags |= SHA_FLAGS_OUTPUT_READY;
  742. if (!(SHA_FLAGS_CPU & sha_dd->flags))
  743. sha_dd->flags |= SHA_FLAGS_DMA_READY;
  744. tasklet_schedule(&sha_dd->done_task);
  745. } else {
  746. dev_warn(sha_dd->dev, "SHA interrupt when no active requests.\n");
  747. }
  748. return IRQ_HANDLED;
  749. }
  750. return IRQ_NONE;
  751. }
  752. static void atmel_sha_unregister_algs(struct atmel_sha_dev *dd)
  753. {
  754. int i;
  755. for (i = 0; i < ARRAY_SIZE(sha_algs); i++)
  756. crypto_unregister_ahash(&sha_algs[i]);
  757. }
  758. static int atmel_sha_register_algs(struct atmel_sha_dev *dd)
  759. {
  760. int err, i, j;
  761. for (i = 0; i < ARRAY_SIZE(sha_algs); i++) {
  762. err = crypto_register_ahash(&sha_algs[i]);
  763. if (err)
  764. goto err_sha_algs;
  765. }
  766. return 0;
  767. err_sha_algs:
  768. for (j = 0; j < i; j++)
  769. crypto_unregister_ahash(&sha_algs[j]);
  770. return err;
  771. }
  772. static int atmel_sha_probe(struct platform_device *pdev)
  773. {
  774. struct atmel_sha_dev *sha_dd;
  775. struct device *dev = &pdev->dev;
  776. struct resource *sha_res;
  777. unsigned long sha_phys_size;
  778. int err;
  779. sha_dd = kzalloc(sizeof(struct atmel_sha_dev), GFP_KERNEL);
  780. if (sha_dd == NULL) {
  781. dev_err(dev, "unable to alloc data struct.\n");
  782. err = -ENOMEM;
  783. goto sha_dd_err;
  784. }
  785. sha_dd->dev = dev;
  786. platform_set_drvdata(pdev, sha_dd);
  787. INIT_LIST_HEAD(&sha_dd->list);
  788. tasklet_init(&sha_dd->done_task, atmel_sha_done_task,
  789. (unsigned long)sha_dd);
  790. crypto_init_queue(&sha_dd->queue, ATMEL_SHA_QUEUE_LENGTH);
  791. sha_dd->irq = -1;
  792. /* Get the base address */
  793. sha_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  794. if (!sha_res) {
  795. dev_err(dev, "no MEM resource info\n");
  796. err = -ENODEV;
  797. goto res_err;
  798. }
  799. sha_dd->phys_base = sha_res->start;
  800. sha_phys_size = resource_size(sha_res);
  801. /* Get the IRQ */
  802. sha_dd->irq = platform_get_irq(pdev, 0);
  803. if (sha_dd->irq < 0) {
  804. dev_err(dev, "no IRQ resource info\n");
  805. err = sha_dd->irq;
  806. goto res_err;
  807. }
  808. err = request_irq(sha_dd->irq, atmel_sha_irq, IRQF_SHARED, "atmel-sha",
  809. sha_dd);
  810. if (err) {
  811. dev_err(dev, "unable to request sha irq.\n");
  812. goto res_err;
  813. }
  814. /* Initializing the clock */
  815. sha_dd->iclk = clk_get(&pdev->dev, NULL);
  816. if (IS_ERR(sha_dd->iclk)) {
  817. dev_err(dev, "clock intialization failed.\n");
  818. err = PTR_ERR(sha_dd->iclk);
  819. goto clk_err;
  820. }
  821. sha_dd->io_base = ioremap(sha_dd->phys_base, sha_phys_size);
  822. if (!sha_dd->io_base) {
  823. dev_err(dev, "can't ioremap\n");
  824. err = -ENOMEM;
  825. goto sha_io_err;
  826. }
  827. spin_lock(&atmel_sha.lock);
  828. list_add_tail(&sha_dd->list, &atmel_sha.dev_list);
  829. spin_unlock(&atmel_sha.lock);
  830. err = atmel_sha_register_algs(sha_dd);
  831. if (err)
  832. goto err_algs;
  833. dev_info(dev, "Atmel SHA1/SHA256\n");
  834. return 0;
  835. err_algs:
  836. spin_lock(&atmel_sha.lock);
  837. list_del(&sha_dd->list);
  838. spin_unlock(&atmel_sha.lock);
  839. iounmap(sha_dd->io_base);
  840. sha_io_err:
  841. clk_put(sha_dd->iclk);
  842. clk_err:
  843. free_irq(sha_dd->irq, sha_dd);
  844. res_err:
  845. tasklet_kill(&sha_dd->done_task);
  846. kfree(sha_dd);
  847. sha_dd = NULL;
  848. sha_dd_err:
  849. dev_err(dev, "initialization failed.\n");
  850. return err;
  851. }
  852. static int atmel_sha_remove(struct platform_device *pdev)
  853. {
  854. static struct atmel_sha_dev *sha_dd;
  855. sha_dd = platform_get_drvdata(pdev);
  856. if (!sha_dd)
  857. return -ENODEV;
  858. spin_lock(&atmel_sha.lock);
  859. list_del(&sha_dd->list);
  860. spin_unlock(&atmel_sha.lock);
  861. atmel_sha_unregister_algs(sha_dd);
  862. tasklet_kill(&sha_dd->done_task);
  863. iounmap(sha_dd->io_base);
  864. clk_put(sha_dd->iclk);
  865. if (sha_dd->irq >= 0)
  866. free_irq(sha_dd->irq, sha_dd);
  867. kfree(sha_dd);
  868. sha_dd = NULL;
  869. return 0;
  870. }
  871. static struct platform_driver atmel_sha_driver = {
  872. .probe = atmel_sha_probe,
  873. .remove = atmel_sha_remove,
  874. .driver = {
  875. .name = "atmel_sha",
  876. .owner = THIS_MODULE,
  877. },
  878. };
  879. module_platform_driver(atmel_sha_driver);
  880. MODULE_DESCRIPTION("Atmel SHA1/SHA256 hw acceleration support.");
  881. MODULE_LICENSE("GPL v2");
  882. MODULE_AUTHOR("Nicolas Royer - Eukréa Electromatique");