* [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants @ 2026-04-19 12:05 Daniel Golle 2026-04-19 12:05 ` [PATCH v3 2/2] hwrng: mtk - add support for hw access via SMCC Daniel Golle 2026-04-20 14:07 ` [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Krzysztof Kozlowski 0 siblings, 2 replies; 7+ messages in thread From: Daniel Golle @ 2026-04-19 12:05 UTC (permalink / raw) To: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, Daniel Golle, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek Add compatible strings for MediaTek SoCs where the hardware random number generator is accessed via a vendor-defined Secure Monitor Call (SMC) rather than direct MMIO register access: - mediatek,mt7981-rng - mediatek,mt7987-rng - mediatek,mt7988-rng These variants require no reg, clocks, or clock-names properties since the RNG hardware is managed by ARM Trusted Firmware-A. Relax the $nodename pattern to also allow 'rng' in addition to the existing 'rng@...' pattern. Add a second example showing the minimal SMC variant binding. Signed-off-by: Daniel Golle <daniel@makrotopia.org> --- v3: * drop not: in compatible conditional * add reg/clocks/clock-names: false for mt7981-rng * add else: requiring reg/clocks/clock-names for others v2: express compatibilities with fallback .../devicetree/bindings/rng/mtk-rng.yaml | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/rng/mtk-rng.yaml b/Documentation/devicetree/bindings/rng/mtk-rng.yaml index 7e8dc62e5d3a6..8fe6c209ab1e5 100644 --- a/Documentation/devicetree/bindings/rng/mtk-rng.yaml +++ b/Documentation/devicetree/bindings/rng/mtk-rng.yaml @@ -11,12 +11,13 @@ maintainers: properties: $nodename: - pattern: "^rng@[0-9a-f]+$" + pattern: "^rng(@[0-9a-f]+)?$" compatible: oneOf: - enum: - mediatek,mt7623-rng + - mediatek,mt7981-rng - items: - enum: - mediatek,mt7622-rng @@ -25,6 +26,11 @@ properties: - mediatek,mt8365-rng - mediatek,mt8516-rng - const: mediatek,mt7623-rng + - items: + - enum: + - mediatek,mt7987-rng + - mediatek,mt7988-rng + - const: mediatek,mt7981-rng reg: maxItems: 1 @@ -38,9 +44,23 @@ properties: required: - compatible - - reg - - clocks - - clock-names + +allOf: + - if: + properties: + compatible: + contains: + const: mediatek,mt7981-rng + then: + properties: + reg: false + clocks: false + clock-names: false + else: + required: + - reg + - clocks + - clock-names additionalProperties: false @@ -53,3 +73,7 @@ examples: clocks = <&infracfg CLK_INFRA_TRNG>; clock-names = "rng"; }; + - | + rng { + compatible = "mediatek,mt7981-rng"; + }; -- 2.53.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/2] hwrng: mtk - add support for hw access via SMCC 2026-04-19 12:05 [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Daniel Golle @ 2026-04-19 12:05 ` Daniel Golle 2026-04-20 14:07 ` [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Krzysztof Kozlowski 1 sibling, 0 replies; 7+ messages in thread From: Daniel Golle @ 2026-04-19 12:05 UTC (permalink / raw) To: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, Daniel Golle, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek Newer versions of ARM TrustedFirmware-A on MediaTek's ARMv8 SoCs no longer allow accessing the TRNG from outside of the trusted firmware. Instead, a vendor-defined custom Secure Monitor Call can be used to acquire random bytes. Add support for newer SoCs (MT7981, MT7987, MT7988). As TF-A for the MT7986 may either follow the old or the new convention, the best bet is to test if firmware blocks direct access to the hwrng and if so, expect the SMCC interface to be usable. Signed-off-by: Daniel Golle <daniel@makrotopia.org> --- v3: unchanged v2: unchanged drivers/char/hw_random/mtk-rng.c | 127 ++++++++++++++++++++++++++----- 1 file changed, 106 insertions(+), 21 deletions(-) diff --git a/drivers/char/hw_random/mtk-rng.c b/drivers/char/hw_random/mtk-rng.c index 5808d09d12c45..8f5856b59ad66 100644 --- a/drivers/char/hw_random/mtk-rng.c +++ b/drivers/char/hw_random/mtk-rng.c @@ -3,6 +3,7 @@ * Driver for Mediatek Hardware Random Number Generator * * Copyright (C) 2017 Sean Wang <sean.wang@mediatek.com> + * Copyright (C) 2026 Daniel Golle <daniel@makrotopia.org> */ #define MTK_RNG_DEV KBUILD_MODNAME @@ -17,6 +18,8 @@ #include <linux/of.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/arm-smccc.h> +#include <linux/soc/mediatek/mtk_sip_svc.h> /* Runtime PM autosuspend timeout: */ #define RNG_AUTOSUSPEND_TIMEOUT 100 @@ -30,6 +33,11 @@ #define RNG_DATA 0x08 +/* Driver feature flags */ +#define MTK_RNG_SMC BIT(0) + +#define MTK_SIP_KERNEL_GET_RND MTK_SIP_SMC_CMD(0x550) + #define to_mtk_rng(p) container_of(p, struct mtk_rng, rng) struct mtk_rng { @@ -37,6 +45,7 @@ struct mtk_rng { struct clk *clk; struct hwrng rng; struct device *dev; + unsigned long flags; }; static int mtk_rng_init(struct hwrng *rng) @@ -103,6 +112,56 @@ static int mtk_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) return retval || !wait ? retval : -EIO; } +static int mtk_rng_read_smc(struct hwrng *rng, void *buf, size_t max, + bool wait) +{ + struct arm_smccc_res res; + int retval = 0; + + while (max >= sizeof(u32)) { + arm_smccc_smc(MTK_SIP_KERNEL_GET_RND, 0, 0, 0, 0, 0, 0, 0, + &res); + if (res.a0) + break; + + *(u32 *)buf = res.a1; + retval += sizeof(u32); + buf += sizeof(u32); + max -= sizeof(u32); + } + + return retval || !wait ? retval : -EIO; +} + +static bool mtk_rng_hw_accessible(struct mtk_rng *priv) +{ + u32 val; + int err; + + err = clk_prepare_enable(priv->clk); + if (err) + return false; + + val = readl(priv->base + RNG_CTRL); + val |= RNG_EN; + writel(val, priv->base + RNG_CTRL); + + val = readl(priv->base + RNG_CTRL); + + if (val & RNG_EN) { + /* HW is accessible, clean up: disable RNG and clock */ + writel(val & ~RNG_EN, priv->base + RNG_CTRL); + clk_disable_unprepare(priv->clk); + return true; + } + + /* + * If TF-A blocks direct access, the register reads back as 0. + * Leave the clock enabled as TF-A needs it. + */ + return false; +} + static int mtk_rng_probe(struct platform_device *pdev) { int ret; @@ -114,23 +173,42 @@ static int mtk_rng_probe(struct platform_device *pdev) priv->dev = &pdev->dev; priv->rng.name = pdev->name; -#ifndef CONFIG_PM - priv->rng.init = mtk_rng_init; - priv->rng.cleanup = mtk_rng_cleanup; -#endif - priv->rng.read = mtk_rng_read; priv->rng.quality = 900; - - priv->clk = devm_clk_get(&pdev->dev, "rng"); - if (IS_ERR(priv->clk)) { - ret = PTR_ERR(priv->clk); - dev_err(&pdev->dev, "no clock for device: %d\n", ret); - return ret; + priv->flags = (unsigned long)device_get_match_data(&pdev->dev); + + if (!(priv->flags & MTK_RNG_SMC)) { + priv->clk = devm_clk_get(&pdev->dev, "rng"); + if (IS_ERR(priv->clk)) { + ret = PTR_ERR(priv->clk); + dev_err(&pdev->dev, "no clock for device: %d\n", ret); + return ret; + } + + priv->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + + if (IS_ENABLED(CONFIG_HAVE_ARM_SMCCC) && + of_device_is_compatible(pdev->dev.of_node, + "mediatek,mt7986-rng") && + !mtk_rng_hw_accessible(priv)) { + priv->flags |= MTK_RNG_SMC; + dev_info(&pdev->dev, + "HW RNG not MMIO accessible, using SMC\n"); + } } - priv->base = devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(priv->base)) - return PTR_ERR(priv->base); + if (priv->flags & MTK_RNG_SMC) { + if (!IS_ENABLED(CONFIG_HAVE_ARM_SMCCC)) + return -ENODEV; + priv->rng.read = mtk_rng_read_smc; + } else { +#ifndef CONFIG_PM + priv->rng.init = mtk_rng_init; + priv->rng.cleanup = mtk_rng_cleanup; +#endif + priv->rng.read = mtk_rng_read; + } ret = devm_hwrng_register(&pdev->dev, &priv->rng); if (ret) { @@ -139,12 +217,15 @@ static int mtk_rng_probe(struct platform_device *pdev) return ret; } - dev_set_drvdata(&pdev->dev, priv); - pm_runtime_set_autosuspend_delay(&pdev->dev, RNG_AUTOSUSPEND_TIMEOUT); - pm_runtime_use_autosuspend(&pdev->dev); - ret = devm_pm_runtime_enable(&pdev->dev); - if (ret) - return ret; + if (!(priv->flags & MTK_RNG_SMC)) { + dev_set_drvdata(&pdev->dev, priv); + pm_runtime_set_autosuspend_delay(&pdev->dev, + RNG_AUTOSUSPEND_TIMEOUT); + pm_runtime_use_autosuspend(&pdev->dev); + ret = devm_pm_runtime_enable(&pdev->dev); + if (ret) + return ret; + } dev_info(&pdev->dev, "registered RNG driver\n"); @@ -181,8 +262,11 @@ static const struct dev_pm_ops mtk_rng_pm_ops = { #endif /* CONFIG_PM */ static const struct of_device_id mtk_rng_match[] = { - { .compatible = "mediatek,mt7986-rng" }, { .compatible = "mediatek,mt7623-rng" }, + { .compatible = "mediatek,mt7981-rng", .data = (void *)MTK_RNG_SMC }, + { .compatible = "mediatek,mt7986-rng" }, + { .compatible = "mediatek,mt7987-rng", .data = (void *)MTK_RNG_SMC }, + { .compatible = "mediatek,mt7988-rng", .data = (void *)MTK_RNG_SMC }, {}, }; MODULE_DEVICE_TABLE(of, mtk_rng_match); @@ -200,4 +284,5 @@ module_platform_driver(mtk_rng_driver); MODULE_DESCRIPTION("Mediatek Random Number Generator Driver"); MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); +MODULE_AUTHOR("Daniel Golle <daniel@makrotopia.org>"); MODULE_LICENSE("GPL"); -- 2.53.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants 2026-04-19 12:05 [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Daniel Golle 2026-04-19 12:05 ` [PATCH v3 2/2] hwrng: mtk - add support for hw access via SMCC Daniel Golle @ 2026-04-20 14:07 ` Krzysztof Kozlowski 2026-04-20 14:24 ` Daniel Golle 1 sibling, 1 reply; 7+ messages in thread From: Krzysztof Kozlowski @ 2026-04-20 14:07 UTC (permalink / raw) To: Daniel Golle Cc: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On Sun, Apr 19, 2026 at 01:05:01PM +0100, Daniel Golle wrote: > + rng { > + compatible = "mediatek,mt7981-rng"; I asked at v1. Reminded at v2. Nothing serious, but repeating myself is pointless and kind of waste of time. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants 2026-04-20 14:07 ` [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Krzysztof Kozlowski @ 2026-04-20 14:24 ` Daniel Golle 2026-04-20 14:43 ` Krzysztof Kozlowski 0 siblings, 1 reply; 7+ messages in thread From: Daniel Golle @ 2026-04-20 14:24 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On Mon, Apr 20, 2026 at 04:07:33PM +0200, Krzysztof Kozlowski wrote: > On Sun, Apr 19, 2026 at 01:05:01PM +0100, Daniel Golle wrote: > > + rng { > > + compatible = "mediatek,mt7981-rng"; > > I asked at v1. Reminded at v2. Nothing serious, but repeating myself is > pointless and kind of waste of time. Replying *once* telling what you would actually want, or replying to me asking back would have helped enormously: https://patchwork.kernel.org/comment/26880354/ All I can see is that you concluded "no improvements" without telling *what it is you would like to see improved*. You want me to drop the whole example? Drop the compatible? I did drop (and replace) the negative list with a positive list, and thought that was what you have asked me for https://patchwork.kernel.org/comment/26817847/ This binding is dead simple: It's a compatible, describing the identical hardware now hidden behind and SMC call. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants 2026-04-20 14:24 ` Daniel Golle @ 2026-04-20 14:43 ` Krzysztof Kozlowski 2026-04-20 14:48 ` Daniel Golle 0 siblings, 1 reply; 7+ messages in thread From: Krzysztof Kozlowski @ 2026-04-20 14:43 UTC (permalink / raw) To: Daniel Golle Cc: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On 20/04/2026 16:24, Daniel Golle wrote: > On Mon, Apr 20, 2026 at 04:07:33PM +0200, Krzysztof Kozlowski wrote: >> On Sun, Apr 19, 2026 at 01:05:01PM +0100, Daniel Golle wrote: >>> + rng { >>> + compatible = "mediatek,mt7981-rng"; >> >> I asked at v1. Reminded at v2. Nothing serious, but repeating myself is >> pointless and kind of waste of time. > > Replying *once* telling what you would actually want, or replying to > me asking back would have helped enormously: > https://patchwork.kernel.org/comment/26880354/ > > All I can see is that you concluded "no improvements" without telling > *what it is you would like to see improved*. > Yes, and then you should go to v1 and read the review. There was only single comment in this spot, so trivial to find. AGAIN: Use four spaces for indentation. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants 2026-04-20 14:43 ` Krzysztof Kozlowski @ 2026-04-20 14:48 ` Daniel Golle 2026-04-20 17:24 ` Krzysztof Kozlowski 0 siblings, 1 reply; 7+ messages in thread From: Daniel Golle @ 2026-04-20 14:48 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On Mon, Apr 20, 2026 at 04:43:00PM +0200, Krzysztof Kozlowski wrote: > On 20/04/2026 16:24, Daniel Golle wrote: > > On Mon, Apr 20, 2026 at 04:07:33PM +0200, Krzysztof Kozlowski wrote: > >> On Sun, Apr 19, 2026 at 01:05:01PM +0100, Daniel Golle wrote: > >>> + rng { > >>> + compatible = "mediatek,mt7981-rng"; > >> > >> I asked at v1. Reminded at v2. Nothing serious, but repeating myself is > >> pointless and kind of waste of time. > > > > Replying *once* telling what you would actually want, or replying to > > me asking back would have helped enormously: > > https://patchwork.kernel.org/comment/26880354/ > > > > All I can see is that you concluded "no improvements" without telling > > *what it is you would like to see improved*. > > > > Yes, and then you should go to v1 and read the review. There was only > single comment in this spot, so trivial to find. > > AGAIN: > > Use four spaces for indentation. Thank you, that IS helpful. I've read the "no improvements" statement as an overall conclusion and not even considered it to be specific to any *place* without further context. Is that the only remaining problem you see in the binding right now? ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants 2026-04-20 14:48 ` Daniel Golle @ 2026-04-20 17:24 ` Krzysztof Kozlowski 0 siblings, 0 replies; 7+ messages in thread From: Krzysztof Kozlowski @ 2026-04-20 17:24 UTC (permalink / raw) To: Daniel Golle Cc: Olivia Mackall, Herbert Xu, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno, Sean Wang, linux-crypto, devicetree, linux-kernel, linux-arm-kernel, linux-mediatek On 20/04/2026 16:48, Daniel Golle wrote: > On Mon, Apr 20, 2026 at 04:43:00PM +0200, Krzysztof Kozlowski wrote: >> On 20/04/2026 16:24, Daniel Golle wrote: >>> On Mon, Apr 20, 2026 at 04:07:33PM +0200, Krzysztof Kozlowski wrote: >>>> On Sun, Apr 19, 2026 at 01:05:01PM +0100, Daniel Golle wrote: >>>>> + rng { >>>>> + compatible = "mediatek,mt7981-rng"; >>>> >>>> I asked at v1. Reminded at v2. Nothing serious, but repeating myself is >>>> pointless and kind of waste of time. >>> >>> Replying *once* telling what you would actually want, or replying to >>> me asking back would have helped enormously: >>> https://patchwork.kernel.org/comment/26880354/ >>> >>> All I can see is that you concluded "no improvements" without telling >>> *what it is you would like to see improved*. >>> >> >> Yes, and then you should go to v1 and read the review. There was only >> single comment in this spot, so trivial to find. >> >> AGAIN: >> >> Use four spaces for indentation. > > Thank you, that IS helpful. > > I've read the "no improvements" statement as an overall conclusion and > not even considered it to be specific to any *place* without further > context. > > Is that the only remaining problem you see in the binding right now? Yes at least quickly looking. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-04-20 17:24 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-19 12:05 [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Daniel Golle 2026-04-19 12:05 ` [PATCH v3 2/2] hwrng: mtk - add support for hw access via SMCC Daniel Golle 2026-04-20 14:07 ` [PATCH v3 1/2] dt-bindings: rng: mtk-rng: add SMC-based TRNG variants Krzysztof Kozlowski 2026-04-20 14:24 ` Daniel Golle 2026-04-20 14:43 ` Krzysztof Kozlowski 2026-04-20 14:48 ` Daniel Golle 2026-04-20 17:24 ` Krzysztof Kozlowski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox