[openwrt/openwrt] mediatek: add driver for HW-RNG v2

LEDE Commits lede-commits at lists.infradead.org
Sat Sep 13 04:54:23 PDT 2025


dangole pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/9cfbd691e911a40357ab848f8e902551de32738e

commit 9cfbd691e911a40357ab848f8e902551de32738e
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Thu Sep 11 01:43:24 2025 +0100

    mediatek: add driver for HW-RNG v2
    
    Add driver for hardware random number generator found in MT7981, MT7988
    and MT7987. This gives us a fast source of high-quality random numbers
    on those platforms.
    
    root at OpenWrt:~# cat /dev/hwrng | rngtest -c 10000
    rngtest 6.17
    Copyright (c) 2004 by Henrique de Moraes Holschuh
    This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    rngtest: starting FIPS tests...
    rngtest: bits received from input: 200000032
    rngtest: FIPS 140-2 successes: 9988
    rngtest: FIPS 140-2 failures: 12
    rngtest: FIPS 140-2(2001-10-10) Monobit: 2
    rngtest: FIPS 140-2(2001-10-10) Poker: 0
    rngtest: FIPS 140-2(2001-10-10) Runs: 4
    rngtest: FIPS 140-2(2001-10-10) Long run: 6
    rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
    rngtest: input channel speed: (min=616.108; avg=11979.007; max=19531250.000)Kibits/s
    rngtest: FIPS tests speed: (min=1.859; avg=82.116; max=83.656)Mibits/s
    rngtest: Program run time: 18629928 microseconds
    
    Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
 target/linux/mediatek/filogic/config-6.12          |   1 +
 target/linux/mediatek/mt7622/config-6.12           |   1 +
 target/linux/mediatek/mt7623/config-6.12           |   1 +
 target/linux/mediatek/mt7629/config-6.12           |   1 +
 ...20-hwrng-add-driver-for-MediaTek-TRNG-SMC.patch | 133 +++++++++++++++++++++
 5 files changed, 137 insertions(+)

diff --git a/target/linux/mediatek/filogic/config-6.12 b/target/linux/mediatek/filogic/config-6.12
index 3feaf0f865..b5af5a716d 100644
--- a/target/linux/mediatek/filogic/config-6.12
+++ b/target/linux/mediatek/filogic/config-6.12
@@ -221,6 +221,7 @@ CONFIG_HAS_IOPORT_MAP=y
 CONFIG_HWMON=y
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_MTK=y
+CONFIG_HW_RANDOM_MTK_V2=y
 CONFIG_I2C=y
 CONFIG_I2C_BOARDINFO=y
 CONFIG_I2C_CHARDEV=y
diff --git a/target/linux/mediatek/mt7622/config-6.12 b/target/linux/mediatek/mt7622/config-6.12
index a776023a7f..bb5c9a98bc 100644
--- a/target/linux/mediatek/mt7622/config-6.12
+++ b/target/linux/mediatek/mt7622/config-6.12
@@ -220,6 +220,7 @@ CONFIG_HAS_IOPORT_MAP=y
 CONFIG_HWMON=y
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_MTK=y
+# CONFIG_HW_RANDOM_MTK_V2 is not set
 CONFIG_I2C=y
 CONFIG_I2C_BOARDINFO=y
 CONFIG_I2C_CHARDEV=y
diff --git a/target/linux/mediatek/mt7623/config-6.12 b/target/linux/mediatek/mt7623/config-6.12
index 5b17e61868..464eeb6d57 100644
--- a/target/linux/mediatek/mt7623/config-6.12
+++ b/target/linux/mediatek/mt7623/config-6.12
@@ -315,6 +315,7 @@ CONFIG_HOTPLUG_CPU=y
 CONFIG_HWMON=y
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_MTK=y
+# CONFIG_HW_RANDOM_MTK_V2 is not set
 CONFIG_HZ_FIXED=0
 CONFIG_I2C=y
 CONFIG_I2C_ALGOBIT=y
diff --git a/target/linux/mediatek/mt7629/config-6.12 b/target/linux/mediatek/mt7629/config-6.12
index 2098293e69..90334a2ae1 100644
--- a/target/linux/mediatek/mt7629/config-6.12
+++ b/target/linux/mediatek/mt7629/config-6.12
@@ -160,6 +160,7 @@ CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
 CONFIG_HOTPLUG_CPU=y
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_MTK=y
+# CONFIG_HW_RANDOM_MTK_V2 is not set
 CONFIG_HZ_FIXED=0
 # CONFIG_IDPF is not set
 CONFIG_INITRAMFS_SOURCE=""
