}
 
 static int cc_generate_mlli(struct device *dev, struct buffer_array *sg_data,
-                           struct mlli_params *mlli_params)
+                           struct mlli_params *mlli_params, gfp_t flags)
 {
        u32 *mlli_p;
        u32 total_nents = 0, prev_total_nents = 0;
 
        /* Allocate memory from the pointed pool */
        mlli_params->mlli_virt_addr =
-               dma_pool_alloc(mlli_params->curr_pool, GFP_KERNEL,
+               dma_pool_alloc(mlli_params->curr_pool, flags,
                               &mlli_params->mlli_dma_addr);
        if (!mlli_params->mlli_virt_addr) {
                dev_err(dev, "dma_pool_alloc() failed\n");
 int cc_map_blkcipher_request(struct cc_drvdata *drvdata, void *ctx,
                             unsigned int ivsize, unsigned int nbytes,
                             void *info, struct scatterlist *src,
-                            struct scatterlist *dst)
+                            struct scatterlist *dst, gfp_t flags)
 {
        struct blkcipher_req_ctx *req_ctx = (struct blkcipher_req_ctx *)ctx;
        struct mlli_params *mlli_params = &req_ctx->mlli_params;
 
        if (req_ctx->dma_buf_type == CC_DMA_BUF_MLLI) {
                mlli_params->curr_pool = buff_mgr->mlli_buffs_pool;
-               rc = cc_generate_mlli(dev, &sg_data, mlli_params);
+               rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags);
                if (rc)
                        goto ablkcipher_exit;
        }
        u32 mapped_nents = 0;
        u32 dummy = 0; /*used for the assoc data fragments */
        u32 size_to_map = 0;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        mlli_params->curr_pool = NULL;
        sg_data.num_of_buffers = 0;
        if (areq_ctx->assoc_buff_type == CC_DMA_BUF_MLLI ||
            areq_ctx->data_buff_type == CC_DMA_BUF_MLLI) {
                mlli_params->curr_pool = buff_mgr->mlli_buffs_pool;
-               rc = cc_generate_mlli(dev, &sg_data, mlli_params);
+               rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags);
                if (rc)
                        goto aead_map_failure;
 
 
 int cc_map_hash_request_final(struct cc_drvdata *drvdata, void *ctx,
                              struct scatterlist *src, unsigned int nbytes,
-                             bool do_update)
+                             bool do_update, gfp_t flags)
 {
        struct ahash_req_ctx *areq_ctx = (struct ahash_req_ctx *)ctx;
        struct device *dev = drvdata_to_dev(drvdata);
                /* add the src data to the sg_data */
                cc_add_sg_entry(dev, &sg_data, areq_ctx->in_nents, src, nbytes,
                                0, true, &areq_ctx->mlli_nents);
-               if (cc_generate_mlli(dev, &sg_data, mlli_params))
+               if (cc_generate_mlli(dev, &sg_data, mlli_params, flags))
                        goto fail_unmap_din;
        }
        /* change the buffer index for the unmap function */
 
 int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx,
                               struct scatterlist *src, unsigned int nbytes,
-                              unsigned int block_size)
+                              unsigned int block_size, gfp_t flags)
 {
        struct ahash_req_ctx *areq_ctx = (struct ahash_req_ctx *)ctx;
        struct device *dev = drvdata_to_dev(drvdata);
                cc_add_sg_entry(dev, &sg_data, areq_ctx->in_nents, src,
                                (update_data_len - *curr_buff_cnt), 0, true,
                                &areq_ctx->mlli_nents);
-               if (cc_generate_mlli(dev, &sg_data, mlli_params))
+               if (cc_generate_mlli(dev, &sg_data, mlli_params, flags))
                        goto fail_unmap_din;
        }
        areq_ctx->buff_index = (areq_ctx->buff_index ^ swap_index);
 
        struct cc_hw_desc desc[MAX_ABLKCIPHER_SEQ_LEN];
        struct cc_crypto_req cc_req = {};
        int rc, seq_len = 0, cts_restore_flag = 0;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "%s req=%p info=%p nbytes=%d\n",
                ((direction == DRV_CRYPTO_DIRECTION_ENCRYPT) ?
        /* The IV we are handed may be allocted from the stack so
         * we must copy it to a DMAable buffer before use.
         */
-       req_ctx->iv = kmalloc(ivsize, GFP_KERNEL);
+       req_ctx->iv = kmalloc(ivsize, flags);
        if (!req_ctx->iv) {
                rc = -ENOMEM;
                goto exit_process;
        /* STAT_PHASE_1: Map buffers */
 
        rc = cc_map_blkcipher_request(ctx_p->drvdata, req_ctx, ivsize, nbytes,
-                                     req_ctx->iv, src, dst);
+                                     req_ctx->iv, src, dst, flags);
        if (rc) {
                dev_err(dev, "map_request() failed\n");
                goto exit_process;
        struct crypto_ablkcipher *ablk_tfm = crypto_ablkcipher_reqtfm(req);
        struct blkcipher_req_ctx *req_ctx = ablkcipher_request_ctx(req);
        unsigned int ivsize = crypto_ablkcipher_ivsize(ablk_tfm);
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        /*
         * Allocate and save the last IV sized bytes of the source, which will
         * be lost in case of in-place decryption and might be needed for CTS.
         */
-       req_ctx->backup_info = kmalloc(ivsize, GFP_KERNEL);
+       req_ctx->backup_info = kmalloc(ivsize, flags);
        if (!req_ctx->backup_info)
                return -ENOMEM;
 
 
 }
 
 static int cc_map_req(struct device *dev, struct ahash_req_ctx *state,
-                     struct cc_hash_ctx *ctx)
+                     struct cc_hash_ctx *ctx, gfp_t flags)
 {
        bool is_hmac = ctx->is_hmac;
        cc_sram_addr_t larval_digest_addr =
        struct cc_hw_desc desc;
        int rc = -ENOMEM;
 
-       state->buff0 = kzalloc(CC_MAX_HASH_BLCK_SIZE, GFP_KERNEL);
+       state->buff0 = kzalloc(CC_MAX_HASH_BLCK_SIZE, flags);
        if (!state->buff0)
                goto fail0;
 
-       state->buff1 = kzalloc(CC_MAX_HASH_BLCK_SIZE, GFP_KERNEL);
+       state->buff1 = kzalloc(CC_MAX_HASH_BLCK_SIZE, flags);
        if (!state->buff1)
                goto fail_buff0;
 
-       state->digest_result_buff = kzalloc(CC_MAX_HASH_DIGEST_SIZE,
-                                           GFP_KERNEL);
+       state->digest_result_buff = kzalloc(CC_MAX_HASH_DIGEST_SIZE, flags);
        if (!state->digest_result_buff)
                goto fail_buff1;
 
-       state->digest_buff = kzalloc(ctx->inter_digestsize, GFP_KERNEL);
+       state->digest_buff = kzalloc(ctx->inter_digestsize, flags);
        if (!state->digest_buff)
                goto fail_digest_result_buff;
 
        dev_dbg(dev, "Allocated digest-buffer in context ctx->digest_buff=@%p\n",
                state->digest_buff);
        if (ctx->hw_mode != DRV_CIPHER_XCBC_MAC) {
-               state->digest_bytes_len = kzalloc(HASH_LEN_SIZE, GFP_KERNEL);
+               state->digest_bytes_len = kzalloc(HASH_LEN_SIZE, flags);
                if (!state->digest_bytes_len)
                        goto fail1;
 
                state->digest_bytes_len = NULL;
        }
 
-       state->opad_digest_buff = kzalloc(ctx->inter_digestsize, GFP_KERNEL);
+       state->opad_digest_buff = kzalloc(ctx->inter_digestsize, flags);
        if (!state->opad_digest_buff)
                goto fail2;
 
                cc_larval_digest_addr(ctx->drvdata, ctx->hash_mode);
        int idx = 0;
        int rc = 0;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== %s-digest (%d) ====\n", is_hmac ? "hmac" : "hash",
                nbytes);
 
