Skip to content

Commit 7e22c49

Browse files
dangowrtfrank-w
authored andcommitted
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@makrotopia.org>
1 parent 61783fe commit 7e22c49

3 files changed

Lines changed: 91 additions & 0 deletions

File tree

drivers/char/hw_random/Kconfig

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,22 @@ config HW_RANDOM_MTK
477477

478478
If unsure, say Y.
479479

480+
config HW_RANDOM_MTK_V2
481+
tristate "Mediatek Random Number Generator support (v2/SMC)"
482+
depends on HW_RANDOM
483+
depends on (ARM64 && ARCH_MEDIATEK) || COMPILE_TEST
484+
default y
485+
help
486+
This driver provides kernel-side support for the Random Number
487+
Generator hardware found on Mediatek SoCs which have a driver
488+
in ARM TrustedFirmware-A allowing Linux to read using a non-
489+
standard vendor-defined Secure Monitor Call.
490+
491+
To compile this driver as a module, choose M here. the
492+
module will be called mtk-rng-v2.
493+
494+
If unsure, say Y.
495+
480496
config HW_RANDOM_S390
481497
tristate "S390 True Random Number Generator support"
482498
depends on S390

drivers/char/hw_random/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o
4141
obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o
4242
obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o
4343
obj-$(CONFIG_HW_RANDOM_MTK) += mtk-rng.o
44+
obj-$(CONFIG_HW_RANDOM_MTK_V2) += mtk-rng-v2.o
4445
obj-$(CONFIG_HW_RANDOM_S390) += s390-trng.o
4546
obj-$(CONFIG_HW_RANDOM_KEYSTONE) += ks-sa-rng.o
4647
obj-$(CONFIG_HW_RANDOM_OPTEE) += optee-rng.o
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
/*
3+
* Driver for Mediatek Hardware Random Number Generator (v2/SMCC)
4+
*
5+
* Copyright (C) 2023 Daniel Golle <daniel@makrotopia.org>
6+
* based on patch from Mingming Su <Mingming.Su@mediatek.com>
7+
*/
8+
#define MTK_RNG_DEV KBUILD_MODNAME
9+
10+
#include <linux/arm-smccc.h>
11+
#include <linux/err.h>
12+
#include <linux/hw_random.h>
13+
#include <linux/kernel.h>
14+
#include <linux/module.h>
15+
#include <linux/of.h>
16+
#include <linux/of_device.h>
17+
#include <linux/platform_device.h>
18+
#include <linux/soc/mediatek/mtk_sip_svc.h>
19+
20+
#define MTK_SIP_KERNEL_GET_RND MTK_SIP_SMC_CMD(0x550)
21+
22+
static int mtk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)
23+
{
24+
struct arm_smccc_res res;
25+
int retval = 0;
26+
27+
while (max >= sizeof(u32)) {
28+
arm_smccc_smc(MTK_SIP_KERNEL_GET_RND, 0, 0, 0, 0, 0, 0, 0,
29+
&res);
30+
if (res.a0)
31+
break;
32+
33+
*(u32 *)buf = res.a1;
34+
retval += sizeof(u32);
35+
buf += sizeof(u32);
36+
max -= sizeof(u32);
37+
}
38+
39+
return retval || !wait ? retval : -EIO;
40+
}
41+
42+
static int mtk_rng_v2_probe(struct platform_device *pdev)
43+
{
44+
struct hwrng *trng;
45+
46+
trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL);
47+
if (!trng)
48+
return -ENOMEM;
49+
50+
trng->name = pdev->name;
51+
trng->read = mtk_rng_v2_read;
52+
trng->quality = 900;
53+
54+
return devm_hwrng_register(&pdev->dev, trng);
55+
}
56+
57+
static const struct of_device_id mtk_rng_v2_match[] = {
58+
{ .compatible = "mediatek,mt7981-rng" },
59+
{},
60+
};
61+
MODULE_DEVICE_TABLE(of, mtk_rng_v2_match);
62+
63+
static struct platform_driver mtk_rng_v2_driver = {
64+
.probe = mtk_rng_v2_probe,
65+
.driver = {
66+
.name = KBUILD_MODNAME,
67+
.of_match_table = mtk_rng_v2_match,
68+
},
69+
};
70+
module_platform_driver(mtk_rng_v2_driver);
71+
72+
MODULE_DESCRIPTION("Mediatek Random Number Generator Driver (v2/SMC)");
73+
MODULE_AUTHOR("Daniel Golle <daniel@makrotopia.org>");
74+
MODULE_LICENSE("GPL");

0 commit comments

Comments
 (0)