* [PATCH v3 1/3] soc: mediatek: add SMC fid table for SIP interface
2019-06-10 10:36 [PATCH v3 0/3] MediaTek Security random number generator support Neal Liu
@ 2019-06-10 10:36 ` Neal Liu
2019-06-10 10:36 ` [PATCH v3 2/3] dt-bindings: rng: update bindings for MediaTek ARMv8 SoCs Neal Liu
2019-06-10 10:36 ` [PATCH v3 3/3] hwrng: add mtk-sec-rng driver Neal Liu
2 siblings, 0 replies; 6+ messages in thread
From: Neal Liu @ 2019-06-10 10:36 UTC (permalink / raw)
To: Matt Mackall, Herbert Xu, Rob Herring, Mark Rutland,
Matthias Brugger, Sean Wang
Cc: devicetree, wsd_upstream, linux-kernel, Crystal Guo,
linux-mediatek, linux-crypto, Neal Liu, linux-arm-kernel
1. Add a header file to provide SIP interface to ATF
2. Add hwrng SMC fid
Signed-off-by: Neal Liu <neal.liu@mediatek.com>
---
include/linux/soc/mediatek/mtk_sip_svc.h | 33 ++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
create mode 100644 include/linux/soc/mediatek/mtk_sip_svc.h
diff --git a/include/linux/soc/mediatek/mtk_sip_svc.h b/include/linux/soc/mediatek/mtk_sip_svc.h
new file mode 100644
index 0000000..e70c325
--- /dev/null
+++ b/include/linux/soc/mediatek/mtk_sip_svc.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2019 MediaTek Inc.
+ */
+
+#ifndef _MTK_SECURE_API_H_
+#define _MTK_SECURE_API_H_
+
+#include <linux/kernel.h>
+
+/* Error Code */
+#define SIP_SVC_E_SUCCESS 0
+#define SIP_SVC_E_NOT_SUPPORTED -1
+#define SIP_SVC_E_INVALID_PARAMS -2
+#define SIP_SVC_E_INVALID_RANGE -3
+#define SIP_SVC_E_PERMISSION_DENY -4
+
+#ifdef CONFIG_ARM64
+#define MTK_SIP_SMC_AARCH_BIT BIT(30)
+#else
+#define MTK_SIP_SMC_AARCH_BIT 0
+#endif
+
+/*******************************************************************************
+ * Defines for Mediatek runtime services func ids
+ ******************************************************************************/
+
+/* Security related SMC call */
+/* HWRNG */
+#define MTK_SIP_KERNEL_GET_RND \
+ (0x82000206 | MTK_SIP_SMC_AARCH_BIT)
+
+#endif /* _MTK_SECURE_API_H_ */
--
1.7.9.5
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v3 2/3] dt-bindings: rng: update bindings for MediaTek ARMv8 SoCs
2019-06-10 10:36 [PATCH v3 0/3] MediaTek Security random number generator support Neal Liu
2019-06-10 10:36 ` [PATCH v3 1/3] soc: mediatek: add SMC fid table for SIP interface Neal Liu
@ 2019-06-10 10:36 ` Neal Liu
2019-06-11 22:53 ` Rob Herring
2019-06-10 10:36 ` [PATCH v3 3/3] hwrng: add mtk-sec-rng driver Neal Liu
2 siblings, 1 reply; 6+ messages in thread
From: Neal Liu @ 2019-06-10 10:36 UTC (permalink / raw)
To: Matt Mackall, Herbert Xu, Rob Herring, Mark Rutland,
Matthias Brugger, Sean Wang
Cc: devicetree, wsd_upstream, linux-kernel, Crystal Guo,
linux-mediatek, linux-crypto, Neal Liu, linux-arm-kernel
Document the binding used by the MediaTek ARMv8 SoCs random
number generator with TrustZone enabled.
Signed-off-by: Neal Liu <neal.liu@mediatek.com>
---
Documentation/devicetree/bindings/rng/mtk-rng.txt | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/rng/mtk-rng.txt b/Documentation/devicetree/bindings/rng/mtk-rng.txt
index 2bc89f1..fb3dd59 100644
--- a/Documentation/devicetree/bindings/rng/mtk-rng.txt
+++ b/Documentation/devicetree/bindings/rng/mtk-rng.txt
@@ -3,9 +3,13 @@ found in MediaTek SoC family
Required properties:
- compatible : Should be
- "mediatek,mt7622-rng", "mediatek,mt7623-rng" : for MT7622
- "mediatek,mt7629-rng", "mediatek,mt7623-rng" : for MT7629
- "mediatek,mt7623-rng" : for MT7623
+ "mediatek,mt7622-rng", "mediatek,mt7623-rng" for MT7622
+ "mediatek,mt7629-rng", "mediatek,mt7623-rng" for MT7629
+ "mediatek,mt7623-rng" for MT7623
+ "mediatek,mtk-sec-rng" for MediaTek ARMv8 SoCs with
+ security RNG
+
+Optional properties:
- clocks : list of clock specifiers, corresponding to
entries in clock-names property;
- clock-names : Should contain "rng" entries;
@@ -19,3 +23,8 @@ rng: rng@1020f000 {
clocks = <&infracfg CLK_INFRA_TRNG>;
clock-names = "rng";
};
+
+/* secure RNG */
+hwrng: hwrng {
+ compatible = "mediatek,mtk-sec-rng";
+};
--
1.7.9.5
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v3 2/3] dt-bindings: rng: update bindings for MediaTek ARMv8 SoCs
2019-06-10 10:36 ` [PATCH v3 2/3] dt-bindings: rng: update bindings for MediaTek ARMv8 SoCs Neal Liu
@ 2019-06-11 22:53 ` Rob Herring
2019-06-12 4:02 ` Neal Liu
0 siblings, 1 reply; 6+ messages in thread
From: Rob Herring @ 2019-06-11 22:53 UTC (permalink / raw)
To: Neal Liu
Cc: Mark Rutland, devicetree, Herbert Xu, wsd_upstream, Sean Wang,
linux-kernel, linux-mediatek, linux-crypto, Matt Mackall,
Matthias Brugger, Crystal Guo, linux-arm-kernel
On Mon, Jun 10, 2019 at 06:36:23PM +0800, Neal Liu wrote:
> Document the binding used by the MediaTek ARMv8 SoCs random
> number generator with TrustZone enabled.
>
> Signed-off-by: Neal Liu <neal.liu@mediatek.com>
> ---
> Documentation/devicetree/bindings/rng/mtk-rng.txt | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/rng/mtk-rng.txt b/Documentation/devicetree/bindings/rng/mtk-rng.txt
> index 2bc89f1..fb3dd59 100644
> --- a/Documentation/devicetree/bindings/rng/mtk-rng.txt
> +++ b/Documentation/devicetree/bindings/rng/mtk-rng.txt
> @@ -3,9 +3,13 @@ found in MediaTek SoC family
>
> Required properties:
> - compatible : Should be
> - "mediatek,mt7622-rng", "mediatek,mt7623-rng" : for MT7622
> - "mediatek,mt7629-rng", "mediatek,mt7623-rng" : for MT7629
> - "mediatek,mt7623-rng" : for MT7623
> + "mediatek,mt7622-rng", "mediatek,mt7623-rng" for MT7622
> + "mediatek,mt7629-rng", "mediatek,mt7623-rng" for MT7629
> + "mediatek,mt7623-rng" for MT7623
> + "mediatek,mtk-sec-rng" for MediaTek ARMv8 SoCs with
> + security RNG
Is there any commonality with the prior h/w? If not, make this a
separate binding doc.
> +
> +Optional properties:
> - clocks : list of clock specifiers, corresponding to
> entries in clock-names property;
> - clock-names : Should contain "rng" entries;
> @@ -19,3 +23,8 @@ rng: rng@1020f000 {
> clocks = <&infracfg CLK_INFRA_TRNG>;
> clock-names = "rng";
> };
> +
> +/* secure RNG */
> +hwrng: hwrng {
> + compatible = "mediatek,mtk-sec-rng";
How does one access this? Seems like this should be part of a node for
firmware? What about other functions?
> +};
> --
> 1.7.9.5
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v3 2/3] dt-bindings: rng: update bindings for MediaTek ARMv8 SoCs
2019-06-11 22:53 ` Rob Herring
@ 2019-06-12 4:02 ` Neal Liu
0 siblings, 0 replies; 6+ messages in thread
From: Neal Liu @ 2019-06-12 4:02 UTC (permalink / raw)
To: Rob Herring
Cc: Mark Rutland, devicetree, Herbert Xu, wsd_upstream, Sean Wang,
linux-kernel, linux-mediatek, linux-crypto, Matt Mackall,
Matthias Brugger, Crystal Guo, linux-arm-kernel
On Tue, 2019-06-11 at 16:53 -0600, Rob Herring wrote:
> On Mon, Jun 10, 2019 at 06:36:23PM +0800, Neal Liu wrote:
> > Document the binding used by the MediaTek ARMv8 SoCs random
> > number generator with TrustZone enabled.
> >
> > Signed-off-by: Neal Liu <neal.liu@mediatek.com>
> > ---
> > Documentation/devicetree/bindings/rng/mtk-rng.txt | 15 ++++++++++++---
> > 1 file changed, 12 insertions(+), 3 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/rng/mtk-rng.txt b/Documentation/devicetree/bindings/rng/mtk-rng.txt
> > index 2bc89f1..fb3dd59 100644
> > --- a/Documentation/devicetree/bindings/rng/mtk-rng.txt
> > +++ b/Documentation/devicetree/bindings/rng/mtk-rng.txt
> > @@ -3,9 +3,13 @@ found in MediaTek SoC family
> >
> > Required properties:
> > - compatible : Should be
> > - "mediatek,mt7622-rng", "mediatek,mt7623-rng" : for MT7622
> > - "mediatek,mt7629-rng", "mediatek,mt7623-rng" : for MT7629
> > - "mediatek,mt7623-rng" : for MT7623
> > + "mediatek,mt7622-rng", "mediatek,mt7623-rng" for MT7622
> > + "mediatek,mt7629-rng", "mediatek,mt7623-rng" for MT7629
> > + "mediatek,mt7623-rng" for MT7623
> > + "mediatek,mtk-sec-rng" for MediaTek ARMv8 SoCs with
> > + security RNG
>
> Is there any commonality with the prior h/w? If not, make this a
> separate binding doc.
There are less common with the prior h/w... I had been thinking about
make new binding doc. Since your suggestion, I'll make one.
>
> > +
> > +Optional properties:
> > - clocks : list of clock specifiers, corresponding to
> > entries in clock-names property;
> > - clock-names : Should contain "rng" entries;
> > @@ -19,3 +23,8 @@ rng: rng@1020f000 {
> > clocks = <&infracfg CLK_INFRA_TRNG>;
> > clock-names = "rng";
> > };
> > +
> > +/* secure RNG */
> > +hwrng: hwrng {
> > + compatible = "mediatek,mtk-sec-rng";
>
> How does one access this? Seems like this should be part of a node for
> firmware? What about other functions?
Yes, We move all hw register & clock control access to the ATF by smc.
>
> > +};
> > --
> > 1.7.9.5
> >
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 3/3] hwrng: add mtk-sec-rng driver
2019-06-10 10:36 [PATCH v3 0/3] MediaTek Security random number generator support Neal Liu
2019-06-10 10:36 ` [PATCH v3 1/3] soc: mediatek: add SMC fid table for SIP interface Neal Liu
2019-06-10 10:36 ` [PATCH v3 2/3] dt-bindings: rng: update bindings for MediaTek ARMv8 SoCs Neal Liu
@ 2019-06-10 10:36 ` Neal Liu
2 siblings, 0 replies; 6+ messages in thread
From: Neal Liu @ 2019-06-10 10:36 UTC (permalink / raw)
To: Matt Mackall, Herbert Xu, Rob Herring, Mark Rutland,
Matthias Brugger, Sean Wang
Cc: devicetree, wsd_upstream, linux-kernel, Crystal Guo,
linux-mediatek, linux-crypto, Neal Liu, linux-arm-kernel
For MediaTek SoCs on ARMv8 with TrustZone enabled, peripherals like
entropy sources is not accessible from normal world (linux) and
rather accessible from secure world (ATF/TEE) only. This driver aims
to provide a generic interface to ATF rng service.
Signed-off-by: Neal Liu <neal.liu@mediatek.com>
---
drivers/char/hw_random/Kconfig | 16 ++++++
drivers/char/hw_random/Makefile | 1 +
drivers/char/hw_random/mtk-sec-rng.c | 97 ++++++++++++++++++++++++++++++++++
3 files changed, 114 insertions(+)
create mode 100644 drivers/char/hw_random/mtk-sec-rng.c
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index 25a7d8f..6c82a3b 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -398,6 +398,22 @@ config HW_RANDOM_MTK
If unsure, say Y.
+config HW_RANDOM_MTK_SEC
+ tristate "MediaTek Security Random Number Generator support"
+ depends on HW_RANDOM
+ depends on ARCH_MEDIATEK || COMPILE_TEST
+ default HW_RANDOM
+ help
+ This driver provides kernel-side support for the Random Number
+ Generator hardware found on MediaTek SoCs. The difference with
+ mtk-rng is the Random Number Generator hardware is secure
+ access only.
+
+ To compile this driver as a module, choose M here. the
+ module will be called mtk-sec-rng.
+
+ If unsure, say Y.
+
config HW_RANDOM_S390
tristate "S390 True Random Number Generator support"
depends on S390
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index 7c9ef4a..0ae4993 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -36,6 +36,7 @@ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o
obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o
obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o
obj-$(CONFIG_HW_RANDOM_MTK) += mtk-rng.o
+obj-$(CONFIG_HW_RANDOM_MTK_SEC) += mtk-sec-rng.o
obj-$(CONFIG_HW_RANDOM_S390) += s390-trng.o
obj-$(CONFIG_HW_RANDOM_KEYSTONE) += ks-sa-rng.o
obj-$(CONFIG_HW_RANDOM_OPTEE) += optee-rng.o
diff --git a/drivers/char/hw_random/mtk-sec-rng.c b/drivers/char/hw_random/mtk-sec-rng.c
new file mode 100644
index 0000000..ecd2e29
--- /dev/null
+++ b/drivers/char/hw_random/mtk-sec-rng.c
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 MediaTek Inc.
+ */
+
+#include <linux/arm-smccc.h>
+#include <linux/hw_random.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/soc/mediatek/mtk_sip_svc.h>
+
+#define MT67XX_RNG_MAGIC 0x74726e67
+#define SMC_RET_NUM 4
+#define MTK_SEC_RND_SIZE (sizeof(u32) * SMC_RET_NUM)
+
+struct mtk_sec_rng_priv {
+ struct hwrng rng;
+};
+
+static void mtk_sec_get_rnd(uint32_t *val)
+{
+ struct arm_smccc_res res;
+
+ arm_smccc_smc(MTK_SIP_KERNEL_GET_RND,
+ MT67XX_RNG_MAGIC, 0, 0, 0, 0, 0, 0, &res);
+
+ val[0] = res.a0;
+ val[1] = res.a1;
+ val[2] = res.a2;
+ val[3] = res.a3;
+}
+
+static int mtk_sec_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
+{
+ u32 val[4] = {0};
+ int retval = 0;
+ int i;
+
+ while (max >= MTK_SEC_RND_SIZE) {
+ mtk_sec_get_rnd(val);
+
+ for (i = 0; i < SMC_RET_NUM; i++) {
+ *(u32 *)buf = val[i];
+ buf += sizeof(u32);
+ }
+
+ retval += MTK_SEC_RND_SIZE;
+ max -= MTK_SEC_RND_SIZE;
+ }
+
+ return retval;
+}
+
+static int mtk_sec_rng_probe(struct platform_device *pdev)
+{
+ struct mtk_sec_rng_priv *priv;
+ int ret;
+
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ priv->rng.name = pdev->name;
+ priv->rng.read = mtk_sec_rng_read;
+ priv->rng.priv = (unsigned long)&pdev->dev;
+ priv->rng.quality = 900;
+
+ ret = devm_hwrng_register(&pdev->dev, &priv->rng);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to register rng device: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct of_device_id mtk_sec_rng_match[] = {
+ { .compatible = "mediatek,mtk-sec-rng", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, mtk_sec_rng_match);
+
+static struct platform_driver mtk_sec_rng_driver = {
+ .probe = mtk_sec_rng_probe,
+ .driver = {
+ .name = KBUILD_MODNAME,
+ .owner = THIS_MODULE,
+ .of_match_table = mtk_sec_rng_match,
+ },
+};
+
+module_platform_driver(mtk_sec_rng_driver);
+
+MODULE_DESCRIPTION("MediaTek Security Random Number Generator Driver");
+MODULE_AUTHOR("Neal Liu <neal.liu@mediatek.com>");
+MODULE_LICENSE("GPL");
--
1.7.9.5
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 6+ messages in thread