aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/804-crypto-0006-crypto-caam-use-devres-to-de-initialize-the-RNG.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/804-crypto-0006-crypto-caam-use-devres-to-de-initialize-the-RNG.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/804-crypto-0006-crypto-caam-use-devres-to-de-initialize-the-RNG.patch179
1 files changed, 179 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/804-crypto-0006-crypto-caam-use-devres-to-de-initialize-the-RNG.patch b/target/linux/layerscape/patches-5.4/804-crypto-0006-crypto-caam-use-devres-to-de-initialize-the-RNG.patch
new file mode 100644
index 0000000000..6e3cd24ac0
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/804-crypto-0006-crypto-caam-use-devres-to-de-initialize-the-RNG.patch
@@ -0,0 +1,179 @@
+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;
+ }
+