mirror of https://gitee.com/openkylin/linux.git
crypto: ccp - Add support for the RNG in a version 5 CCP
Signed-off-by: Gary R Hook <gary.hook@amd.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
4b394a232d
commit
084935b208
|
@ -432,14 +432,9 @@ static int ccp_init(struct ccp_device *ccp)
|
|||
dev_dbg(dev, "Registering device...\n");
|
||||
ccp_add_device(ccp);
|
||||
|
||||
/* Register the RNG */
|
||||
ccp->hwrng.name = ccp->rngname;
|
||||
ccp->hwrng.read = ccp_trng_read;
|
||||
ret = hwrng_register(&ccp->hwrng);
|
||||
if (ret) {
|
||||
dev_err(dev, "error registering hwrng (%d)\n", ret);
|
||||
ret = ccp_register_rng(ccp);
|
||||
if (ret)
|
||||
goto e_kthread;
|
||||
}
|
||||
|
||||
/* Register the DMA engine support */
|
||||
ret = ccp_dmaengine_register(ccp);
|
||||
|
@ -449,7 +444,7 @@ static int ccp_init(struct ccp_device *ccp)
|
|||
return 0;
|
||||
|
||||
e_hwrng:
|
||||
hwrng_unregister(&ccp->hwrng);
|
||||
ccp_unregister_rng(ccp);
|
||||
|
||||
e_kthread:
|
||||
for (i = 0; i < ccp->cmd_q_count; i++)
|
||||
|
@ -475,7 +470,7 @@ static void ccp_destroy(struct ccp_device *ccp)
|
|||
ccp_dmaengine_unregister(ccp);
|
||||
|
||||
/* Unregister the RNG */
|
||||
hwrng_unregister(&ccp->hwrng);
|
||||
ccp_unregister_rng(ccp);
|
||||
|
||||
/* Remove this device from the list of available units */
|
||||
ccp_del_device(ccp);
|
||||
|
|
|
@ -828,6 +828,10 @@ static int ccp5_init(struct ccp_device *ccp)
|
|||
/* Put this on the unit list to make it available */
|
||||
ccp_add_device(ccp);
|
||||
|
||||
ret = ccp_register_rng(ccp);
|
||||
if (ret)
|
||||
goto e_kthread;
|
||||
|
||||
return 0;
|
||||
|
||||
e_kthread:
|
||||
|
@ -852,6 +856,9 @@ static void ccp5_destroy(struct ccp_device *ccp)
|
|||
struct ccp_cmd *cmd;
|
||||
unsigned int i;
|
||||
|
||||
/* Unregister the RNG */
|
||||
ccp_unregister_rng(ccp);
|
||||
|
||||
/* Remove this device from the list of available units first */
|
||||
ccp_del_device(ccp);
|
||||
|
||||
|
|
|
@ -119,6 +119,29 @@ void ccp_del_device(struct ccp_device *ccp)
|
|||
write_unlock_irqrestore(&ccp_unit_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ccp_register_rng(struct ccp_device *ccp)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
dev_dbg(ccp->dev, "Registering RNG...\n");
|
||||
/* Register an RNG */
|
||||
ccp->hwrng.name = ccp->rngname;
|
||||
ccp->hwrng.read = ccp_trng_read;
|
||||
ret = hwrng_register(&ccp->hwrng);
|
||||
if (ret)
|
||||
dev_err(ccp->dev, "error registering hwrng (%d)\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ccp_unregister_rng(struct ccp_device *ccp)
|
||||
{
|
||||
if (ccp->hwrng.name)
|
||||
hwrng_unregister(&ccp->hwrng);
|
||||
}
|
||||
|
||||
static struct ccp_device *ccp_get_device(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
@ -601,6 +601,8 @@ int ccp_trng_read(struct hwrng *rng, void *data, size_t max, bool wait);
|
|||
|
||||
int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd);
|
||||
|
||||
int ccp_register_rng(struct ccp_device *ccp);
|
||||
void ccp_unregister_rng(struct ccp_device *ccp);
|
||||
int ccp_dmaengine_register(struct ccp_device *ccp);
|
||||
void ccp_dmaengine_unregister(struct ccp_device *ccp);
|
||||
|
||||
|
|
Loading…
Reference in New Issue