devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver
@ 2024-11-01 21:13 Markus Mayer
  2024-11-01 21:13 ` [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG Markus Mayer
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Markus Mayer @ 2024-11-01 21:13 UTC (permalink / raw)
  To: Olivia Mackall, Herbert Xu, Aurelien Jarno, Conor Dooley,
	Daniel Golle, Florian Fainelli, Francesco Dolcini,
	Krzysztof Kozlowski, Rob Herring
  Cc: Markus Mayer, Device Tree Mailing List, Linux Crypto Mailing List,
	Linux Kernel Mailing List

This series adds a driver for the random number generator found on the
BCM74110 SoC.

Binding changes from v1:
  - renamed binding file to brcm,bcm74110-rng.yaml
  - ensure "brcm,bcm74110-rng" is being used instead of "...-trng"
  - removed "|" after "description:"
  - removed label "rng:"

Code-related changes from v1:
  - only enable the driver for ARCH_BRCMSTB || COMPILE_TEST

Markus Mayer (2):
  dt-bindings: rng: add binding for BCM74110 RNG
  hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver

 .../bindings/rng/brcm,bcm74110-rng.yaml       |  35 +++++
 drivers/char/hw_random/Kconfig                |  13 ++
 drivers/char/hw_random/Makefile               |   1 +
 drivers/char/hw_random/bcm74110-rng.c         | 125 ++++++++++++++++++
 4 files changed, 174 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml
 create mode 100644 drivers/char/hw_random/bcm74110-rng.c

-- 
2.47.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG
  2024-11-01 21:13 [PATCH v2 0/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
@ 2024-11-01 21:13 ` Markus Mayer
  2024-11-02 13:13   ` Krzysztof Kozlowski
  2024-11-01 21:13 ` [PATCH v2 2/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
  2024-11-10  3:57 ` [PATCH v2 0/2] " Herbert Xu
  2 siblings, 1 reply; 5+ messages in thread
From: Markus Mayer @ 2024-11-01 21:13 UTC (permalink / raw)
  To: Olivia Mackall, Herbert Xu, Aurelien Jarno, Conor Dooley,
	Daniel Golle, Florian Fainelli, Francesco Dolcini,
	Krzysztof Kozlowski, Rob Herring
  Cc: Markus Mayer, Device Tree Mailing List, Linux Crypto Mailing List,
	Linux Kernel Mailing List

Add a binding for the random number generator used on the BCM74110.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
---
 .../bindings/rng/brcm,bcm74110-rng.yaml       | 35 +++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml

diff --git a/Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml b/Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml
new file mode 100644
index 000000000000..8e89d4a70b53
--- /dev/null
+++ b/Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml
@@ -0,0 +1,35 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/rng/brcm,bcm74110-rng.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: BCM74110 Random number generator
+
+description:
+  Random number generator used on the BCM74110.
+
+maintainers:
+  - Markus Mayer <mmayer@broadcom.com>
+  - Florian Fainelli <florian.fainelli@broadcom.com>
+
+properties:
+  compatible:
+    enum:
+      - brcm,bcm74110-rng
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    rng@83ba000 {
+        compatible = "brcm,bcm74110-rng";
+        reg = <0x83ba000 0x14>;
+    };
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver
  2024-11-01 21:13 [PATCH v2 0/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
  2024-11-01 21:13 ` [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG Markus Mayer
@ 2024-11-01 21:13 ` Markus Mayer
  2024-11-10  3:57 ` [PATCH v2 0/2] " Herbert Xu
  2 siblings, 0 replies; 5+ messages in thread
From: Markus Mayer @ 2024-11-01 21:13 UTC (permalink / raw)
  To: Olivia Mackall, Herbert Xu, Aurelien Jarno, Conor Dooley,
	Daniel Golle, Florian Fainelli, Francesco Dolcini,
	Krzysztof Kozlowski, Rob Herring
  Cc: Markus Mayer, Device Tree Mailing List, Linux Crypto Mailing List,
	Linux Kernel Mailing List

Add a driver for the random number generator present on the Broadcom
BCM74110 SoC.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
---
 drivers/char/hw_random/Kconfig        |  13 +++
 drivers/char/hw_random/Makefile       |   1 +
 drivers/char/hw_random/bcm74110-rng.c | 125 ++++++++++++++++++++++++++
 3 files changed, 139 insertions(+)
 create mode 100644 drivers/char/hw_random/bcm74110-rng.c

diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig
index b51d9e243f35..e665581e2324 100644
--- a/drivers/char/hw_random/Kconfig
+++ b/drivers/char/hw_random/Kconfig
@@ -99,6 +99,19 @@ config HW_RANDOM_BCM2835
 
 	  If unsure, say Y.
 
+config HW_RANDOM_BCM74110
+	tristate "Broadcom BCM74110 Random Number Generator support"
+	depends on ARCH_BRCMSTB || COMPILE_TEST
+	default HW_RANDOM
+	help
+	  This driver provides kernel-side support for the Random Number
+	  Generator hardware found on the Broadcom BCM74110 SoCs.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called bcm74110-rng
+
+	  If unsure, say Y.
+
 config HW_RANDOM_IPROC_RNG200
 	tristate "Broadcom iProc/STB RNG200 support"
 	depends on ARCH_BCM_IPROC || ARCH_BCM2835 || ARCH_BRCMSTB || COMPILE_TEST
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile
index 01f012eab440..283791f5462d 100644
--- a/drivers/char/hw_random/Makefile
+++ b/drivers/char/hw_random/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
 obj-$(CONFIG_HW_RANDOM_HISI)	+= hisi-rng.o
 obj-$(CONFIG_HW_RANDOM_HISTB) += histb-rng.o
 obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o
+obj-$(CONFIG_HW_RANDOM_BCM74110) += bcm74110-rng.o
 obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) += iproc-rng200.o
 obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o
 obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o
diff --git a/drivers/char/hw_random/bcm74110-rng.c b/drivers/char/hw_random/bcm74110-rng.c
new file mode 100644
index 000000000000..5c64148e91f1
--- /dev/null
+++ b/drivers/char/hw_random/bcm74110-rng.c
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2024 Broadcom
+ */
+
+#define pr_fmt(fmt)	KBUILD_MODNAME ": " fmt
+
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/random.h>
+#include <linux/hw_random.h>
+
+#define HOST_REV_ID		0x00
+#define HOST_FIFO_DEPTH		0x04
+#define HOST_FIFO_COUNT		0x08
+#define HOST_FIFO_THRESHOLD	0x0c
+#define HOST_FIFO_DATA		0x10
+
+#define HOST_FIFO_COUNT_MASK		0xffff
+
+/* Delay range in microseconds */
+#define FIFO_DELAY_MIN_US		3
+#define FIFO_DELAY_MAX_US		7
+#define FIFO_DELAY_MAX_COUNT		10
+
+struct bcm74110_priv {
+	void __iomem *base;
+};
+
+static inline int bcm74110_rng_fifo_count(void __iomem *mem)
+{
+	return readl_relaxed(mem) & HOST_FIFO_COUNT_MASK;
+}
+
+static int bcm74110_rng_read(struct hwrng *rng, void *buf, size_t max,
+			bool wait)
+{
+	struct bcm74110_priv *priv = (struct bcm74110_priv *)rng->priv;
+	void __iomem *fc_addr = priv->base + HOST_FIFO_COUNT;
+	void __iomem *fd_addr = priv->base + HOST_FIFO_DATA;
+	unsigned underrun_count = 0;
+	u32 max_words = max / sizeof(u32);
+	u32 num_words;
+	unsigned i;
+
+	/*
+	 * We need to check how many words are available in the RNG FIFO. If
+	 * there aren't any, we need to wait for some to become available.
+	 */
+	while ((num_words = bcm74110_rng_fifo_count(fc_addr)) == 0) {
+		if (!wait)
+			return 0;
+		/*
+		 * As a precaution, limit how long we wait. If the FIFO doesn't
+		 * refill within the allotted time, return 0 (=no data) to the
+		 * caller.
+		 */
+		if (likely(underrun_count < FIFO_DELAY_MAX_COUNT))
+			usleep_range(FIFO_DELAY_MIN_US, FIFO_DELAY_MAX_US);
+		else
+			return 0;
+		underrun_count++;
+	}
+	if (num_words > max_words)
+		num_words = max_words;
+
+	/* Bail early if we run out of random numbers unexpectedly */
+	for (i = 0; i < num_words && bcm74110_rng_fifo_count(fc_addr) > 0; i++)
+		((u32 *)buf)[i] = readl_relaxed(fd_addr);
+
+	return i * sizeof(u32);
+}
+
+static struct hwrng bcm74110_hwrng = {
+	.read = bcm74110_rng_read,
+};
+
+static int bcm74110_rng_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct bcm74110_priv *priv;
+	int rc;
+
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	bcm74110_hwrng.name = pdev->name;
+	bcm74110_hwrng.priv = (unsigned long)priv;
+
+	priv->base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(priv->base))
+		return PTR_ERR(priv->base);
+
+	rc = devm_hwrng_register(dev, &bcm74110_hwrng);
+	if (rc)
+		dev_err(dev, "hwrng registration failed (%d)\n", rc);
+	else
+		dev_info(dev, "hwrng registered\n");
+
+	return rc;
+}
+
+static const struct of_device_id bcm74110_rng_match[] = {
+	{ .compatible	= "brcm,bcm74110-rng", },
+	{},
+};
+MODULE_DEVICE_TABLE(of, bcm74110_rng_match);
+
+static struct platform_driver bcm74110_rng_driver = {
+	.driver = {
+		.name = KBUILD_MODNAME,
+		.of_match_table = bcm74110_rng_match,
+	},
+	.probe	= bcm74110_rng_probe,
+};
+module_platform_driver(bcm74110_rng_driver);
+
+MODULE_AUTHOR("Markus Mayer <mmayer@broadcom.com>");
+MODULE_DESCRIPTION("BCM 74110 Random Number Generator (RNG) driver");
+MODULE_LICENSE("GPL v2");
-- 
2.47.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG
  2024-11-01 21:13 ` [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG Markus Mayer
@ 2024-11-02 13:13   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 5+ messages in thread
From: Krzysztof Kozlowski @ 2024-11-02 13:13 UTC (permalink / raw)
  To: Markus Mayer
  Cc: Olivia Mackall, Herbert Xu, Aurelien Jarno, Conor Dooley,
	Daniel Golle, Florian Fainelli, Francesco Dolcini,
	Krzysztof Kozlowski, Rob Herring, Device Tree Mailing List,
	Linux Crypto Mailing List, Linux Kernel Mailing List

On Fri, Nov 01, 2024 at 02:13:14PM -0700, Markus Mayer wrote:
> Add a binding for the random number generator used on the BCM74110.
> 
> Signed-off-by: Markus Mayer <mmayer@broadcom.com>
> ---
>  .../bindings/rng/brcm,bcm74110-rng.yaml       | 35 +++++++++++++++++++
>  1 file changed, 35 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver
  2024-11-01 21:13 [PATCH v2 0/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
  2024-11-01 21:13 ` [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG Markus Mayer
  2024-11-01 21:13 ` [PATCH v2 2/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
@ 2024-11-10  3:57 ` Herbert Xu
  2 siblings, 0 replies; 5+ messages in thread
From: Herbert Xu @ 2024-11-10  3:57 UTC (permalink / raw)
  To: Markus Mayer
  Cc: Olivia Mackall, Aurelien Jarno, Conor Dooley, Daniel Golle,
	Florian Fainelli, Francesco Dolcini, Krzysztof Kozlowski,
	Rob Herring, Device Tree Mailing List, Linux Crypto Mailing List,
	Linux Kernel Mailing List

On Fri, Nov 01, 2024 at 02:13:13PM -0700, Markus Mayer wrote:
> This series adds a driver for the random number generator found on the
> BCM74110 SoC.
> 
> Binding changes from v1:
>   - renamed binding file to brcm,bcm74110-rng.yaml
>   - ensure "brcm,bcm74110-rng" is being used instead of "...-trng"
>   - removed "|" after "description:"
>   - removed label "rng:"
> 
> Code-related changes from v1:
>   - only enable the driver for ARCH_BRCMSTB || COMPILE_TEST
> 
> Markus Mayer (2):
>   dt-bindings: rng: add binding for BCM74110 RNG
>   hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver
> 
>  .../bindings/rng/brcm,bcm74110-rng.yaml       |  35 +++++
>  drivers/char/hw_random/Kconfig                |  13 ++
>  drivers/char/hw_random/Makefile               |   1 +
>  drivers/char/hw_random/bcm74110-rng.c         | 125 ++++++++++++++++++
>  4 files changed, 174 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/rng/brcm,bcm74110-rng.yaml
>  create mode 100644 drivers/char/hw_random/bcm74110-rng.c
> 
> -- 
> 2.47.0

All applied.  Thanks.
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-11-10  3:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-01 21:13 [PATCH v2 0/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
2024-11-01 21:13 ` [PATCH v2 1/2] dt-bindings: rng: add binding for BCM74110 RNG Markus Mayer
2024-11-02 13:13   ` Krzysztof Kozlowski
2024-11-01 21:13 ` [PATCH v2 2/2] hwrng: bcm74110 - Add Broadcom BCM74110 RNG driver Markus Mayer
2024-11-10  3:57 ` [PATCH v2 0/2] " Herbert Xu

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).