-       if (cc_map_req(dev, state, ctx)) {
+       if (cc_map_req(dev, state, ctx, flags)) {
                dev_err(dev, "map_ahash_source() failed\n");
                return -ENOMEM;
        }
                return -ENOMEM;
        }
 
-       if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1)) {
+       if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1,
+                                     flags)) {
                dev_err(dev, "map_ahash_request_final() failed\n");
                return -ENOMEM;
        }
        struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
        u32 idx = 0;
        int rc;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== %s-update (%d) ====\n", ctx->is_hmac ?
                "hmac" : "hash", nbytes);
        }
 
        rc = cc_map_hash_request_update(ctx->drvdata, state, src, nbytes,
-                                       block_size);
+                                       block_size, flags);
        if (rc) {
                if (rc == 1) {
                        dev_dbg(dev, " data size not require HW update %x\n",
        struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
        int idx = 0;
        int rc;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== %s-finup (%d) ====\n", is_hmac ? "hmac" : "hash",
                nbytes);
 
-       if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1)) {
+       if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1,
+                                     flags)) {
                dev_err(dev, "map_ahash_request_final() failed\n");
                return -ENOMEM;
        }
        struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
        int idx = 0;
        int rc;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== %s-final (%d) ====\n", is_hmac ? "hmac" : "hash",
                nbytes);
 
