Lines Matching refs:aes

9  * Some ideas are from atmel-aes.c drivers.
12 #include <crypto/aes.h>
221 static inline void mtk_aes_set_mode(struct mtk_aes_rec *aes,
225 aes->flags = (aes->flags & AES_FLAGS_BUSY) | rctx->mode;
246 struct mtk_aes_rec *aes,
249 aes->flags &= ~AES_FLAGS_BUSY;
250 aes->areq->complete(aes->areq, err);
252 tasklet_schedule(&aes->queue_task);
260 static int mtk_aes_xmit(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
262 struct mtk_ring *ring = cryp->ring[aes->id];
264 struct scatterlist *ssg = aes->src.sg, *dsg = aes->dst.sg;
265 u32 slen = aes->src.sg_len, dlen = aes->dst.sg_len;
276 MTK_DESC_CT_LEN(aes->ctx->ct_size);
277 cmd->ct = cpu_to_le32(aes->ctx->ct_dma);
278 cmd->ct_hdr = aes->ctx->ct_hdr;
279 cmd->tfm = cpu_to_le32(aes->ctx->tfm_dma);
307 if (aes->flags & AES_FLAGS_GCM)
316 mtk_aes_write(cryp, RDR_PREP_COUNT(aes->id), MTK_DESC_CNT(dlen));
317 mtk_aes_write(cryp, CDR_PREP_COUNT(aes->id), MTK_DESC_CNT(slen));
322 static void mtk_aes_unmap(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
324 struct mtk_aes_base_ctx *ctx = aes->ctx;
329 if (aes->src.sg == aes->dst.sg) {
330 dma_unmap_sg(cryp->dev, aes->src.sg, aes->src.nents,
333 if (aes->src.sg != &aes->aligned_sg)
334 mtk_aes_restore_sg(&aes->src);
336 dma_unmap_sg(cryp->dev, aes->dst.sg, aes->dst.nents,
339 if (aes->dst.sg != &aes->aligned_sg)
340 mtk_aes_restore_sg(&aes->dst);
342 dma_unmap_sg(cryp->dev, aes->src.sg, aes->src.nents,
345 if (aes->src.sg != &aes->aligned_sg)
346 mtk_aes_restore_sg(&aes->src);
349 if (aes->dst.sg == &aes->aligned_sg)
350 sg_copy_from_buffer(aes->real_dst, sg_nents(aes->real_dst),
351 aes->buf, aes->total);
354 static int mtk_aes_map(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
356 struct mtk_aes_base_ctx *ctx = aes->ctx;
366 if (aes->src.sg == aes->dst.sg) {
367 aes->src.sg_len = dma_map_sg(cryp->dev, aes->src.sg,
368 aes->src.nents,
370 aes->dst.sg_len = aes->src.sg_len;
371 if (unlikely(!aes->src.sg_len))
374 aes->src.sg_len = dma_map_sg(cryp->dev, aes->src.sg,
375 aes->src.nents, DMA_TO_DEVICE);
376 if (unlikely(!aes->src.sg_len))
379 aes->dst.sg_len = dma_map_sg(cryp->dev, aes->dst.sg,
380 aes->dst.nents, DMA_FROM_DEVICE);
381 if (unlikely(!aes->dst.sg_len)) {
382 dma_unmap_sg(cryp->dev, aes->src.sg, aes->src.nents,
388 return mtk_aes_xmit(cryp, aes);
393 return mtk_aes_complete(cryp, aes, -EINVAL);
397 static void mtk_aes_info_init(struct mtk_cryp *cryp, struct mtk_aes_rec *aes,
400 struct skcipher_request *req = skcipher_request_cast(aes->areq);
401 struct mtk_aes_base_ctx *ctx = aes->ctx;
410 if (aes->flags & AES_FLAGS_ENCRYPT)
415 switch (aes->flags & AES_FLAGS_CIPHER_MSK) {
446 static int mtk_aes_dma(struct mtk_cryp *cryp, struct mtk_aes_rec *aes,
453 aes->total = len;
454 aes->src.sg = src;
455 aes->dst.sg = dst;
456 aes->real_dst = dst;
458 src_aligned = mtk_aes_check_aligned(src, len, &aes->src);
462 dst_aligned = mtk_aes_check_aligned(dst, len, &aes->dst);
468 return mtk_aes_complete(cryp, aes, -ENOMEM);
471 sg_copy_to_buffer(src, sg_nents(src), aes->buf, len);
472 aes->src.sg = &aes->aligned_sg;
473 aes->src.nents = 1;
474 aes->src.remainder = 0;
478 aes->dst.sg = &aes->aligned_sg;
479 aes->dst.nents = 1;
480 aes->dst.remainder = 0;
483 sg_init_table(&aes->aligned_sg, 1);
484 sg_set_buf(&aes->aligned_sg, aes->buf, len + padlen);
487 mtk_aes_info_init(cryp, aes, len + padlen);
489 return mtk_aes_map(cryp, aes);
495 struct mtk_aes_rec *aes = cryp->aes[id];
501 spin_lock_irqsave(&aes->lock, flags);
503 ret = crypto_enqueue_request(&aes->queue, new_areq);
504 if (aes->flags & AES_FLAGS_BUSY) {
505 spin_unlock_irqrestore(&aes->lock, flags);
508 backlog = crypto_get_backlog(&aes->queue);
509 areq = crypto_dequeue_request(&aes->queue);
511 aes->flags |= AES_FLAGS_BUSY;
512 spin_unlock_irqrestore(&aes->lock, flags);
524 aes->areq = areq;
525 aes->ctx = ctx;
527 return ctx->start(cryp, aes);
531 struct mtk_aes_rec *aes)
533 return mtk_aes_complete(cryp, aes, 0);
536 static int mtk_aes_start(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
538 struct skcipher_request *req = skcipher_request_cast(aes->areq);
541 mtk_aes_set_mode(aes, rctx);
542 aes->resume = mtk_aes_transfer_complete;
544 return mtk_aes_dma(cryp, aes, req->src, req->dst, req->cryptlen);
553 static int mtk_aes_ctr_transfer(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
555 struct mtk_aes_base_ctx *ctx = aes->ctx;
557 struct skcipher_request *req = skcipher_request_cast(aes->areq);
564 cctx->offset += aes->total;
566 return mtk_aes_transfer_complete(cryp, aes);
599 return mtk_aes_dma(cryp, aes, src, dst, datalen);
602 static int mtk_aes_ctr_start(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
604 struct mtk_aes_ctr_ctx *cctx = mtk_aes_ctr_ctx_cast(aes->ctx);
605 struct skcipher_request *req = skcipher_request_cast(aes->areq);
608 mtk_aes_set_mode(aes, rctx);
612 aes->total = 0;
613 aes->resume = mtk_aes_ctr_transfer;
615 return mtk_aes_ctr_transfer(cryp, aes);
733 .base.cra_name = "cbc(aes)",
734 .base.cra_driver_name = "cbc-aes-mtk",
751 .base.cra_name = "ecb(aes)",
752 .base.cra_driver_name = "ecb-aes-mtk",
768 .base.cra_name = "ctr(aes)",
769 .base.cra_driver_name = "ctr-aes-mtk",
786 .base.cra_name = "ofb(aes)",
787 .base.cra_driver_name = "ofb-aes-mtk",
803 .base.cra_name = "cfb(aes)",
804 .base.cra_driver_name = "cfb-aes-mtk",
832 struct mtk_aes_rec *aes)
834 __le32 status = cryp->ring[aes->id]->res_prev->ct;
836 return mtk_aes_complete(cryp, aes, (status & AES_AUTH_TAG_ERR) ?
842 struct mtk_aes_rec *aes,
845 struct aead_request *req = aead_request_cast(aes->areq);
846 struct mtk_aes_base_ctx *ctx = aes->ctx;
859 if (aes->flags & AES_FLAGS_ENCRYPT) {
879 static int mtk_aes_gcm_dma(struct mtk_cryp *cryp, struct mtk_aes_rec *aes,
885 aes->src.sg = src;
886 aes->dst.sg = dst;
887 aes->real_dst = dst;
889 src_aligned = mtk_aes_check_aligned(src, len, &aes->src);
893 dst_aligned = mtk_aes_check_aligned(dst, len, &aes->dst);
896 if (aes->total > AES_BUF_SIZE)
897 return mtk_aes_complete(cryp, aes, -ENOMEM);
900 sg_copy_to_buffer(src, sg_nents(src), aes->buf, len);
901 aes->src.sg = &aes->aligned_sg;
902 aes->src.nents = 1;
903 aes->src.remainder = 0;
907 aes->dst.sg = &aes->aligned_sg;
908 aes->dst.nents = 1;
909 aes->dst.remainder = 0;
912 sg_init_table(&aes->aligned_sg, 1);
913 sg_set_buf(&aes->aligned_sg, aes->buf, aes->total);
916 mtk_aes_gcm_info_init(cryp, aes, len);
918 return mtk_aes_map(cryp, aes);
922 static int mtk_aes_gcm_start(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
924 struct mtk_aes_gcm_ctx *gctx = mtk_aes_gcm_ctx_cast(aes->ctx);
925 struct aead_request *req = aead_request_cast(aes->areq);
929 mtk_aes_set_mode(aes, rctx);
931 if (aes->flags & AES_FLAGS_ENCRYPT) {
934 aes->resume = mtk_aes_transfer_complete;
936 aes->total = len + gctx->authsize;
940 aes->resume = mtk_aes_gcm_tag_verify;
941 aes->total = len;
944 return mtk_aes_gcm_dma(cryp, aes, req->src, req->dst, len);
1072 .cra_name = "gcm(aes)",
1073 .cra_driver_name = "gcm-aes-mtk",
1085 struct mtk_aes_rec *aes = (struct mtk_aes_rec *)data;
1087 mtk_aes_handle_queue(aes->cryp, aes->id, NULL);
1092 struct mtk_aes_rec *aes = (struct mtk_aes_rec *)data;
1093 struct mtk_cryp *cryp = aes->cryp;
1095 mtk_aes_unmap(cryp, aes);
1096 aes->resume(cryp, aes);
1101 struct mtk_aes_rec *aes = (struct mtk_aes_rec *)dev_id;
1102 struct mtk_cryp *cryp = aes->cryp;
1103 u32 val = mtk_aes_read(cryp, RDR_STAT(aes->id));
1105 mtk_aes_write(cryp, RDR_STAT(aes->id), val);
1107 if (likely(AES_FLAGS_BUSY & aes->flags)) {
1108 mtk_aes_write(cryp, RDR_PROC_COUNT(aes->id), MTK_CNT_RST);
1109 mtk_aes_write(cryp, RDR_THRESH(aes->id),
1112 tasklet_schedule(&aes->done_task);
1127 struct mtk_aes_rec **aes = cryp->aes;
1131 aes[i] = kzalloc(sizeof(**aes), GFP_KERNEL);
1132 if (!aes[i])
1135 aes[i]->buf = (void *)__get_free_pages(GFP_KERNEL,
1137 if (!aes[i]->buf)
1140 aes[i]->cryp = cryp;
1142 spin_lock_init(&aes[i]->lock);
1143 crypto_init_queue(&aes[i]->queue, AES_QUEUE_SIZE);
1145 tasklet_init(&aes[i]->queue_task, mtk_aes_queue_task,
1146 (unsigned long)aes[i]);
1147 tasklet_init(&aes[i]->done_task, mtk_aes_done_task,
1148 (unsigned long)aes[i]);
1152 aes[0]->id = MTK_RING0;
1153 aes[1]->id = MTK_RING1;
1159 free_page((unsigned long)aes[i]->buf);
1160 kfree(aes[i]);
1171 tasklet_kill(&cryp->aes[i]->done_task);
1172 tasklet_kill(&cryp->aes[i]->queue_task);
1174 free_page((unsigned long)cryp->aes[i]->buf);
1175 kfree(cryp->aes[i]);
1224 0, "mtk-aes", cryp->aes[0]);
1231 0, "mtk-aes", cryp->aes[1]);
1259 dev_err(cryp->dev, "mtk-aes initialization failed.\n");