crypto: rockchip - remove non-aligned handling
Now driver have fallback for un-aligned cases, remove all code handling
those cases.
Fixes: ce0183cb64
("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>
This commit is contained in:
parent
d6b23ccef8
commit
bb3c7b7336
|
@ -88,63 +88,26 @@ static int rk_load_data(struct rk_crypto_info *dev,
|
||||||
{
|
{
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
|
|
||||||
dev->aligned = dev->aligned ?
|
count = min(dev->left_bytes, sg_src->length);
|
||||||
check_alignment(sg_src, sg_dst, dev->align_size) :
|
dev->left_bytes -= count;
|
||||||
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)) {
|
if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
|
||||||
dev_err(dev->dev, "[%s:%d] dma_map_sg(src) error\n",
|
dev_err(dev->dev, "[%s:%d] dma_map_sg(src) error\n",
|
||||||
__func__, __LINE__);
|
__func__, __LINE__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
dev->addr_in = sg_dma_address(sg_src);
|
dev->addr_in = sg_dma_address(sg_src);
|
||||||
|
|
||||||
if (sg_dst) {
|
if (sg_dst) {
|
||||||
if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
|
if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
|
||||||
dev_err(dev->dev,
|
dev_err(dev->dev,
|
||||||
"[%s:%d] dma_map_sg(dst) error\n",
|
"[%s:%d] dma_map_sg(dst) error\n",
|
||||||
__func__, __LINE__);
|
__func__, __LINE__);
|
||||||
dma_unmap_sg(dev->dev, sg_src, 1,
|
dma_unmap_sg(dev->dev, sg_src, 1,
|
||||||
DMA_TO_DEVICE);
|
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__);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
dev->left_bytes -= count;
|
dev->addr_out = sg_dma_address(sg_dst);
|
||||||
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->count = count;
|
dev->count = count;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -154,11 +117,11 @@ static void rk_unload_data(struct rk_crypto_info *dev)
|
||||||
{
|
{
|
||||||
struct scatterlist *sg_in, *sg_out;
|
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);
|
dma_unmap_sg(dev->dev, sg_in, 1, DMA_TO_DEVICE);
|
||||||
|
|
||||||
if (dev->sg_dst) {
|
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);
|
dma_unmap_sg(dev->dev, sg_out, 1, DMA_FROM_DEVICE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,12 +204,8 @@ struct rk_crypto_info {
|
||||||
/* the public variable */
|
/* the public variable */
|
||||||
struct scatterlist *sg_src;
|
struct scatterlist *sg_src;
|
||||||
struct scatterlist *sg_dst;
|
struct scatterlist *sg_dst;
|
||||||
struct scatterlist sg_tmp;
|
|
||||||
struct scatterlist *first;
|
struct scatterlist *first;
|
||||||
unsigned int left_bytes;
|
unsigned int left_bytes;
|
||||||
void *addr_vir;
|
|
||||||
int aligned;
|
|
||||||
int align_size;
|
|
||||||
size_t src_nents;
|
size_t src_nents;
|
||||||
size_t dst_nents;
|
size_t dst_nents;
|
||||||
unsigned int total;
|
unsigned int total;
|
||||||
|
|
|
@ -236,8 +236,6 @@ static int rk_ahash_start(struct rk_crypto_info *dev)
|
||||||
|
|
||||||
dev->total = req->nbytes;
|
dev->total = req->nbytes;
|
||||||
dev->left_bytes = req->nbytes;
|
dev->left_bytes = req->nbytes;
|
||||||
dev->aligned = 0;
|
|
||||||
dev->align_size = 4;
|
|
||||||
dev->sg_dst = NULL;
|
dev->sg_dst = NULL;
|
||||||
dev->sg_src = req->src;
|
dev->sg_src = req->src;
|
||||||
dev->first = 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);
|
dev->unload_data(dev);
|
||||||
if (dev->left_bytes) {
|
if (dev->left_bytes) {
|
||||||
if (dev->aligned) {
|
if (sg_is_last(dev->sg_src)) {
|
||||||
if (sg_is_last(dev->sg_src)) {
|
dev_warn(dev->dev, "[%s:%d], Lack of data\n",
|
||||||
dev_warn(dev->dev, "[%s:%d], Lack of data\n",
|
__func__, __LINE__);
|
||||||
__func__, __LINE__);
|
err = -ENOMEM;
|
||||||
err = -ENOMEM;
|
goto out_rx;
|
||||||
goto out_rx;
|
|
||||||
}
|
|
||||||
dev->sg_src = sg_next(dev->sg_src);
|
|
||||||
}
|
}
|
||||||
|
dev->sg_src = sg_next(dev->sg_src);
|
||||||
err = rk_ahash_set_data_start(dev);
|
err = rk_ahash_set_data_start(dev);
|
||||||
} else {
|
} 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);
|
algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
|
||||||
|
|
||||||
tctx->dev = algt->dev;
|
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->start = rk_ahash_start;
|
||||||
tctx->dev->update = rk_ahash_crypto_rx;
|
tctx->dev->update = rk_ahash_crypto_rx;
|
||||||
tctx->dev->complete = rk_ahash_crypto_complete;
|
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);
|
struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
|
||||||
|
|
||||||
free_page((unsigned long)tctx->dev->addr_vir);
|
|
||||||
crypto_free_ahash(tctx->fallback_tfm);
|
crypto_free_ahash(tctx->fallback_tfm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -356,7 +356,6 @@ static int rk_ablk_start(struct rk_crypto_info *dev)
|
||||||
dev->src_nents = sg_nents(req->src);
|
dev->src_nents = sg_nents(req->src);
|
||||||
dev->sg_dst = req->dst;
|
dev->sg_dst = req->dst;
|
||||||
dev->dst_nents = sg_nents(req->dst);
|
dev->dst_nents = sg_nents(req->dst);
|
||||||
dev->aligned = 1;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&dev->lock, flags);
|
spin_lock_irqsave(&dev->lock, flags);
|
||||||
rk_ablk_hw_init(dev);
|
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. */
|
/* Update the IV buffer to contain the next IV for encryption mode. */
|
||||||
if (!(rctx->mode & RK_CRYPTO_DEC)) {
|
if (!(rctx->mode & RK_CRYPTO_DEC)) {
|
||||||
if (dev->aligned) {
|
memcpy(req->iv,
|
||||||
memcpy(req->iv, sg_virt(dev->sg_dst) +
|
sg_virt(dev->sg_dst) + dev->sg_dst->length - ivsize,
|
||||||
dev->sg_dst->length - ivsize, ivsize);
|
ivsize);
|
||||||
} else {
|
|
||||||
memcpy(req->iv, dev->addr_vir +
|
|
||||||
dev->count - ivsize, ivsize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,27 +415,16 @@ static int rk_ablk_rx(struct rk_crypto_info *dev)
|
||||||
skcipher_request_cast(dev->async_req);
|
skcipher_request_cast(dev->async_req);
|
||||||
|
|
||||||
dev->unload_data(dev);
|
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) {
|
if (dev->left_bytes) {
|
||||||
rk_update_iv(dev);
|
rk_update_iv(dev);
|
||||||
if (dev->aligned) {
|
if (sg_is_last(dev->sg_src)) {
|
||||||
if (sg_is_last(dev->sg_src)) {
|
dev_err(dev->dev, "[%s:%d] Lack of data\n",
|
||||||
dev_err(dev->dev, "[%s:%d] Lack of data\n",
|
|
||||||
__func__, __LINE__);
|
__func__, __LINE__);
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto out_rx;
|
goto out_rx;
|
||||||
}
|
|
||||||
dev->sg_src = sg_next(dev->sg_src);
|
|
||||||
dev->sg_dst = sg_next(dev->sg_dst);
|
|
||||||
}
|
}
|
||||||
|
dev->sg_src = sg_next(dev->sg_src);
|
||||||
|
dev->sg_dst = sg_next(dev->sg_dst);
|
||||||
err = rk_set_data_start(dev);
|
err = rk_set_data_start(dev);
|
||||||
} else {
|
} else {
|
||||||
rk_iv_copyback(dev);
|
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);
|
algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
|
||||||
|
|
||||||
ctx->dev = algt->dev;
|
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->start = rk_ablk_start;
|
||||||
ctx->dev->update = rk_ablk_rx;
|
ctx->dev->update = rk_ablk_rx;
|
||||||
ctx->dev->complete = rk_crypto_complete;
|
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);
|
ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
|
||||||
if (IS_ERR(ctx->fallback_tfm)) {
|
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);
|
struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||||
|
|
||||||
memzero_explicit(ctx->key, ctx->keylen);
|
memzero_explicit(ctx->key, ctx->keylen);
|
||||||
free_page((unsigned long)ctx->dev->addr_vir);
|
|
||||||
crypto_free_skcipher(ctx->fallback_tfm);
|
crypto_free_skcipher(ctx->fallback_tfm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue