[PATCH] Added Getentropy() support to beagle BSP

Christian Mauderer list at c-mauderer.de
Mon Mar 12 20:43:33 UTC 2018


Am 12.03.2018 um 20:02 schrieb Udit agarwal:
> 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
> 

Good news: I tested the patch and the getentropy01 test worked without
problems. So I would say it is nearly ready to get pushed.

The bad news: I have still found two points about the patch:


1. It seems odd that you call am335x_rng_enable(rng) every time
getentropy is called. From the name, I would expect that it enables the
rng which should happen only one time. Are you sure that this is
necessary? The NetBSD driver you linked some time back seems to do it
only during initialization:
http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/arch/arm/omap/am335x_trng.c

So I would suggest to put am335x_rng_clock_enable and am335x_rng_enable
into one function and call that with the RTEMS_SYSINIT_ITEM. If it still
works as expected, that would most likely be the better solution.


2. This is a minor problem: Whitespace errors.

These could theoretically even be fixed when applying the patch with a
'git am --whitespace=fix'. But it would be better if that wouldn't be
necessary. Therefore some explanation:

If I apply the patch, I get a lot of them:

--------
Applying: Added Getentropy() support to beagle BSP
/home/christian/rtems/rtems-bbb/.git/modules/rtems/rebase-apply/patch:44:
trailing whitespace.
#define RNG_STATUS_RDY (1u <<  0)
[...]
warning: squelched 16 whitespace errors
warning: 21 lines add whitespace errors.
--------

These are quite hard to spot if you don't use Colors in git or in your
editor. For git I would suggest to add this setting:

    git config --global color.ui auto

If you then use "git diff" or similar commands, you'll see white spaces
at the end of a line highlighted quite clearly:
https://gist.github.com/c-mauderer/c621b50173ed1fb702bec0f7ff312c41

Best regards

Christian

> 
> From 454a8ff3e0ea3393818859874705a54b098c6081 Mon Sep 17 00:00:00 2001
> From: Udit agarwal <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            |   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>> 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>> 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;
> +
> +#endif
> \ No newline at end of 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
> +
>  #RTC
>  libbsp_a_SOURCES += rtc.c
>  libbsp_a_SOURCES += ../../shared/tod.c
> diff --git a/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
> b/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
> new file mode 100644
> index 0000000..134bf3b
> --- /dev/null
> +++ b/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
> @@ -0,0 +1,116 @@
> +/**
> +* @file
> +*
> +* @ingroup arm_beagle
> +*
> +* @brief Getentropy implementation on BeagleBone Black BSP
> +*/
> +
> +/*
> +* Copyright (c) 2018 Udit agarwal <dev.madaari at gmail.com
> <http://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 <stdint.h>
> +
> +/* max refill 34 * 256 cycles */
> +#define AM335X_RNG_MAX_REFILL (34 << 16)
> +/* min refill 33 * 64 cycles */
> +#define AM335X_RNG_MIN_REFILL (33 << 0)
> +/* startup 33 * 256 cycles */
> +#define AM335X_RNG_STARTUP_CYCLES (33 << 16)
> +
> +/* maximun and minimum refill cycle sets the number of samples to be taken
> +   from FRO to generate random number */
> +static void am335x_rng_enable(volatile bbb_trng_register *rng)
> +{
> +    rng->control = rng->config = 0;
> +    rng->config |= AM335X_RNG_MIN_REFILL | AM335X_RNG_MAX_REFILL ;
> +    rng->control |= AM335X_RNG_STARTUP_CYCLES | AM335X_RNG_ENABLE ;
> +}
> +
> +static void am335x_rng_clock_enable(void)
> +{
> +    *(volatile uint8_t *) CM_PER_RNG_CLKCTRL = 2;
> +    while(
> +      *(volatile uint32_t *) CM_PER_RNG_CLKCTRL &
> +      AM335X_CLK_RNG_BIT_MASK
> +    ) {
> +        /* wait */
> +    }
> +}
> +
> +static uint64_t trng_getranddata(volatile bbb_trng_register *rng)
> +{
> +    uint64_t output = rng->output;
> +    return output;
> +}
> +
> +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 */
> +        }
> +
> +        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
> http://lists.rtems.org/mailman/listinfo/devel
> 



More information about the devel mailing list