crypto: rockchip - remove non-aligned handling
authorCorentin Labbe <clabbe@baylibre.com>
Tue, 27 Sep 2022 07:54:47 +0000 (07:54 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:14:22 +0000 (13:14 +0100)
[ Upstream commit bb3c7b73363c9a149b12b74c44ae94b73a8fddf8 ]

Now driver have fallback for un-aligned cases, remove all code handling
those cases.

Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
Reviewed-by: John Keeping <john@metanate.com>
Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/crypto/rockchip/rk3288_crypto.c
drivers/crypto/rockchip/rk3288_crypto.h
drivers/crypto/rockchip/rk3288_crypto_ahash.c
drivers/crypto/rockchip/rk3288_crypto_skcipher.c

index 5f8444b..3145325 100644 (file)
@@ -88,63 +88,26 @@ static int rk_load_data(struct rk_crypto_info *dev,
 {
        unsigned int count;
 
-       dev->aligned = dev->aligned ?
-               check_alignment(sg_src, sg_dst, dev->align_size) :
-               dev->aligned;
-       if (dev->aligned) {
-               count = min(dev->left_bytes, sg_src->length);
-               dev->left_bytes -= count;
-
-               if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
-                       dev_err(dev->dev, "[%s:%d] dma_map_sg(src)  error\n",
+       count = min(dev->left_bytes, sg_src->length);
+       dev->left_bytes -= count;
+
+       if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
+               dev_err(dev->dev, "[%s:%d] dma_map_sg(src)  error\n",
                                __func__, __LINE__);
-                       return -EINVAL;
-               }
-               dev->addr_in = sg_dma_address(sg_src);
+               return -EINVAL;
+       }
+       dev->addr_in = sg_dma_address(sg_src);
 
-               if (sg_dst) {
-                       if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
-                               dev_err(dev->dev,
+       if (sg_dst) {
+               if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
+                       dev_err(dev->dev,
                                        "[%s:%d] dma_map_sg(dst)  error\n",
                                        __func__, __LINE__);
-                               dma_unmap_sg(dev->dev, sg_src, 1,
-                                            DMA_TO_DEVICE);
-                               return -EINVAL;
-                       }
-                       dev->addr_out = sg_dma_address(sg_dst);
-               }
-       } else {
-               count = (dev->left_bytes > PAGE_SIZE) ?
-                       PAGE_SIZE : dev->left_bytes;
-
-               if (!sg_pcopy_to_buffer(dev->first, dev->src_nents,
-                                       dev->addr_vir, count,
-                                       dev->total - dev->left_bytes)) {
-                       dev_err(dev->dev, "[%s:%d] pcopy err\n",
-                               __func__, __LINE__);
+                       dma_unmap_sg(dev->dev, sg_src, 1,
+                                       DMA_TO_DEVICE);
                        return -EINVAL;
                }
-               dev->left_bytes -= count;
-               sg_init_one(&dev->sg_tmp, dev->addr_vir, count);
-               if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1, DMA_TO_DEVICE)) {
-                       dev_err(dev->dev, "[%s:%d] dma_map_sg(sg_tmp)  error\n",
-                               __func__, __LINE__);
-                       return -ENOMEM;
-               }
-               dev->addr_in = sg_dma_address(&dev->sg_tmp);
-
-               if (sg_dst) {
-                       if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1,
-                                       DMA_FROM_DEVICE)) {
-                               dev_err(dev->dev,
-                                       "[%s:%d] dma_map_sg(sg_tmp)  error\n",
-                                       __func__, __LINE__);
-                               dma_unmap_sg(dev->dev, &dev->sg_tmp, 1,
-                                            DMA_TO_DEVICE);
-                               return -ENOMEM;
-                       }
-                       dev->addr_out = sg_dma_address(&dev->sg_tmp);
-               }
+               dev->addr_out = sg_dma_address(sg_dst);
        }
        dev->count = count;
        return 0;
@@ -154,11 +117,11 @@ static void rk_unload_data(struct rk_crypto_info *dev)
 {
        struct scatterlist *sg_in, *sg_out;
 
-       sg_in = dev->aligned ? dev->sg_src : &dev->sg_tmp;
+       sg_in = dev->sg_src;
        dma_unmap_sg(dev->dev, sg_in, 1, DMA_TO_DEVICE);
 
        if (dev->sg_dst) {
-               sg_out = dev->aligned ? dev->sg_dst : &dev->sg_tmp;
+               sg_out = dev->sg_dst;
                dma_unmap_sg(dev->dev, sg_out, 1, DMA_FROM_DEVICE);
        }
 }
