public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Leif Lindholm <leif.lindholm@linaro.org>
To: kalyan-nagabhirava <kalyankumar.nagabhirava@linaro.org>
Cc: edk2-devel@lists.01.org, ard.biesheuvel@linaro.org,
	mark.gregotski@linaro.org, lersek@redhat.com
Subject: Re: [PATCH] [edk2-platforms]:Enabling Secure boot feature support on hikey platfrom
Date: Sun, 26 Nov 2017 15:22:06 +0000	[thread overview]
Message-ID: <20171126152206.yhb7gvofp4ne6f62@bivouac.eciton.net> (raw)
In-Reply-To: <20171121105336.26699-1-kalyankumar.nagabhirava@linaro.org>

(Adding Laszlo to cc based on a single comment I make below.)

On Tue, Nov 21, 2017 at 04:23:36PM +0530, kalyan-nagabhirava wrote:
> Added required library packages related to secure boot  in hikey.dsc and Blockvariable driver[
> from 96-board edk2 fork] to support the NV storage of the variables.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: kalyan-nagabhirava <kalyankumar.nagabhirava@linaro.org>
> ---
>  Platform/Hisilicon/HiKey/HiKey.dec                 |  10 +
>  Platform/Hisilicon/HiKey/HiKey.dsc                 |  56 ++-
>  Platform/Hisilicon/HiKey/HiKey.fdf                 |  13 +-
>  Platform/Hisilicon/HiKey/VarStore.fdf.inc          |  72 ++++
>  .../Drivers/BlockVariableDxe/BlockVariableDxe.c    | 444 +++++++++++++++++++++
>  .../Drivers/BlockVariableDxe/BlockVariableDxe.h    |  51 +++
>  .../Drivers/BlockVariableDxe/BlockVariableDxe.inf  |  65 +++

First high-level comments:
Like for the USB driver, could you please split this up into two
separate patches:
- one for the driver
- one for the HiKey configuration/description files.

>  7 files changed, 706 insertions(+), 5 deletions(-)
>  create mode 100644 Platform/Hisilicon/HiKey/VarStore.fdf.inc
>  create mode 100644 Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.c
>  create mode 100644 Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.h
>  create mode 100644 Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.inf
> 
> diff --git a/Platform/Hisilicon/HiKey/HiKey.dec b/Platform/Hisilicon/HiKey/HiKey.dec
> index 537138eb4..e27d70447 100644
> --- a/Platform/Hisilicon/HiKey/HiKey.dec
> +++ b/Platform/Hisilicon/HiKey/HiKey.dec
> @@ -30,7 +30,17 @@
>  
>  [Guids.common]
>    gHiKeyTokenSpaceGuid          =  { 0x91148425, 0xcdd2, 0x4830, { 0x8b, 0xd0, 0xc6, 0x1c, 0x6d, 0xea, 0x36, 0x21 } }
> +  gHwTokenSpaceGuid             =  { 0x99999999, 0x74c5, 0x4043, { 0xb4, 0x17, 0xa3, 0x22, 0x38, 0x14, 0xce, 0x76 } }

This very much looks like a not properly generated GUID.
GUIDs must always be generated using an RFC4122-compliant algorithm.
I generally recommend using
https://www.guidgenerator.com/online-guid-generator.aspx.

That said, I am not sure any of the additions to this file really
belong in this file. It feels to me these could all be added to
Silicon/Hisilicon/HisiPkg.dec, reusing gHisiTokenSpaceGuid.
(This would then belong in the first, driver, patch I mention above
rather than the second one.)

>  
>  [PcdsFixedAtBuild.common]
>    gHiKeyTokenSpaceGuid.PcdAndroidFastbootNvmDevicePath|L""|VOID*|0x00000001
>    gHiKeyTokenSpaceGuid.PcdArmFastbootFlashLimit|L""|VOID*|0x00000002
> +
> +  # NV Block
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockLba|0|UINT32|0x01000012
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockSize|0|UINT32|0x0100011
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockCount|0|UINT32|0x0100010
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockDevicePath|L""|VOID*|0x01000013
> +  
> +  # UncachedAllocationLib
> +  gArmTokenSpaceGuid.PcdArmUncachedMemoryMask|0x0000000080000000|UINT64|0x00000002

This UncachedAllocationLib stuff is not even used in this patch (but
if it was, it should not use gArmTokenSpaceGuid when declared outside
ArmPkg).

