Add a helper function to perform the descriptor allocation.

Signed-off-by: Russell King <rmk+ker...@arm.linux.org.uk>
---
 drivers/crypto/caam/caamhash.c | 60 +++++++++++++++++++++++-------------------
 1 file changed, 33 insertions(+), 27 deletions(-)

diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c
index 9638e9f4f001..f35f4cfc27a7 100644
--- a/drivers/crypto/caam/caamhash.c
+++ b/drivers/crypto/caam/caamhash.c
@@ -765,6 +765,25 @@ static void ahash_done_ctx_dst(struct device *jrdev, u32 
*desc, u32 err,
        req->base.complete(&req->base, err);
 }
 
+/*
+ * Allocate an enhanced descriptor, which contains the hardware descriptor
+ * and space for hardware scatter table containing sg_num entries.
+ */
+static struct ahash_edesc *ahash_edesc_alloc(struct caam_hash_ctx *ctx,
+                                            int sg_num, gfp_t flags)
+{
+       struct ahash_edesc *edesc;
+       unsigned int sg_size = sg_num * sizeof(struct sec4_sg_entry);
+
+       edesc = kzalloc(sizeof(*edesc) + sg_size, GFP_DMA | flags);
+       if (!edesc) {
+               dev_err(ctx->jrdev, "could not allocate extended descriptor\n");
+               return NULL;
+       }
+
+       return edesc;
+}
+
 /* submit update job descriptor */
 static int ahash_update_ctx(struct ahash_request *req)
 {
@@ -813,11 +832,9 @@ static int ahash_update_ctx(struct ahash_request *req)
                 * allocate space for base edesc and hw desc commands,
                 * link tables
                 */
-               edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes,
-                               GFP_DMA | flags);
+               edesc = ahash_edesc_alloc(ctx, sec4_sg_src_index + mapped_nents,
+                                         flags);
                if (!edesc) {
-                       dev_err(jrdev,
-                               "could not allocate extended descriptor\n");
                        dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
                        return -ENOMEM;
                }
@@ -930,11 +947,9 @@ static int ahash_final_ctx(struct ahash_request *req)
        sec4_sg_bytes = sec4_sg_src_index * sizeof(struct sec4_sg_entry);
 
        /* allocate space for base edesc and hw desc commands, link tables */
-       edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes, GFP_DMA | flags);
-       if (!edesc) {
-               dev_err(jrdev, "could not allocate extended descriptor\n");
+       edesc = ahash_edesc_alloc(ctx, sec4_sg_src_index, flags);
+       if (!edesc)
                return -ENOMEM;
-       }
 
        sh_len = desc_len(sh_desc);
        desc = edesc->hw_desc;
@@ -1026,9 +1041,9 @@ static int ahash_finup_ctx(struct ahash_request *req)
                         sizeof(struct sec4_sg_entry);
 
        /* allocate space for base edesc and hw desc commands, link tables */
-       edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes, GFP_DMA | flags);
+       edesc = ahash_edesc_alloc(ctx, sec4_sg_src_index + mapped_nents,
+                                 flags);
        if (!edesc) {
-               dev_err(jrdev, "could not allocate extended descriptor\n");
                dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
                return -ENOMEM;
        }
@@ -1122,9 +1137,9 @@ static int ahash_digest(struct ahash_request *req)
                sec4_sg_bytes = 0;
 
        /* allocate space for base edesc and hw desc commands, link tables */
-       edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes, GFP_DMA | flags);
+       edesc = ahash_edesc_alloc(ctx, mapped_nents > 1 ? mapped_nents : 0,
+                                 flags);
        if (!edesc) {
-               dev_err(jrdev, "could not allocate extended descriptor\n");
                dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
                return -ENOMEM;
        }
@@ -1198,13 +1213,10 @@ static int ahash_final_no_ctx(struct ahash_request *req)
        int sh_len;
 
        /* allocate space for base edesc and hw desc commands, link tables */
-       edesc = kzalloc(sizeof(*edesc), GFP_DMA | flags);
-       if (!edesc) {
-               dev_err(jrdev, "could not allocate extended descriptor\n");
+       edesc = ahash_edesc_alloc(ctx, 0, flags);
+       if (!edesc)
                return -ENOMEM;
-       }
 
-       edesc->sec4_sg_bytes = 0;
        sh_len = desc_len(sh_desc);
        desc = edesc->hw_desc;
        init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER | HDR_REVERSE);
@@ -1287,11 +1299,8 @@ static int ahash_update_no_ctx(struct ahash_request *req)
                 * allocate space for base edesc and hw desc commands,
                 * link tables
                 */
-               edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes,
-                               GFP_DMA | flags);
+               edesc = ahash_edesc_alloc(ctx, 1 + mapped_nents, flags);
                if (!edesc) {
-                       dev_err(jrdev,
-                               "could not allocate extended descriptor\n");
                        dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
                        return -ENOMEM;
                }
@@ -1406,9 +1415,8 @@ static int ahash_finup_no_ctx(struct ahash_request *req)
                         sizeof(struct sec4_sg_entry);
 
        /* allocate space for base edesc and hw desc commands, link tables */
-       edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes, GFP_DMA | flags);
+       edesc = ahash_edesc_alloc(ctx, sec4_sg_src_index + mapped_nents, flags);
        if (!edesc) {
-               dev_err(jrdev, "could not allocate extended descriptor\n");
                dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
                return -ENOMEM;
        }
@@ -1508,11 +1516,9 @@ static int ahash_update_first(struct ahash_request *req)
                 * allocate space for base edesc and hw desc commands,
                 * link tables
                 */
-               edesc = kzalloc(sizeof(*edesc) + sec4_sg_bytes,
-                               GFP_DMA | flags);
+               edesc = ahash_edesc_alloc(ctx, mapped_nents > 1 ?
+                                         mapped_nents : 0, flags);
                if (!edesc) {
-                       dev_err(jrdev,
-                               "could not allocate extended descriptor\n");
                        dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
                        return -ENOMEM;
                }
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to