<div dir="ltr"><div><div><div>Hi,<br></div>Here's the updated code(I have also attached the patch PFA):<br><br>From 96e6e1bfd8cffeef5d309eb0a07fe2bfd086ef0a 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: Tue, 6 Mar 2018 20:07:44 +0530<br>Subject: [PATCH] Added getentropy support to BBB BSP<br><br>---<br> bsps/arm/beagle/<a href="http://headers.am">headers.am</a>                         |  1 +<br> bsps/arm/beagle/include/bsp/bbb_getentropy.h       | 57 +++++++++++++++<br> bsps/arm/include/libcpu/am335x.h                   | 16 +++++<br> c/src/lib/libbsp/arm/beagle/Makefile.am            |  4 ++<br> .../libbsp/arm/beagle/getentropy/bbb_getentropy.c  | 80 ++++++++++++++++++++++<br> 5 files changed, 158 insertions(+)<br> create mode 100644 bsps/arm/beagle/include/bsp/bbb_getentropy.h<br> create mode 100644 c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c<br><br>diff --git a/bsps/arm/beagle/<a href="http://headers.am">headers.am</a> b/bsps/arm/beagle/<a href="http://headers.am">headers.am</a><br>index 6692d0b..ac4ff7c 100644<br>--- a/bsps/arm/beagle/<a href="http://headers.am">headers.am</a><br>+++ b/bsps/arm/beagle/<a href="http://headers.am">headers.am</a><br>@@ -12,3 +12,4 @@ include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/bbb-pwm.h<br> include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/beagleboneblack.h<br> include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/i2c.h<br> include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/irq.h<br>+include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/bbb_getentropy.h<br>diff --git a/bsps/arm/beagle/include/bsp/bbb_getentropy.h b/bsps/arm/beagle/include/bsp/bbb_getentropy.h<br>new file mode 100644<br>index 0000000..5e46f89<br>--- /dev/null<br>+++ b/bsps/arm/beagle/include/bsp/bbb_getentropy.h<br>@@ -0,0 +1,57 @@<br>+/**<br>+ * @file<br>+ *<br>+ * @ingroup arm_beagle<br>+ *<br>+ * @brief TRNG Definations<br>+ */<br>+<br>+/*<br>+ * Copyright (c) 2018 Udit kumar agarwal <dev.madaari at <a href="http://gmail.com">gmail.com</a>><br>+ *<br>+ * The license and distribution terms for this file may be<br>+ * found in the file LICENSE in this distribution or at<br>+ * <a href="http://www.rtems.org/license/LICENSE">http://www.rtems.org/license/LICENSE</a>.<br>+ */<br>+<br>+<br>+#ifndef _TRNG_<br>+#define _TRNG_<br>+<br>+/*------------------------------------------------------------------------------<br>+ *         Headers<br>+ *----------------------------------------------------------------------------*/<br>+<br>+#include <libcpu/am335x.h><br>+<br>+ /*------------------------------------------------------------------------------<br>+ *         Register structure<br>+ *----------------------------------------------------------------------------*/<br>+<br>+struct rng {<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>+<br>+typedef volatile struct rng *rng_ref_t;<br>+<br>+/*----------------------------------------------------------------------------*/<br>+/*         Exported functions                                                 */<br>+/*----------------------------------------------------------------------------*/<br>+<br>+/* configure and enable RNG module  */<br>+static void am335x_rng_enable(rng_ref_t);<br>+/* enable module clock for random number generator */<br>+static void am335x_rng_clock_enable(void);<br>+/* outputs random data */<br>+static uint64_t trng_getranddata(rng_ref_t);<br>+/* Copy random data of a specified size to the pointer supplied */<br>+int getentropy(void *ptr, size_t);<br>+<br>+<br>+<br>+#endif /* #ifndef _TRNG_ */<br>\ No newline at end of file<br>diff --git a/bsps/arm/include/libcpu/am335x.h b/bsps/arm/include/libcpu/am335x.h<br>index 367e97c..8b58f1a 100644<br>--- a/bsps/arm/include/libcpu/am335x.h<br>+++ b/bsps/arm/include/libcpu/am335x.h<br>@@ -14,6 +14,9 @@<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 random<br>+ * number generating module definations<br>  */<br> <br> #if !defined(_AM335X_H_)<br>@@ -701,4 +704,17 @@<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 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>+/* 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>+<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..bf92081 100644<br>--- a/c/src/lib/libbsp/arm/beagle/Makefile.am<br>+++ b/c/src/lib/libbsp/arm/beagle/Makefile.am<br>@@ -88,9 +88,13 @@ 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> #RTC<br> libbsp_a_SOURCES += rtc.c<br> libbsp_a_SOURCES += ../../shared/tod.c<br>+<br> # Clock<br> libbsp_a_SOURCES += clock.c<br> libbsp_a_SOURCES += ../../shared/clockdrv_shell.h<br>diff --git a/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c b/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c<br>new file mode 100644<br>index 0000000..cab2102<br>--- /dev/null<br>+++ b/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c<br>@@ -0,0 +1,80 @@<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 kumar agarwal <dev.madaari at <a href="http://gmail.com">gmail.com</a>><br>+*<br>+* The license and distribution terms for this file may be<br>+* found in the file LICENSE in this distribution or at<br>+* <a href="http://www.rtems.org/license/LICENSE">http://www.rtems.org/license/LICENSE</a>.<br>+*/<br>+<br>+#include <unistd.h><br>+#include <stdint.h><br>+#include <string.h><br>+#include <rtems/sysinit.h><br>+<br>+<br>+/* maximun and minimun refill cycle sets the number of samples to be taken <br>+   from FRO to generate random number */<br>+static void am335x_rng_enable(rng_ref_t rng){<br>+    rng->config = 0<br>+    | 34 << 16  /* max refill 34 * 256 cycles */<br>+    | 33 <<  0; /* min refill 33 * 64 cycles */<br>+    rng->control = 0<br>+    | 33 << 16  /* startup 33 * 256 cycles */<br>+    |  1 << 10; /* enable module */<br>+}<br>+<br>+static void am335x_rng_clock_enable(void)<br>+{<br>+    *(volatile uint8_t *) CM_PER_RNG_CLKCTRL = 2;<br>+    while( *(volatile uint32_t *) CM_PER_RNG_CLKCTRL & 0x30000 ) {}<br>+}<br>+<br>+static uint64_t trng_getranddata(rng_ref_t rng){<br>+    uint64_t output = rng->output;<br>+    return output;<br>+}<br>+<br>+int getentropy(void *ptr, size_t n)<br>+{<br>+    rng_ref_t const rng = (rng_ref_t) RNG_BASE;<br>+    am335x_rng_enable(rng);<br>+    while (n > 0) {<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>+    random = trng_getranddata(rng);<br>+<br>+    /* Checking for error by masking all bits other then error bit in status register */<br>+    if( ((rng->status & RNG_STATUS_ERR)>>1) == 0){<br>+<br>+        /* clear the status flag after reading to generate new random value*/<br>+        rng->status_clr = RNG_STATUS_RDY;<br>+        copy = sizeof(random);<br>+        if ( n < copy ) {<br>+        copy = n;<br>+        }<br>+        memcpy(ptr, &random, copy);<br>+        n -= copy;<br>+        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></div>Regards,<br></div>Udit Agarwal<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 6, 2018 at 12:50 AM, Christian Mauderer <span dir="ltr"><<a href="mailto:list@c-mauderer.de" target="_blank">list@c-mauderer.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Am 05.03.2018 um 14:51 schrieb Udit agarwal:<br>
> Hi,<br>
> I tried implementing getentropy on BBB, below is the patch. Please have<br>
> a look.<br>
> I followed these(1<br>
</span>> <<a href="https://e2e.ti.com/support/arm/sitara_arm/f/791/t/355064" rel="noreferrer" target="_blank">https://e2e.ti.com/support/<wbr>arm/sitara_arm/f/791/t/355064</a>> & 2<br>
> <<a href="http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/arch/arm/omap/am335x_trng.c" rel="noreferrer" target="_blank">http://ftp.netbsd.org/pub/<wbr>NetBSD/NetBSD-current/src/sys/<wbr>arch/arm/omap/am335x_trng.c</a>>)<br>
<span class="">> links for code reference. and this<br>
</span>> <<a href="https://docs.google.com/spreadsheets/d/1VpghMlLtrWQIrcvCsRg3ueRZkX0eGSQkFnzjfsqrd8A/view#gid=0" rel="noreferrer" target="_blank">https://docs.google.com/<wbr>spreadsheets/d/<wbr>1VpghMlLtrWQIrcvCsRg3ueRZkX0eG<wbr>SQkFnzjfsqrd8A/view#gid=0</a>><br>
<span class="">> for register reference. Moreover, what further configuration in RTEMS is<br>
> needed to execute and test this code along with getentropy() sample<br>
> testcode?<br>
<br>
</span>Hello Udit,<br>
<br>
regarding the patch: Please use 'git format-patch' for generating your<br>
patches and send them unchanged to the mailing list (for example with<br>
'git send-email'. If you follow this workflow, it's easier to apply and<br>
test the patches. The preferred workflow for RTEMS is described here:<br>
<a href="https://devel.rtems.org/wiki/Developer/Git/Users#CreatingaPatch" rel="noreferrer" target="_blank">https://devel.rtems.org/wiki/<wbr>Developer/Git/Users#<wbr>CreatingaPatch</a><br>
<br>
Regarding documentation: It seems that there is really only few<br>
documentation regarding the crypto part available. The FreeBSD driver is<br>
most likely your best source.<br>
<br>
I added further comments down in your code.<br>
<br>
Best regards<br>
<br>
Christian<br>
<span class=""><br>
><br>
><br>
> + /*<br>
> +  * Copyright (c) 2018 embedded brains GmbH.  All rights reserved.<br>
> +  *<br>
> +  *  embedded brains GmbH<br>
> +  *  Dornierstr. 4<br>
> +  *  82178 Puchheim<br>
> +  *  Germany<br>
</span>> +  *  <<a href="mailto:rtems@embedded-brains.de">rtems@embedded-brains.de</a> <mailto:<a href="mailto:rtems@embedded-brains.de">rtems@embedded-brains.<wbr>de</a>>><br>
> +  *<br>
<br>
Also it's nice if you add an embedded brains header, I don't think that<br>
I've seen you when I have been at work today. So please add your own<br>
name to the copyright line instead. With that you can even point to that<br>
file and tell everyone that it's from you.<br>
<br>
An address isn't really necessary except if you want it for some reason<br>
(like PR in case of a company).<br>
<span class=""><br>
> +  * The license and distribution terms for this file may be<br>
> +  * found in the file LICENSE in this distribution or at<br>
> +  * <a href="http://www.rtems.org/license/LICENSE" rel="noreferrer" target="_blank">http://www.rtems.org/license/<wbr>LICENSE</a>.<br>
> +  */<br>
> +<br>
> + #include <libcpu/am335x.h><br>
> + #include <unistd.h><br>
> + #include <string.h><br>
> + #include <rtems/sysinit.h><br>
> +<br>
> + #define RNG_BASE    0x48310000<br>
> + #define CM_PER_RNG_CLKCTRL    0x44e00090<br>
> + #define RNG_STATUS_RDY    (1u <<  0)  // output ready for reading<br>
> + #define RNG_STATUS_ERR    (1u <<  1)  // FRO shutdown alarm<br>
> + #define RNG_STATUS_CLK    (1u << 31)  // module functional clock<br>
> active (no irq)<br>
<br>
</span>Please add address definitions and the bit masks to the<br>
bsps/arm/include/libcpu/<wbr>am335x.h instead of defining them here locally.<br>
Note that for the CM_PER_RNG_CLKCTRL, there is already a<br>
AM335X_CM_PER_ADDR that should be used as a base.<br>
<span class=""><br>
> +<br>
> + typedef volatile struct rng *rng_ref_t;<br>
> +<br>
> + struct rng {<br>
> + /*00*/    uint64_t output;    //r-<br>
> + /*08*/    uint32_t status;    //r-<br>
> + /*0c*/    uint32_t irq_en;    //rw<br>
> + /*10*/    uint32_t status_clr;    //-c<br>
> + /*14*/    uint32_t control;    //rw<br>
> + /*18*/    uint32_t config;    //rw<br>
> + };<br>
<br>
</span>Same is true here: It's a structure describing the registers. So it<br>
should be in the header instead.<br>
<br>
It seems that you copied that from the forum post. Please always check<br>
the license when you copy code. We have to avoid that we get any code<br>
into RTEMS that isn't compatible with RTEMS license.<br>
<br>
In this case the code should be obvious enough that - if you just<br>
rewrite it in RTEMS style, there shouldn't be a problem. But just<br>
remember that licensing is always a difficult topic.<br>
<span class=""><br>
> +<br>
> + static void TRNG_Enable(rng_ref_t rng){<br>
> +     rng->config = 0<br>
> +     | 34 << 16  // max refill 34 * 256 cycles<br>
> +     | 33 <<  0;  // min refill 33 * 64 cycles<br>
> +     rng->control = 0<br>
> +     | 33 << 16  // startup 33 * 256 cycles<br>
> +     |  1 << 10;  // enable module<br>
> + }<br>
<br>
</span>Please use C-Style comments /* */ in all pure C code (most of RTEMS).<br>
<span class=""><br>
> +<br>
> + static void beagle_trng_clock_enable(void)<br>
> + {<br>
> +     // enable module clock<br>
> +     *(volatile uint8_t *) CM_PER_RNG_CLKCTRL = 2;<br>
> +     while( *(volatile uint32_t *) CM_PER_RNG_CLKCTRL & 0x30000 ) {}<br>
> + }<br>
> +<br>
> + static uint64_t TRNG_GetRandData(){<br>
> +     uint64_t output = rng->output;<br>
<br>
</span>'rng' isn't defined here.<br>
<span class=""><br>
> +     return output;<br>
> + }<br>
> +<br>
> + int getentropy(void *ptr, size_t n)<br>
> + {<br>
> +     rng_ref_t const rng = (rng_ref_t) RNG_BASE;<br>
> +     TRNG_Enable(rng);<br>
> +     while (n > 0) {<br>
> +         uint64_t random;<br>
> +         size_t copy;<br>
> +<br>
> +         while( ( rng->status & RNG_STATUS_RDY ) == 0 ); //wait<br>
<br>
</span>You should check specifically for the TRNG_STATUS_READY flag here like<br>
done in FreeBSD. I'm not sure what the other flags are but it's quite<br>
possible that there is also some error flag or similar. In that case it<br>
would not be a good idea to use the random number.<br>
<span class=""><br>
> +<br>
> +         random = TRNG_GetRandData(rng);<br>
<br>
</span>Note that you don't have to copy the function names from the atsam<br>
exactly. In the atsam BSP, the library has provided these names.<br>
Otherwise it's quite unusual to start functions with upper case in RTEMS.<br>
<span class=""><br>
> +<br>
> +         /*<br>
> +          * Read TRNG status one more time to avoid race condition.<br>
> +          * Otherwise we can read (and clear) an old ready status but get<br>
> +          * a new value. The ready status for this value wouldn't be<br>
> +          * reset.<br>
> +          */<br>
<br>
</span>That comment seems like it doesn't fit here any longer. You acknowledge<br>
the status instead in your next line. Just remove the comment.<br>
<span class=""><br>
> +         rng->status_clr = RNG_STATUS_RDY;<br>
> +<br>
> +         copy = sizeof(random);<br>
> +         if (n < copy ) {<br>
> +             copy = n;<br>
> +         }<br>
> +         memcpy(ptr, &random, copy);<br>
> +         n -= copy;<br>
> +         ptr += copy;<br>
> +     }<br>
> +<br>
> +     return 0;<br>
> + }<br>
> +<br>
> + RTEMS_SYSINIT_ITEM(<br>
> +   beagle_trng_clock_enable,<br>
> +   RTEMS_SYSINIT_DEVICE_DRIVERS,<br>
> +   RTEMS_SYSINIT_ORDER_LAST<br>
> + );<br>
><br>
> Regards,<br>
> Udit agarwal<br>
><br>
><br>
</span>> ______________________________<wbr>_________________<br>
> devel mailing list<br>
> <a href="mailto:devel@rtems.org">devel@rtems.org</a><br>
> <a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/<wbr>mailman/listinfo/devel</a><br>
><br>
</blockquote></div><br></div>