- abuf->src = dma_addr;
- abuf->dst = dma_addr;
- abuf->iv = abuf->src + nbytes;
- abuf->size = nbytes - ZYNQMP_AES_GCM_SIZE;
- abuf->optype = ZYNQMP_AES_DECRYPT;
- abuf->keysrc = keytype;
- if (keytype == ZYNQMP_AES_KUP_KEY) {
- memcpy(kbuf + nbytes + ZYNQMP_AES_IV_SIZE,
- op->key, ZYNQMP_AES_KEY_SIZE);
- abuf->key = abuf->iv + ZYNQMP_AES_IV_SIZE;
- } else {
- abuf->key = 0;
- }
- eemi_ops->aes(dma_addr_buf, &ret);
- if (ret != 0) {
- switch (ret) {
- case ZYNQMP_AES_GCM_TAG_MISMATCH_ERR:
- dev_err(dd->dev, "ERROR: Gcm Tag mismatch\n\r");
- break;
- case ZYNQMP_AES_SIZE_ERR:
- dev_err(dd->dev, "ERROR : Non word aligned data\n\r");
- break;
- case ZYNQMP_AES_WRONG_KEY_SRC_ERR:
- dev_err(dd->dev, "ERROR: Wrong KeySrc, enable secure mode\n\r");
- break;
- default:
- dev_err(dd->dev, "ERROR: Invalid");
- break;
- }
- goto END;
- }
- memcpy(walk.dst.virt.addr, kbuf, nbytes - ZYNQMP_AES_GCM_SIZE);
-END:
- err = blkcipher_walk_done(desc, &walk, 0);
- dma_free_coherent(dd->dev, dma_size, kbuf, dma_addr);
- dma_free_coherent(dd->dev, sizeof(struct zynqmp_aes_data),
- abuf, dma_addr_buf);
- return err;
-}
-
-static int zynqmp_aes_encrypt(struct blkcipher_desc *desc,
- struct scatterlist *dst,
- struct scatterlist *src,
- unsigned int nbytes)
-{
- struct zynqmp_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
- struct zynqmp_aes_dev *dd = zynqmp_aes_find_dev(op);
- const struct zynqmp_eemi_ops *eemi_ops = zynqmp_pm_get_eemi_ops();
- dma_addr_t dma_addr, dma_addr_buf;
- struct zynqmp_aes_data *abuf;
- struct blkcipher_walk walk;
- unsigned int data_size;
- size_t dma_size;
- u32 keytype;
- char *kbuf;
- int err, ret;
-
- if (!eemi_ops || !eemi_ops->aes)
- return -ENOTSUPP;
-
- blkcipher_walk_init(&walk, dst, src, nbytes);