| From 4719469bf1e6d5bac8bb0426be4dd6a124471b69 Mon Sep 17 00:00:00 2001 |
| From: Andrey Smirnov <andrew.smirnov@gmail.com> |
| Date: Tue, 22 Oct 2019 08:30:10 -0700 |
| Subject: [PATCH] crypto: caam - use devres to de-initialize the RNG |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Use devres to de-initialize the RNG and drop explicit de-initialization |
| code in caam_remove(). |
| |
| Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> |
| Cc: Chris Healy <cphealy@gmail.com> |
| Cc: Lucas Stach <l.stach@pengutronix.de> |
| Cc: Horia Geantă <horia.geanta@nxp.com> |
| Cc: Herbert Xu <herbert@gondor.apana.org.au> |
| Cc: Iuliana Prodan <iuliana.prodan@nxp.com> |
| Cc: linux-crypto@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org |
| Reviewed-by: Horia Geantă <horia.geanta@nxp.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| (cherry picked from commit e57acaf0dfe0c8f63411d43cf7c689e43f6810c0) |
| --- |
| drivers/crypto/caam/ctrl.c | 130 ++++++++++++++++++++++++--------------------- |
| 1 file changed, 70 insertions(+), 60 deletions(-) |
| |
| --- a/drivers/crypto/caam/ctrl.c |
| +++ b/drivers/crypto/caam/ctrl.c |
| @@ -176,6 +176,73 @@ static inline int run_descriptor_deco0(s |
| } |
| |
| /* |
| + * deinstantiate_rng - builds and executes a descriptor on DECO0, |
| + * which deinitializes the RNG block. |
| + * @ctrldev - pointer to device |
| + * @state_handle_mask - bitmask containing the instantiation status |
| + * for the RNG4 state handles which exist in |
| + * the RNG4 block: 1 if it's been instantiated |
| + * |
| + * Return: - 0 if no error occurred |
| + * - -ENOMEM if there isn't enough memory to allocate the descriptor |
| + * - -ENODEV if DECO0 couldn't be acquired |
| + * - -EAGAIN if an error occurred when executing the descriptor |
| + */ |
| +static int deinstantiate_rng(struct device *ctrldev, int state_handle_mask) |
| +{ |
| + u32 *desc, status; |
| + int sh_idx, ret = 0; |
| + |
| + desc = kmalloc(CAAM_CMD_SZ * 3, GFP_KERNEL); |
| + if (!desc) |
| + return -ENOMEM; |
| + |
| + for (sh_idx = 0; sh_idx < RNG4_MAX_HANDLES; sh_idx++) { |
| + /* |
| + * If the corresponding bit is set, then it means the state |
| + * handle was initialized by us, and thus it needs to be |
| + * deinitialized as well |
| + */ |
| + if ((1 << sh_idx) & state_handle_mask) { |
| + /* |
| + * Create the descriptor for deinstantating this state |
| + * handle |
| + */ |
| + build_deinstantiation_desc(desc, sh_idx); |
| + |
| + /* Try to run it through DECO0 */ |
| + ret = run_descriptor_deco0(ctrldev, desc, &status); |
| + |
| + if (ret || |
| + (status && status != JRSTA_SSRC_JUMP_HALT_CC)) { |
| + dev_err(ctrldev, |
| + "Failed to deinstantiate RNG4 SH%d\n", |
| + sh_idx); |
| + break; |
| + } |
| + dev_info(ctrldev, "Deinstantiated RNG4 SH%d\n", sh_idx); |
| + } |
| + } |
| + |
| + kfree(desc); |
| + |
| + return ret; |
| +} |
| + |
| +static void devm_deinstantiate_rng(void *data) |
| +{ |
| + struct device *ctrldev = data; |
| + struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev); |
| + |
| + /* |
| + * De-initialize RNG state handles initialized by this driver. |
| + * In case of SoCs with Management Complex, RNG is managed by MC f/w. |
| + */ |
| + if (ctrlpriv->rng4_sh_init) |
| + deinstantiate_rng(ctrldev, ctrlpriv->rng4_sh_init); |
| +} |
| + |
| +/* |
| * instantiate_rng - builds and executes a descriptor on DECO0, |
| * which initializes the RNG block. |
| * @ctrldev - pointer to device |
| @@ -247,59 +314,9 @@ static int instantiate_rng(struct device |
| |
| kfree(desc); |
| |
| - return ret; |
| -} |
| - |
| -/* |
| - * deinstantiate_rng - builds and executes a descriptor on DECO0, |
| - * which deinitializes the RNG block. |
| - * @ctrldev - pointer to device |
| - * @state_handle_mask - bitmask containing the instantiation status |
| - * for the RNG4 state handles which exist in |
| - * the RNG4 block: 1 if it's been instantiated |
| - * |
| - * Return: - 0 if no error occurred |
| - * - -ENOMEM if there isn't enough memory to allocate the descriptor |
| - * - -ENODEV if DECO0 couldn't be acquired |
| - * - -EAGAIN if an error occurred when executing the descriptor |
| - */ |
| -static int deinstantiate_rng(struct device *ctrldev, int state_handle_mask) |
| -{ |
| - u32 *desc, status; |
| - int sh_idx, ret = 0; |
| - |
| - desc = kmalloc(CAAM_CMD_SZ * 3, GFP_KERNEL); |
| - if (!desc) |
| - return -ENOMEM; |
| - |
| - for (sh_idx = 0; sh_idx < RNG4_MAX_HANDLES; sh_idx++) { |
| - /* |
| - * If the corresponding bit is set, then it means the state |
| - * handle was initialized by us, and thus it needs to be |
| - * deinitialized as well |
| - */ |
| - if ((1 << sh_idx) & state_handle_mask) { |
| - /* |
| - * Create the descriptor for deinstantating this state |
| - * handle |
| - */ |
| - build_deinstantiation_desc(desc, sh_idx); |
| - |
| - /* Try to run it through DECO0 */ |
| - ret = run_descriptor_deco0(ctrldev, desc, &status); |
| - |
| - if (ret || |
| - (status && status != JRSTA_SSRC_JUMP_HALT_CC)) { |
| - dev_err(ctrldev, |
| - "Failed to deinstantiate RNG4 SH%d\n", |
| - sh_idx); |
| - break; |
| - } |
| - dev_info(ctrldev, "Deinstantiated RNG4 SH%d\n", sh_idx); |
| - } |
| - } |
| - |
| - kfree(desc); |
| + if (!ret) |
| + ret = devm_add_action_or_reset(ctrldev, devm_deinstantiate_rng, |
| + ctrldev); |
| |
| return ret; |
| } |
| @@ -320,13 +337,6 @@ static int caam_remove(struct platform_d |
| caam_qi_shutdown(ctrldev); |
| #endif |
| |
| - /* |
| - * De-initialize RNG state handles initialized by this driver. |
| - * In case of SoCs with Management Complex, RNG is managed by MC f/w. |
| - */ |
| - if (!ctrlpriv->mc_en && ctrlpriv->rng4_sh_init) |
| - deinstantiate_rng(ctrldev, ctrlpriv->rng4_sh_init); |
| - |
| return 0; |
| } |
| |