Commit 673046ea authored by Ofir Drang's avatar Ofir Drang Committed by Greg Kroah-Hartman

crypto: ccree - add function to handle cryptocell tee fips error

commit 897ab231 upstream.

Adds function that checks if cryptocell tee fips error occurred
and in such case triggers system error through kernel panic.
Change fips function to use this new routine.
Signed-off-by: default avatarOfir Drang <ofir.drang@arm.com>
Signed-off-by: default avatarGilad Ben-Yossef <gilad@benyossef.com>
Cc: stable@vger.kernel.org # v4.19+
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 273f8a2d
...@@ -72,20 +72,28 @@ static inline void tee_fips_error(struct device *dev) ...@@ -72,20 +72,28 @@ static inline void tee_fips_error(struct device *dev)
dev_err(dev, "TEE reported error!\n"); dev_err(dev, "TEE reported error!\n");
} }
/*
* This function check if cryptocell tee fips error occurred
* and in such case triggers system error
*/
void cc_tee_handle_fips_error(struct cc_drvdata *p_drvdata)
{
struct device *dev = drvdata_to_dev(p_drvdata);
if (!cc_get_tee_fips_status(p_drvdata))
tee_fips_error(dev);
}
/* Deferred service handler, run as interrupt-fired tasklet */ /* Deferred service handler, run as interrupt-fired tasklet */
static void fips_dsr(unsigned long devarg) static void fips_dsr(unsigned long devarg)
{ {
struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg; struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
struct device *dev = drvdata_to_dev(drvdata); u32 irq, val;
u32 irq, state, val;
irq = (drvdata->irq & (CC_GPR0_IRQ_MASK)); irq = (drvdata->irq & (CC_GPR0_IRQ_MASK));
if (irq) { if (irq) {
state = cc_ioread(drvdata, CC_REG(GPR_HOST)); cc_tee_handle_fips_error(drvdata);
if (state != (CC_FIPS_SYNC_TEE_STATUS | CC_FIPS_SYNC_MODULE_OK))
tee_fips_error(dev);
} }
/* after verifing that there is nothing to do, /* after verifing that there is nothing to do,
...@@ -113,8 +121,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata) ...@@ -113,8 +121,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata)
dev_dbg(dev, "Initializing fips tasklet\n"); dev_dbg(dev, "Initializing fips tasklet\n");
tasklet_init(&fips_h->tasklet, fips_dsr, (unsigned long)p_drvdata); tasklet_init(&fips_h->tasklet, fips_dsr, (unsigned long)p_drvdata);
if (!cc_get_tee_fips_status(p_drvdata)) cc_tee_handle_fips_error(p_drvdata);
tee_fips_error(dev);
return 0; return 0;
} }
...@@ -18,6 +18,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata); ...@@ -18,6 +18,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata);
void cc_fips_fini(struct cc_drvdata *drvdata); void cc_fips_fini(struct cc_drvdata *drvdata);
void fips_handler(struct cc_drvdata *drvdata); void fips_handler(struct cc_drvdata *drvdata);
void cc_set_ree_fips_status(struct cc_drvdata *drvdata, bool ok); void cc_set_ree_fips_status(struct cc_drvdata *drvdata, bool ok);
void cc_tee_handle_fips_error(struct cc_drvdata *p_drvdata);
#else /* CONFIG_CRYPTO_FIPS */ #else /* CONFIG_CRYPTO_FIPS */
...@@ -30,6 +31,7 @@ static inline void cc_fips_fini(struct cc_drvdata *drvdata) {} ...@@ -30,6 +31,7 @@ static inline void cc_fips_fini(struct cc_drvdata *drvdata) {}
static inline void cc_set_ree_fips_status(struct cc_drvdata *drvdata, static inline void cc_set_ree_fips_status(struct cc_drvdata *drvdata,
bool ok) {} bool ok) {}
static inline void fips_handler(struct cc_drvdata *drvdata) {} static inline void fips_handler(struct cc_drvdata *drvdata) {}
static inline void cc_tee_handle_fips_error(struct cc_drvdata *p_drvdata) {}
#endif /* CONFIG_CRYPTO_FIPS */ #endif /* CONFIG_CRYPTO_FIPS */
......
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