Commit c9f21cb6 authored by Tom Lendacky's avatar Tom Lendacky Committed by Herbert Xu

crypto: ccp - Check for CCP before registering crypto algs

If the ccp is built as a built-in module, then ccp-crypto (whether
built as a module or a built-in module) will be able to load and
it will register its crypto algorithms.  If the system does not have
a CCP this will result in -ENODEV being returned whenever a command
is attempted to be queued by the registered crypto algorithms.

Add an API, ccp_present(), that checks for the presence of a CCP
on the system.  The ccp-crypto module can use this to determine if it
should register it's crypto alogorithms.

Cc: stable@vger.kernel.org
Reported-by: default avatarScot Doyle <lkml14@scotdoyle.com>
Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Tested-by: default avatarScot Doyle <lkml14@scotdoyle.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 413e5574
...@@ -367,6 +367,10 @@ static int ccp_crypto_init(void) ...@@ -367,6 +367,10 @@ static int ccp_crypto_init(void)
{ {
int ret; int ret;
ret = ccp_present();
if (ret)
return ret;
spin_lock_init(&req_queue_lock); spin_lock_init(&req_queue_lock);
INIT_LIST_HEAD(&req_queue.cmds); INIT_LIST_HEAD(&req_queue.cmds);
req_queue.backlog = &req_queue.cmds; req_queue.backlog = &req_queue.cmds;
......
...@@ -54,6 +54,20 @@ static inline void ccp_del_device(struct ccp_device *ccp) ...@@ -54,6 +54,20 @@ static inline void ccp_del_device(struct ccp_device *ccp)
ccp_dev = NULL; ccp_dev = NULL;
} }
/**
* ccp_present - check if a CCP device is present
*
* Returns zero if a CCP device is present, -ENODEV otherwise.
*/
int ccp_present(void)
{
if (ccp_get_device())
return 0;
return -ENODEV;
}
EXPORT_SYMBOL_GPL(ccp_present);
/** /**
* ccp_enqueue_cmd - queue an operation for processing by the CCP * ccp_enqueue_cmd - queue an operation for processing by the CCP
* *
......
...@@ -26,6 +26,13 @@ struct ccp_cmd; ...@@ -26,6 +26,13 @@ struct ccp_cmd;
#if defined(CONFIG_CRYPTO_DEV_CCP_DD) || \ #if defined(CONFIG_CRYPTO_DEV_CCP_DD) || \
defined(CONFIG_CRYPTO_DEV_CCP_DD_MODULE) defined(CONFIG_CRYPTO_DEV_CCP_DD_MODULE)
/**
* ccp_present - check if a CCP device is present
*
* Returns zero if a CCP device is present, -ENODEV otherwise.
*/
int ccp_present(void);
/** /**
* ccp_enqueue_cmd - queue an operation for processing by the CCP * ccp_enqueue_cmd - queue an operation for processing by the CCP
* *
...@@ -53,6 +60,11 @@ int ccp_enqueue_cmd(struct ccp_cmd *cmd); ...@@ -53,6 +60,11 @@ int ccp_enqueue_cmd(struct ccp_cmd *cmd);
#else /* CONFIG_CRYPTO_DEV_CCP_DD is not enabled */ #else /* CONFIG_CRYPTO_DEV_CCP_DD is not enabled */
static inline int ccp_present(void)
{
return -ENODEV;
}
static inline int ccp_enqueue_cmd(struct ccp_cmd *cmd) static inline int ccp_enqueue_cmd(struct ccp_cmd *cmd)
{ {
return -ENODEV; return -ENODEV;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment