diff --git a/drivers/crypto/rockchip/rk_crypto_core.c b/drivers/crypto/rockchip/rk_crypto_core.c index 98361997ad8f..6e7a4136f32e 100644 --- a/drivers/crypto/rockchip/rk_crypto_core.c +++ b/drivers/crypto/rockchip/rk_crypto_core.c @@ -169,8 +169,8 @@ static int rk_load_data(struct rk_crypto_dev *rk_dev, alg_ctx->addr_out = sg_dma_address(sg_dst); } } else { - count = (alg_ctx->left_bytes > PAGE_SIZE) ? - PAGE_SIZE : alg_ctx->left_bytes; + count = (alg_ctx->left_bytes > rk_dev->vir_max) ? + rk_dev->vir_max : alg_ctx->left_bytes; if (!sg_pcopy_to_buffer(alg_ctx->req_src, alg_ctx->src_nents, rk_dev->addr_vir, count, @@ -674,13 +674,15 @@ static int rk_crypto_probe(struct platform_device *pdev) goto err_crypto; } - rk_dev->addr_vir = (char *)__get_free_page(GFP_KERNEL); + rk_dev->addr_vir = (void *)__get_free_pages(GFP_KERNEL, RK_BUFFER_ORDER); if (!rk_dev->addr_vir) { err = -ENOMEM; dev_err(dev, "__get_free_page failed.\n"); goto err_crypto; } + rk_dev->vir_max = RK_BUFFER_SIZE; + platform_set_drvdata(pdev, rk_dev); tasklet_init(&rk_dev->queue_task, diff --git a/drivers/crypto/rockchip/rk_crypto_core.h b/drivers/crypto/rockchip/rk_crypto_core.h index ea82090a5a4c..6a84117d1507 100644 --- a/drivers/crypto/rockchip/rk_crypto_core.h +++ b/drivers/crypto/rockchip/rk_crypto_core.h @@ -30,6 +30,10 @@ #define RK_CRYPTO_PRIORITY 300 +/* Increase the addr_vir buffer size from 1 to 8 pages */ +#define RK_BUFFER_ORDER 3 +#define RK_BUFFER_SIZE (PAGE_SIZE << RK_BUFFER_ORDER) + struct rk_crypto_soc_data { char **valid_algs_name; int valid_algs_num; @@ -66,6 +70,7 @@ struct rk_crypto_dev { /* the public variable */ struct crypto_async_request *async_req; void *addr_vir; + u32 vir_max; bool busy; void (*request_crypto)(struct rk_crypto_dev *rk_dev, const char *name);