[PATCH] Added Getentropy() support to beagle BSP

Gedare Bloom gedare at rtems.org
Fri Mar 16 13:59:44 UTC 2018


Hello Udit,

Now I think you should re-send this patch as a separate submission. In
this case, it would also be a good idea to tag it as "v2". You can use
for this the "-v 2" command line argument to git-format-patch, and
then git-send-email on the output file(s). Probably, you may want to
resend your ATSAM one too if it has undergone revisions.

Gedare

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


More information about the devel mailing list