mirror of https://gitee.com/openkylin/linux.git
crypto: hisilicon - redefine skcipher initiation
1.Define base initiation of QP for context which can be reused. 2.Define cipher initiation for other algorithms. Signed-off-by: Zaibo Xu <xuzaibo@huawei.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
b9c8d897a0
commit
473a0f9662
|
@ -273,25 +273,17 @@ static void sec_release_qp_ctx(struct sec_ctx *ctx,
|
||||||
hisi_qm_release_qp(qp_ctx->qp);
|
hisi_qm_release_qp(qp_ctx->qp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sec_skcipher_init(struct crypto_skcipher *tfm)
|
static int sec_ctx_base_init(struct sec_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct sec_ctx *ctx = crypto_skcipher_ctx(tfm);
|
|
||||||
struct sec_cipher_ctx *c_ctx;
|
|
||||||
struct sec_dev *sec;
|
struct sec_dev *sec;
|
||||||
struct device *dev;
|
|
||||||
struct hisi_qm *qm;
|
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
crypto_skcipher_set_reqsize(tfm, sizeof(struct sec_req));
|
|
||||||
|
|
||||||
sec = sec_find_device(cpu_to_node(smp_processor_id()));
|
sec = sec_find_device(cpu_to_node(smp_processor_id()));
|
||||||
if (!sec) {
|
if (!sec) {
|
||||||
pr_err("Can not find proper Hisilicon SEC device!\n");
|
pr_err("Can not find proper Hisilicon SEC device!\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
ctx->sec = sec;
|
ctx->sec = sec;
|
||||||
qm = &sec->qm;
|
|
||||||
dev = &qm->pdev->dev;
|
|
||||||
ctx->hlf_q_num = sec->ctx_q_num >> 1;
|
ctx->hlf_q_num = sec->ctx_q_num >> 1;
|
||||||
|
|
||||||
/* Half of queue depth is taken as fake requests limit in the queue. */
|
/* Half of queue depth is taken as fake requests limit in the queue. */
|
||||||
|
@ -302,27 +294,12 @@ static int sec_skcipher_init(struct crypto_skcipher *tfm)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 0; i < sec->ctx_q_num; i++) {
|
for (i = 0; i < sec->ctx_q_num; i++) {
|
||||||
ret = sec_create_qp_ctx(qm, ctx, i, 0);
|
ret = sec_create_qp_ctx(&sec->qm, ctx, i, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_sec_release_qp_ctx;
|
goto err_sec_release_qp_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
c_ctx = &ctx->c_ctx;
|
|
||||||
c_ctx->ivsize = crypto_skcipher_ivsize(tfm);
|
|
||||||
if (c_ctx->ivsize > SEC_IV_SIZE) {
|
|
||||||
dev_err(dev, "get error iv size!\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto err_sec_release_qp_ctx;
|
|
||||||
}
|
|
||||||
c_ctx->c_key = dma_alloc_coherent(dev, SEC_MAX_KEY_SIZE,
|
|
||||||
&c_ctx->c_key_dma, GFP_KERNEL);
|
|
||||||
if (!c_ctx->c_key) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto err_sec_release_qp_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_sec_release_qp_ctx:
|
err_sec_release_qp_ctx:
|
||||||
for (i = i - 1; i >= 0; i--)
|
for (i = i - 1; i >= 0; i--)
|
||||||
sec_release_qp_ctx(ctx, &ctx->qp_ctx[i]);
|
sec_release_qp_ctx(ctx, &ctx->qp_ctx[i]);
|
||||||
|
@ -331,17 +308,9 @@ static int sec_skcipher_init(struct crypto_skcipher *tfm)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sec_skcipher_uninit(struct crypto_skcipher *tfm)
|
static void sec_ctx_base_uninit(struct sec_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct sec_ctx *ctx = crypto_skcipher_ctx(tfm);
|
int i;
|
||||||
struct sec_cipher_ctx *c_ctx = &ctx->c_ctx;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
if (c_ctx->c_key) {
|
|
||||||
dma_free_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE,
|
|
||||||
c_ctx->c_key, c_ctx->c_key_dma);
|
|
||||||
c_ctx->c_key = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ctx->sec->ctx_q_num; i++)
|
for (i = 0; i < ctx->sec->ctx_q_num; i++)
|
||||||
sec_release_qp_ctx(ctx, &ctx->qp_ctx[i]);
|
sec_release_qp_ctx(ctx, &ctx->qp_ctx[i]);
|
||||||
|
@ -349,6 +318,63 @@ static void sec_skcipher_uninit(struct crypto_skcipher *tfm)
|
||||||
kfree(ctx->qp_ctx);
|
kfree(ctx->qp_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sec_cipher_init(struct sec_ctx *ctx)
|
||||||
|
{
|
||||||
|
struct sec_cipher_ctx *c_ctx = &ctx->c_ctx;
|
||||||
|
|
||||||
|
c_ctx->c_key = dma_alloc_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE,
|
||||||
|
&c_ctx->c_key_dma, GFP_KERNEL);
|
||||||
|
if (!c_ctx->c_key)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sec_cipher_uninit(struct sec_ctx *ctx)
|
||||||
|
{
|
||||||
|
struct sec_cipher_ctx *c_ctx = &ctx->c_ctx;
|
||||||
|
|
||||||
|
memzero_explicit(c_ctx->c_key, SEC_MAX_KEY_SIZE);
|
||||||
|
dma_free_coherent(SEC_CTX_DEV(ctx), SEC_MAX_KEY_SIZE,
|
||||||
|
c_ctx->c_key, c_ctx->c_key_dma);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sec_skcipher_init(struct crypto_skcipher *tfm)
|
||||||
|
{
|
||||||
|
struct sec_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ctx = crypto_skcipher_ctx(tfm);
|
||||||
|
crypto_skcipher_set_reqsize(tfm, sizeof(struct sec_req));
|
||||||
|
ctx->c_ctx.ivsize = crypto_skcipher_ivsize(tfm);
|
||||||
|
if (ctx->c_ctx.ivsize > SEC_IV_SIZE) {
|
||||||
|
dev_err(SEC_CTX_DEV(ctx), "get error skcipher iv size!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sec_ctx_base_init(ctx);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = sec_cipher_init(ctx);
|
||||||
|
if (ret)
|
||||||
|
goto err_cipher_init;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
err_cipher_init:
|
||||||
|
sec_ctx_base_uninit(ctx);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sec_skcipher_uninit(struct crypto_skcipher *tfm)
|
||||||
|
{
|
||||||
|
struct sec_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||||
|
|
||||||
|
sec_cipher_uninit(ctx);
|
||||||
|
sec_ctx_base_uninit(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static int sec_skcipher_3des_setkey(struct sec_cipher_ctx *c_ctx,
|
static int sec_skcipher_3des_setkey(struct sec_cipher_ctx *c_ctx,
|
||||||
const u32 keylen,
|
const u32 keylen,
|
||||||
const enum sec_cmode c_mode)
|
const enum sec_cmode c_mode)
|
||||||
|
|
Loading…
Reference in New Issue