crypto: ccree - add function to handle cryptocell tee fips error
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: Ofir Drang <ofir.drang@arm.com> Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com> Cc: stable@vger.kernel.org # v4.19+ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
@@ -70,20 +70,28 @@ static inline void tee_fips_error(struct device *dev)
|
||||
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 */
|
||||
static void fips_dsr(unsigned long devarg)
|
||||
{
|
||||
struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
|
||||
struct device *dev = drvdata_to_dev(drvdata);
|
||||
u32 irq, state, val;
|
||||
u32 irq, val;
|
||||
|
||||
irq = (drvdata->irq & (CC_GPR0_IRQ_MASK));
|
||||
|
||||
if (irq) {
|
||||
state = cc_ioread(drvdata, CC_REG(GPR_HOST));
|
||||
|
||||
if (state != (CC_FIPS_SYNC_TEE_STATUS | CC_FIPS_SYNC_MODULE_OK))
|
||||
tee_fips_error(dev);
|
||||
cc_tee_handle_fips_error(drvdata);
|
||||
}
|
||||
|
||||
/* after verifing that there is nothing to do,
|
||||
@@ -111,8 +119,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata)
|
||||
dev_dbg(dev, "Initializing fips tasklet\n");
|
||||
tasklet_init(&fips_h->tasklet, fips_dsr, (unsigned long)p_drvdata);
|
||||
|
||||
if (!cc_get_tee_fips_status(p_drvdata))
|
||||
tee_fips_error(dev);
|
||||
cc_tee_handle_fips_error(p_drvdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user