-       if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 0)) {
+       if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 0,
+                                     flags)) {
                dev_err(dev, "map_ahash_request_final() failed\n");
                return -ENOMEM;
        }
        struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
        struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
        struct device *dev = drvdata_to_dev(ctx->drvdata);
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== init (%d) ====\n", req->nbytes);
 
        state->xcbc_count = 0;
-       cc_map_req(dev, state, ctx);
+       cc_map_req(dev, state, ctx, flags);
 
        return 0;
 }
        struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
        int rc;
        u32 idx = 0;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        if (req->nbytes == 0) {
                /* no real updates required */
        state->xcbc_count++;
 
        rc = cc_map_hash_request_update(ctx->drvdata, state, req->src,
-                                       req->nbytes, block_size);
+                                       req->nbytes, block_size, flags);
        if (rc) {
                if (rc == 1) {
                        dev_dbg(dev, " data size not require HW update %x\n",
        int rc = 0;
        u32 key_size, key_len;
        u32 digestsize = crypto_ahash_digestsize(tfm);
-
+       gfp_t flags = cc_gfp_flags(&req->base);
        u32 rem_cnt = state->buff_index ? state->buff1_cnt :
                        state->buff0_cnt;
 
        dev_dbg(dev, "===== final  xcbc reminder (%d) ====\n", rem_cnt);
 
        if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
-                                     req->nbytes, 0)) {
+                                     req->nbytes, 0, flags)) {
                dev_err(dev, "map_ahash_request_final() failed\n");
                return -ENOMEM;
        }
        int rc = 0;
        u32 key_len = 0;
        u32 digestsize = crypto_ahash_digestsize(tfm);
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== finup xcbc(%d) ====\n", req->nbytes);
        if (state->xcbc_count > 0 && req->nbytes == 0) {
        }
 
        if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
-                                     req->nbytes, 1)) {
+                                     req->nbytes, 1, flags)) {
                dev_err(dev, "map_ahash_request_final() failed\n");
                return -ENOMEM;
        }
        u32 key_len;
        int idx = 0;
        int rc;
+       gfp_t flags = cc_gfp_flags(&req->base);
 
        dev_dbg(dev, "===== -digest mac (%d) ====\n",  req->nbytes);
 
-       if (cc_map_req(dev, state, ctx)) {
+       if (cc_map_req(dev, state, ctx, flags)) {
                dev_err(dev, "map_ahash_source() failed\n");
                return -ENOMEM;
        }
        }
 
        if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
-                                     req->nbytes, 1)) {
+                                     req->nbytes, 1, flags)) {
                dev_err(dev, "map_ahash_request_final() failed\n");
                return -ENOMEM;
        }