index 665cc0b..df4db59 100644 (file)
@@ -204,12 +204,8 @@ struct rk_crypto_info {
        /* the public variable */
        struct scatterlist              *sg_src;
        struct scatterlist              *sg_dst;
-       struct scatterlist              sg_tmp;
        struct scatterlist              *first;
        unsigned int                    left_bytes;
-       void                            *addr_vir;
-       int                             aligned;
-       int                             align_size;
        size_t                          src_nents;
        size_t                          dst_nents;
        unsigned int                    total;
index 16009bb..c762e46 100644 (file)
@@ -236,8 +236,6 @@ static int rk_ahash_start(struct rk_crypto_info *dev)
 
        dev->total = req->nbytes;
        dev->left_bytes = req->nbytes;
-       dev->aligned = 0;
-       dev->align_size = 4;
        dev->sg_dst = NULL;
        dev->sg_src = req->src;
        dev->first = req->src;
@@ -272,15 +270,13 @@ static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
 
        dev->unload_data(dev);
        if (dev->left_bytes) {
-               if (dev->aligned) {
-                       if (sg_is_last(dev->sg_src)) {
-                               dev_warn(dev->dev, "[%s:%d], Lack of data\n",
-                                        __func__, __LINE__);
-                               err = -ENOMEM;
-                               goto out_rx;
-                       }
-                       dev->sg_src = sg_next(dev->sg_src);
+               if (sg_is_last(dev->sg_src)) {
+                       dev_warn(dev->dev, "[%s:%d], Lack of data\n",
+                                       __func__, __LINE__);
+                       err = -ENOMEM;
+                       goto out_rx;
                }
+               dev->sg_src = sg_next(dev->sg_src);
                err = rk_ahash_set_data_start(dev);
        } else {
                /*
@@ -318,11 +314,6 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
        algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
 
        tctx->dev = algt->dev;
-       tctx->dev->addr_vir = (void *)__get_free_page(GFP_KERNEL);
-       if (!tctx->dev->addr_vir) {
-               dev_err(tctx->dev->dev, "failed to kmalloc for addr_vir\n");
-               return -ENOMEM;
-       }
        tctx->dev->start = rk_ahash_start;
        tctx->dev->update = rk_ahash_crypto_rx;
        tctx->dev->complete = rk_ahash_crypto_complete;
@@ -345,7 +336,6 @@ static void rk_cra_hash_exit(struct crypto_tfm *tfm)
 {
        struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
 
-       free_page((unsigned long)tctx->dev->addr_vir);
        crypto_free_ahash(tctx->fallback_tfm);
 }
 
index 1ef94f8..d067b7f 100644 (file)
@@ -356,7 +356,6 @@ static int rk_ablk_start(struct rk_crypto_info *dev)
        dev->src_nents = sg_nents(req->src);
        dev->sg_dst = req->dst;
        dev->dst_nents = sg_nents(req->dst);
-       dev->aligned = 1;
 
        spin_lock_irqsave(&dev->lock, flags);
        rk_ablk_hw_init(dev);
@@ -376,13 +375,9 @@ static void rk_iv_copyback(struct rk_crypto_info *dev)
 
        /* Update the IV buffer to contain the next IV for encryption mode. */
        if (!(rctx->mode & RK_CRYPTO_DEC)) {
-               if (dev->aligned) {
-                       memcpy(req->iv, sg_virt(dev->sg_dst) +
-                               dev->sg_dst->length - ivsize, ivsize);
-               } else {
-                       memcpy(req->iv, dev->addr_vir +
-                               dev->count - ivsize, ivsize);
-               }
+               memcpy(req->iv,
+                      sg_virt(dev->sg_dst) + dev->sg_dst->length - ivsize,
+                      ivsize);
        }
 }
 
@@ -420,27 +415,16 @@ static int rk_ablk_rx(struct rk_crypto_info *dev)
                skcipher_request_cast(dev->async_req);
 
        dev->unload_data(dev);
-       if (!dev->aligned) {
-               if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents,
-                                         dev->addr_vir, dev->count,
-                                         dev->total - dev->left_bytes -
-                                         dev->count)) {
-                       err = -EINVAL;
-                       goto out_rx;
-               }
-       }
        if (dev->left_bytes) {
                rk_update_iv(dev);
-               if (dev->aligned) {
-                       if (sg_is_last(dev->sg_src)) {
-                               dev_err(dev->dev, "[%s:%d] Lack of data\n",
+               if (sg_is_last(dev->sg_src)) {
+                       dev_err(dev->dev, "[%s:%d] Lack of data\n",
                                        __func__, __LINE__);
-                               err = -ENOMEM;
-                               goto out_rx;
-                       }
-                       dev->sg_src = sg_next(dev->sg_src);
-                       dev->sg_dst = sg_next(dev->sg_dst);
+                       err = -ENOMEM;
+                       goto out_rx;
                }
+               dev->sg_src = sg_next(dev->sg_src);
+               dev->sg_dst = sg_next(dev->sg_dst);
                err = rk_set_data_start(dev);
        } else {
                rk_iv_copyback(dev);
@@ -462,13 +446,9 @@ static int rk_ablk_init_tfm(struct crypto_skcipher *tfm)
        algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
 
        ctx->dev = algt->dev;
-       ctx->dev->align_size = crypto_tfm_alg_alignmask(crypto_skcipher_tfm(tfm)) + 1;
        ctx->dev->start = rk_ablk_start;
        ctx->dev->update = rk_ablk_rx;
        ctx->dev->complete = rk_crypto_complete;
-       ctx->dev->addr_vir = (char *)__get_free_page(GFP_KERNEL);
-       if (!ctx->dev->addr_vir)
-               return -ENOMEM;
 
        ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
        if (IS_ERR(ctx->fallback_tfm)) {
@@ -488,7 +468,6 @@ static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm)
        struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
 
        memzero_explicit(ctx->key, ctx->keylen);
-       free_page((unsigned long)ctx->dev->addr_vir);
        crypto_free_skcipher(ctx->fallback_tfm);
 }