Message ID | 20241016151845.23712-2-ansuelsmth@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Herbert Xu |
Headers | show |
Series | [1/2] dt-bindings: rng: add support for Airoha EN7581 TRNG | expand |
Hi Christian, kernel test robot noticed the following build errors: [auto build test ERROR on char-misc/char-misc-testing] [also build test ERROR on char-misc/char-misc-next char-misc/char-misc-linus robh/for-next herbert-cryptodev-2.6/master linus/master v6.12-rc3 next-20241016] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Christian-Marangi/hwrng-add-support-for-Airoha-EN7581-TRNG/20241016-232144 base: char-misc/char-misc-testing patch link: https://lore.kernel.org/r/20241016151845.23712-2-ansuelsmth%40gmail.com patch subject: [PATCH 2/2] hwrng: add support for Airoha EN7581 TRNG config: arc-randconfig-001-20241017 (https://download.01.org/0day-ci/archive/20241017/202410171822.152Yno42-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241017/202410171822.152Yno42-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202410171822.152Yno42-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from drivers/char/hw_random/airoha-trng.c:9: drivers/char/hw_random/airoha-trng.c: In function 'airoha_trng_init': >> drivers/char/hw_random/airoha-trng.c:115:34: error: implicit declaration of function 'FIELD_GET' [-Werror=implicit-function-declaration] 115 | FIELD_GET(CNT_TRANS, val) == TRNG_CNT_TRANS_VALID, | ^~~~~~~~~ include/linux/iopoll.h:47:21: note: in definition of macro 'read_poll_timeout' 47 | if (cond) \ | ^~~~ include/linux/iopoll.h:170:9: note: in expansion of macro 'readx_poll_timeout' 170 | readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us) | ^~~~~~~~~~~~~~~~~~ drivers/char/hw_random/airoha-trng.c:114:15: note: in expansion of macro 'readl_poll_timeout' 114 | ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, | ^~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/FIELD_GET +115 drivers/char/hw_random/airoha-trng.c 75 76 static int airoha_trng_init(struct hwrng *rng) 77 { 78 struct airoha_trng *trng = container_of(rng, struct airoha_trng, rng); 79 int ret; 80 u32 val; 81 82 val = readl(trng->base + TRNG_NS_SEK_AND_DAT_EN); 83 val |= RNG_EN; 84 writel(val, trng->base + TRNG_NS_SEK_AND_DAT_EN); 85 86 /* Set out of SW Reset */ 87 airoha_trng_irq_unmask(trng); 88 writel(0, trng->base + TRNG_HEALTH_TEST_SW_RST); 89 90 ret = wait_for_completion_timeout(&trng->rng_op_done, BUSY_LOOP_TIMEOUT); 91 if (ret <= 0) { 92 dev_err(trng->dev, "Timeout waiting for Health Check\n"); 93 airoha_trng_irq_mask(trng); 94 return -ENODEV; 95 } 96 97 /* Check if Health Test Failed */ 98 val = readl(trng->base + TRNG_HEALTH_TEST_STATUS); 99 if (val & (RST_STARTUP_AP_TEST_FAIL | RST_STARTUP_RC_TEST_FAIL)) { 100 dev_err(trng->dev, "Health Check fail: %s test fail\n", 101 val & RST_STARTUP_AP_TEST_FAIL ? "AP" : "RC"); 102 return -ENODEV; 103 } 104 105 /* Check if IP is ready */ 106 ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, 107 val & SAMPLE_RDY, 10, 1000); 108 if (ret < 0) { 109 dev_err(trng->dev, "Timeout waiting for IP ready"); 110 return -ENODEV; 111 } 112 113 /* CNT_TRANS must be 0x80 for IP to be considered ready */ 114 ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, > 115 FIELD_GET(CNT_TRANS, val) == TRNG_CNT_TRANS_VALID, 116 10, 1000); 117 if (ret < 0) { 118 dev_err(trng->dev, "Timeout waiting for IP ready"); 119 return -ENODEV; 120 } 121 122 return 0; 123 } 124
Hi Christian, kernel test robot noticed the following build errors: [auto build test ERROR on char-misc/char-misc-testing] [also build test ERROR on char-misc/char-misc-next char-misc/char-misc-linus robh/for-next herbert-cryptodev-2.6/master linus/master v6.12-rc3 next-20241017] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Christian-Marangi/hwrng-add-support-for-Airoha-EN7581-TRNG/20241016-232144 base: char-misc/char-misc-testing patch link: https://lore.kernel.org/r/20241016151845.23712-2-ansuelsmth%40gmail.com patch subject: [PATCH 2/2] hwrng: add support for Airoha EN7581 TRNG config: i386-buildonly-randconfig-003-20241017 (https://download.01.org/0day-ci/archive/20241017/202410172126.EXJ0sOkP-lkp@intel.com/config) compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241017/202410172126.EXJ0sOkP-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202410172126.EXJ0sOkP-lkp@intel.com/ All errors (new ones prefixed by >>): >> drivers/char/hw_random/airoha-trng.c:115:6: error: call to undeclared function 'FIELD_GET'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 115 | FIELD_GET(CNT_TRANS, val) == TRNG_CNT_TRANS_VALID, | ^ >> drivers/char/hw_random/airoha-trng.c:115:6: error: call to undeclared function 'FIELD_GET'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 2 errors generated. vim +/FIELD_GET +115 drivers/char/hw_random/airoha-trng.c 75 76 static int airoha_trng_init(struct hwrng *rng) 77 { 78 struct airoha_trng *trng = container_of(rng, struct airoha_trng, rng); 79 int ret; 80 u32 val; 81 82 val = readl(trng->base + TRNG_NS_SEK_AND_DAT_EN); 83 val |= RNG_EN; 84 writel(val, trng->base + TRNG_NS_SEK_AND_DAT_EN); 85 86 /* Set out of SW Reset */ 87 airoha_trng_irq_unmask(trng); 88 writel(0, trng->base + TRNG_HEALTH_TEST_SW_RST); 89 90 ret = wait_for_completion_timeout(&trng->rng_op_done, BUSY_LOOP_TIMEOUT); 91 if (ret <= 0) { 92 dev_err(trng->dev, "Timeout waiting for Health Check\n"); 93 airoha_trng_irq_mask(trng); 94 return -ENODEV; 95 } 96 97 /* Check if Health Test Failed */ 98 val = readl(trng->base + TRNG_HEALTH_TEST_STATUS); 99 if (val & (RST_STARTUP_AP_TEST_FAIL | RST_STARTUP_RC_TEST_FAIL)) { 100 dev_err(trng->dev, "Health Check fail: %s test fail\n", 101 val & RST_STARTUP_AP_TEST_FAIL ? "AP" : "RC"); 102 return -ENODEV; 103 } 104 105 /* Check if IP is ready */ 106 ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, 107 val & SAMPLE_RDY, 10, 1000); 108 if (ret < 0) { 109 dev_err(trng->dev, "Timeout waiting for IP ready"); 110 return -ENODEV; 111 } 112 113 /* CNT_TRANS must be 0x80 for IP to be considered ready */ 114 ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, > 115 FIELD_GET(CNT_TRANS, val) == TRNG_CNT_TRANS_VALID, 116 10, 1000); 117 if (ret < 0) { 118 dev_err(trng->dev, "Timeout waiting for IP ready"); 119 return -ENODEV; 120 } 121 122 return 0; 123 } 124
On Wed, Oct 16, 2024 at 05:18:42PM +0200, Christian Marangi wrote: > Add support for Airoha TRNG. The Airoha SoC provide a True RNG module > that can output 4 bytes of raw data at times. > > The module makes use of various noise source to provide True Random > Number Generation. > > On probe the module is reset to operate Health Test and verify correct > execution of it. > > The module can also provide DRBG function but the execution mode is > mutually exclusive, running as TRNG doesn't permit to also run it as > DRBG. > > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> > --- > drivers/char/hw_random/Kconfig | 13 ++ > drivers/char/hw_random/Makefile | 1 + > drivers/char/hw_random/airoha-trng.c | 243 +++++++++++++++++++++++++++ > 3 files changed, 257 insertions(+) > create mode 100644 drivers/char/hw_random/airoha-trng.c > > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > index 5912c2dd6398..bda283f290bc 100644 > --- a/drivers/char/hw_random/Kconfig > +++ b/drivers/char/hw_random/Kconfig > @@ -62,6 +62,19 @@ config HW_RANDOM_AMD > > If unsure, say Y. > > +config HW_RANDOM_AIROHA > + tristate "Airoha True HW Random Number Generator support" > + depends on ARCH_AIROHA || COMPILE_TEST > + default HW_RANDOM This should not be always enabled when HW_RANDOM is enabled. Enabling driver should be a opt-in. Francesco
On Thu, Oct 17, 2024 at 03:11:12PM +0200, Francesco Dolcini wrote: > On Wed, Oct 16, 2024 at 05:18:42PM +0200, Christian Marangi wrote: > > Add support for Airoha TRNG. The Airoha SoC provide a True RNG module > > that can output 4 bytes of raw data at times. > > > > The module makes use of various noise source to provide True Random > > Number Generation. > > > > On probe the module is reset to operate Health Test and verify correct > > execution of it. > > > > The module can also provide DRBG function but the execution mode is > > mutually exclusive, running as TRNG doesn't permit to also run it as > > DRBG. > > > > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> > > --- > > drivers/char/hw_random/Kconfig | 13 ++ > > drivers/char/hw_random/Makefile | 1 + > > drivers/char/hw_random/airoha-trng.c | 243 +++++++++++++++++++++++++++ > > 3 files changed, 257 insertions(+) > > create mode 100644 drivers/char/hw_random/airoha-trng.c > > > > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > > index 5912c2dd6398..bda283f290bc 100644 > > --- a/drivers/char/hw_random/Kconfig > > +++ b/drivers/char/hw_random/Kconfig > > @@ -62,6 +62,19 @@ config HW_RANDOM_AMD > > > > If unsure, say Y. > > > > +config HW_RANDOM_AIROHA > > + tristate "Airoha True HW Random Number Generator support" > > + depends on ARCH_AIROHA || COMPILE_TEST > > > + default HW_RANDOM > This should not be always enabled when HW_RANDOM is enabled. Enabling > driver should be a opt-in. Was following the pattern with other HW_RANDOM config. Ok will drop.
On Thu, Oct 17, 2024 at 03:13:37PM +0200, Christian Marangi wrote: > On Thu, Oct 17, 2024 at 03:11:12PM +0200, Francesco Dolcini wrote: > > On Wed, Oct 16, 2024 at 05:18:42PM +0200, Christian Marangi wrote: > > > Add support for Airoha TRNG. The Airoha SoC provide a True RNG module > > > that can output 4 bytes of raw data at times. > > > > > > The module makes use of various noise source to provide True Random > > > Number Generation. > > > > > > On probe the module is reset to operate Health Test and verify correct > > > execution of it. > > > > > > The module can also provide DRBG function but the execution mode is > > > mutually exclusive, running as TRNG doesn't permit to also run it as > > > DRBG. > > > > > > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> > > > --- > > > drivers/char/hw_random/Kconfig | 13 ++ > > > drivers/char/hw_random/Makefile | 1 + > > > drivers/char/hw_random/airoha-trng.c | 243 +++++++++++++++++++++++++++ > > > 3 files changed, 257 insertions(+) > > > create mode 100644 drivers/char/hw_random/airoha-trng.c > > > > > > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > > > index 5912c2dd6398..bda283f290bc 100644 > > > --- a/drivers/char/hw_random/Kconfig > > > +++ b/drivers/char/hw_random/Kconfig > > > @@ -62,6 +62,19 @@ config HW_RANDOM_AMD > > > > > > If unsure, say Y. > > > > > > +config HW_RANDOM_AIROHA > > > + tristate "Airoha True HW Random Number Generator support" > > > + depends on ARCH_AIROHA || COMPILE_TEST > > > > > + default HW_RANDOM > > This should not be always enabled when HW_RANDOM is enabled. Enabling > > driver should be a opt-in. > > Was following the pattern with other HW_RANDOM config. Ok will drop. Whoops. I missed that it depends on ARCH_AIROHA. Given that dependency is fine to me without any change. Francesco
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 5912c2dd6398..bda283f290bc 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig @@ -62,6 +62,19 @@ config HW_RANDOM_AMD If unsure, say Y. +config HW_RANDOM_AIROHA + tristate "Airoha True HW Random Number Generator support" + depends on ARCH_AIROHA || COMPILE_TEST + default HW_RANDOM + help + This driver provides kernel-side support for the True Random Number + Generator hardware found on Airoha SoC. + + To compile this driver as a module, choose M here: the + module will be called airoha-rng. + + If unsure, say Y. + config HW_RANDOM_ATMEL tristate "Atmel Random Number Generator support" depends on (ARCH_AT91 || COMPILE_TEST) diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index 01f012eab440..dfb717b12f0b 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile @@ -8,6 +8,7 @@ rng-core-y := core.o obj-$(CONFIG_HW_RANDOM_TIMERIOMEM) += timeriomem-rng.o obj-$(CONFIG_HW_RANDOM_INTEL) += intel-rng.o obj-$(CONFIG_HW_RANDOM_AMD) += amd-rng.o +obj-$(CONFIG_HW_RANDOM_AIROHA) += airoha-trng.o obj-$(CONFIG_HW_RANDOM_ATMEL) += atmel-rng.o obj-$(CONFIG_HW_RANDOM_BA431) += ba431-rng.o obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o diff --git a/drivers/char/hw_random/airoha-trng.c b/drivers/char/hw_random/airoha-trng.c new file mode 100644 index 000000000000..88650aeaf8d0 --- /dev/null +++ b/drivers/char/hw_random/airoha-trng.c @@ -0,0 +1,243 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (C) 2024 Christian Marangi */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/mod_devicetable.h> +#include <linux/err.h> +#include <linux/io.h> +#include <linux/iopoll.h> +#include <linux/interrupt.h> +#include <linux/hw_random.h> +#include <linux/platform_device.h> +#include <linux/delay.h> + +#define TRNG_IP_RDY 0x800 +#define CNT_TRANS GENMASK(15, 8) +#define SAMPLE_RDY BIT(0) +#define TRNG_NS_SEK_AND_DAT_EN 0x804 +#define RNG_EN BIT(31) /* referenced as ring_en */ +#define RAW_DATA_EN BIT(16) +#define TRNG_HEALTH_TEST_SW_RST 0x808 +#define SW_RST BIT(0) /* Active High */ +#define TRNG_INTR_EN 0x818 +#define INTR_MASK BIT(16) +#define CONTINUOUS_HEALTH_INITR_EN BIT(2) +#define SW_STARTUP_INITR_EN BIT(1) +#define RST_STARTUP_INITR_EN BIT(0) +/* Notice that Health Test are done only out of Reset and with RNG_EN */ +#define TRNG_HEALTH_TEST_STATUS 0x824 +#define CONTINUOUS_HEALTH_AP_TEST_FAIL BIT(23) +#define CONTINUOUS_HEALTH_RC_TEST_FAIL BIT(22) +#define SW_STARTUP_TEST_DONE BIT(21) +#define SW_STARTUP_AP_TEST_FAIL BIT(20) +#define SW_STARTUP_RC_TEST_FAIL BIT(19) +#define RST_STARTUP_TEST_DONE BIT(18) +#define RST_STARTUP_AP_TEST_FAIL BIT(17) +#define RST_STARTUP_RC_TEST_FAIL BIT(16) +#define RAW_DATA_VALID BIT(7) + +#define TRNG_RAW_DATA_OUT 0x828 + +#define TRNG_CNT_TRANS_VALID 0x80 +#define BUSY_LOOP_SLEEP 10 +#define BUSY_LOOP_TIMEOUT (BUSY_LOOP_SLEEP * 10000) + +struct airoha_trng { + void __iomem *base; + struct hwrng rng; + struct device *dev; + + struct completion rng_op_done; +}; + +static int airoha_trng_irq_mask(struct airoha_trng *trng) +{ + u32 val; + + val = readl(trng->base + TRNG_INTR_EN); + val |= INTR_MASK; + writel(val, trng->base + TRNG_INTR_EN); + + return 0; +} + +static int airoha_trng_irq_unmask(struct airoha_trng *trng) +{ + u32 val; + + val = readl(trng->base + TRNG_INTR_EN); + val &= ~INTR_MASK; + writel(val, trng->base + TRNG_INTR_EN); + + return 0; +} + +static int airoha_trng_init(struct hwrng *rng) +{ + struct airoha_trng *trng = container_of(rng, struct airoha_trng, rng); + int ret; + u32 val; + + val = readl(trng->base + TRNG_NS_SEK_AND_DAT_EN); + val |= RNG_EN; + writel(val, trng->base + TRNG_NS_SEK_AND_DAT_EN); + + /* Set out of SW Reset */ + airoha_trng_irq_unmask(trng); + writel(0, trng->base + TRNG_HEALTH_TEST_SW_RST); + + ret = wait_for_completion_timeout(&trng->rng_op_done, BUSY_LOOP_TIMEOUT); + if (ret <= 0) { + dev_err(trng->dev, "Timeout waiting for Health Check\n"); + airoha_trng_irq_mask(trng); + return -ENODEV; + } + + /* Check if Health Test Failed */ + val = readl(trng->base + TRNG_HEALTH_TEST_STATUS); + if (val & (RST_STARTUP_AP_TEST_FAIL | RST_STARTUP_RC_TEST_FAIL)) { + dev_err(trng->dev, "Health Check fail: %s test fail\n", + val & RST_STARTUP_AP_TEST_FAIL ? "AP" : "RC"); + return -ENODEV; + } + + /* Check if IP is ready */ + ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, + val & SAMPLE_RDY, 10, 1000); + if (ret < 0) { + dev_err(trng->dev, "Timeout waiting for IP ready"); + return -ENODEV; + } + + /* CNT_TRANS must be 0x80 for IP to be considered ready */ + ret = readl_poll_timeout(trng->base + TRNG_IP_RDY, val, + FIELD_GET(CNT_TRANS, val) == TRNG_CNT_TRANS_VALID, + 10, 1000); + if (ret < 0) { + dev_err(trng->dev, "Timeout waiting for IP ready"); + return -ENODEV; + } + + return 0; +} + +static void airoha_trng_cleanup(struct hwrng *rng) +{ + struct airoha_trng *trng = container_of(rng, struct airoha_trng, rng); + u32 val; + + val = readl(trng->base + TRNG_NS_SEK_AND_DAT_EN); + val &= ~RNG_EN; + writel(val, trng->base + TRNG_NS_SEK_AND_DAT_EN); + + /* Put it in SW Reset */ + writel(SW_RST, trng->base + TRNG_HEALTH_TEST_SW_RST); +} + +static int airoha_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait) +{ + struct airoha_trng *trng = container_of(rng, struct airoha_trng, rng); + u32 *data = buf; + u32 status; + int ret; + + ret = readl_poll_timeout(trng->base + TRNG_HEALTH_TEST_STATUS, status, + status & RAW_DATA_VALID, 10, 1000); + if (ret < 0) { + dev_err(trng->dev, "Timeout waiting for TRNG RAW Data valid\n"); + return ret; + } + + *data = readl(trng->base + TRNG_RAW_DATA_OUT); + + return 4; +} + +static irqreturn_t airoha_trng_irq(int irq, void *priv) +{ + struct airoha_trng *trng = (struct airoha_trng *)priv; + + airoha_trng_irq_mask(trng); + /* Just complete the task, we will read the value later */ + complete(&trng->rng_op_done); + + return IRQ_HANDLED; +} + +static int airoha_trng_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct airoha_trng *trng; + int irq, ret; + u32 val; + + trng = devm_kzalloc(dev, sizeof(*trng), GFP_KERNEL); + if (!trng) + return -ENOMEM; + + trng->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(trng->base)) + return PTR_ERR(trng->base); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + airoha_trng_irq_mask(trng); + ret = devm_request_irq(&pdev->dev, irq, airoha_trng_irq, 0, + pdev->name, (void *)trng); + if (ret) { + dev_err(dev, "Can't get interrupt working.\n"); + return ret; + } + + init_completion(&trng->rng_op_done); + + /* Enable interrupt for SW reset Health Check */ + val = readl(trng->base + TRNG_INTR_EN); + val |= RST_STARTUP_INITR_EN; + writel(val, trng->base + TRNG_INTR_EN); + + /* Set output to raw data */ + val = readl(trng->base + TRNG_NS_SEK_AND_DAT_EN); + val |= RAW_DATA_EN; + writel(val, trng->base + TRNG_NS_SEK_AND_DAT_EN); + + /* Put it in SW Reset */ + writel(SW_RST, trng->base + TRNG_HEALTH_TEST_SW_RST); + + trng->dev = dev; + trng->rng.name = pdev->name; + trng->rng.init = airoha_trng_init; + trng->rng.cleanup = airoha_trng_cleanup; + trng->rng.read = airoha_trng_read; + + ret = devm_hwrng_register(dev, &trng->rng); + if (ret) { + dev_err(dev, "failed to register rng device: %d\n", ret); + return ret; + } + + return 0; +} + +static const struct of_device_id airoha_trng_of_match[] = { + { .compatible = "airoha,en7581-trng", }, + {}, +}; +MODULE_DEVICE_TABLE(of, airoha_trng_of_match); + +static struct platform_driver airoha_trng_driver = { + .driver = { + .name = "airoha-trng", + .of_match_table = airoha_trng_of_match, + }, + .probe = airoha_trng_probe, +}; + +module_platform_driver(airoha_trng_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Christian Marangi <ansuelsmth@gmail.com>"); +MODULE_DESCRIPTION("Airoha True Random Number Generator driver");
Add support for Airoha TRNG. The Airoha SoC provide a True RNG module that can output 4 bytes of raw data at times. The module makes use of various noise source to provide True Random Number Generation. On probe the module is reset to operate Health Test and verify correct execution of it. The module can also provide DRBG function but the execution mode is mutually exclusive, running as TRNG doesn't permit to also run it as DRBG. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> --- drivers/char/hw_random/Kconfig | 13 ++ drivers/char/hw_random/Makefile | 1 + drivers/char/hw_random/airoha-trng.c | 243 +++++++++++++++++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 drivers/char/hw_random/airoha-trng.c