public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Marcin Wojtas <mw@semihalf.com>
To: Leif Lindholm <leif.lindholm@linaro.org>
Cc: "Ard Biesheuvel" <ard.biesheuvel@linaro.org>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	"Nadav Haklai" <nadavh@marvell.com>,
	"Neta Zur Hershkovits" <neta@marvell.com>,
	"Kostya Porotchkin" <kostap@marvell.com>,
	"Hua Jing" <jinghua@marvell.com>, "Jan Dąbroś" <jsd@semihalf.com>
Subject: Re: [platforms: PATCH 1/8] Marvell/Armada: Implement EFI_RNG_PROTOCOL driver for EIP76 TRNG
Date: Thu, 12 Oct 2017 06:39:46 +0200	[thread overview]
Message-ID: <CAPv3WKdLZ1ADQOjcvjitkUnn5YMGYhkEZ_DYKCmsSz-PP6fuNA@mail.gmail.com> (raw)
In-Reply-To: <CAKv+Gu9WBXYNGdytc3wHchKKNNxtjxi4NKUyLZhqorSsRYPpNA@mail.gmail.com>

2017-10-11 20:15 GMT+02:00 Ard Biesheuvel <ard.biesheuvel@linaro.org>:
> On 11 October 2017 at 17:47, Leif Lindholm <leif.lindholm@linaro.org> wrote:
>> On Wed, Oct 11, 2017 at 05:40:42PM +0200, Marcin Wojtas wrote:
>>> From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>>
>>> Add an implementation of EFI_RNG_PROTOCOL so that the OS loader has
>>> access to entropy for KASLR and other purposes (i.e., seeding the OS's
>>> entropy pool very early on).
>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.1
>>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>> Signed-off-by: Marcin Wojtas <mw@semihalf.com>
>>> ---
>>>  Platform/Marvell/Armada/Armada.dsc.inc                                |   4 +
>>>  Platform/Marvell/Armada/Armada70x0.fdf                                |   1 +
>>>  Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.c   | 254 ++++++++++++++++++++
>>>  Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.inf |  47 ++++
>>>  Platform/Marvell/Marvell.dec                                          |   3 +
>>>  5 files changed, 309 insertions(+)
>>>
>>> diff --git a/Platform/Marvell/Armada/Armada.dsc.inc b/Platform/Marvell/Armada/Armada.dsc.inc
>>> index 1aa485c..ec24d76 100644
>>> --- a/Platform/Marvell/Armada/Armada.dsc.inc
>>> +++ b/Platform/Marvell/Armada/Armada.dsc.inc
>>> @@ -364,6 +364,9 @@
>>>    gArmTokenSpaceGuid.PcdSystemMemorySize|0x40000000
>>>    gArmTokenSpaceGuid.PcdArmScr|0x531
>>>
>>> +  # TRNG
>>> +  gMarvellTokenSpaceGuid.PcdEip76TrngBaseAddress|0xF2760000
>>> +
>>>  ################################################################################
>>>  #
>>>  # Components Section - list of all EDK II Modules needed by this Platform
>>> @@ -400,6 +403,7 @@
>>>    Platform/Marvell/Drivers/I2c/Devices/MvEeprom/MvEeprom.inf
>>>    Platform/Marvell/Drivers/Spi/MvSpiDxe.inf
>>>    Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf
>>> +  Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.inf
>>>
>>>    # Network support
>>>    MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
>>> diff --git a/Platform/Marvell/Armada/Armada70x0.fdf b/Platform/Marvell/Armada/Armada70x0.fdf
>>> index 933c3ed..a94a9ff 100644
>>> --- a/Platform/Marvell/Armada/Armada70x0.fdf
>>> +++ b/Platform/Marvell/Armada/Armada70x0.fdf
>>> @@ -113,6 +113,7 @@ FvNameGuid         = 5eda4200-2c5f-43cb-9da3-0baf74b1b30c
>>>    INF Platform/Marvell/Drivers/I2c/Devices/MvEeprom/MvEeprom.inf
>>>    INF Platform/Marvell/Drivers/Spi/MvSpiDxe.inf
>>>    INF Platform/Marvell/Drivers/Spi/Devices/MvSpiFlash.inf
>>> +  INF Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.inf
>>>
>>>    # Network support
>>>    INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
>>> diff --git a/Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.c b/Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.c
>>> new file mode 100644
>>> index 0000000..dca6dcc
>>> --- /dev/null
>>> +++ b/Platform/Marvell/Armada/Drivers/Armada70x0RngDxe/Armada70x0RngDxe.c
>>> @@ -0,0 +1,254 @@
>>> +/** @file
>>> +
>>> +  This driver produces an EFI_RNG_PROTOCOL instance for the Armada 70x0 TRNG
>>> +
>>> +  Copyright (C) 2017, Linaro Ltd. All rights reserved.<BR>
>>> +
>>> +  This program and the accompanying materials are licensed and made available
>>> +  under the terms and conditions of the BSD License which accompanies this
>>> +  distribution. The full text of the license may be found at
>>> +  http://opensource.org/licenses/bsd-license.php
>>> +
>>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
>>> +  WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>>> +
>>> +**/
>>> +
>>> +#include <Library/BaseMemoryLib.h>
>>> +#include <Library/IoLib.h>
>>> +#include <Library/PcdLib.h>
>>> +#include <Library/UefiBootServicesTableLib.h>
>>> +
>>> +#include <Protocol/Rng.h>
>>> +
>>> +#define TRNG_OUTPUT_REG                         mTrngBaseAddress
>>> +#define TRNG_OUTPUT_SIZE                        0x10
>>> +
>>> +#define TRNG_STATUS_REG                         (mTrngBaseAddress + 0x10)
>>> +#define TRNG_STATUS_READY                       BIT0
>>> +
>>> +#define TRNG_INTACK_REG                         (mTrngBaseAddress + 0x10)
>>> +#define TRNG_INTACK_READY                       BIT0
>>> +
>>> +#define TRNG_CONTROL_REG                        (mTrngBaseAddress + 0x14)
>>> +#define TRNG_CONTROL_REG_ENABLE                 BIT10
>>> +
>>> +#define TRNG_CONFIG_REG                         (mTrngBaseAddress + 0x18)
>>> +#define __MIN_REFILL_SHIFT                      0
>>> +#define __MAX_REFILL_SHIFT                      16
>>> +#define TRNG_CONFIG_MIN_REFILL_CYCLES           (0x05 << __MIN_REFILL_SHIFT)
>>> +#define TRNG_CONFIG_MAX_REFILL_CYCLES           (0x22 << __MAX_REFILL_SHIFT)
>>> +
>>> +#define TRNG_FRODETUNE_REG                      (mTrngBaseAddress + 0x24)
>>> +#define TRNG_FRODETUNE_MASK                     0x0
>>> +
>>> +#define TRNG_FROENABLE_REG                      (mTrngBaseAddress + 0x20)
>>> +#define TRNG_FROENABLE_MASK                     0xffffff
>>> +
>>> +#define TRNG_MAX_RETRIES                        20
>>> +
>>> +STATIC EFI_PHYSICAL_ADDRESS                     mTrngBaseAddress;
>>> +
>>> +/**
>>> +  Returns information about the random number generation implementation.
>>> +
>>> +  @param[in]     This                 A pointer to the EFI_RNG_PROTOCOL
>>> +                                      instance.
>>> +  @param[in,out] RNGAlgorithmListSize On input, the size in bytes of
>>> +                                      RNGAlgorithmList.
>>> +                                      On output with a return code of
>>> +                                      EFI_SUCCESS, the size in bytes of the
>>> +                                      data returned in RNGAlgorithmList. On
>>> +                                      output with a return code of
>>> +                                      EFI_BUFFER_TOO_SMALL, the size of
>>> +                                      RNGAlgorithmList required to obtain the
>>> +                                      list.
>>> +  @param[out] RNGAlgorithmList        A caller-allocated memory buffer filled
>>> +                                      by the driver with one EFI_RNG_ALGORITHM
>>> +                                      element for each supported RNG algorithm.
>>> +                                      The list must not change across multiple
>>> +                                      calls to the same driver. The first
>>> +                                      algorithm in the list is the default
>>> +                                      algorithm for the driver.
>>> +
>>> +  @retval EFI_SUCCESS                 The RNG algorithm list was returned
>>> +                                      successfully.
>>> +  @retval EFI_UNSUPPORTED             The services is not supported by this
>>> +                                      driver.
>>> +  @retval EFI_DEVICE_ERROR            The list of algorithms could not be
>>> +                                      retrieved due to a hardware or firmware
>>> +                                      error.
>>> +  @retval EFI_INVALID_PARAMETER       One or more of the parameters are
>>> +                                      incorrect.
>>> +  @retval EFI_BUFFER_TOO_SMALL        The buffer RNGAlgorithmList is too small
>>> +                                      to hold the result.
>>> +
>>> +**/
>>> +STATIC
>>> +EFI_STATUS
>>> +EFIAPI
>>> +Armada70x0RngGetInfo (
>>> +  IN      EFI_RNG_PROTOCOL        *This,
>>> +  IN OUT  UINTN                   *RNGAlgorithmListSize,
>>> +  OUT     EFI_RNG_ALGORITHM       *RNGAlgorithmList
>>> +  )
>>> +{
>>> +  if (This == NULL || RNGAlgorithmListSize == NULL) {
>>> +    return EFI_INVALID_PARAMETER;
>>> +  }
>>> +
>>> +  if (*RNGAlgorithmListSize < sizeof (EFI_RNG_ALGORITHM)) {
>>> +    *RNGAlgorithmListSize = sizeof (EFI_RNG_ALGORITHM);
>>> +    return EFI_BUFFER_TOO_SMALL;
>>> +  }
>>> +
>>> +  if (RNGAlgorithmList == NULL) {
>>> +    return EFI_INVALID_PARAMETER;
>>> +  }
>>> +
>>> +  *RNGAlgorithmListSize = sizeof (EFI_RNG_ALGORITHM);
>>> +  CopyGuid (RNGAlgorithmList, &gEfiRngAlgorithmRaw);
>>> +
>>> +  return EFI_SUCCESS;
>>> +}
>>> +
>>> +STATIC
>>> +EFI_STATUS
>>> +GetTrngData (
>>> +  IN    UINTN   Length,
>>> +  OUT   UINT8   *Bits
>>> +  )
>>> +{
>>> +  UINTN   Tries;
>>> +  UINT32  Buf[TRNG_OUTPUT_SIZE / sizeof (UINT32)];
>>> +  UINTN   Index;
>>> +
>>> +  for (Tries = 0; Tries < TRNG_MAX_RETRIES; Tries++) {
>>> +    if (MmioRead32 (TRNG_STATUS_REG) & TRNG_STATUS_READY) {
>>> +      for (Index = 0; Index < ARRAY_SIZE (Buf); Index++) {
>>> +        Buf[Index] = MmioRead32 (TRNG_OUTPUT_REG + Index * sizeof (UINT32));
>>> +      }
>>> +      CopyMem (Bits, Buf, Length);
>>> +      MmioWrite32 (TRNG_INTACK_REG, TRNG_INTACK_READY);
>>> +
>>> +      return EFI_SUCCESS;
>>> +    }
>>> +    gBS->Stall (10);
>>
>> Why? Why 10? Please add a comment.
>>
>> No other comments on this patch.
>>
>
> I don't remember the details, and I think the 1 ms delay was chosen
> arbitrarily, but the purpose of the delay is to allow the hardware to
> assume the 'ready' state.
>

I don't have EIP150 docs, but how about a comment:

// Polling interval for obtaining TRNG data is 10us
gBS->Stall (10);

I know it's not perfect, but would you accept it?:)

Best regards,
Marcin


  reply	other threads:[~2017-10-12  4:36 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-11 15:40 [platforms: PATCH 0/8] Armada 7k/8k - memory improvements Marcin Wojtas
2017-10-11 15:40 ` [platforms: PATCH 1/8] Marvell/Armada: Implement EFI_RNG_PROTOCOL driver for EIP76 TRNG Marcin Wojtas
2017-10-11 16:47   ` Leif Lindholm
2017-10-11 18:15     ` Ard Biesheuvel
2017-10-12  4:39       ` Marcin Wojtas [this message]
2017-10-12 10:24         ` Leif Lindholm
2017-10-11 15:40 ` [platforms: PATCH 2/8] Marvell/Armada: Increase preallocated memory region size Marcin Wojtas
2017-10-11 16:56   ` Leif Lindholm
2017-10-11 15:40 ` [platforms: PATCH 3/8] Marvell/Armada: Remove custom reset library residues Marcin Wojtas
2017-10-11 16:56   ` Leif Lindholm
2017-10-11 15:40 ` [platforms: PATCH 4/8] Marvell/Armada: Add support from DRAM remapping Marcin Wojtas
2017-10-11 17:08   ` Leif Lindholm
2017-10-11 18:18     ` Ard Biesheuvel
2017-10-12  4:58       ` Marcin Wojtas
2017-10-12 10:29         ` Leif Lindholm
2017-10-11 15:40 ` [platforms: PATCH 5/8] Marvell/Armada: Add MemoryInitPeiLib that reserves secure region Marcin Wojtas
2017-10-11 17:11   ` Leif Lindholm
2017-10-11 15:40 ` [platforms: PATCH 6/8] Marvell/Armada: Enable dynamic DRAM size detection Marcin Wojtas
2017-10-11 17:56   ` Leif Lindholm
2017-10-12  5:47     ` Marcin Wojtas
2017-10-12 10:50       ` Leif Lindholm
2017-10-12 10:58         ` Marcin Wojtas
2017-10-11 15:40 ` [platforms: PATCH 7/8] Marvell/Armada: Armada70x0Lib: Add support for 32-bit ARM Marcin Wojtas
2017-10-11 17:57   ` Leif Lindholm
2017-10-11 15:40 ` [platforms: PATCH 8/8] Marvell/Armada: Add 32-bit ARM support Marcin Wojtas
2017-10-11 17:58   ` Leif Lindholm
2017-10-11 18:20     ` Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAPv3WKdLZ1ADQOjcvjitkUnn5YMGYhkEZ_DYKCmsSz-PP6fuNA@mail.gmail.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox