diff options
author | Yangbo Lu <yangbo.lu@nxp.com> | 2020-04-10 10:47:05 +0800 |
---|---|---|
committer | Petr Štetiar <ynezz@true.cz> | 2020-05-07 12:53:06 +0200 |
commit | cddd4591404fb4c53dc0b3c0b15b942cdbed4356 (patch) | |
tree | 392c1179de46b0f804e3789edca19069b64e6b44 /target/linux/layerscape/patches-5.4/804-crypto-0033-LFV-26-crypto-caam-fix-Secure-Memory-driver-init.patch | |
parent | d1d2c0b5579ea4f69a42246c9318539d61ba1999 (diff) | |
download | upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.gz upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.bz2 upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.zip |
layerscape: add patches-5.4
Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release
which was tagged LSDK-20.04-V5.4.
https://source.codeaurora.org/external/qoriq/qoriq-components/linux/
For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in
LSDK, port the dts patches from 4.14.
The patches are sorted into the following categories:
301-arch-xxxx
302-dts-xxxx
303-core-xxxx
701-net-xxxx
801-audio-xxxx
802-can-xxxx
803-clock-xxxx
804-crypto-xxxx
805-display-xxxx
806-dma-xxxx
807-gpio-xxxx
808-i2c-xxxx
809-jailhouse-xxxx
810-keys-xxxx
811-kvm-xxxx
812-pcie-xxxx
813-pm-xxxx
814-qe-xxxx
815-sata-xxxx
816-sdhc-xxxx
817-spi-xxxx
818-thermal-xxxx
819-uart-xxxx
820-usb-xxxx
821-vfio-xxxx
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Diffstat (limited to 'target/linux/layerscape/patches-5.4/804-crypto-0033-LFV-26-crypto-caam-fix-Secure-Memory-driver-init.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/804-crypto-0033-LFV-26-crypto-caam-fix-Secure-Memory-driver-init.patch | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/804-crypto-0033-LFV-26-crypto-caam-fix-Secure-Memory-driver-init.patch b/target/linux/layerscape/patches-5.4/804-crypto-0033-LFV-26-crypto-caam-fix-Secure-Memory-driver-init.patch new file mode 100644 index 0000000000..8bece63710 --- /dev/null +++ b/target/linux/layerscape/patches-5.4/804-crypto-0033-LFV-26-crypto-caam-fix-Secure-Memory-driver-init.patch @@ -0,0 +1,274 @@ +From 1286c9b10f76b122ad1b328cc1bec17ac4d5908e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Horia=20Geant=C4=83?= <horia.geanta@nxp.com> +Date: Wed, 13 Nov 2019 09:42:34 +0200 +Subject: [PATCH] LFV-26 crypto: caam - fix Secure Memory driver init +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +SM driver is buggy, since it runs irrespective of the presence of +the caam-sm DT node. +This causes issues on SoCs that have caam HW, but without support +for secure memory. + +Let's transform the module in a library, in the same way (and for +the same reasons) we did for the other job ring-dependent drivers +(caamalg, caamhash etc.) in +commit 1b46c90c8e00 ("crypto: caam - convert top level drivers to libraries") + +SM test module is also updated, to run only when needed. + +Fixes: 54e3fcf89f97 ("MLKU-25-3 crypto: caam - add Secure Memory support") +Signed-off-by: Horia Geantă <horia.geanta@nxp.com> +Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com> +--- + drivers/crypto/caam/Kconfig | 2 +- + drivers/crypto/caam/ctrl.c | 2 ++ + drivers/crypto/caam/intern.h | 19 ++++++++++ + drivers/crypto/caam/jr.c | 6 ++-- + drivers/crypto/caam/sm.h | 1 - + drivers/crypto/caam/sm_store.c | 80 +++++------------------------------------- + drivers/crypto/caam/sm_test.c | 7 ++++ + 7 files changed, 42 insertions(+), 75 deletions(-) + +--- a/drivers/crypto/caam/Kconfig ++++ b/drivers/crypto/caam/Kconfig +@@ -166,7 +166,7 @@ config CRYPTO_DEV_FSL_CAAM_RNG_TEST + just before the RNG is registered with the hw_random API. + + config CRYPTO_DEV_FSL_CAAM_SM +- tristate "CAAM Secure Memory / Keystore API (EXPERIMENTAL)" ++ bool "CAAM Secure Memory / Keystore API (EXPERIMENTAL)" + help + Enables use of a prototype kernel-level Keystore API with CAAM + Secure Memory for insertion/extraction of bus-protected secrets. +--- a/drivers/crypto/caam/ctrl.c ++++ b/drivers/crypto/caam/ctrl.c +@@ -763,6 +763,8 @@ iomap_ctrl: + ctrlpriv->sm_size = resource_size(&res_regs); + else + ctrlpriv->sm_size = PG_SIZE_64K; ++ ++ ctrlpriv->sm_present = 1; + of_node_put(np); + + if (!reg_access) +--- a/drivers/crypto/caam/intern.h ++++ b/drivers/crypto/caam/intern.h +@@ -86,6 +86,7 @@ struct caam_drv_private { + */ + u8 total_jobrs; /* Total Job Rings in device */ + u8 qi_present; /* Nonzero if QI present in device */ ++ u8 sm_present; /* Nonzero if Secure Memory is supported */ + u8 mc_en; /* Nonzero if MC f/w is active */ + u8 scu_en; /* Nonzero if SCU f/w is active */ + u8 optee_en; /* Nonzero if OP-TEE f/w is active */ +@@ -200,6 +201,24 @@ static inline void caam_qi_algapi_exit(v + + #endif /* CONFIG_CAAM_QI */ + ++#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_SM ++ ++int caam_sm_startup(struct device *dev); ++void caam_sm_shutdown(struct device *dev); ++ ++#else ++ ++static inline int caam_sm_startup(struct device *dev) ++{ ++ return 0; ++} ++ ++static inline void caam_sm_shutdown(struct device *dev) ++{ ++} ++ ++#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_SM */ ++ + #ifdef CONFIG_DEBUG_FS + static int caam_debugfs_u64_get(void *data, u64 *val) + { +--- a/drivers/crypto/caam/jr.c ++++ b/drivers/crypto/caam/jr.c +@@ -34,6 +34,7 @@ static void register_algs(struct device + if (++active_devs != 1) + goto algs_unlock; + ++ caam_sm_startup(dev); + caam_algapi_init(dev); + caam_algapi_hash_init(dev); + caam_pkc_init(dev); +@@ -44,7 +45,7 @@ algs_unlock: + mutex_unlock(&algs_lock); + } + +-static void unregister_algs(void) ++static void unregister_algs(struct device *dev) + { + mutex_lock(&algs_lock); + +@@ -57,6 +58,7 @@ static void unregister_algs(void) + caam_pkc_exit(); + caam_algapi_hash_exit(); + caam_algapi_exit(); ++ caam_sm_shutdown(dev); + + algs_unlock: + mutex_unlock(&algs_lock); +@@ -143,7 +145,7 @@ static int caam_jr_remove(struct platfor + } + + /* Unregister JR-based RNG & crypto algorithms */ +- unregister_algs(); ++ unregister_algs(jrdev->parent); + + /* Remove the node from Physical JobR list maintained by driver */ + spin_lock(&driver_data.jr_alloc_lock); +--- a/drivers/crypto/caam/sm.h ++++ b/drivers/crypto/caam/sm.h +@@ -41,7 +41,6 @@ void sm_init_keystore(struct device *dev + u32 sm_detect_keystore_units(struct device *dev); + int sm_establish_keystore(struct device *dev, u32 unit); + void sm_release_keystore(struct device *dev, u32 unit); +-void caam_sm_shutdown(struct platform_device *pdev); + int caam_sm_example_init(struct platform_device *pdev); + + /* Keystore accessor functions */ +--- a/drivers/crypto/caam/sm_store.c ++++ b/drivers/crypto/caam/sm_store.c +@@ -1053,9 +1053,9 @@ EXPORT_SYMBOL(sm_keystore_slot_import); + * Also, simply uses ring 0 for execution at the present + */ + +-int caam_sm_startup(struct platform_device *pdev) ++int caam_sm_startup(struct device *ctrldev) + { +- struct device *ctrldev, *smdev; ++ struct device *smdev; + struct caam_drv_private *ctrlpriv; + struct caam_drv_private_sm *smpriv; + struct caam_drv_private_jr *jrpriv; /* need this for reg page */ +@@ -1065,17 +1065,10 @@ int caam_sm_startup(struct platform_devi + int ret = 0; + + struct device_node *np; +- ctrldev = &pdev->dev; + ctrlpriv = dev_get_drvdata(ctrldev); + +- /* +- * If ctrlpriv is NULL, it's probably because the caam driver wasn't +- * properly initialized (e.g. RNG4 init failed). Thus, bail out here. +- */ +- if (!ctrlpriv) { +- ret = -ENODEV; +- goto exit; +- } ++ if (!ctrlpriv->sm_present) ++ return 0; + + /* + * Set up the private block for secure memory +@@ -1248,14 +1241,16 @@ exit: + return ret; + } + +-void caam_sm_shutdown(struct platform_device *pdev) ++void caam_sm_shutdown(struct device *ctrldev) + { +- struct device *ctrldev, *smdev; ++ struct device *smdev; + struct caam_drv_private *priv; + struct caam_drv_private_sm *smpriv; + +- ctrldev = &pdev->dev; + priv = dev_get_drvdata(ctrldev); ++ if (!priv->sm_present) ++ return; ++ + smdev = priv->smdev; + + /* Return if resource not initialized by startup */ +@@ -1273,60 +1268,3 @@ void caam_sm_shutdown(struct platform_de + kfree(smpriv); + } + EXPORT_SYMBOL(caam_sm_shutdown); +- +-static void __exit caam_sm_exit(void) +-{ +- struct device_node *dev_node; +- struct platform_device *pdev; +- +- dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); +- if (!dev_node) { +- dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); +- if (!dev_node) +- return; +- } +- +- pdev = of_find_device_by_node(dev_node); +- if (!pdev) +- return; +- +- of_node_put(dev_node); +- +- caam_sm_shutdown(pdev); +- +- return; +-} +- +-static int __init caam_sm_init(void) +-{ +- struct device_node *dev_node; +- struct platform_device *pdev; +- +- /* +- * Do of_find_compatible_node() then of_find_device_by_node() +- * once a functional device tree is available +- */ +- dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); +- if (!dev_node) { +- dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); +- if (!dev_node) +- return -ENODEV; +- } +- +- pdev = of_find_device_by_node(dev_node); +- if (!pdev) +- return -ENODEV; +- +- of_node_get(dev_node); +- +- caam_sm_startup(pdev); +- +- return 0; +-} +- +-module_init(caam_sm_init); +-module_exit(caam_sm_exit); +- +-MODULE_LICENSE("Dual BSD/GPL"); +-MODULE_DESCRIPTION("FSL CAAM Secure Memory / Keystore"); +-MODULE_AUTHOR("Freescale Semiconductor - NMSG/MAD"); +--- a/drivers/crypto/caam/sm_test.c ++++ b/drivers/crypto/caam/sm_test.c +@@ -531,6 +531,7 @@ static int __init caam_sm_test_init(void + { + struct device_node *dev_node; + struct platform_device *pdev; ++ struct caam_drv_private *priv; + int ret; + + /* +@@ -550,6 +551,12 @@ static int __init caam_sm_test_init(void + + of_node_put(dev_node); + ++ priv = dev_get_drvdata(&pdev->dev); ++ if (!priv->sm_present) { ++ dev_info(&pdev->dev, "No SM support, skipping tests\n"); ++ return -ENODEV; ++ } ++ + ret = caam_sm_example_init(pdev); + if (ret) + dev_err(&pdev->dev, "SM test failed: %d\n", ret); |