<div dir="ltr"><div>Hi,<br>@Joel This seems to be SoC specific.<br><br></div><div>So, here is the implementation with mutex, Do let me know if this is okay. I'll then do it for atsam also.<br><br>int getentropy(void *ptr, size_t n)<br>{<br>    volatile am335x_trng_register  *rng = (am335x_trng_register*) RNG_BASE;<br>    rtems_mutex lock_trng_reg = RTEMS_MUTEX_INITIALIZER("lock_trng_reg");<br><br>    while (n > 0)<br>    {<br>        uint64_t random;<br>        size_t copy;<br><br>        /* for mutual exclusion synchronization between multiple<br>           access to TRNG register in different contexts */<br>        rtems_mutex_lock(&lock_trng_reg);<br><br>        /* wait untill RNG becomes ready with next set of random data */<br>        while( ( rng->status & RNG_STATUS_RDY ) == 0 )<br>        {<br>            /* wait */<br>        }<br><br>        random = trng_getranddata(rng);<br>        /* clear the status flag after reading to generate new random<br>           value */<br>        rng->status_clr = RNG_STATUS_RDY;<br>        rtems_mutex_unlock(&lock_trng_reg);<br><br>        /* checking for error by masking all bits other then error bit in<br>           status register */<br>        if( ((rng->status & RNG_STATUS_ERR)>>1) == 1)<br>        {<br>            copy = sizeof(random);<br>            if ( n < copy )<br>            {<br>                copy = n;<br>            }<br>            memcpy(ptr, &random, copy);<br>            n -= copy;<br>            ptr = (char*)ptr + copy;<br>        }<br>    }<br><br>    rtems_mutex_destroy(&lock_trng_reg);<br>    return 0;<br>}<br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 14, 2018 at 2:15 AM, Joel Sherrill <span dir="ltr"><<a href="mailto:joel@rtems.org" target="_blank">joel@rtems.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div><div class="h5"><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Mar 13, 2018 1:31 AM, "Sebastian Huber" <<a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-<wbr>brains.de</a>> wrote:<br type="attribution"><blockquote class="m_-8378932487181802192quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-8378932487181802192quoted-text"><br>
<br>
On 12/03/18 20:02, Udit agarwal wrote:<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-8378932487181802192quoted-text">
So, It looks like here's the final patch, do let me know if its ready to be pushed. Also, it would be really helpful if someone else also tests this patch before pushing(Although i have done that once).<br>
<br>
Thanks,<br>
Udit agarwal<br>
<br>
<br>
>From 454a8ff3e0ea3393818859874705a5<wbr>4b098c6081 Mon Sep 17 00:00:00 2001<br></div>
From: Udit agarwal <<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a> <mailto:<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a>><wbr>><div class="m_-8378932487181802192quoted-text"><br>
Date: Tue, 13 Mar 2018 00:20:28 +0530<br>
Subject: [PATCH] Added Getentropy() support to beagle BSP<br>
<br>
---<br>
 bsps/arm/include/libcpu/am335<wbr>x.h                   |  37 ++++++-<br>
 c/src/lib/libbsp/arm/beagle/M<a href="http://akefile.am" target="_blank"><wbr>akefile.am</a>            |   4 +-<br>
 .../libbsp/arm/beagle/getentr<wbr>opy/bbb_getentropy.c  | 116 +++++++++++++++++++++<br>
 3 files changed, 155 insertions(+), 2 deletions(-)<br>
 create mode 100644 c/src/lib/libbsp/arm/beagle/ge<wbr>tentropy/bbb_getentropy.c<br>
<br>
diff --git a/bsps/arm/include/libcpu/am33<wbr>5x.h b/bsps/arm/include/libcpu/am33<wbr>5x.h<br>
index 367e97c..cedd637 100644<br>
--- a/bsps/arm/include/libcpu/am33<wbr>5x.h<br>
+++ b/bsps/arm/include/libcpu/am33<wbr>5x.h<br>
@@ -14,11 +14,17 @@<br></div>
  * Modified by Ben Gras <<a href="mailto:beng@shrike-systems.com" target="_blank">beng@shrike-systems.com</a> <mailto:<a href="mailto:beng@shrike-systems.com" target="_blank">beng@shrike-systems.co<wbr>m</a>>> to add lots<div class="m_-8378932487181802192quoted-text"><br>
  * of beagleboard/beaglebone definitions, delete lpc32xx specific<br>
  * ones, and merge with some other header files.<br>