> diff --git a/Platform/Hisilicon/HiKey/HiKey.dsc b/Platform/Hisilicon/HiKey/HiKey.dsc
> index 2e3b1c879..a7288b125 100644
> --- a/Platform/Hisilicon/HiKey/HiKey.dsc
> +++ b/Platform/Hisilicon/HiKey/HiKey.dsc
> @@ -26,6 +26,8 @@
>    SKUID_IDENTIFIER               = DEFAULT
>    FLASH_DEFINITION               = Platform/Hisilicon/HiKey/HiKey.fdf
>  
> +  DEFINE SECURE_BOOT_ENABLE	 = FALSE
> +
>  [LibraryClasses.common]
>  !if $(TARGET) == RELEASE
>    DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
> @@ -125,6 +127,18 @@
>    # Add support for GCC stack protector
>    NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
>  
> +!if $(SECURE_BOOT_ENABLE) == TRUE
> +  IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
> +  TpmMeasurementLib|SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf
> +  AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf
> +  VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
> +  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> +  OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf
> +  PlatformSecureLib|OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf
> +  BdsLib|ArmPkg/Library/BdsLib/BdsLib.inf
> +  DmaLib|EmbeddedPkg/Library/NonCoherentDmaLib/NonCoherentDmaLib.inf
> +!endif
> +
>  [LibraryClasses.common.SEC]
>    PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
>    ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
> @@ -160,6 +174,7 @@
>    HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>    MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>    ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
> +  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
>  
>  [BuildOptions]
>    GCC:*_*_*_PLATFORM_FLAGS = -I$(WORKSPACE)/Silicon/Hisilicon/Hi6220/Include -I$(WORKSPACE)/Platform/Hisilicon/HiKey/Include
> @@ -337,6 +352,29 @@
>    gEmbeddedTokenSpaceGuid.PcdAndroidFastbootUsbVendorId|0x18d1
>    gEmbeddedTokenSpaceGuid.PcdAndroidFastbootUsbProductId|0xd00d
>  
> +  # 
> +  # NV Storage PCDs.
> +  #
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockCount|0x00001000
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockSize|0x00000200
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockLba|0x00006000
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockDevicePath|L"VenHw(B549F005-4BD4-4020-A0CB-06F42BDA68C3)/HD(5,GPT,00354BCD-BBCB-4CB3-B5AE-CDEFCB5DAC43)"
> +
> +  #
> +  # ARM Pcds
> +  #
> +  gArmTokenSpaceGuid.PcdArmUncachedMemoryMask|0x0000000000000000
> +

So this one can probably be deleted too.

> +  # Increase storage space of UEFI variable to 2KB so that it can store root certificate
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x800
> +
> +!if $(SECURE_BOOT_ENABLE) == TRUE
> +  # override the default values from SecurityPkg to ensure images from all sources are verified in secure boot
> +  gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy|0x04
> +  gEfiSecurityPkgTokenSpaceGuid.PcdFixedMediaImageVerificationPolicy|0x04
> +  gEfiSecurityPkgTokenSpaceGuid.PcdRemovableMediaImageVerificationPolicy|0x04
> +!endif
> +
>  ################################################################################
>  #
>  # Components Section - list of all EDK II Modules needed by this Platform
> @@ -362,7 +400,6 @@
>    #
>    ArmPkg/Drivers/CpuDxe/CpuDxe.inf
>    MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
> -  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
>    MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
>    EmbeddedPkg/EmbeddedMonotonicCounter/EmbeddedMonotonicCounter.inf
>    MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
> @@ -375,7 +412,6 @@
>    MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
>  
>    MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
> -  MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
>  
>    ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
>    ArmPkg/Drivers/TimerDxe/TimerDxe.inf
> @@ -478,3 +514,19 @@
>        gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
>        gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
>    }
> +
> +  #
> +  # SecureBoot
> +  #
> +!if $(SECURE_BOOT_ENABLE) == TRUE
> +  MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
> +  SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf  
> +  Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.inf
> +  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf {
> +    <LibraryClasses>
> +      NULL|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
> +  }
> +!else
> +  MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
> +  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
> +!endif
> diff --git a/Platform/Hisilicon/HiKey/HiKey.fdf b/Platform/Hisilicon/HiKey/HiKey.fdf
> index d277bd6ce..04f98c637 100644
> --- a/Platform/Hisilicon/HiKey/HiKey.fdf
> +++ b/Platform/Hisilicon/HiKey/HiKey.fdf
> @@ -26,12 +26,12 @@
>  
>  [FD.BL33_AP_UEFI]
>  BaseAddress   = 0x35000000|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
> -Size          = 0x000F0000|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
> +Size          = 0x00200000|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device

This is a substantial enough change to motivate a mention in the
commit message.

