[PATCH] Added Getentropy() support to beagle BSP

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Mar 14 06:06:06 UTC 2018


On 14/03/18 00:38, Udit agarwal wrote:
> Hi,
> @Joel This seems to be SoC specific.

Yes, it is an on-chip peripheral.

>
> So, here is the implementation with mutex, Do let me know if this is 
> okay. I'll then do it for atsam also.
>
> int getentropy(void *ptr, size_t n)
> {
>     volatile am335x_trng_register  *rng = (am335x_trng_register*) 
> RNG_BASE;
>     rtems_mutex lock_trng_reg = RTEMS_MUTEX_INITIALIZER("lock_trng_reg");

In order to ensure mutual exclusion for a particular piece of code via a 
mutex object all threads must use the same mutex object. Here, you 
create a mutex object on the fly on the stack of the executing thread. 
So, each thread has its own mutex. This doesn't work. You must use a 
global mutex used by all threads. For example:

static rtems_mutex am335x_trng_mutex = RTEMS_MUTEX_INITIALIZER("AM335X 
TRNG");

>
>     while (n > 0)
>     {
>         uint64_t random;
>         size_t copy;
>
>         /* for mutual exclusion synchronization between multiple
>            access to TRNG register in different contexts */
>         rtems_mutex_lock(&lock_trng_reg);

I would do the lock/unlock around the while loop.

>
>         /* wait untill RNG becomes ready with next set of random data */
>         while( ( rng->status & RNG_STATUS_RDY ) == 0 )
>         {
>             /* wait */
>         }
>
>         random = trng_getranddata(rng);
>         /* clear the status flag after reading to generate new random
>            value */
>         rng->status_clr = RNG_STATUS_RDY;
>         rtems_mutex_unlock(&lock_trng_reg);
>
>         /* checking for error by masking all bits other then error bit in
>            status register */
>         if( ((rng->status & RNG_STATUS_ERR)>>1) == 1)
>         {
>             copy = sizeof(random);
>             if ( n < copy )
>             {
>                 copy = n;
>             }
>             memcpy(ptr, &random, copy);
>             n -= copy;
>             ptr = (char*)ptr + copy;
>         }
>     }
>
>     rtems_mutex_destroy(&lock_trng_reg);
>     return 0;
> }
>
>
> On Wed, Mar 14, 2018 at 2:15 AM, Joel Sherrill <joel at rtems.org 
> <mailto:joel at rtems.org>> wrote:
>
>
>
>     On Mar 13, 2018 1:31 AM, "Sebastian Huber"
>     <sebastian.huber at embedded-brains.de
>     <mailto:sebastian.huber at embedded-brains.de>> wrote:
>
>
>
>         On 12/03/18 20:02, Udit agarwal wrote:
>
>             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).
>
>             Thanks,
>             Udit agarwal
>
>
>             From 454a8ff3e0ea3393818859874705a54b098c6081 Mon Sep 17
>             00:00:00 2001
>             From: Udit agarwal <dev.madaari at gmail.com
>             <mailto:dev.madaari at gmail.com>
>             <mailto:dev.madaari at gmail.com
>             <mailto:dev.madaari at gmail.com>>>
>
>             Date: Tue, 13 Mar 2018 00:20:28 +0530
>             Subject: [PATCH] Added Getentropy() support to beagle BSP
>
>             ---
>              bsps/arm/include/libcpu/am335x.h |  37 ++++++-
>              c/src/lib/libbsp/arm/beagle/Makefile.am
>             <http://akefile.am> |   4 +-
>              .../libbsp/arm/beagle/getentropy/bbb_getentropy.c | 116
>             +++++++++++++++++++++
>              3 files changed, 155 insertions(+), 2 deletions(-)
>              create mode 100644
>             c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
>
>             diff --git a/bsps/arm/include/libcpu/am335x.h
>             b/bsps/arm/include/libcpu/am335x.h
>             index 367e97c..cedd637 100644
>             --- a/bsps/arm/include/libcpu/am335x.h
>             +++ b/bsps/arm/include/libcpu/am335x.h
>             @@ -14,11 +14,17 @@
>               * Modified by Ben Gras <beng at shrike-systems.com
>             <mailto:beng at shrike-systems.com>
>             <mailto:beng at shrike-systems.com
>             <mailto:beng at shrike-systems.com>>> to add lots
>
>               * of beagleboard/beaglebone definitions, delete lpc32xx
>             specific
>               * ones, and merge with some other header files.
>             + *
>             + * Modified by Udit agarwal <dev.madaari at gmail.com
>             <mailto:dev.madaari at gmail.com>
>             <mailto:dev.madaari at gmail.com
>             <mailto:dev.madaari at gmail.com>>> to add random
>
>             + * number generating module definitions and TRNG register
>             structure.
>               */
>
>              #if !defined(_AM335X_H_)
>              #define _AM335X_H_
>
>             +/* For TRNG register definition */
>             +#include <stdint.h>
>             +
>              /* Interrupt controller memory map */
>              #define OMAP3_DM37XX_INTR_BASE 0x48200000 /* INTCPS
>             physical address */
>
>             @@ -701,4 +707,33 @@
>              #define
>             AM335X_CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK
>             (0x00000020u)
>              #define AM335X_I2C_INT_STOP_CONDITION AM335X_I2C_IRQSTATUS_BF
>
>             -#endif
>             +/* TRNG Register */
>             +
>             +/* RNG base address */
>             +#define RNG_BASE 0x48310000
>             +/* RNG clock control */
>             +#define CM_PER_RNG_CLKCTRL (AM335X_CM_PER_ADDR | (9 << 4))
>             +/* rng module clock status bits */
>             +#define AM335X_CLK_RNG_BIT_MASK (0x30000)
>             +/* Offset from RNG base for output ready flag */
>             +#define RNG_STATUS_RDY (1u <<  0)
>             +/* Offset from RNG base for FRO related error */
>             +#define RNG_STATUS_ERR (1u <<  1)
>             +/* Offset from RNG base for clock status */
>             +#define RNG_STATUS_CLK (1u << 31)
>             +/* enable module */
>             +#define AM335X_RNG_ENABLE (1 << 10)
>             +
>             +/* TRNG register structure */
>             +struct bbb_trng_register
>             +{
>             +    uint64_t output;     /* 00 */
>             +    uint32_t status;     /* 08 */
>             +    uint32_t irq_en;     /* 0c */
>             +    uint32_t status_clr; /* 10 */
>             +    uint32_t control;    /* 14 */
>             +    uint32_t config;     /* 18 */
>             +};
>             +typedef struct bbb_trng_register bbb_trng_register;
>
>
>         The bbb (Beagle Bone Black) is a particular board and the
>         AM335X is a SoC family. This should be something like this
>
>         typedef struct {
>          ...
>         } am335x_trng;
>
>
>             +
>             +#endif
>             \ No newline at end of file
>
>
>         Git thinks that files should have a newline at the end of the
>         file.
>
>
>             diff --git a/c/src/lib/libbsp/arm/beagle/Makefile.am
>             b/c/src/lib/libbsp/arm/beagle/Makefile.am
>             index 8251660..5d5ade3 100644
>             --- a/c/src/lib/libbsp/arm/beagle/Makefile.am
>             +++ b/c/src/lib/libbsp/arm/beagle/Makefile.am
>             @@ -40,7 +40,6 @@ libbsp_a_LIBADD =
>
>              # Shared
>              libbsp_a_SOURCES += ../../shared/bootcard.c
>             -libbsp_a_SOURCES += ../../shared/getentropy-cpucounter.c
>              libbsp_a_SOURCES += ../../shared/src/bsp-fdt.c
>              libbsp_a_SOURCES += ../../shared/bspclean.c
>              libbsp_a_SOURCES += ../../shared/bspgetworkarea.c
>             @@ -88,6 +87,9 @@ libbsp_a_SOURCES += gpio/bbb-gpio.c
>              #pwm
>              libbsp_a_SOURCES += pwm/pwm.c
>
>             +#getentropy
>             +libbsp_a_SOURCES += getentropy/bbb_getentropy.c
>             +
>
>
>         With the new BSP source structure
>
>         https://devel.rtems.org/ticket/3285
>         <https://devel.rtems.org/ticket/3285>
>
>         this new file could be also placed at
>
>         bsps/arm/beagle/dev/getentropy.c
>
>
>     Is this specific to the Beagle or the SoC? Or a combination?
>     Earlier you said the structure was SoC specific?
>
>
>             [...]
>
>             +int getentropy(void *ptr, size_t n)
>             +{
>             +    volatile bbb_trng_register  *rng =
>             (bbb_trng_register*) RNG_BASE;
>             +    am335x_rng_enable(rng);
>             +    while (n > 0)
>             +    {
>             +        uint64_t random;
>             +        size_t copy;
>             +
>             +        /* wait untill RNG becomes ready with next set of
>             random data */
>             +        while( ( rng->status & RNG_STATUS_RDY ) == 0 )
>             +        {
>             +            /* wait */
>             +        }
>
>
>         What happens if you call this function in parallel on
>         different processors?
>
>             +
>             +        random = trng_getranddata(rng);
>             +
>             +        /* Checking for error by masking all bits other
>             then error bit in
>             +           status register */
>             +        if( ((rng->status & RNG_STATUS_ERR)>>1) == 1)
>             +        {
>             +            /* clear the status flag after reading to
>             generate new random
>             +               value */
>             +            rng->status_clr = RNG_STATUS_RDY;
>             +            copy = sizeof(random);
>             +            if ( n < copy )
>             +            {
>             +                copy = n;
>             +            }
>             +            memcpy(ptr, &random, copy);
>             +            n -= copy;
>             +            ptr = (char*)ptr + copy;
>             +        }
>             +    }
>             +
>             +    return 0;
>             +}
>             +
>             +RTEMS_SYSINIT_ITEM(
>             +    am335x_rng_clock_enable,
>             +    RTEMS_SYSINIT_DEVICE_DRIVERS,
>             +    RTEMS_SYSINIT_ORDER_LAST
>             +);
>             \ No newline at end of file
>             -- 
>             1.9.1
>
>
>
>
>             _______________________________________________
>             devel mailing list
>             devel at rtems.org <mailto:devel at rtems.org>
>             http://lists.rtems.org/mailman/listinfo/devel
>             <http://lists.rtems.org/mailman/listinfo/devel>
>
>
>         -- 
>         Sebastian Huber, embedded brains GmbH
>
>         Address : Dornierstr. 4, D-82178 Puchheim, Germany
>         <https://maps.google.com/?q=Dornierstr.+4,+D-82178+Puchheim,+Germany&entry=gmail&source=g>
>         Phone   : +49 89 189 47 41-16 <tel:%2B49%2089%20189%2047%2041-16>
>         Fax     : +49 89 189 47 41-09 <tel:%2B49%2089%20189%2047%2041-09>
>         E-Mail  : sebastian.huber at embedded-brains.de
>         <mailto:sebastian.huber at embedded-brains.de>
>         PGP     : Public key available on request.
>
>         Diese Nachricht ist keine geschäftliche Mitteilung im Sinne
>         des EHUG.
>
>
>         _______________________________________________
>         devel mailing list
>         devel at rtems.org <mailto:devel at rtems.org>
>         http://lists.rtems.org/mailman/listinfo/devel
>         <http://lists.rtems.org/mailman/listinfo/devel>
>
>
>
>
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.




More information about the devel mailing list