+ *<br></div>
+ * Modified by Udit agarwal <<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a> <mailto:<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a>><wbr>> to add random<div class="m_-8378932487181802192elided-text"><br>
+ * number generating module definitions and TRNG register structure.<br>
  */<br>
<br>
 #if !defined(_AM335X_H_)<br>
 #define _AM335X_H_<br>
<br>
+/* For TRNG register definition */<br>
+#include <stdint.h><br>
+<br>
 /* Interrupt controller memory map */<br>
 #define OMAP3_DM37XX_INTR_BASE 0x48200000 /* INTCPS physical address */<br>
<br>
@@ -701,4 +707,33 @@<br>
 #define AM335X_CM_PER_OCPWP_L3_CLKSTCT<wbr>RL_CLKACTIVITY_OCPWP_L4_GCLK (0x00000020u)<br>
 #define AM335X_I2C_INT_STOP_CONDITION AM335X_I2C_IRQSTATUS_BF<br>
<br>
-#endif<br>
+/* TRNG Register */<br>
+<br>
+/* RNG base address */<br>
+#define RNG_BASE 0x48310000<br>
+/* RNG clock control */<br>
+#define CM_PER_RNG_CLKCTRL (AM335X_CM_PER_ADDR | (9 << 4))<br>
+/* rng module clock status bits */<br>
+#define AM335X_CLK_RNG_BIT_MASK (0x30000)<br>
+/* Offset from RNG base for output ready flag */<br>
+#define RNG_STATUS_RDY (1u <<  0)<br>
+/* Offset from RNG base for FRO related error */<br>
+#define RNG_STATUS_ERR (1u <<  1)<br>
+/* Offset from RNG base for clock status */<br>
+#define RNG_STATUS_CLK (1u << 31)<br>
+/* enable module */<br>
+#define AM335X_RNG_ENABLE (1 << 10)<br>
+<br>
+/* TRNG register structure */<br>
+struct bbb_trng_register<br>
+{<br>
+    uint64_t output;     /* 00 */<br>
+    uint32_t status;     /* 08 */<br>
+    uint32_t irq_en;     /* 0c */<br>
+    uint32_t status_clr; /* 10 */<br>
+    uint32_t control;    /* 14 */<br>
+    uint32_t config;     /* 18 */<br>
+};<br>
+typedef struct bbb_trng_register bbb_trng_register;<br>
</div></blockquote>
<br>
The bbb (Beagle Bone Black) is a particular board and the AM335X is a SoC family. This should be something like this<br>
<br>
typedef struct {<br>
 ...<br>
} am335x_trng;<div class="m_-8378932487181802192quoted-text"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+#endif<br>
\ No newline at end of file<br>
</blockquote>
<br></div>
Git thinks that files should have a newline at the end of the file.<div class="m_-8378932487181802192quoted-text"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
diff --git a/c/src/lib/libbsp/arm/beagle/<wbr>Makefile.am b/c/src/lib/libbsp/arm/beagle/<wbr>Makefile.am<br>
index 8251660..5d5ade3 100644<br>
--- a/c/src/lib/libbsp/arm/beagle/<wbr>Makefile.am<br>
+++ b/c/src/lib/libbsp/arm/beagle/<wbr>Makefile.am<br>
@@ -40,7 +40,6 @@ libbsp_a_LIBADD =<br>
<br>
 # Shared<br>
 libbsp_a_SOURCES += ../../shared/bootcard.c<br>
-libbsp_a_SOURCES += ../../shared/getentropy-cpucou<wbr>nter.c<br>
 libbsp_a_SOURCES += ../../shared/src/bsp-fdt.c<br>
 libbsp_a_SOURCES += ../../shared/bspclean.c<br>
 libbsp_a_SOURCES += ../../shared/bspgetworkarea.c<br>
