[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