mirror of
https://github.com/Heleguo/lede.git
synced 2025-12-16 10:51:12 +00:00
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. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
parent
a8c92456d0
commit
8c0898a465
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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=""
|
||||
|
||||
@ -0,0 +1,133 @@
|
||||
From 9837930d6738e9fdc323ad887ace7c236a61d70c Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Golle <daniel@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@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@makrotopia.org>
|
||||
+ * based on patch from Mingming Su <Mingming.Su@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@makrotopia.org>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
Loading…
Reference in New Issue
Block a user