* [PATCH v2 0/3] True RNG driver for Samsung Exynos 5250+ SoCs [not found] <CGME20171127095808eucas1p22ded3526ec44c8b9edf3e4480a811820@eucas1p2.samsung.com> @ 2017-11-27 9:58 ` Łukasz Stelmach [not found] ` <CGME20171127095809eucas1p2988d8c9f37b995b08fb5ae694cf020a2@eucas1p2.samsung.com> ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Łukasz Stelmach @ 2017-11-27 9:58 UTC (permalink / raw) To: Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring, Matt Mackall, Herbert Xu, Krzysztof Kozlowski, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-crypto-u79uwXL29TY76Z2rM5mHXA, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA Cc: Łukasz Stelmach, Marek Szyprowski, Bartlomiej Zolnierkiewicz Hello. The following patches add support for the true random number generator found in Samsung Exynos 5250+ SoCs. Patch #1 adds documentation for devicetree bindings. Patch #2 introduces the driver and appropriate changes in Makefile and Kconfig. Patch #3 adds nodes in devicetree files for Exynos SoCs. Changes in v2: - Fixed indentation in drivers/char/hw_random/Kconfig. - Defined TRNG_CTRL_RGNEN. - Removed global variable exynos_trng_dev. - Removed exynos_trng_{set,get}_reg() functions. - Used the min_t() macro instead of the ternary operator in exynos_trng_do_read(). - Moved trng initialisation to the variable declaration in exynos_trng_init(). - Fixed comment formating. - Removed unnecessary "TODO" comments. - Return ENOMEM, if devm_kzalloc() devm_kstrdup() fail. - Rephrased and unified error messages in exynos_trng_probe(). - Removed nullification of trng->mem. - Added err_pm_get label at the end of exynos_trng_probe(). - Removed double error message at the end of exynos_trng_probe(). - Implemented exynos_trng_remove(). Thank you, Krzysztof Kozlowski, Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring. v1 can be found: https://www.spinics.net/lists/linux-samsung-soc/msg61253.html https://patchwork.kernel.org/patch/10072967/ https://patchwork.kernel.org/patch/10072971/ https://patchwork.kernel.org/patch/10072963/ Łukasz Stelmach (3): dt-bindings: hwrng: Add Samsung Exynos 5250+ True RNG bindings hwrng: exynos - add Samsung Exynos True RNG driver ARM: dts: exynos: Add nodes for True Random Number Generator .../bindings/rng/samsung,exynos5250-trng.txt | 17 ++ MAINTAINERS | 7 + arch/arm/boot/dts/exynos5.dtsi | 5 + arch/arm/boot/dts/exynos5250.dtsi | 5 + arch/arm/boot/dts/exynos5410.dtsi | 5 + arch/arm/boot/dts/exynos5420.dtsi | 5 + drivers/char/hw_random/Kconfig | 12 + drivers/char/hw_random/Makefile | 1 + drivers/char/hw_random/exynos-trng.c | 245 +++++++++++++++++++++ 9 files changed, 302 insertions(+) create mode 100644 Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt create mode 100644 drivers/char/hw_random/exynos-trng.c -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <CGME20171127095809eucas1p2988d8c9f37b995b08fb5ae694cf020a2@eucas1p2.samsung.com>]
[parent not found: <20171127095804.7128-1-l.stelmach-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>]
* [PATCH v2 1/3] dt-bindings: hwrng: Add Samsung Exynos 5250+ True RNG bindings [not found] ` <20171127095804.7128-1-l.stelmach-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> @ 2017-11-27 9:58 ` Łukasz Stelmach 2017-11-27 10:45 ` Krzysztof Kozlowski 0 siblings, 1 reply; 7+ messages in thread From: Łukasz Stelmach @ 2017-11-27 9:58 UTC (permalink / raw) To: Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring, Matt Mackall, Herbert Xu, Krzysztof Kozlowski, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-crypto-u79uwXL29TY76Z2rM5mHXA, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA Cc: Łukasz Stelmach, Marek Szyprowski, Bartlomiej Zolnierkiewicz Add binding documentation for the True Random Number Generator found on Samsung Exynos 5250+ SoCs. Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Reviewed-by: Krzysztof Kozlowski <krzk-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Signed-off-by: Łukasz Stelmach <l.stelmach-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- .../devicetree/bindings/rng/samsung,exynos5250-trng.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt diff --git a/Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt b/Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt new file mode 100644 index 000000000000..22dfe8cb21c0 --- /dev/null +++ b/Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt @@ -0,0 +1,17 @@ +Exynos True Random Number Generator + +Required properties: + +- compatible : Should be "samsung,exynos5250-trng". +- reg : Specifies base physical address and size of the registers map. +- clocks : Phandle to clock-controller plus clock-specifier pair. +- clock-names : "secss" as a clock name. + +Example: + + trng@10830600 { + compatible = "samsung,exynos5250-trng"; + reg = <0x10830600 0x100>; + clocks = <&clock CLK_SSS>; + clock-names = "secss"; + }; -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/3] dt-bindings: hwrng: Add Samsung Exynos 5250+ True RNG bindings 2017-11-27 9:58 ` [PATCH v2 1/3] dt-bindings: hwrng: Add Samsung Exynos 5250+ True RNG bindings Łukasz Stelmach @ 2017-11-27 10:45 ` Krzysztof Kozlowski 0 siblings, 0 replies; 7+ messages in thread From: Krzysztof Kozlowski @ 2017-11-27 10:45 UTC (permalink / raw) To: Łukasz Stelmach Cc: Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring, Matt Mackall, Herbert Xu, devicetree, linux-crypto, linux-samsung-soc, linux-kernel, Marek Szyprowski, Bartlomiej Zolnierkiewicz On Mon, Nov 27, 2017 at 10:58 AM, Łukasz Stelmach <l.stelmach@samsung.com> wrote: > Add binding documentation for the True Random Number Generator > found on Samsung Exynos 5250+ SoCs. > > Acked-by: Rob Herring <robh@kernel.org> > Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> > Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com> A minor nit: add new tags after your Signed-off-by, in same order you received them. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <CGME20171127095809eucas1p27b7d5c44c564bb553342f5fab40d0bac@eucas1p2.samsung.com>]
* [PATCH v2 2/3] hwrng: exynos - add Samsung Exynos True RNG driver [not found] ` <CGME20171127095809eucas1p27b7d5c44c564bb553342f5fab40d0bac@eucas1p2.samsung.com> @ 2017-11-27 9:58 ` Łukasz Stelmach 2017-11-27 10:49 ` Krzysztof Kozlowski 2017-12-06 3:10 ` PrasannaKumar Muralidharan 0 siblings, 2 replies; 7+ messages in thread From: Łukasz Stelmach @ 2017-11-27 9:58 UTC (permalink / raw) To: Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring, Matt Mackall, Herbert Xu, Krzysztof Kozlowski, devicetree, linux-crypto, linux-samsung-soc, linux-kernel Cc: Łukasz Stelmach, Marek Szyprowski, Bartlomiej Zolnierkiewicz Add support for True Random Number Generator found in Samsung Exynos 5250+ SoCs. Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com> --- MAINTAINERS | 7 + drivers/char/hw_random/Kconfig | 12 ++ drivers/char/hw_random/Makefile | 1 + drivers/char/hw_random/exynos-trng.c | 245 +++++++++++++++++++++++++++++++++++ 4 files changed, 265 insertions(+) create mode 100644 drivers/char/hw_random/exynos-trng.c diff --git a/MAINTAINERS b/MAINTAINERS index 2811a211632c..992074cca612 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -11780,6 +11780,13 @@ S: Maintained F: drivers/crypto/exynos-rng.c F: Documentation/devicetree/bindings/rng/samsung,exynos-rng4.txt +SAMSUNG EXYNOS TRUE RANDOM NUMBER GENERATOR (TRNG) DRIVER +M: Łukasz Stelmach <l.stelmach@samsung.com> +L: linux-samsung-soc@vger.kernel.org +S: Maintained +F: drivers/char/hw_random/exynos-trng.c +F: Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt + SAMSUNG FRAMEBUFFER DRIVER M: Jingoo Han <jingoohan1@gmail.com> L: linux-fbdev@vger.kernel.org diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 95a031e9eced..292e6b36d493 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig @@ -449,6 +449,18 @@ config HW_RANDOM_S390 If unsure, say Y. +config HW_RANDOM_EXYNOS + tristate "Samsung Exynos True Random Number Generator support" + depends on ARCH_EXYNOS || COMPILE_TEST + default HW_RANDOM + ---help--- + This driver provides support for the True Random Number + Generator available in Exynos SoCs. + + To compile this driver as a module, choose M here: the module + will be called exynos-trng. + + If unsure, say Y. endif # HW_RANDOM config UML_RANDOM diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index f3728d008fff..5595df97da7a 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile @@ -14,6 +14,7 @@ obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o obj-$(CONFIG_HW_RANDOM_N2RNG) += n2-rng.o n2-rng-y := n2-drv.o n2-asm.o obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o +obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-trng.o obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o diff --git a/drivers/char/hw_random/exynos-trng.c b/drivers/char/hw_random/exynos-trng.c new file mode 100644 index 000000000000..91b2ddb249fa --- /dev/null +++ b/drivers/char/hw_random/exynos-trng.c @@ -0,0 +1,245 @@ +/* + * RNG driver for Exynos TRNGs + * + * Author: Łukasz Stelmach <l.stelmach@samsung.com> + * + * Copyright 2017 (c) Samsung Electronics Software, Inc. + * + * Based on the Exynos PRNG driver drivers/crypto/exynos-rng by + * Krzysztof Kozłowski <krzk@kernel.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/clk.h> +#include <linux/crypto.h> +#include <linux/delay.h> +#include <linux/err.h> +#include <linux/hw_random.h> +#include <linux/io.h> +#include <linux/iopoll.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> + +#define EXYNOS_TRNG_CLKDIV (0x0) +#define EXYNOS_TRNG_CTRL (0x20) +#define EXYNOS_TRNG_POST_CTRL (0x30) +#define EXYNOS_TRNG_ONLINE_CTRL (0x40) +#define EXYNOS_TRNG_ONLINE_STAT (0x44) +#define EXYNOS_TRNG_ONLINE_MAXCHI2 (0x48) +#define EXYNOS_TRNG_FIFO_CTRL (0x50) +#define EXYNOS_TRNG_FIFO_0 (0x80) +#define EXYNOS_TRNG_FIFO_1 (0x84) +#define EXYNOS_TRNG_FIFO_2 (0x88) +#define EXYNOS_TRNG_FIFO_3 (0x8c) +#define EXYNOS_TRNG_FIFO_4 (0x90) +#define EXYNOS_TRNG_FIFO_5 (0x94) +#define EXYNOS_TRNG_FIFO_6 (0x98) +#define EXYNOS_TRNG_FIFO_7 (0x9c) +#define EXYNOS_TRNG_FIFO_LEN (8) +#define EXYNOS_TRNG_CLOCK_RATE (500000) + +#define TRNG_CTRL_RGNEN BIT(31) + +struct exynos_trng_dev { + struct device *dev; + void __iomem *mem; + struct clk *clk; + struct hwrng rng; +}; + +static int exynos_trng_do_read(struct hwrng *rng, void *data, size_t max, + bool wait) +{ + struct exynos_trng_dev *trng; + u32 val; + + max = min_t(size_t, max, (EXYNOS_TRNG_FIFO_LEN * 4)); + + trng = (struct exynos_trng_dev *)rng->priv; + + __raw_writel(max * 8, trng->mem + EXYNOS_TRNG_FIFO_CTRL); + val = readl_poll_timeout(trng->mem + EXYNOS_TRNG_FIFO_CTRL, val, + val == 0, 200, 1000000); + if (val < 0) + return val; + + memcpy_fromio(data, trng->mem + EXYNOS_TRNG_FIFO_0, max); + + return max; +} + +static int exynos_trng_init(struct hwrng *rng) +{ + struct exynos_trng_dev *trng = (struct exynos_trng_dev *)rng->priv; + unsigned long sss_rate; + u32 val; + + sss_rate = clk_get_rate(trng->clk); + + /* + * For most TRNG circuits the clock frequency of under 500 kHz + * is safe. + */ + val = sss_rate / (EXYNOS_TRNG_CLOCK_RATE * 2); + if (val > 0x7fff) { + dev_err(trng->dev, "clock divider too large: %d", val); + return -ERANGE; + } + val = val << 1; + __raw_writel(val, trng->mem + EXYNOS_TRNG_CLKDIV); + + /* Enable the generator. */ + val = TRNG_CTRL_RGNEN; + __raw_writel(val, trng->mem + EXYNOS_TRNG_CTRL); + + /* + * Disable post-processing. /dev/hwrng is supposed to deliver + * unprocessed data. + */ + __raw_writel(0, trng->mem + EXYNOS_TRNG_POST_CTRL); + + return 0; +} + +static int exynos_trng_probe(struct platform_device *pdev) +{ + struct exynos_trng_dev *trng; + struct resource *res; + int ret = -ENOMEM; + + trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL); + if (!trng) + return ret; + + trng->rng.name = devm_kstrdup(&pdev->dev, dev_name(&pdev->dev), + GFP_KERNEL); + if (!trng->rng.name) + return ret; + + trng->rng.init = exynos_trng_init; + trng->rng.read = exynos_trng_do_read; + trng->rng.priv = (unsigned long) trng; + + platform_set_drvdata(pdev, trng); + trng->dev = &pdev->dev; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + trng->mem = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(trng->mem)) { + ret = PTR_ERR(trng->mem); + dev_err(&pdev->dev, "Could not map IO resources.\n"); + goto err_ioremap; + } + + pm_runtime_enable(&pdev->dev); + ret = pm_runtime_get_sync(&pdev->dev); + if (ret < 0) { + dev_err(&pdev->dev, "Could not get runtime PM.\n"); + goto err_pm_get; + } + + trng->clk = devm_clk_get(&pdev->dev, "secss"); + if (IS_ERR(trng->clk)) { + ret = PTR_ERR(trng->clk); + dev_err(&pdev->dev, "Could not get clock.\n"); + goto err_clock; + } + + ret = clk_prepare_enable(trng->clk); + if (ret) { + dev_err(&pdev->dev, "Could not enable the clk.\n"); + goto err_clock; + } + + ret = hwrng_register(&trng->rng); + if (ret) { + dev_err(&pdev->dev, "Could not register hwrng device.\n"); + goto err_register; + } + + dev_info(&pdev->dev, "Exynos True Random Number Generator.\n"); + + return 0; + +err_register: + clk_disable_unprepare(trng->clk); + +err_clock: + pm_runtime_put_sync(&pdev->dev); + +err_pm_get: + pm_runtime_disable(&pdev->dev); + +err_ioremap: + return ret; +} + +static int exynos_trng_remove(struct platform_device *pdev) +{ + struct exynos_trng_dev *trng = platform_get_drvdata(pdev); + + hwrng_unregister(&trng->rng); + clk_disable_unprepare(trng->clk); + + pm_runtime_put_sync(&pdev->dev); + pm_runtime_disable(&pdev->dev); + + return 0; +} + +static int __maybe_unused exynos_trng_suspend(struct device *dev) +{ + pm_runtime_put_sync(dev); + + return 0; +} + +static int __maybe_unused exynos_trng_resume(struct device *dev) +{ + int ret; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) { + dev_err(dev, "Could not get runtime PM.\n"); + pm_runtime_put_noidle(dev); + return ret; + } + + return 0; +} + +static SIMPLE_DEV_PM_OPS(exynos_trng_pm_ops, exynos_trng_suspend, + exynos_trng_resume); + +static const struct of_device_id exynos_trng_dt_match[] = { + { + .compatible = "samsung,exynos5250-trng", + }, + { }, +}; +MODULE_DEVICE_TABLE(of, exynos_rng_dt_match); + +static struct platform_driver exynos_trng_driver = { + .driver = { + .name = "exynos-trng", + .pm = &exynos_trng_pm_ops, + .of_match_table = exynos_trng_dt_match, + }, + .probe = exynos_trng_probe, + .remove = exynos_trng_remove, +}; + +module_platform_driver(exynos_trng_driver); +MODULE_AUTHOR("Łukasz Stelmach"); +MODULE_DESCRIPTION("H/W TRNG driver for Exynos chips"); +MODULE_LICENSE("GPL"); -- 2.11.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/3] hwrng: exynos - add Samsung Exynos True RNG driver 2017-11-27 9:58 ` [PATCH v2 2/3] hwrng: exynos - add Samsung Exynos True RNG driver Łukasz Stelmach @ 2017-11-27 10:49 ` Krzysztof Kozlowski 2017-12-06 3:10 ` PrasannaKumar Muralidharan 1 sibling, 0 replies; 7+ messages in thread From: Krzysztof Kozlowski @ 2017-11-27 10:49 UTC (permalink / raw) To: Łukasz Stelmach Cc: Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring, Matt Mackall, Herbert Xu, devicetree, linux-crypto, linux-samsung-soc, linux-kernel, Marek Szyprowski, Bartlomiej Zolnierkiewicz On Mon, Nov 27, 2017 at 10:58 AM, Łukasz Stelmach <l.stelmach@samsung.com> wrote: > Add support for True Random Number Generator found in Samsung Exynos > 5250+ SoCs. > > Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com> > --- > MAINTAINERS | 7 + > drivers/char/hw_random/Kconfig | 12 ++ > drivers/char/hw_random/Makefile | 1 + > drivers/char/hw_random/exynos-trng.c | 245 +++++++++++++++++++++++++++++++++++ > 4 files changed, 265 insertions(+) > create mode 100644 drivers/char/hw_random/exynos-trng.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 2811a211632c..992074cca612 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -11780,6 +11780,13 @@ S: Maintained > F: drivers/crypto/exynos-rng.c > F: Documentation/devicetree/bindings/rng/samsung,exynos-rng4.txt > > +SAMSUNG EXYNOS TRUE RANDOM NUMBER GENERATOR (TRNG) DRIVER > +M: Łukasz Stelmach <l.stelmach@samsung.com> > +L: linux-samsung-soc@vger.kernel.org > +S: Maintained > +F: drivers/char/hw_random/exynos-trng.c > +F: Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt > + > SAMSUNG FRAMEBUFFER DRIVER > M: Jingoo Han <jingoohan1@gmail.com> > L: linux-fbdev@vger.kernel.org > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > index 95a031e9eced..292e6b36d493 100644 > --- a/drivers/char/hw_random/Kconfig > +++ b/drivers/char/hw_random/Kconfig > @@ -449,6 +449,18 @@ config HW_RANDOM_S390 > > If unsure, say Y. > > +config HW_RANDOM_EXYNOS > + tristate "Samsung Exynos True Random Number Generator support" > + depends on ARCH_EXYNOS || COMPILE_TEST > + default HW_RANDOM > + ---help--- > + This driver provides support for the True Random Number > + Generator available in Exynos SoCs. > + > + To compile this driver as a module, choose M here: the module > + will be called exynos-trng. > + > + If unsure, say Y. > endif # HW_RANDOM > > config UML_RANDOM > diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile > index f3728d008fff..5595df97da7a 100644 > --- a/drivers/char/hw_random/Makefile > +++ b/drivers/char/hw_random/Makefile > @@ -14,6 +14,7 @@ obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o > obj-$(CONFIG_HW_RANDOM_N2RNG) += n2-rng.o > n2-rng-y := n2-drv.o n2-asm.o > obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o > +obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-trng.o > obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o > obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o > obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o > diff --git a/drivers/char/hw_random/exynos-trng.c b/drivers/char/hw_random/exynos-trng.c > new file mode 100644 > index 000000000000..91b2ddb249fa > --- /dev/null > +++ b/drivers/char/hw_random/exynos-trng.c > @@ -0,0 +1,245 @@ > +/* > + * RNG driver for Exynos TRNGs > + * > + * Author: Łukasz Stelmach <l.stelmach@samsung.com> > + * > + * Copyright 2017 (c) Samsung Electronics Software, Inc. > + * > + * Based on the Exynos PRNG driver drivers/crypto/exynos-rng by > + * Krzysztof Kozłowski <krzk@kernel.org> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <linux/clk.h> > +#include <linux/crypto.h> > +#include <linux/delay.h> > +#include <linux/err.h> > +#include <linux/hw_random.h> > +#include <linux/io.h> > +#include <linux/iopoll.h> > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > +#include <linux/pm_runtime.h> > + > +#define EXYNOS_TRNG_CLKDIV (0x0) > +#define EXYNOS_TRNG_CTRL (0x20) > +#define EXYNOS_TRNG_POST_CTRL (0x30) > +#define EXYNOS_TRNG_ONLINE_CTRL (0x40) > +#define EXYNOS_TRNG_ONLINE_STAT (0x44) > +#define EXYNOS_TRNG_ONLINE_MAXCHI2 (0x48) > +#define EXYNOS_TRNG_FIFO_CTRL (0x50) > +#define EXYNOS_TRNG_FIFO_0 (0x80) > +#define EXYNOS_TRNG_FIFO_1 (0x84) > +#define EXYNOS_TRNG_FIFO_2 (0x88) > +#define EXYNOS_TRNG_FIFO_3 (0x8c) > +#define EXYNOS_TRNG_FIFO_4 (0x90) > +#define EXYNOS_TRNG_FIFO_5 (0x94) > +#define EXYNOS_TRNG_FIFO_6 (0x98) > +#define EXYNOS_TRNG_FIFO_7 (0x9c) > +#define EXYNOS_TRNG_FIFO_LEN (8) > +#define EXYNOS_TRNG_CLOCK_RATE (500000) > + > +#define TRNG_CTRL_RGNEN BIT(31) Add a EXYNOS prefix and please put it after the register where it is used (CTRL). > + > +struct exynos_trng_dev { > + struct device *dev; > + void __iomem *mem; > + struct clk *clk; > + struct hwrng rng; > +}; > + > +static int exynos_trng_do_read(struct hwrng *rng, void *data, size_t max, > + bool wait) > +{ > + struct exynos_trng_dev *trng; > + u32 val; > + > + max = min_t(size_t, max, (EXYNOS_TRNG_FIFO_LEN * 4)); > + > + trng = (struct exynos_trng_dev *)rng->priv; > + > + __raw_writel(max * 8, trng->mem + EXYNOS_TRNG_FIFO_CTRL); > + val = readl_poll_timeout(trng->mem + EXYNOS_TRNG_FIFO_CTRL, val, > + val == 0, 200, 1000000); > + if (val < 0) > + return val; > + > + memcpy_fromio(data, trng->mem + EXYNOS_TRNG_FIFO_0, max); > + > + return max; > +} > + > +static int exynos_trng_init(struct hwrng *rng) > +{ > + struct exynos_trng_dev *trng = (struct exynos_trng_dev *)rng->priv; > + unsigned long sss_rate; > + u32 val; > + > + sss_rate = clk_get_rate(trng->clk); > + > + /* > + * For most TRNG circuits the clock frequency of under 500 kHz > + * is safe. > + */ > + val = sss_rate / (EXYNOS_TRNG_CLOCK_RATE * 2); > + if (val > 0x7fff) { > + dev_err(trng->dev, "clock divider too large: %d", val); > + return -ERANGE; > + } > + val = val << 1; > + __raw_writel(val, trng->mem + EXYNOS_TRNG_CLKDIV); > + > + /* Enable the generator. */ > + val = TRNG_CTRL_RGNEN; > + __raw_writel(val, trng->mem + EXYNOS_TRNG_CTRL); > + > + /* > + * Disable post-processing. /dev/hwrng is supposed to deliver > + * unprocessed data. > + */ > + __raw_writel(0, trng->mem + EXYNOS_TRNG_POST_CTRL); > + > + return 0; > +} > + > +static int exynos_trng_probe(struct platform_device *pdev) > +{ > + struct exynos_trng_dev *trng; > + struct resource *res; > + int ret = -ENOMEM; > + > + trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL); > + if (!trng) > + return ret; > + > + trng->rng.name = devm_kstrdup(&pdev->dev, dev_name(&pdev->dev), > + GFP_KERNEL); > + if (!trng->rng.name) > + return ret; > + > + trng->rng.init = exynos_trng_init; > + trng->rng.read = exynos_trng_do_read; > + trng->rng.priv = (unsigned long) trng; > + > + platform_set_drvdata(pdev, trng); > + trng->dev = &pdev->dev; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + trng->mem = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(trng->mem)) { > + ret = PTR_ERR(trng->mem); > + dev_err(&pdev->dev, "Could not map IO resources.\n"); > + goto err_ioremap; Just return PTR_ERR(trng->mem)? Less lines and goto labels. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/3] hwrng: exynos - add Samsung Exynos True RNG driver 2017-11-27 9:58 ` [PATCH v2 2/3] hwrng: exynos - add Samsung Exynos True RNG driver Łukasz Stelmach 2017-11-27 10:49 ` Krzysztof Kozlowski @ 2017-12-06 3:10 ` PrasannaKumar Muralidharan 1 sibling, 0 replies; 7+ messages in thread From: PrasannaKumar Muralidharan @ 2017-12-06 3:10 UTC (permalink / raw) To: Łukasz Stelmach Cc: Andrew F. Davis, Rob Herring, Matt Mackall, Herbert Xu, Krzysztof Kozlowski, devicetree, open list:HARDWARE RANDOM NUMBER GENERATOR CORE, linux-samsung-soc, open list, Marek Szyprowski, Bartlomiej Zolnierkiewicz Hi Lukasz, On 27 November 2017 at 15:28, Łukasz Stelmach <l.stelmach@samsung.com> wrote: > Add support for True Random Number Generator found in Samsung Exynos > 5250+ SoCs. > > Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com> > --- > MAINTAINERS | 7 + > drivers/char/hw_random/Kconfig | 12 ++ > drivers/char/hw_random/Makefile | 1 + > drivers/char/hw_random/exynos-trng.c | 245 +++++++++++++++++++++++++++++++++++ > 4 files changed, 265 insertions(+) > create mode 100644 drivers/char/hw_random/exynos-trng.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 2811a211632c..992074cca612 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -11780,6 +11780,13 @@ S: Maintained > F: drivers/crypto/exynos-rng.c > F: Documentation/devicetree/bindings/rng/samsung,exynos-rng4.txt > > +SAMSUNG EXYNOS TRUE RANDOM NUMBER GENERATOR (TRNG) DRIVER > +M: Łukasz Stelmach <l.stelmach@samsung.com> > +L: linux-samsung-soc@vger.kernel.org > +S: Maintained > +F: drivers/char/hw_random/exynos-trng.c > +F: Documentation/devicetree/bindings/rng/samsung,exynos5250-trng.txt > + > SAMSUNG FRAMEBUFFER DRIVER > M: Jingoo Han <jingoohan1@gmail.com> > L: linux-fbdev@vger.kernel.org > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > index 95a031e9eced..292e6b36d493 100644 > --- a/drivers/char/hw_random/Kconfig > +++ b/drivers/char/hw_random/Kconfig > @@ -449,6 +449,18 @@ config HW_RANDOM_S390 > > If unsure, say Y. > > +config HW_RANDOM_EXYNOS > + tristate "Samsung Exynos True Random Number Generator support" > + depends on ARCH_EXYNOS || COMPILE_TEST > + default HW_RANDOM > + ---help--- > + This driver provides support for the True Random Number > + Generator available in Exynos SoCs. > + > + To compile this driver as a module, choose M here: the module > + will be called exynos-trng. > + > + If unsure, say Y. > endif # HW_RANDOM > > config UML_RANDOM > diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile > index f3728d008fff..5595df97da7a 100644 > --- a/drivers/char/hw_random/Makefile > +++ b/drivers/char/hw_random/Makefile > @@ -14,6 +14,7 @@ obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o > obj-$(CONFIG_HW_RANDOM_N2RNG) += n2-rng.o > n2-rng-y := n2-drv.o n2-asm.o > obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o > +obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-trng.o > obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o > obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o > obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o > diff --git a/drivers/char/hw_random/exynos-trng.c b/drivers/char/hw_random/exynos-trng.c > new file mode 100644 > index 000000000000..91b2ddb249fa > --- /dev/null > +++ b/drivers/char/hw_random/exynos-trng.c > @@ -0,0 +1,245 @@ > +/* > + * RNG driver for Exynos TRNGs > + * > + * Author: Łukasz Stelmach <l.stelmach@samsung.com> > + * > + * Copyright 2017 (c) Samsung Electronics Software, Inc. > + * > + * Based on the Exynos PRNG driver drivers/crypto/exynos-rng by > + * Krzysztof Kozłowski <krzk@kernel.org> > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <linux/clk.h> > +#include <linux/crypto.h> > +#include <linux/delay.h> > +#include <linux/err.h> > +#include <linux/hw_random.h> > +#include <linux/io.h> > +#include <linux/iopoll.h> > +#include <linux/kernel.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > +#include <linux/pm_runtime.h> > + > +#define EXYNOS_TRNG_CLKDIV (0x0) > +#define EXYNOS_TRNG_CTRL (0x20) > +#define EXYNOS_TRNG_POST_CTRL (0x30) > +#define EXYNOS_TRNG_ONLINE_CTRL (0x40) > +#define EXYNOS_TRNG_ONLINE_STAT (0x44) > +#define EXYNOS_TRNG_ONLINE_MAXCHI2 (0x48) > +#define EXYNOS_TRNG_FIFO_CTRL (0x50) > +#define EXYNOS_TRNG_FIFO_0 (0x80) > +#define EXYNOS_TRNG_FIFO_1 (0x84) > +#define EXYNOS_TRNG_FIFO_2 (0x88) > +#define EXYNOS_TRNG_FIFO_3 (0x8c) > +#define EXYNOS_TRNG_FIFO_4 (0x90) > +#define EXYNOS_TRNG_FIFO_5 (0x94) > +#define EXYNOS_TRNG_FIFO_6 (0x98) > +#define EXYNOS_TRNG_FIFO_7 (0x9c) > +#define EXYNOS_TRNG_FIFO_LEN (8) > +#define EXYNOS_TRNG_CLOCK_RATE (500000) > + > +#define TRNG_CTRL_RGNEN BIT(31) > + > +struct exynos_trng_dev { > + struct device *dev; > + void __iomem *mem; > + struct clk *clk; > + struct hwrng rng; > +}; > + > +static int exynos_trng_do_read(struct hwrng *rng, void *data, size_t max, > + bool wait) > +{ > + struct exynos_trng_dev *trng; > + u32 val; > + > + max = min_t(size_t, max, (EXYNOS_TRNG_FIFO_LEN * 4)); > + > + trng = (struct exynos_trng_dev *)rng->priv; > + > + __raw_writel(max * 8, trng->mem + EXYNOS_TRNG_FIFO_CTRL); > + val = readl_poll_timeout(trng->mem + EXYNOS_TRNG_FIFO_CTRL, val, > + val == 0, 200, 1000000); > + if (val < 0) > + return val; > + > + memcpy_fromio(data, trng->mem + EXYNOS_TRNG_FIFO_0, max); > + > + return max; > +} > + > +static int exynos_trng_init(struct hwrng *rng) > +{ > + struct exynos_trng_dev *trng = (struct exynos_trng_dev *)rng->priv; > + unsigned long sss_rate; > + u32 val; > + > + sss_rate = clk_get_rate(trng->clk); > + > + /* > + * For most TRNG circuits the clock frequency of under 500 kHz > + * is safe. > + */ > + val = sss_rate / (EXYNOS_TRNG_CLOCK_RATE * 2); > + if (val > 0x7fff) { > + dev_err(trng->dev, "clock divider too large: %d", val); > + return -ERANGE; > + } > + val = val << 1; > + __raw_writel(val, trng->mem + EXYNOS_TRNG_CLKDIV); > + > + /* Enable the generator. */ > + val = TRNG_CTRL_RGNEN; > + __raw_writel(val, trng->mem + EXYNOS_TRNG_CTRL); > + > + /* > + * Disable post-processing. /dev/hwrng is supposed to deliver > + * unprocessed data. > + */ > + __raw_writel(0, trng->mem + EXYNOS_TRNG_POST_CTRL); > + > + return 0; > +} > + > +static int exynos_trng_probe(struct platform_device *pdev) > +{ > + struct exynos_trng_dev *trng; > + struct resource *res; > + int ret = -ENOMEM; > + > + trng = devm_kzalloc(&pdev->dev, sizeof(*trng), GFP_KERNEL); > + if (!trng) > + return ret; > + > + trng->rng.name = devm_kstrdup(&pdev->dev, dev_name(&pdev->dev), > + GFP_KERNEL); > + if (!trng->rng.name) > + return ret; > + > + trng->rng.init = exynos_trng_init; > + trng->rng.read = exynos_trng_do_read; > + trng->rng.priv = (unsigned long) trng; > + > + platform_set_drvdata(pdev, trng); > + trng->dev = &pdev->dev; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + trng->mem = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(trng->mem)) { > + ret = PTR_ERR(trng->mem); > + dev_err(&pdev->dev, "Could not map IO resources.\n"); > + goto err_ioremap; > + } > + > + pm_runtime_enable(&pdev->dev); > + ret = pm_runtime_get_sync(&pdev->dev); > + if (ret < 0) { > + dev_err(&pdev->dev, "Could not get runtime PM.\n"); > + goto err_pm_get; > + } > + > + trng->clk = devm_clk_get(&pdev->dev, "secss"); > + if (IS_ERR(trng->clk)) { > + ret = PTR_ERR(trng->clk); > + dev_err(&pdev->dev, "Could not get clock.\n"); > + goto err_clock; > + } > + > + ret = clk_prepare_enable(trng->clk); > + if (ret) { > + dev_err(&pdev->dev, "Could not enable the clk.\n"); > + goto err_clock; > + } > + > + ret = hwrng_register(&trng->rng); > + if (ret) { > + dev_err(&pdev->dev, "Could not register hwrng device.\n"); > + goto err_register; > + } > + > + dev_info(&pdev->dev, "Exynos True Random Number Generator.\n"); > + > + return 0; > + > +err_register: > + clk_disable_unprepare(trng->clk); > + > +err_clock: > + pm_runtime_put_sync(&pdev->dev); > + > +err_pm_get: > + pm_runtime_disable(&pdev->dev); > + > +err_ioremap: > + return ret; > +} > + > +static int exynos_trng_remove(struct platform_device *pdev) > +{ > + struct exynos_trng_dev *trng = platform_get_drvdata(pdev); > + > + hwrng_unregister(&trng->rng); > + clk_disable_unprepare(trng->clk); > + > + pm_runtime_put_sync(&pdev->dev); > + pm_runtime_disable(&pdev->dev); > + > + return 0; > +} > + > +static int __maybe_unused exynos_trng_suspend(struct device *dev) > +{ > + pm_runtime_put_sync(dev); > + > + return 0; > +} > + > +static int __maybe_unused exynos_trng_resume(struct device *dev) > +{ > + int ret; > + > + ret = pm_runtime_get_sync(dev); > + if (ret < 0) { > + dev_err(dev, "Could not get runtime PM.\n"); > + pm_runtime_put_noidle(dev); > + return ret; > + } > + > + return 0; > +} > + > +static SIMPLE_DEV_PM_OPS(exynos_trng_pm_ops, exynos_trng_suspend, > + exynos_trng_resume); > + > +static const struct of_device_id exynos_trng_dt_match[] = { > + { > + .compatible = "samsung,exynos5250-trng", > + }, > + { }, > +}; > +MODULE_DEVICE_TABLE(of, exynos_rng_dt_match); > + > +static struct platform_driver exynos_trng_driver = { > + .driver = { > + .name = "exynos-trng", > + .pm = &exynos_trng_pm_ops, > + .of_match_table = exynos_trng_dt_match, > + }, > + .probe = exynos_trng_probe, > + .remove = exynos_trng_remove, > +}; > + > +module_platform_driver(exynos_trng_driver); > +MODULE_AUTHOR("Łukasz Stelmach"); > +MODULE_DESCRIPTION("H/W TRNG driver for Exynos chips"); > +MODULE_LICENSE("GPL"); > -- > 2.11.0 > Reviewed-by: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com> Regards, PrasannaKumar ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <CGME20171127095810eucas1p2f580db5216f419551e4b530adcf9a41f@eucas1p2.samsung.com>]
* [PATCH v2 3/3] ARM: dts: exynos: Add nodes for True Random Number Generator [not found] ` <CGME20171127095810eucas1p2f580db5216f419551e4b530adcf9a41f@eucas1p2.samsung.com> @ 2017-11-27 9:58 ` Łukasz Stelmach 0 siblings, 0 replies; 7+ messages in thread From: Łukasz Stelmach @ 2017-11-27 9:58 UTC (permalink / raw) To: Andrew F. Davis, PrasannaKumar Muralidharan, Rob Herring, Matt Mackall, Herbert Xu, Krzysztof Kozlowski, devicetree, linux-crypto, linux-samsung-soc, linux-kernel Cc: Łukasz Stelmach, Marek Szyprowski, Bartlomiej Zolnierkiewicz Add nodes for the True Random Number Generator found in Samsung Exynos 5250+ SoCs. Signed-off-by: Łukasz Stelmach <l.stelmach@samsung.com> --- arch/arm/boot/dts/exynos5.dtsi | 5 +++++ arch/arm/boot/dts/exynos5250.dtsi | 5 +++++ arch/arm/boot/dts/exynos5410.dtsi | 5 +++++ arch/arm/boot/dts/exynos5420.dtsi | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi index 7da4a4285b24..6a298b536e1c 100644 --- a/arch/arm/boot/dts/exynos5.dtsi +++ b/arch/arm/boot/dts/exynos5.dtsi @@ -210,5 +210,10 @@ reg = <0x10830000 0x300>; interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>; }; + + trng: trng@10830600 { + compatible = "samsung,exynos5250-trng"; + reg = <0x10830600 0x100>; + }; }; }; diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 8032d7e567fc..332fe04b772b 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -1081,4 +1081,9 @@ clock-names = "secss"; }; +&trng { + clocks = <&clock CLK_SSS>; + clock-names = "secss"; +}; + #include "exynos5250-pinctrl.dtsi" diff --git a/arch/arm/boot/dts/exynos5410.dtsi b/arch/arm/boot/dts/exynos5410.dtsi index 7eab4bc07cec..f3991206a562 100644 --- a/arch/arm/boot/dts/exynos5410.dtsi +++ b/arch/arm/boot/dts/exynos5410.dtsi @@ -379,6 +379,11 @@ 3 0 0x07000000 0x20000>; }; +&trng { + clocks = <&clock CLK_SSS>; + clock-names = "secss"; +}; + &usbdrd3_0 { clocks = <&clock CLK_USBD300>; clock-names = "usbdrd30"; diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index 02d2f898efa6..2f4e5542f354 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi @@ -1454,6 +1454,11 @@ clock-names = "secss"; }; +&trng { + clocks = <&clock CLK_SSS>; + clock-names = "secss"; +}; + &usbdrd3_0 { clocks = <&clock CLK_USBD300>; clock-names = "usbdrd30"; -- 2.11.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-12-06 3:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20171127095808eucas1p22ded3526ec44c8b9edf3e4480a811820@eucas1p2.samsung.com>
2017-11-27 9:58 ` [PATCH v2 0/3] True RNG driver for Samsung Exynos 5250+ SoCs Łukasz Stelmach
[not found] ` <CGME20171127095809eucas1p2988d8c9f37b995b08fb5ae694cf020a2@eucas1p2.samsung.com>
[not found] ` <20171127095804.7128-1-l.stelmach-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2017-11-27 9:58 ` [PATCH v2 1/3] dt-bindings: hwrng: Add Samsung Exynos 5250+ True RNG bindings Łukasz Stelmach
2017-11-27 10:45 ` Krzysztof Kozlowski
[not found] ` <CGME20171127095809eucas1p27b7d5c44c564bb553342f5fab40d0bac@eucas1p2.samsung.com>
2017-11-27 9:58 ` [PATCH v2 2/3] hwrng: exynos - add Samsung Exynos True RNG driver Łukasz Stelmach
2017-11-27 10:49 ` Krzysztof Kozlowski
2017-12-06 3:10 ` PrasannaKumar Muralidharan
[not found] ` <CGME20171127095810eucas1p2f580db5216f419551e4b530adcf9a41f@eucas1p2.samsung.com>
2017-11-27 9:58 ` [PATCH v2 3/3] ARM: dts: exynos: Add nodes for True Random Number Generator Łukasz Stelmach
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).