<div dir="ltr">Patch for BBB:<br><br>From a6b3b58a38a6925bf26b6573f36fc652708f9f32 Mon Sep 17 00:00:00 2001<br>From: Udit agarwal <<a href="mailto:dev.madaari@gmail.com">dev.madaari@gmail.com</a>><br>Date: Fri, 16 Mar 2018 15:37:05 +0530<br>Subject: [PATCH] arm/beagle: add TRNG based getentropy implementation<br><br>---<br> bsps/arm/include/libcpu/am335x.h                 |  33 ++++++<br> c/src/lib/libbsp/arm/beagle/Makefile.am          |   4 +-<br> c/src/lib/libbsp/arm/beagle/dev/bbb_getentropy.c | 130 +++++++++++++++++++++++<br> 3 files changed, 166 insertions(+), 1 deletion(-)<br> create mode 100644 c/src/lib/libbsp/arm/beagle/dev/bbb_getentropy.c<br><br>diff --git a/bsps/arm/include/libcpu/am335x.h b/bsps/arm/include/libcpu/am335x.h<br>index 367e97c..a6fb8b8 100644<br>--- a/bsps/arm/include/libcpu/am335x.h<br>+++ b/bsps/arm/include/libcpu/am335x.h<br>@@ -14,11 +14,17 @@<br>  * Modified by Ben Gras <<a href="mailto:beng@shrike-systems.com">beng@shrike-systems.com</a>> to add lots<br>  * of beagleboard/beaglebone definitions, delete lpc32xx specific<br>  * ones, and merge with some other header files.<br>+ *<br>+ * Modified by Udit agarwal <<a href="mailto:dev.madaari@gmail.com">dev.madaari@gmail.com</a>> to add true random<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,31 @@<br> #define AM335X_CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK (0x00000020u)<br> #define AM335X_I2C_INT_STOP_CONDITION AM335X_I2C_IRQSTATUS_BF<br> <br>+/* TRNG Registers */<br>+/* TRNG base address */<br>+#define TRNG_BASE 0x48310000<br>+/* Mask bits for trng clock status */<br>+#define AM335X_CLK_TRNG_BIT_MASK (0x30000)<br>+/* Mask bits for output ready flag */<br>+#define TRNG_STATUS_RDY (1u <<  0)<br>+/* Mask bits for FRO related error */<br>+#define TRNG_STATUS_ERR (1u <<  1)<br>+/* Mask bits for clock status */<br>+#define TRNG_STATUS_CLK (1u << 31)<br>+/* enable module */<br>+#define AM335X_TRNG_ENABLE (1 << 10)<br>+<br>+/* TRNG module clock register */<br>+#define CM_PER_TRNG_CLKCTRL (AM335X_CM_PER_ADDR | (9 << 4))<br>+<br>+/* TRNG register structure */<br>+typedef struct {<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>+} am335x_trng_register;<br>+<br> #endif<br>diff --git a/c/src/lib/libbsp/arm/beagle/Makefile.am b/c/src/lib/libbsp/arm/beagle/Makefile.am<br>index 8251660..c483dc4 100644<br>--- a/c/src/lib/libbsp/arm/beagle/Makefile.am<br>+++ b/c/src/lib/libbsp/arm/beagle/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-cpucounter.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 += dev/bbb_getentropy.c<br>+<br> #RTC<br> libbsp_a_SOURCES += rtc.c<br> libbsp_a_SOURCES += ../../shared/tod.c<br>diff --git a/c/src/lib/libbsp/arm/beagle/dev/bbb_getentropy.c b/c/src/lib/libbsp/arm/beagle/dev/bbb_getentropy.c<br>new file mode 100644<br>index 0000000..b3ea681<br>--- /dev/null<br>+++ b/c/src/lib/libbsp/arm/beagle/dev/bbb_getentropy.c<br>@@ -0,0 +1,130 @@<br>+/**<br>+* @file<br>+*<br>+* @ingroup arm_beagle<br>+*<br>+* @brief Getentropy implementation on BeagleBone Black BSP<br>+*/<br>+<br>+/*<br>+* Copyright (c) 2018 Udit agarwal <dev.madaari at <a href="http://gmail.com">gmail.com</a>><br>+* All rights reserved.<br>+*<br>+* Redistribution and use in source and binary forms, with or without<br>+* modification, are permitted provided that the following conditions<br>+* are met:<br>+* 1. Redistributions of source code must retain the above copyright<br>+*    notice, this list of conditions and the following disclaimer.<br>+* 2. Redistributions in binary form must reproduce the above copyright<br>+*    notice, this list of conditions and the following disclaimer in the<br>+*    documentation and/or other materials provided with the distribution.<br>+*<br>+* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND<br>+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE<br>+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE<br>+* ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE<br>+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL<br>+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS<br>+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)<br>+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT<br>+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY<br>+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF<br>+* SUCH DAMAGE.<br>+*/<br>+<br>+#include <libcpu/am335x.h><br>+#include <unistd.h><br>+#include <string.h><br>+#include <rtems/sysinit.h><br>+#include <rtems/thread.h><br>+#include <stdint.h><br>+<br>+/* max refill 34 * 256 cycles */<br>+#define AM335X_TRNG_MAX_REFILL (34 << 16)<br>+/* min refill 33 * 64 cycles */<br>+#define AM335X_TRNG_MIN_REFILL (33 << 0)<br>+/* startup 33 * 256 cycles */<br>+#define AM335X_TRNG_STARTUP_CYCLES (33 << 16)<br>+<br>+static rtems_mutex am335x_trng_mutex =<br>+    RTEMS_MUTEX_INITIALIZER("am335x_trng");<br>+<br>+/* maximun and minimum refill cycle sets the number of samples to be taken<br>+ * from FRO to generate random number */<br>+static void am335x_trng_enable(volatile am335x_trng_register *trng)<br>+{<br>+  trng->control = trng->config = 0;<br>+  trng->config |= AM335X_TRNG_MIN_REFILL | AM335X_TRNG_MAX_REFILL ;<br>+  trng->control |= AM335X_TRNG_STARTUP_CYCLES | AM335X_TRNG_ENABLE ;<br>+}<br>+<br>+static void am335x_trng_clock_enable(void)<br>+{<br>+  volatile am335x_trng_register  *trng = (am335x_trng_register*) TRNG_BASE;<br>+  *(volatile uint8_t *) CM_PER_TRNG_CLKCTRL = 2;<br>+  while(<br>+    *(volatile uint32_t *) CM_PER_TRNG_CLKCTRL &<br>+    AM335X_CLK_TRNG_BIT_MASK<br>+  ) {<br>+    /* wait */<br>+  }<br>+  am335x_trng_enable(trng);<br>+}<br>+<br>+static uint64_t trng_getranddata(volatile am335x_trng_register *trng)<br>+{<br>+  uint64_t output = trng->output;<br>+  return output;<br>+}<br>+<br>+int getentropy(void *ptr, size_t n)<br>+{<br>+  volatile am335x_trng_register  *trng =<br>+      (am335x_trng_register*) TRNG_BASE;<br>+<br>+  /* for mutual exclusion synchronization between multiple<br>+   * access to TRNG register in different contexts */<br>+  rtems_mutex_lock(&am335x_trng_mutex);<br>+<br>+  while ( n > 0 )<br>+  {<br>+    uint64_t random;<br>+    size_t copy;<br>+<br>+    /* wait untill TRNG becomes ready with next set of random data */<br>+    while ( ( trng->status & TRNG_STATUS_RDY ) == 0 )<br>+    {<br>+      /* wait */<br>+    }<br>+<br>+    random = trng_getranddata(trng);<br>+<br>+    /* clear the status flag after reading to generate new random<br>+     * value */<br>+    trng->status_clr = TRNG_STATUS_RDY;<br>+<br>+    /* checking for error by masking all bits other then error bit in<br>+     * status register */<br>+    if ( ((trng->status & TRNG_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>+<br>+  rtems_mutex_unlock(&am335x_trng_mutex);<br>+  return 0;<br>+}<br>+<br>+RTEMS_SYSINIT_ITEM(<br>+  am335x_trng_clock_enable,<br>+  RTEMS_SYSINIT_DEVICE_DRIVERS,<br>+  RTEMS_SYSINIT_ORDER_LAST<br>+);<br>-- <br>1.9.1<br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 16, 2018 at 3:01 PM, Udit agarwal <span dir="ltr"><<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Thanks for pointing that out, I have rectified the indentation errors.<br><br></div>Here's the patch for atsam:<br>From 8e5e17525a76e68bc4d869d0af9700<wbr>aaa5628483 Mon Sep 17 00:00:00 2001<br>From: Udit agarwal <<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a>><br>Date: Fri, 16 Mar 2018 14:54:53 +0530<br>Subject: [PATCH] arm/atsam: protect TRNG_GetRandData with mutex<br><br>---<br> c/src/lib/libbsp/arm/atsam/<wbr>startup/getentropy-trng.c | 7 ++++++-<br> 1 file changed, 6 insertions(+), 1 deletion(-)<br><br>diff --git a/c/src/lib/libbsp/arm/atsam/<wbr>startup/getentropy-trng.c b/c/src/lib/libbsp/arm/atsam/<wbr>startup/getentropy-trng.c<br>index 11e24dc..54a1cef 100644<br>--- a/c/src/lib/libbsp/arm/atsam/<wbr>startup/getentropy-trng.c<br>+++ b/c/src/lib/libbsp/arm/atsam/<wbr>startup/getentropy-trng.c<br>@@ -17,6 +17,9 @@<br> #include <string.h><br> #include <rtems/sysinit.h><br> <br>+static rtems_mutex atsam_trng_mutex =<br>+    RTEMS_MUTEX_INITIALIZER("<wbr>atsam_trng");<span class=""><br>+<br> static void atsam_trng_enable(void)<br> {<br>  PMC_EnablePeripheral(ID_TRNG);<br></span>@@ -25,6 +28,8 @@ static void atsam_trng_enable(void)<span class=""><br> <br> int getentropy(void *ptr, size_t n)<br> {<br></span>+  rtems_mutex_lock(&atsam_trng_<wbr>mutex);<span class=""><br>+<br>  while (n > 0) {<br>    uint32_t random;<br>    size_t copy;<br></span>@@ -50,7 +55,7 @@ int getentropy(void *ptr, size_t n)<span class=""><br>    n -= copy;<br>    ptr += copy;<br>  }<br></span>-<span class=""><br>+  rtems_mutex_unlock(&atsam_<wbr>trng_mutex);<br>  return 0;<br> }<br> <br>-- <br>1.9.1<br></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 15, 2018 at 7:52 PM, Gedare Bloom <span dir="ltr"><<a href="mailto:gedare@rtems.org" target="_blank">gedare@rtems.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On Thu, Mar 15, 2018 at 7:00 AM, Udit agarwal <<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a>> wrote:<br>
><br>
><br>
> On Thu, Mar 15, 2018 at 2:38 PM, Sebastian Huber<br>
> <<a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brai<wbr>ns.de</a>> wrote:<br>
>><br>
>> On 15/03/18 09:20, Udit agarwal wrote:<br>
>>><br>
>>> Also, will it be ok to keep atsam_trng_mutex even after user has finished<br>
>>> using getentropy() i.e when we don't use destroy(&atsam_trng_mutex) at all?<br>
>><br>
>><br>
>> Why do you want to destroy the mutex?<br>
><br>
> Just trying to reduce redundancy, but then i don't think that's a good idea.<br>
> BTW, here's atsam patch, please have a look:<br>
><br>
> From 35313002ea19715c5914c5983a2447<wbr>1b0763aa68 Mon Sep 17 00:00:00 2001<br>
> From: Udit agarwal <<a href="mailto:dev.madaari@gmail.com" target="_blank">dev.madaari@gmail.com</a>><br>
> Date: Thu, 15 Mar 2018 16:21:51 +0530<br>
> Subject: [PATCH] Added mutex across TRNG_GetRandData<br>
<br>
</span>In the commit message, identify the rtems subsystem. I guess we don't<br>
have detailed advice on the wiki for this, but here I guess we usually<br>
would have something like "arm/atsam: protect TRNG_GetRandData with<br>
mutex"<br>
<span><br>
><br>
> ---<br>
>  c/src/lib/libbsp/arm/atsam/sta<wbr>rtup/getentropy-trng.c | 7 +++++++<br>
>  1 file changed, 7 insertions(+)<br>
><br>
> diff --git a/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
> b/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
> index 11e24dc..2789970 100644<br>
> --- a/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
> +++ b/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
> @@ -16,6 +16,9 @@<br>
>  #include <unistd.h><br>
>  #include <string.h><br>
>  #include <rtems/sysinit.h><br>
> +#include <rtems/thread.h><br>
> +<br>
> +static rtems_mutex atsam_trng_mutex =<br>
> RTEMS_MUTEX_INITIALIZER("atsam<wbr>_trng");<br>
><br>
</span>The second line should be indented 2 more levels (4 spaces).<br>
<a href="https://devel.rtems.org/wiki/Developer/Coding/80_characters_per_line" rel="noreferrer" target="_blank">https://devel.rtems.org/wiki/D<wbr>eveloper/Coding/80_characters_<wbr>per_line</a><br>
<span><br>
>  static void atsam_trng_enable(void)<br>
>  {<br>
> @@ -25,6 +28,9 @@ static void atsam_trng_enable(void)<br>
><br>
>  int getentropy(void *ptr, size_t n)<br>
>  {<br>
> +<br>
> +    rtems_mutex_lock(&atsam_trng_m<wbr>utex);<br>
</span>The number of indent spaces here look wrong to me. It should be 2.<br>
<span><br>
> +<br>
>      while (n > 0) {<br>
>          uint32_t random;<br>
>          size_t copy;<br>
> @@ -51,6 +57,7 @@ int getentropy(void *ptr, size_t n)<br>
>          ptr += copy;<br>
>      }<br>
><br>
> +    rtems_mutex_unlock(&atsam_trng<wbr>_mutex);<br>
</span>ditto.<br>
<span class="m_1164267919484488757im m_1164267919484488757HOEnZb"><br>
>      return 0;<br>
>  }<br>
><br>
> --<br>
> 1.9.1<br>
><br>
><br>
>><br>
>><br>
>><br>
>> --<br>
>> Sebastian Huber, embedded brains GmbH<br>
>><br>
>> Address : Dornierstr. 4, D-82178 Puchheim, Germany<br>
>> Phone   : +49 89 189 47 41-16<br>
>> Fax     : +49 89 189 47 41-09<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.<br>
>><br>
><br>
><br>
</span><div class="m_1164267919484488757HOEnZb"><div class="m_1164267919484488757h5">> ______________________________<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></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>