diff --git a/target/linux/mediatek/patches-6.12/320-hwrng-add-driver-for-MediaTek-TRNG-SMC.patch b/target/linux/mediatek/patches-6.12/320-hwrng-add-driver-for-MediaTek-TRNG-SMC.patch
new file mode 100644
index 0000000000..e738883800
--- /dev/null
+++ b/target/linux/mediatek/patches-6.12/320-hwrng-add-driver-for-MediaTek-TRNG-SMC.patch
@@ -0,0 +1,133 @@
+From 9837930d6738e9fdc323ad887ace7c236a61d70c Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel at makrotopia.org>
+Date: Wed, 25 Jan 2023 00:27:49 +0000
+Subject: [PATCH] hwrng: add driver for MediaTek TRNG SMC
+
+Add driver providing kernel-side support for the Random Number
+Generator hardware found on Mediatek SoCs which have a driver in ARM
+TrustedFirmware-A allowing Linux to read random numbers using a
+non-standard vendor-defined Secure Monitor Call.
+
+Signed-off-by: Daniel Golle <daniel at makrotopia.org>
+---
+ drivers/char/hw_random/Kconfig      | 16 +++++++
+ drivers/char/hw_random/Makefile     |  1 +
+ drivers/char/hw_random/mtk-rng-v2.c | 74 +++++++++++++++++++++++++++++
+ 3 files changed, 91 insertions(+)
+ create mode 100644 drivers/char/hw_random/mtk-rng-v2.c
+
+--- a/drivers/char/hw_random/Kconfig
++++ b/drivers/char/hw_random/Kconfig
+@@ -451,6 +451,23 @@ config HW_RANDOM_MTK
+ 
+ 	  If unsure, say Y.
+ 
++config HW_RANDOM_MTK_V2
++	tristate "Mediatek Random Number Generator support (v2/SMC)"
++	depends on HAVE_ARM_SMCCC
++	depends on HW_RANDOM
++	depends on (ARM64 && ARCH_MEDIATEK) || COMPILE_TEST
++	default y
++	help
++	  This driver provides kernel-side support for the Random Number
++	  Generator hardware found on Mediatek SoCs which have a driver
++	  in ARM TrustedFirmware-A allowing Linux to read using a non-
++	  standard vendor-defined Secure Monitor Call.
++
++	  To compile this driver as a module, choose M here. the
++	  module will be called mtk-rng-v2.
++
++	  If unsure, say Y.
++
+ config HW_RANDOM_S390
+ 	tristate "S390 True Random Number Generator support"
+ 	depends on S390
+--- a/drivers/char/hw_random/Makefile
++++ b/drivers/char/hw_random/Makefile
+@@ -39,6 +39,7 @@ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-r
+ 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_V2)	+= mtk-rng-v2.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
+--- /dev/null
++++ b/drivers/char/hw_random/mtk-rng-v2.c
+@@ -0,0 +1,76 @@
++// SPDX-License-Identifier: GPL-2.0-or-later
++/*
++ * Driver for Mediatek Hardware Random Number Generator (v2/SMCC)
++ *
++ * Copyright (C) 2023 Daniel Golle <daniel at makrotopia.org>
++ * based on patch from Mingming Su <Mingming.Su at mediatek.com>
++ */
++#define MTK_RNG_DEV KBUILD_MODNAME
++
++#include <linux/arm-smccc.h>
++#include <linux/err.h>
++#include <linux/hw_random.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/of.h>
++#include <linux/of_device.h>
++#include <linux/platform_device.h>
++#include <linux/soc/mediatek/mtk_sip_svc.h>
++
++#define MTK_SIP_KERNEL_GET_RND		MTK_SIP_SMC_CMD(0x550)
++
++static int mtk_rng_v2_read(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 int mtk_rng_v2_probe(struct platform_device *pdev)
++{
++	struct hwrng *trng;
++
++	trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL);
++	if (!trng)
++		return -ENOMEM;
++
++	trng->name = pdev->name;
++	trng->read = mtk_rng_v2_read;
++	trng->quality = 900;
++
++	return devm_hwrng_register(&pdev->dev, trng);
++}
++
++static const struct of_device_id mtk_rng_v2_match[] = {
++	{ .compatible = "mediatek,mt7981-rng" },
++	{ .compatible = "mediatek,mt7987-rng" },
++	{ .compatible = "mediatek,mt7988-rng" },
++	{},
++};
++MODULE_DEVICE_TABLE(of, mtk_rng_v2_match);
++
++static struct platform_driver mtk_rng_v2_driver = {
++	.probe          = mtk_rng_v2_probe,
++	.driver = {
++		.name = KBUILD_MODNAME,
++		.of_match_table = mtk_rng_v2_match,
++	},
++};
++module_platform_driver(mtk_rng_v2_driver);
++
++MODULE_DESCRIPTION("Mediatek Random Number Generator Driver (v2/SMC)");
++MODULE_AUTHOR("Daniel Golle <daniel at makrotopia.org>");
++MODULE_LICENSE("GPL");




More information about the lede-commits mailing list