@@ -88,6 +87,9 @@ libbsp_a_SOURCES += gpio/bbb-gpio.c<br>
 #pwm<br>
 libbsp_a_SOURCES += pwm/pwm.c<br>
<br>
+#getentropy<br>
+libbsp_a_SOURCES += getentropy/bbb_getentropy.c<br>
+<br>
</blockquote>
<br></div>
With the new BSP source structure<br>
<br>
<a href="https://devel.rtems.org/ticket/3285" rel="noreferrer" target="_blank">https://devel.rtems.org/ticket<wbr>/3285</a><br>
<br>
this new file could be also placed at<br>
<br>
bsps/arm/beagle/dev/getentropy<wbr>.c<br></blockquote></div></div></div><div dir="auto"><br></div></div></div><div dir="auto">Is this specific to the Beagle or the SoC? Or a combination? Earlier you said the structure was SoC specific?</div><div><div class="h5"><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="m_-8378932487181802192quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
[...]<div class="m_-8378932487181802192quoted-text"><br>
+int getentropy(void *ptr, size_t n)<br>
+{<br>
+    volatile bbb_trng_register  *rng = (bbb_trng_register*) RNG_BASE;<br>
+    am335x_rng_enable(rng);<br>
+    while (n > 0)<br>
+    {<br>
+        uint64_t random;<br>
+        size_t copy;<br>
+<br>
+        /* wait untill RNG becomes ready with next set of random data */<br>
+        while( ( rng->status & RNG_STATUS_RDY ) == 0 )<br>
+        {<br>
+            /* wait */<br>
+        }<br>
</div></blockquote>
<br>
What happens if you call this function in parallel on different processors?<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="m_-8378932487181802192elided-text">
+<br>
+        random = trng_getranddata(rng);<br>
+<br>
+        /* Checking for error by masking all bits other then error bit in<br>
+           status register */<br>
+        if( ((rng->status & RNG_STATUS_ERR)>>1) == 1)<br>
+        {<br>
+            /* clear the status flag after reading to generate new random<br>
+               value */<br>
+            rng->status_clr = RNG_STATUS_RDY;<br>
+            copy = sizeof(random);<br>
+            if ( n < copy )<br>
+            {<br>
+                copy = n;<br>
+            }<br>
+            memcpy(ptr, &random, copy);<br>
+            n -= copy;<br>
+            ptr = (char*)ptr + copy;<br>
+        }<br>
+    }<br>
+<br>
+    return 0;<br>
+}<br>
+<br>
+RTEMS_SYSINIT_ITEM(<br>
+    am335x_rng_clock_enable,<br>
+    RTEMS_SYSINIT_DEVICE_DRIVERS,<br>
+    RTEMS_SYSINIT_ORDER_LAST<br>
+);<br>
\ No newline at end of file<br>
-- <br>
1.9.1<br>
<br>
<br>
<br>
<br></div><div class="m_-8378932487181802192quoted-text">
______________________________<wbr>_________________<br>
devel mailing list<br>
<a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
<a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman<wbr>/listinfo/devel</a><br>
</div></blockquote><font color="#888888">
<br>
-- <br>
Sebastian Huber, embedded brains GmbH<br>
<br>
Address : <a href="https://maps.google.com/?q=Dornierstr.+4,+D-82178+Puchheim,+Germany&entry=gmail&source=g">Dornierstr. 4, D-82178 Puchheim, Germany</a><br>
Phone   : <a href="tel:%2B49%2089%20189%2047%2041-16" value="+4989189474116" target="_blank">+49 89 189 47 41-16</a><br>
Fax     : <a href="tel:%2B49%2089%20189%2047%2041-09" value="+4989189474109" target="_blank">+49 89 189 47 41-09</a><br>
E-Mail  : <a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brain<wbr>s.de</a><br>
PGP     : Public key available on request.<br>
<br>
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.</font><div class="m_-8378932487181802192elided-text"><br>
<br>
______________________________<wbr>_________________<br>
devel mailing list<br>
<a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
<a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman<wbr>/listinfo/devel</a></div></blockquote></div><br></div></div></div></div></div>
</blockquote></div><br></div>