>  ErasePolarity = 1
>  
>  # This one is tricky, it must be: BlockSize * NumBlocks = Size
>  BlockSize     = 0x00001000
> -NumBlocks     = 0xF0
> +NumBlocks     = 0x200
>  
>  ################################################################################
>  #
> @@ -49,10 +49,11 @@ NumBlocks     = 0xF0
>  #
>  ################################################################################
>  
> -0x00000000|0x000F0000
> +0x00000000|0x00140000
>  gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
>  FV = FVMAIN_COMPACT
>  
> +!include VarStore.fdf.inc
>  
>  ################################################################################
>  #
> @@ -172,7 +173,13 @@ READ_LOCK_STATUS   = TRUE
>    INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
>  
>    INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
> +!if $(SECURE_BOOT_ENABLE) == TRUE
> +  INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
> +  INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
> +  INF Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.inf
> +!else
>    INF MdeModulePkg/Universal/Variable/EmuRuntimeDxe/EmuVariableRuntimeDxe.inf
> +!endif
>  
>    INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>  
> diff --git a/Platform/Hisilicon/HiKey/VarStore.fdf.inc b/Platform/Hisilicon/HiKey/VarStore.fdf.inc
> new file mode 100644
> index 000000000..492b06abc
> --- /dev/null
> +++ b/Platform/Hisilicon/HiKey/VarStore.fdf.inc
> @@ -0,0 +1,72 @@
> +## @file
> +#  FDF include file with Layout Regions that define an empty variable store.
> +#
> +#  Copyright (C) 2014, Red Hat, Inc.
> +#  Copyright (c) 2006 - 2013, Intel Corporation. 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.
> +#
> +##
> +
> +0x00140000|0x00040000
> +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
> +#NV_VARIABLE_STORE
> +DATA = {
> +  ## This is the EFI_FIRMWARE_VOLUME_HEADER
> +  # ZeroVector []
> +  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +  # FileSystemGuid: gEfiSystemNvDataFvGuid         =
> +  #   { 0xFFF12B8D, 0x7696, 0x4C8B,
> +  #     { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }}
> +  0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C,
> +  0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50,
> +  # FvLength: 0xC0000
> +  0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
> +  # Signature "_FVH"       # Attributes
> +  0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00,
> +  # HeaderLength # CheckSum # ExtHeaderOffset #Reserved #Revision
> +  0x48, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x02,
> +  # Blockmap[0]: 0x3 Blocks * 0x40000 Bytes / Block
> +  0x3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
> +  # Blockmap[1]: End
> +  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> +  ## This is the VARIABLE_STORE_HEADER
> +  # It is compatible with SECURE_BOOT_ENABLE == FALSE as well.
> +  # Signature: gEfiAuthenticatedVariableGuid =
> +  #   { 0xaaf32c78, 0x947b, 0x439a,
> +  #     { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }}
> +  0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43,
> +  0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92,
> +  # Size: 0x40000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) -
> +  #         0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) = 0x3ffb8
> +  # This can speed up the Variable Dispatch a bit.
> +  0xB8, 0xFF, 0x03, 0x00,
> +  # FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32
> +  0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> +}
> +
> +0x00180000|0x00040000
> +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
> +#NV_FTW_WORKING
> +DATA = {
> +  # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid         =
> +  #  { 0x9e58292b, 0x7c68, 0x497d, { 0xa0, 0xce, 0x65,  0x0, 0xfd, 0x9f, 0x1b, 0x95 }}
> +  0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49,
> +  0xa0, 0xce, 0x65,  0x0, 0xfd, 0x9f, 0x1b, 0x95,
> +  # Crc:UINT32            #WorkingBlockValid:1, WorkingBlockInvalid:1, Reserved
> +  0x5b, 0xe7, 0xc6, 0x86, 0xFE, 0xFF, 0xFF, 0xFF,
> +  # WriteQueueSize: UINT64
> +  0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00
> +}
> +
> +0x001c0000|0x00040000
> +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
> +#NV_FTW_SPARE
> diff --git a/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.c b/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.c
> new file mode 100644
> index 000000000..fb4c08252
> --- /dev/null
> +++ b/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.c
> @@ -0,0 +1,444 @@
> +/** @file
> +  This file implement the Variable Protocol for the block device.
> +
> +  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +
> +  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 <Guid/VariableFormat.h>
> +#include <Guid/SystemNvDataGuid.h>
> +
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/CacheMaintenanceLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/DevicePathLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +
> +#include "BlockVariableDxe.h"
> +
> +
> +STATIC EFI_PHYSICAL_ADDRESS      mMapNvStorageVariableBase;
> +
> +EFI_STATUS
> +EFIAPI
> +FvbGetAttributes (
> +  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL    *This,
> +  OUT       EFI_FVB_ATTRIBUTES_2                   *Attributes
> +  )
> +{
> +  EFI_FVB_ATTRIBUTES_2 FvbAttributes;
> +  FvbAttributes = (EFI_FVB_ATTRIBUTES_2) (
> +
> +      EFI_FVB2_READ_ENABLED_CAP | // Reads may be enabled
> +      EFI_FVB2_READ_STATUS      | // Reads are currently enabled
> +      EFI_FVB2_STICKY_WRITE     | // A block erase is required to flip bits into EFI_FVB2_ERASE_POLARITY
> +      EFI_FVB2_MEMORY_MAPPED    | // It is memory mapped
> +      EFI_FVB2_ERASE_POLARITY     // After erasure all bits take this value (i.e. '1')
> +
> +      );
> +  FvbAttributes |= EFI_FVB2_WRITE_STATUS      | // Writes are currently enabled
> +                   EFI_FVB2_WRITE_ENABLED_CAP;  // Writes may be enabled
> +
> +  *Attributes = FvbAttributes;
> +
> +  DEBUG ((DEBUG_BLKIO, "FvbGetAttributes(0x%X)\n", *Attributes));
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FvbSetAttributes(
> +  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL  *This,
> +  IN OUT    EFI_FVB_ATTRIBUTES_2                 *Attributes
> +  )
> +{
> +  DEBUG ((DEBUG_BLKIO, "FvbSetAttributes(0x%X) is not supported\n",*Attributes));
> +  return EFI_UNSUPPORTED;

As per my (very) recent comment to Marcin, I do not believe returning
EFI_UNSUPPORTED is a valid thing to do here. Which to me suggests the
implementation of FvbGetAttributes is also incorrect.

Laszlo - what's your take on this in conjunction with PI 1.6 section
3.4.2? OvmfPkg does something very similar in
EmuVariableFvbRuntimeDxe/Fvb.c.

> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FvbGetPhysicalAddress (
> +  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL  *This,
> +  OUT       EFI_PHYSICAL_ADDRESS                 *Address
> +  )
> +{
> +  *Address = mMapNvStorageVariableBase;
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FvbGetBlockSize (
> +  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL  *This,
> +  IN        EFI_LBA                              Lba,
> +  OUT       UINTN                                *BlockSize,
> +  OUT       UINTN                                *NumberOfBlocks
> +  )
> +{
> +  BLOCK_VARIABLE_INSTANCE       *Instance;
> +
> +  Instance = CR (This, BLOCK_VARIABLE_INSTANCE, FvbProtocol, BLOCK_VARIABLE_SIGNATURE);
> +  *BlockSize = (UINTN) Instance->Media.BlockSize;
> +  *NumberOfBlocks = PcdGet32 (PcdNvStorageVariableBlockCount);
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FvbRead (
> +  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL   *This,
> +  IN        EFI_LBA                               Lba,
> +  IN        UINTN                                 Offset,
> +  IN OUT    UINTN                                 *NumBytes,
> +  IN OUT    UINT8                                 *Buffer
> +  )
> +{
> +  BLOCK_VARIABLE_INSTANCE       *Instance;
> +  EFI_BLOCK_IO_PROTOCOL         *BlockIo;
> +  EFI_STATUS                    Status;
> +  UINTN                         Bytes;
> +  VOID                          *DataPtr;
> +
> +  Instance = CR (This, BLOCK_VARIABLE_INSTANCE, FvbProtocol, BLOCK_VARIABLE_SIGNATURE);
> +  BlockIo = Instance->BlockIoProtocol;
> +  Bytes = (Offset + *NumBytes + Instance->Media.BlockSize - 1) / Instance->Media.BlockSize * Instance->Media.BlockSize;
> +  DataPtr = AllocateZeroPool (Bytes);
> +  if (DataPtr == NULL) {
> +    DEBUG ((EFI_D_ERROR, "FvbWrite: failed to allocate buffer.\n"));
> +    return EFI_BUFFER_TOO_SMALL;
> +  }
> +  WriteBackDataCacheRange (DataPtr, Bytes);
> +  InvalidateDataCacheRange (Buffer, *NumBytes);
> +  Status = BlockIo->ReadBlocks (BlockIo, BlockIo->Media->MediaId, Instance->StartLba + Lba,
> +		                Bytes, DataPtr);

Spotted some tabs in indentation here.
In general, please run patches through
"python BaseTools/Scripts/PatchCheck.py" before submission to catch
some basic formatting issues like this.

> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "FvbRead StartLba:%x, Lba:%x, Offset:%x, Status:%x\n",
> +	    Instance->StartLba, Lba, Offset, Status));

(Here too.)

/
    Leif

> +    goto exit;
> +  }
> +  CopyMem (Buffer, DataPtr + Offset, *NumBytes);
> +  WriteBackDataCacheRange (Buffer, *NumBytes);
> +exit:
> +  FreePool (DataPtr);
> +  return Status;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FvbWrite (
> +  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL   *This,
> +  IN        EFI_LBA                               Lba,
> +  IN        UINTN                                 Offset,
> +  IN OUT    UINTN                                 *NumBytes,
> +  IN        UINT8                                 *Buffer
> +  )
> +{
> +  BLOCK_VARIABLE_INSTANCE       *Instance;
> +  EFI_BLOCK_IO_PROTOCOL         *BlockIo;
> +  EFI_STATUS                    Status;
> +  UINTN                         Bytes;
> +  VOID                          *DataPtr;
> +
> +  Instance = CR (This, BLOCK_VARIABLE_INSTANCE, FvbProtocol, BLOCK_VARIABLE_SIGNATURE);
> +  BlockIo = Instance->BlockIoProtocol;
> +  Bytes = (Offset + *NumBytes + Instance->Media.BlockSize - 1) / Instance->Media.BlockSize * Instance->Media.BlockSize;
> +  DataPtr = AllocateZeroPool (Bytes);
> +  if (DataPtr == NULL) {
> +    DEBUG ((EFI_D_ERROR, "FvbWrite: failed to allocate buffer.\n"));
> +    return EFI_BUFFER_TOO_SMALL;
> +  }
> +  WriteBackDataCacheRange (DataPtr, Bytes);
> +  Status = BlockIo->ReadBlocks (BlockIo, BlockIo->Media->MediaId, Instance->StartLba + Lba,
> +                                Bytes, DataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "FvbWrite: failed on reading blocks.\n"));
> +    goto exit;
> +  }
> +  CopyMem (DataPtr + Offset, Buffer, *NumBytes);
> +  WriteBackDataCacheRange (DataPtr, Bytes);
> +  Status = BlockIo->WriteBlocks (BlockIo, BlockIo->Media->MediaId, Instance->StartLba + Lba,
> +                                 Bytes, DataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "FvbWrite StartLba:%x, Lba:%x, Offset:%x, Status:%x\n",
> +            Instance->StartLba, Lba, Offset, Status));
> +  }
> +  // Sometimes the variable isn't flushed into block device if it's the last flush operation.
> +  // So flush it again.
> +  Status = BlockIo->WriteBlocks (BlockIo, BlockIo->Media->MediaId, Instance->StartLba + Lba,
> +                                 Bytes, DataPtr);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "FvbWrite StartLba:%x, Lba:%x, Offset:%x, Status:%x\n",
> +            Instance->StartLba, Lba, Offset, Status));
> +  }
> +exit:
> +  FreePool (DataPtr);
> +  return Status;
> +}
> +
> +EFI_STATUS
> +EFIAPI
> +FvbEraseBlocks (
> +  IN CONST EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,
> +  ...
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +STATIC BLOCK_VARIABLE_INSTANCE   mBlockVariableInstance = {
> +  .Signature      = BLOCK_VARIABLE_SIGNATURE,
> +  .Media          = {
> +    .MediaId                       = 0,
> +    .RemovableMedia                = FALSE,
> +    .MediaPresent                  = TRUE,
> +    .LogicalPartition              = TRUE,
> +    .ReadOnly                      = FALSE,
> +    .WriteCaching                  = FALSE,
> +    .BlockSize                     = 0,
> +    .IoAlign                       = 4,
> +    .LastBlock                     = 0,
> +    .LowestAlignedLba              = 0,
> +    .LogicalBlocksPerPhysicalBlock = 0,
> +  },
> +  .FvbProtocol    = {
> +    .GetAttributes        = FvbGetAttributes,
> +    .SetAttributes        = FvbSetAttributes,
> +    .GetPhysicalAddress   = FvbGetPhysicalAddress,
> +    .GetBlockSize         = FvbGetBlockSize,
> +    .Read                 = FvbRead,
> +    .Write                = FvbWrite,
> +    .EraseBlocks          = FvbEraseBlocks,
> +  }
> +};
> +
> +EFI_STATUS
> +ValidateFvHeader (
> +  IN EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader
> +  )
> +{
> +  UINT16                      Checksum, TempChecksum;
> +  VARIABLE_STORE_HEADER       *VariableStoreHeader;
> +  UINTN                       VariableStoreLength;
> +  UINTN                       FvLength;
> +
> +  FvLength = (UINTN) (PcdGet32(PcdFlashNvStorageVariableSize) + PcdGet32(PcdFlashNvStorageFtwWorkingSize) +
> +      PcdGet32(PcdFlashNvStorageFtwSpareSize));
> +
> +  //
> +  // Verify the header revision, header signature, length
> +  // Length of FvBlock cannot be 2**64-1
> +  // HeaderLength cannot be an odd number
> +  //
> +  if (   (FwVolHeader->Revision  != EFI_FVH_REVISION)
> +      || (FwVolHeader->Signature != EFI_FVH_SIGNATURE)
> +      || (FwVolHeader->FvLength  != FvLength)
> +      )
> +  {
> +    DEBUG ((EFI_D_ERROR, "ValidateFvHeader: No Firmware Volume header present\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  // Check the Firmware Volume Guid
> +  if( CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiSystemNvDataFvGuid) == FALSE ) {
> +    DEBUG ((EFI_D_ERROR, "ValidateFvHeader: Firmware Volume Guid non-compatible\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  // Verify the header checksum
> +  TempChecksum = FwVolHeader->Checksum;
> +  FwVolHeader->Checksum = 0;
> +  Checksum = CalculateSum16((UINT16*)FwVolHeader, FwVolHeader->HeaderLength);
> +  if (Checksum != TempChecksum) {
> +    DEBUG ((EFI_D_ERROR, "ValidateFvHeader: FV checksum is invalid (Checksum:0x%X)\n",Checksum));
> +    return EFI_NOT_FOUND;
> +  }
> +  FwVolHeader->Checksum = Checksum;
> +
> +  VariableStoreHeader = (VARIABLE_STORE_HEADER*)((UINTN)FwVolHeader + FwVolHeader->HeaderLength);
> +
> +  // Check the Variable Store Guid
> +  if( CompareGuid (&VariableStoreHeader->Signature, &gEfiVariableGuid) == FALSE ) {
> +    DEBUG ((EFI_D_ERROR, "ValidateFvHeader: Variable Store Guid non-compatible\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  VariableStoreLength = PcdGet32 (PcdFlashNvStorageVariableSize) - FwVolHeader->HeaderLength;
> +  if (VariableStoreHeader->Size != VariableStoreLength) {
> +    DEBUG ((EFI_D_ERROR, "ValidateFvHeader: Variable Store Length does not match\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +InitNonVolatileVariableStore (
> +  IN BLOCK_VARIABLE_INSTANCE      *Instance,
> +  IN VOID                         *Headers,
> +  IN UINTN                        HeadersLength
> +  )
> +{
> +  EFI_FIRMWARE_VOLUME_HEADER            *FirmwareVolumeHeader;
> +  EFI_STATUS                            Status;
> +  VARIABLE_STORE_HEADER                 *VariableStoreHeader;
> +
> +  // Check if the size of the area is at least one block size
> +  ASSERT((PcdGet32(PcdFlashNvStorageVariableSize) > 0) && (PcdGet32(PcdFlashNvStorageVariableSize) / Instance->BlockIoProtocol->Media->BlockSize > 0));
> +  ASSERT((PcdGet32(PcdFlashNvStorageFtwWorkingSize) > 0) && (PcdGet32(PcdFlashNvStorageFtwWorkingSize) / Instance->BlockIoProtocol->Media->BlockSize > 0));
> +  ASSERT((PcdGet32(PcdFlashNvStorageFtwSpareSize) > 0) && (PcdGet32(PcdFlashNvStorageFtwSpareSize) / Instance->BlockIoProtocol->Media->BlockSize > 0));
> +
> +  //
> +  // EFI_FIRMWARE_VOLUME_HEADER
> +  //
> +  FirmwareVolumeHeader = (EFI_FIRMWARE_VOLUME_HEADER *)Headers;
> +  CopyGuid (&FirmwareVolumeHeader->FileSystemGuid, &gEfiSystemNvDataFvGuid);
> +  FirmwareVolumeHeader->FvLength =
> +      PcdGet32(PcdFlashNvStorageVariableSize) +
> +      PcdGet32(PcdFlashNvStorageFtwWorkingSize) +
> +      PcdGet32(PcdFlashNvStorageFtwSpareSize);
> +  FirmwareVolumeHeader->Signature = EFI_FVH_SIGNATURE;
> +  FirmwareVolumeHeader->Attributes = (EFI_FVB_ATTRIBUTES_2) (
> +                                            EFI_FVB2_READ_ENABLED_CAP   | // Reads may be enabled
> +                                            EFI_FVB2_READ_STATUS        | // Reads are currently enabled
> +                                            EFI_FVB2_STICKY_WRITE       | // A block erase is required to flip bits into EFI_FVB2_ERASE_POLARITY
> +                                            EFI_FVB2_MEMORY_MAPPED      | // It is memory mapped
> +                                            EFI_FVB2_ERASE_POLARITY     | // After erasure all bits take this value (i.e. '1')
> +                                            EFI_FVB2_WRITE_STATUS       | // Writes are currently enabled
> +                                            EFI_FVB2_WRITE_ENABLED_CAP    // Writes may be enabled
> +                                        );
> +  FirmwareVolumeHeader->HeaderLength          = sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY);
> +  FirmwareVolumeHeader->Revision              = EFI_FVH_REVISION;
> +  FirmwareVolumeHeader->BlockMap[0].NumBlocks = PcdGet32 (PcdNvStorageVariableBlockCount);
> +  FirmwareVolumeHeader->BlockMap[0].Length    = Instance->BlockIoProtocol->Media->BlockSize;
> +  // BlockMap Terminator
> +  FirmwareVolumeHeader->BlockMap[1].NumBlocks = 0;
> +  FirmwareVolumeHeader->BlockMap[1].Length    = 0;
> +  FirmwareVolumeHeader->Checksum = 0;
> +  FirmwareVolumeHeader->Checksum = CalculateSum16 ((UINT16*)FirmwareVolumeHeader, FirmwareVolumeHeader->HeaderLength);
> +
> +  //
> +  // VARIABLE_STORE_HEADER
> +  //
> +  VariableStoreHeader = (VARIABLE_STORE_HEADER*)((UINTN)FirmwareVolumeHeader + FirmwareVolumeHeader->HeaderLength);
> +  CopyGuid (&VariableStoreHeader->Signature, &gEfiVariableGuid);
> +  VariableStoreHeader->Size = PcdGet32(PcdFlashNvStorageVariableSize) - FirmwareVolumeHeader->HeaderLength;
> +  VariableStoreHeader->Format            = VARIABLE_STORE_FORMATTED;
> +  VariableStoreHeader->State             = VARIABLE_STORE_HEALTHY;
> +
> +  Status = FvbWrite (&Instance->FvbProtocol, 0, 0, &HeadersLength, Headers);
> +  return Status;
> +}
> +
> +EFI_STATUS
> +BlockVariableDxeInitialize (
> +  IN EFI_HANDLE                   ImageHandle,
> +  IN EFI_SYSTEM_TABLE             *SystemTable
> +  )
> +{
> +  EFI_HANDLE                      Handle;
> +  EFI_STATUS                      Status;
> +  BLOCK_VARIABLE_INSTANCE         *Instance = &mBlockVariableInstance;
> +  UINT32                          Count;
> +  EFI_LBA                         Lba;
> +  UINTN                           NvStorageSize;
> +  EFI_DEVICE_PATH_PROTOCOL        *NvBlockDevicePath;
> +  UINT8                           *NvStorageData;
> +  VOID                            *Headers;
> +  UINTN                           HeadersLength;
> +
> +  Instance->Signature = BLOCK_VARIABLE_SIGNATURE;
> +
> +  HeadersLength = sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(VARIABLE_STORE_HEADER);
> +  Headers = AllocateZeroPool(HeadersLength);
> +  if (Headers == NULL) {
> +    DEBUG ((EFI_D_ERROR, "%a: failed to allocate memory of Headers\n", __func__));
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  Lba = (EFI_LBA) PcdGet32 (PcdNvStorageVariableBlockLba);
> +  Count = PcdGet32 (PcdNvStorageVariableBlockCount);
> +  Instance->Media.BlockSize = PcdGet32 (PcdNvStorageVariableBlockSize);
> +  NvStorageSize = Count * Instance->Media.BlockSize;
> +  Instance->StartLba = Lba;
> +  HeadersLength = sizeof(EFI_FIRMWARE_VOLUME_HEADER) + sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(VARIABLE_STORE_HEADER);
> +  if (NvStorageSize < HeadersLength) {
> +    return EFI_BAD_BUFFER_SIZE;
> +  }
> +  NvStorageData = (UINT8 *) (UINTN) PcdGet32(PcdFlashNvStorageVariableBase);
> +  mMapNvStorageVariableBase = PcdGet32(PcdFlashNvStorageVariableBase);
> +  NvBlockDevicePath = &Instance->DevicePath;
> +  NvBlockDevicePath = ConvertTextToDevicePath ((CHAR16*)FixedPcdGetPtr (PcdNvStorageVariableBlockDevicePath));
> +  Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &NvBlockDevicePath,
> +                                  &Instance->Handle);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "Warning: Couldn't locate NVM device (status: %r)\n", Status));
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  Status = gBS->OpenProtocol (
> +		      Instance->Handle,
> +                      &gEfiBlockIoProtocolGuid,
> +		      (VOID **) &Instance->BlockIoProtocol,
> +                      gImageHandle,
> +                      NULL,
> +                      EFI_OPEN_PROTOCOL_GET_PROTOCOL
> +                      );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "Warning: Couldn't open NVM device (status: %r)\n", Status));
> +    return EFI_DEVICE_ERROR;
> +  }
> +  WriteBackDataCacheRange (Instance, sizeof(BLOCK_VARIABLE_INSTANCE));
> +
> +  Handle = NULL;
> +  Status = gBS->InstallMultipleProtocolInterfaces (
> +		  &Handle,
> +		  &gEfiFirmwareVolumeBlockProtocolGuid, &Instance->FvbProtocol,
> +		  NULL
> +		  );
> +  if (EFI_ERROR (Status)) {
> +    goto exit;
> +  }
> +
> +  Status = FvbRead (&Instance->FvbProtocol, 0, 0, &HeadersLength, Headers);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  Status = ValidateFvHeader (Headers);
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((EFI_D_ERROR, "%a, Found invalid Fv Header\n", __func__));
> +
> +    // Erase all the block device that is reserved for variable storage
> +    Status = FvbEraseBlocks (&Instance->FvbProtocol, (EFI_LBA)0, Count, EFI_LBA_LIST_TERMINATOR);
> +    if (EFI_ERROR (Status)) {
> +      goto exit;
> +    }
> +
> +    Status = InitNonVolatileVariableStore (Instance, Headers, HeadersLength);
> +    if (EFI_ERROR (Status)) {
> +      goto exit;
> +    }
> +  }
> +
> +  if (NvStorageSize > ((EFI_FIRMWARE_VOLUME_HEADER*)Headers)->FvLength) {
> +    NvStorageSize = ((EFI_FIRMWARE_VOLUME_HEADER*)Headers)->FvLength;
> +    NvStorageSize = ((NvStorageSize + Instance->Media.BlockSize - 1) / Instance->Media.BlockSize) * Instance->Media.BlockSize;
> +  }
> +  Status = FvbRead (&Instance->FvbProtocol, 0, 0, &NvStorageSize, NvStorageData);
> +
> +exit:
> +  return Status;
> +}
> diff --git a/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.h b/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.h
> new file mode 100644
> index 000000000..a8f95e8ca
> --- /dev/null
> +++ b/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.h
> @@ -0,0 +1,51 @@
> +/** @file  NorFlashDxe.h
> +
> +  Copyright (c) 2015, Linaro Ltd. All rights reserved.
> +  Copyright (c) 2015, Hisilicon Ltd. All rights reserved.
> +
> +  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.
> +
> +**/
> +
> +#ifndef __VARIABLE_DXE_H__
> +#define __VARIABLE_DXE_H__
> +
> +#include <Protocol/BlockIo.h>
> +#include <Protocol/DiskIo.h>
> +#include <Protocol/FirmwareVolumeBlock.h>
> +
> +#define BLOCK_VARIABLE_SIGNATURE                       SIGNATURE_32('b', 'l', 'k', '0')
> +
> +typedef struct _BLOCK_VARIABLE_INSTANCE                BLOCK_VARIABLE_INSTANCE;
> +
> +typedef struct {
> +  VENDOR_DEVICE_PATH                  Vendor;
> +  EFI_DEVICE_PATH_PROTOCOL            End;
> +} BLOCK_DEVICE_PATH;
> +
> +struct _BLOCK_VARIABLE_INSTANCE {
> +  UINT32                              Signature;
> +  EFI_HANDLE                          Handle;
> +
> +  BOOLEAN                             Initialized;
> +
> +  UINTN                               Size;
> +  EFI_LBA                             StartLba;
> +
> +  EFI_BLOCK_IO_MEDIA                  Media;
> +  EFI_BLOCK_IO_PROTOCOL               *BlockIoProtocol;
> +  EFI_DISK_IO_PROTOCOL                DiskIoProtocol;
> +  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol;
> +  EFI_DEVICE_PATH_PROTOCOL            DevicePath;
> +
> +  VOID*                               ShadowBuffer;
> +};
> +
> +
> +#endif /* __VARIABLE_DXE_H__ */
> diff --git a/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.inf b/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.inf
> new file mode 100644
> index 000000000..9d25f3777
> --- /dev/null
> +++ b/Silicon/Hisilicon/Drivers/BlockVariableDxe/BlockVariableDxe.inf
> @@ -0,0 +1,65 @@
> +#/** @file
> +#  INF file for the Variable Protocol implementation for the block device.
> +#
> +#  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +#  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> +#
> +#  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.
> +#
> +#**/
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = BlockVariableDxe
> +  FILE_GUID                      = 522fc4a8-46d8-403e-a415-e2dbb1e0ebc0
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +
> +  ENTRY_POINT                    = BlockVariableDxeInitialize
> +
> +[Sources.common]
> +  BlockVariableDxe.c
> +
> +[Packages]
> +  Platform/Hisilicon/HiKey/HiKey.dec
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +
> +[LibraryClasses]
> +  ArmLib
> +  BaseLib
> +  BaseMemoryLib
> +  CacheMaintenanceLib
> +  IoLib
> +  UefiDriverEntryPoint
> +  UefiLib
> +  DmaLib
> +
> +[Guids]
> +  gEfiSystemNvDataFvGuid
> +  gEfiVariableGuid
> +  gEfiEventVirtualAddressChangeGuid
> +
> +[Protocols]
> +  gEfiDevicePathProtocolGuid
> +  gEfiBlockIoProtocolGuid			                    ## CONSUMES
> +  gEfiFirmwareVolumeBlockProtocolGuid
> +
> +[Pcd]
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase      ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize      ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize    ## CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize      ## CONSUMES
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockCount                  ## CONSUMES
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockSize                   ## CONSUMES
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockLba                    ## CONSUMES
> +  gHwTokenSpaceGuid.PcdNvStorageVariableBlockDevicePath             ## CONSUMES
> +
> +[Depex]
> +  TRUE
> -- 
> 2.15.0
> 


  reply	other threads:[~2017-11-26 15:17 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-21 10:53 [PATCH] [edk2-platforms]:Enabling Secure boot feature support on hikey platfrom kalyan-nagabhirava
2017-11-26 15:22 ` Leif Lindholm [this message]
2017-11-27 13:02   ` Laszlo Ersek
2017-11-27 16:57     ` Leif Lindholm
2017-11-28  7:35       ` Kalyan Nagabhirava
2017-11-28 12:37         ` Leif Lindholm
2017-11-28 13:01           ` Kalyan Nagabhirava

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=20171126152206.yhb7gvofp4ne6f62@bivouac.eciton.net \
    --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