Looks good.

Can we add "Is" before the function - LowestSupportedVersionCheckRequired (), 
LockFmpDeviceAtLockEventGuidRequired () ?

That is IsLowestSupportedVersionCheckRequired (), 
IsLockFmpDeviceAtLockEventGuidRequired ().

Thank you
Yao Jiewen

> -----Original Message-----
> From: Kinney, Michael D
> Sent: Tuesday, May 29, 2018 3:37 PM
> To: [email protected]
> Cc: Kinney, Michael D <[email protected]>; Sean Brogan
> <[email protected]>; Yao, Jiewen <[email protected]>
> Subject: [RFC v3 2/4] FmpDevicePkg: Add library instances
> 
> From: "Kinney, Michael D" <[email protected]>
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=922
> 
> Based on content from the following branch:
> 
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsu
> leUpdatePkg
> 
> Add library instances for FmpDeviceLib, CapsuleUpdatePolicyLib,
> and FmpPayloadHeaderLib.
> 
> Library Classes
> ===============
> * FmpDeviceLibNull - Non-functional template of the FmpDeviceLib
>   that can be used as a starting point for an FmpDeviceLib for
>   a specific firmware storage device.
> * CapsuleUpdatePolicyLibNull - Functional template of the
>   CapsuleUpdatePolicyLib that can be used as a starting point
>   of a platform specific implementation.
> * FmpPayloadHeaderLibV1 - Version 1 of the FmpPayloadHeaderLib.
>   This library is indented to be used "as is" with no need for
>   any device specific or platform specific changes.
> 
> Cc: Sean Brogan <[email protected]>
> Cc: Jiewen Yao <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Michael D Kinney <[email protected]>
> ---
>  .../CapsuleUpdatePolicyLibNull.c                   | 136 +++++++
>  .../CapsuleUpdatePolicyLibNull.inf                 |  45 +++
>  .../CapsuleUpdatePolicyLibNull.uni                 |  17 +
>  .../Library/FmpDeviceLibNull/FmpDeviceLib.c        | 427
> +++++++++++++++++++++
>  .../Library/FmpDeviceLibNull/FmpDeviceLibNull.inf  |  48 +++
>  .../Library/FmpDeviceLibNull/FmpDeviceLibNull.uni  |  18 +
>  .../FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c    | 188 +++++++++
>  .../FmpPayloadHeaderLibV1.inf                      |  48 +++
>  .../FmpPayloadHeaderLibV1.uni                      |  21 +
>  9 files changed, 948 insertions(+)
>  create mode 100644
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull
> .c
>  create mode 100644
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull
> .inf
>  create mode 100644
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull
> .uni
>  create mode 100644
> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c
>  create mode 100644
> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf
>  create mode 100644
> FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.uni
>  create mode 100644
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
>  create mode 100644
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf
>  create mode 100644
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.uni
> 
> diff --git
> a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.c
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.c
> new file mode 100644
> index 0000000000..b4cccc8f01
> --- /dev/null
> +++
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.c
> @@ -0,0 +1,136 @@
> +/**  @file
> +  Provides platform policy services used during a capsule update.
> +
> +  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> +
> +  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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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 <PiDxe.h>
> +#include <Library/CapsuleUpdatePolicyLib.h>
> +
> +/**
> +  Determine if the system power state supports a capsule update.
> +
> +  @param[out] Good  Returns TRUE if system power state supports a capsule
> +                    update.  Returns FALSE if system power state does not
> +                    support a capsule update.  Return value is only valid if
> +                    return status is EFI_SUCCESS.
> +
> +  @retval EFI_SUCCESS            Good parameter has been updated with
> result.
> +  @retval EFI_INVALID_PARAMETER  Good is NULL.
> +  @retval EFI_DEVICE_ERROR       System power state can not be
> determined.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +CheckSystemPower (
> +  OUT BOOLEAN  *Good
> +  )
> +{
> +  *Good = TRUE;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Determines if the system thermal state supports a capsule update.
> +
> +  @param[out] Good  Returns TRUE if system thermal state supports a
> capsule
> +                    update.  Returns FALSE if system thermal state does
> not
> +                    support a capsule update.  Return value is only valid if
> +                    return status is EFI_SUCCESS.
> +
> +  @retval EFI_SUCCESS            Good parameter has been updated with
> result.
> +  @retval EFI_INVALID_PARAMETER  Good is NULL.
> +  @retval EFI_DEVICE_ERROR       System thermal state can not be
> determined.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +CheckSystemThermal (
> +  IN OUT BOOLEAN  *Good
> +  )
> +{
> +  *Good = TRUE;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Determines if the system environment state supports a capsule update.
> +
> +  @param[out] Good  Returns TRUE if system environment state supports a
> capsule
> +                    update.  Returns FALSE if system environment state
> does not
> +                    support a capsule update.  Return value is only valid if
> +                    return status is EFI_SUCCESS.
> +
> +  @retval EFI_SUCCESS            Good parameter has been updated with
> result.
> +  @retval EFI_INVALID_PARAMETER  Good is NULL.
> +  @retval EFI_DEVICE_ERROR       System environment state can not be
> determined.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +CheckSystemEnvironment (
> +  IN OUT BOOLEAN  *Good
> +  )
> +{
> +  *Good = TRUE;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Determines if the Lowest Supported Version checks should be performed.
> The
> +  expected result from this function is TRUE.  A platform can choose to 
> return
> +  FALSE (e.g. during manufacturing or servicing) to allow a capsule update 
> to a
> +  version below the current Lowest Supported Version.
> +
> +  @retval TRUE   The lowest supported version check is required.
> +  @retval FALSE  Do not perform lowest support version check.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +LowestSupportedVersionCheckRequired (
> +  VOID
> +  )
> +{
> +  return TRUE;
> +}
> +
> +/**
> +  Determines if the FMP device should be locked when the event specified by
> +  PcdFmpDeviceLockEventGuid is signaled. The expected result from this
> function
> +  is TRUE so the FMP device is always locked.  A platform can choose to 
> return
> +  FALSE (e.g. during manufacturing) to allow FMP devices to remain unlocked.
> +
> +  @retval TRUE   The FMP device lock action is required at lock event guid.
> +  @retval FALSE  Do not perform FMP device lock at lock event guid.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +LockFmpDeviceAtLockEventGuidRequired (
> +  VOID
> +  )
> +{
> +  return TRUE;
> +}
> diff --git
> a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.inf
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.inf
> new file mode 100644
> index 0000000000..c7c669e3e0
> --- /dev/null
> +++
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.inf
> @@ -0,0 +1,45 @@
> +## @file
> +#  Provides platform policy services used during a capsule update.
> +#
> +#  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> +#
> +#  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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> +##
> +
> +[Defines]
> +  INF_VERSION     = 0x00010005
> +  BASE_NAME       = CapsuleUpdatePolicyLibNull
> +  MODULE_UNI_FILE = CapsuleUpdatePolicyLibNull.uni
> +  FILE_GUID       = 8E36EC87-440D-44F9-AB2F-AA806C61A1A6
> +  MODULE_TYPE     = BASE
> +  VERSION_STRING  = 1.0
> +  LIBRARY_CLASS   = CapsuleUpdatePolicyLib
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF ARM AARCH64
> +#
> +
> +[Sources]
> +  CapsuleUpdatePolicyLibNull.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  FmpDevicePkg/FmpDevicePkg.dec
> diff --git
> a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.uni
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.uni
> new file mode 100644
> index 0000000000..0f16fea391
> --- /dev/null
> +++
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibN
> ull.uni
> @@ -0,0 +1,17 @@
> +// /** @file
> +// Provides platform policy services used during a capsule update.
> +//
> +// Copyright (c) 2018, 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.
> +//
> +// **/
> +
> +#string STR_MODULE_ABSTRACT     #language en-US  "Provides platform
> policy services used during a capsule update."
> +
> +#string STR_MODULE_DESCRIPTION  #language en-US  "Provides platform
> policy services used during a capsule update."
> diff --git a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c
> new file mode 100644
> index 0000000000..03e8750661
> --- /dev/null
> +++ b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLib.c
> @@ -0,0 +1,427 @@
> +/**  @file
> +  Provides firmware device specific services to support updates of a firmware
> +  image stored in a firmware device.
> +
> +  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> +
> +  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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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 <PiDxe.h>
> +#include <Library/FmpDeviceLib.h>
> +
> +/**
> +  Provide a function to install the Firmware Management Protocol instance
> onto a
> +  device handle when the device is managed by a driver that follows the UEFI
> +  Driver Model.  If the device is not managed by a driver that follows the 
> UEFI
> +  Driver Model, then EFI_UNSUPPORTED is returned.
> +
> +  @param[in] FmpInstaller  Function that installs the Firmware Management
> +                           Protocol.
> +
> +  @retval EFI_SUCCESS      The device is managed by a driver that follows
> the
> +                           UEFI Driver Model.  FmpInstaller must be
> called on
> +                           each Driver Binding Start().
> +  @retval EFI_UNSUPPORTED  The device is not managed by a driver that
> follows
> +                           the UEFI Driver Model.
> +  @retval other            The Firmware Management Protocol for this
> firmware
> +                           device is not installed.  The firmware device is
> +                           still locked using FmpDeviceLock().
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RegisterFmpInstaller (
> +  IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER  Function
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Returns the size, in bytes, of the firmware image currently stored in the
> +  firmware device.  This function is used to by the GetImage() and
> +  GetImageInfo() services of the Firmware Management Protocol.  If the
> image
> +  size can not be determined from the firmware device, then 0 must be
> returned.
> +
> +  @param[out] Size  Pointer to the size, in bytes, of the firmware image
> +                    currently stored in the firmware device.
> +
> +  @retval EFI_SUCCESS            The size of the firmware image currently
> +                                 stored in the firmware device was
> returned.
> +  @retval EFI_INVALID_PARAMETER  Size is NULL.
> +  @retval EFI_UNSUPPORTED        The firmware device does not support
> reporting
> +                                 the size of the currently stored firmware
> image.
> +  @retval EFI_DEVICE_ERROR       An error occurred attempting to
> determine the
> +                                 size of the firmware image currently
> stored in
> +                                 in the firmware device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetSize (
> +  IN UINTN  *Size
> +  )
> +{
> +  if (Size == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  *Size = 0;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Returns the GUID value used to fill in the ImageTypeId field of the
> +  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the
> GetImageInfo()
> +  service of the Firmware Management Protocol.  If EFI_UNSUPPORTED is
> returned,
> +  then the ImageTypeId field is set to gEfiCallerIdGuid.  If EFI_SUCCESS is
> +  returned, then ImageTypeId is set to the Guid returned from this function.
> +
> +  @param[out] Guid  Double pointer to a GUID value that is updated to point
> to
> +                    to a GUID value.  The GUID value is not allocated and
> must
> +                    not be modified or freed by the caller.
> +
> +  @retval EFI_SUCCESS      EFI_FIRMWARE_IMAGE_DESCRIPTOR
> ImageTypeId GUID is set
> +                           to the returned Guid value.
> +  @retval EFI_UNSUPPORTED  EFI_FIRMWARE_IMAGE_DESCRIPTOR
> ImageTypeId GUID is set
> +                           to gEfiCallerIdGuid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetImageTypeIdGuidPtr (
> +  OUT EFI_GUID  **Guid
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Returns values used to fill in the AttributesSupported and 
> AttributesSettings
> +  fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned
> by the
> +  GetImageInfo() service of the Firmware Management Protocol.  The
> following
> +  bit values from the Firmware Management Protocol may be combined:
> +    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE
> +    IMAGE_ATTRIBUTE_RESET_REQUIRED
> +    IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED
> +    IMAGE_ATTRIBUTE_IN_USE
> +    IMAGE_ATTRIBUTE_UEFI_IMAGE
> +
> +  @param[out] Supported  Attributes supported by this firmware device.
> +  @param[out] Setting    Attributes settings for this firmware device.
> +
> +  @retval EFI_SUCCESS            The attributes supported by the
> firmware
> +                                 device were returned.
> +  @retval EFI_INVALID_PARAMETER  Supported is NULL.
> +  @retval EFI_INVALID_PARAMETER  Setting is NULL.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetAttributes (
> +  IN OUT UINT64  *Supported,
> +  IN OUT UINT64  *Setting
> +  )
> +{
> +  if (Supported == NULL || Setting == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  *Supported = 0;
> +  *Setting   = 0;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Returns the value used to fill in the LowestSupportedVersion field of the
> +  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the
> GetImageInfo()
> +  service of the Firmware Management Protocol.  If EFI_SUCCESS is returned,
> then
> +  the firmware device supports a method to report the
> LowestSupportedVersion
> +  value from the currently stored firmware image.  If the value can not be
> +  reported for the firmware image currently stored in the firmware device,
> then
> +  EFI_UNSUPPORTED must be returned.  EFI_DEVICE_ERROR is returned if an
> error
> +  occurs attempting to retrieve the LowestSupportedVersion value for the
> +  currently stored firmware image.
> +
> +  @note It is recommended that all firmware devices support a method to
> report
> +        the LowestSupportedVersion value from the currently stored
> firmware
> +        image.
> +
> +  @param[out] LowestSupportedVersion  LowestSupportedVersion value
> retrieved
> +                                      from the currently stored
> firmware image.
> +
> +  @retval EFI_SUCCESS       The lowest supported version of currently
> stored
> +                            firmware image was returned in
> LowestSupportedVersion.
> +  @retval EFI_UNSUPPORTED   The firmware device does not support a
> method to
> +                            report the lowest supported version of the
> currently
> +                            stored firmware image.
> +  @retval EFI_DEVICE_ERROR  An error occurred attempting to retrieve the
> lowest
> +                            supported version of the currently stored
> firmware
> +                            image.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetLowestSupportedVersion (
> +  OUT UINT32  *LowestSupportedVersion
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Returns the Null-terminated Unicode string that is used to fill in the
> +  VersionName field of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that
> is
> +  returned by the GetImageInfo() service of the Firmware Management
> Protocol.
> +  The returned string must be allocated using
> EFI_BOOT_SERVICES.AllocatePool().
> +
> +  @note It is recommended that all firmware devices support a method to
> report
> +        the VersionName string from the currently stored firmware image.
> +
> +  @param[out] VersionString  The version string retrieved from the currently
> +                             stored firmware image.
> +
> +  @retval EFI_SUCCESS            The version string of currently stored
> +                                 firmware image was returned in
> Version.
> +  @retval EFI_INVALID_PARAMETER  VersionString is NULL.
> +  @retval EFI_UNSUPPORTED        The firmware device does not support
> a method
> +                                 to report the version string of the
> currently
> +                                 stored firmware image.
> +  @retval EFI_DEVICE_ERROR       An error occurred attempting to retrieve
> the
> +                                 version string of the currently stored
> +                                 firmware image.
> +  @retval EFI_OUT_OF_RESOURCES   There are not enough resources to
> allocate the
> +                                 buffer for the version string of the
> currently
> +                                 stored firmware image.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetVersionString (
> +  OUT CHAR16  **VersionString
> +  )
> +{
> +  if (VersionString == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  *VersionString = NULL;
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Returns the value used to fill in the Version field of the
> +  EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the
> GetImageInfo()
> +  service of the Firmware Management Protocol.  If EFI_SUCCESS is returned,
> then
> +  the firmware device supports a method to report the Version value from the
> +  currently stored firmware image.  If the value can not be reported for the
> +  firmware image currently stored in the firmware device, then
> EFI_UNSUPPORTED
> +  must be returned.  EFI_DEVICE_ERROR is returned if an error occurs
> attempting
> +  to retrieve the LowestSupportedVersion value for the currently stored
> firmware
> +  image.
> +
> +  @note It is recommended that all firmware devices support a method to
> report
> +        the Version value from the currently stored firmware image.
> +
> +  @param[out] Version  The version value retrieved from the currently stored
> +                       firmware image.
> +
> +  @retval EFI_SUCCESS       The version of currently stored firmware image
> was
> +                            returned in Version.
> +  @retval EFI_UNSUPPORTED   The firmware device does not support a
> method to
> +                            report the version of the currently stored
> firmware
> +                            image.
> +  @retval EFI_DEVICE_ERROR  An error occurred attempting to retrieve the
> version
> +                            of the currently stored firmware image.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetVersion (
> +  OUT UINT32  *Version
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Returns a copy of the firmware image currently stored in the firmware
> device.
> +
> +  @note It is recommended that all firmware devices support a method to
> retrieve
> +        a copy currently stored firmware image.  This can be used to support
> +        features such as recovery and rollback.
> +
> +  @param[out]    Image      Pointer to a caller allocated buffer where the
> +                            currently stored firmware image is copied to.
> +  @param[in out] ImageSize  Pointer the size, in bytes, of the Image buffer.
> +                            On return, points to the size, in bytes, of
> firmware
> +                            image currently stored in the firmware device.
> +
> +  @retval EFI_SUCCESS            Image contains a copy of the firmware
> image
> +                                 currently stored in the firmware device,
> and
> +                                 ImageSize contains the size, in bytes, of
> the
> +                                 firmware image currently stored in the
> +                                 firmware device.
> +  @retval EFI_BUFFER_TOO_SMALL   The buffer specified by ImageSize is
> too small
> +                                 to hold the firmware image currently
> stored in
> +                                 the firmware device. The buffer size
> required
> +                                 is returned in ImageSize.
> +  @retval EFI_INVALID_PARAMETER  The Image is NULL.
> +  @retval EFI_INVALID_PARAMETER  The ImageSize is NULL.
> +  @retval EFI_UNSUPPORTED        The operation is not supported.
> +  @retval EFI_DEVICE_ERROR       An error occurred attempting to retrieve
> the
> +                                 firmware image currently stored in the
> firmware
> +                                 device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceGetImage (
> +  IN OUT    VOID   *Image,
> +  IN IN OUT UINTN  *ImageSize
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Checks if a new firmware image is valid for the firmware device.  This
> +  function allows firmware update operation to validate the firmware image
> +  before FmpDeviceSetImage() is called.
> +
> +  @param[in]  Image           Points to a new firmware image.
> +  @param[in]  ImageSize       Size, in bytes, of a new firmware image.
> +  @param[out] ImageUpdatable  Indicates if a new firmware image is valid
> for
> +                              a firmware update to the firmware device.
> The
> +                              following values from the Firmware
> Management
> +                              Protocol are supported:
> +                                IMAGE_UPDATABLE_VALID
> +                                IMAGE_UPDATABLE_INVALID
> +                                IMAGE_UPDATABLE_INVALID_TYPE
> +                                IMAGE_UPDATABLE_INVALID_OLD
> +
> IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE
> +
> +  @retval EFI_SUCCESS            The image was successfully checked.
> Additional
> +                                 status information is returned in
> +                                 ImageUpdateable.
> +  @retval EFI_INVALID_PARAMETER  Image is NULL.
> +  @retval EFI_INVALID_PARAMETER  ImageUpdateable is NULL.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceCheckImage (
> +  IN  CONST VOID  *Image,
> +  IN  UINTN       ImageSize,
> +  OUT UINT32      *ImageUpdateable
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Updates a firmware device with a new firmware image.  This function
> returns
> +  EFI_UNSUPPORTED if the firmware image is not updatable.  If the firmware
> image
> +  is updatable, the function should perform the following minimal validations
> +  before proceeding to do the firmware image update.
> +    - Validate that the image is a supported image for this firmware device.
> +      Return EFI_ABORTED if the image is not supported.  Additional details
> +      on why the image is not a supported image may be returned in
> AbortReason.
> +    - Validate the data from VendorCode if is not NULL.  Firmware image
> +      validation must be performed before VendorCode data validation.
> +      VendorCode data is ignored or considered invalid if image validation
> +      fails.  Return EFI_ABORTED if the VendorCode data is invalid.
> +
> +  VendorCode enables vendor to implement vendor-specific firmware image
> update
> +  policy.  Null if the caller did not specify the policy or use the default
> +  policy.  As an example, vendor can implement a policy to allow an option to
> +  force a firmware image update when the abort reason is due to the new
> firmware
> +  image version is older than the current firmware image version or bad image
> +  checksum.  Sensitive operations such as those wiping the entire firmware
> image
> +  and render the device to be non-functional should be encoded in the image
> +  itself rather than passed with the VendorCode.  AbortReason enables
> vendor to
> +  have the option to provide a more detailed description of the abort reason 
> to
> +  the caller.
> +
> +  @param[in]  Image             Points to the new firmware image.
> +  @param[in]  ImageSize         Size, in bytes, of the new firmware image.
> +  @param[in]  VendorCode        This enables vendor to implement
> vendor-specific
> +                                firmware image update policy.  NULL
> indicates
> +                                the caller did not specify the policy or use
> the
> +                                default policy.
> +  @param[in]  Progress          A function used to report the progress of
> +                                updating the firmware device with the
> new
> +                                firmware image.
> +  @param[in]  CapsuleFwVersion  The version of the new firmware image
> from the
> +                                update capsule that provided the new
> firmware
> +                                image.
> +  @param[out] AbortReason       A pointer to a pointer to a
> Null-terminated
> +                                Unicode string providing more details on
> an
> +                                aborted operation. The buffer is allocated
> by
> +                                this function with
> +                                EFI_BOOT_SERVICES.AllocatePool().  It
> is the
> +                                caller's responsibility to free this buffer
> with
> +                                EFI_BOOT_SERVICES.FreePool().
> +
> +  @retval EFI_SUCCESS            The firmware device was successfully
> updated
> +                                 with the new firmware image.
> +  @retval EFI_ABORTED            The operation is aborted.  Additional
> details
> +                                 are provided in AbortReason.
> +  @retval EFI_INVALID_PARAMETER  The Image was NULL.
> +  @retval EFI_UNSUPPORTED        The operation is not supported.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceSetImage (
> +  IN  CONST VOID                                     *Image,
> +  IN  UINTN                                          ImageSize,
> +  IN  CONST VOID                                     *VendorCode,
> OPTIONAL
> +  IN  EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS
> Progress,          OPTIONAL
> +  IN  UINT32
> CapsuleFwVersion,
> +  OUT CHAR16                                         **AbortReason
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Lock the firmware device that contains a firmware image.  Once a firmware
> +  device is locked, any attempts to modify the firmware image contents in the
> +  firmware device must fail.
> +
> +  @note It is recommended that all firmware devices support a lock method to
> +        prevent modifications to a stored firmware image.
> +
> +  @note A firmware device lock mechanism is typically only cleared by a full
> +        system reset (not just sleep state/low power mode).
> +
> +  @retval  EFI_SUCCESS      The firmware device was locked.
> +  @retval  EFI_UNSUPPORTED  The firmware device does not support
> locking
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +FmpDeviceLock (
> +  VOID
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> diff --git a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf
> new file mode 100644
> index 0000000000..d51f69d0b9
> --- /dev/null
> +++ b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.inf
> @@ -0,0 +1,48 @@
> +## @file
> +#  Provides firmware device specific services to support updates of a 
> firmware
> +#  image stored in a firmware device.
> +#
> +#  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> +#
> +#  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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> +##
> +
> +[Defines]
> +  INF_VERSION     = 0x00010005
> +  BASE_NAME       = FmpDeviceLibNull
> +  MODULE_UNI_FILE = FmpDeviceLibNull.uni
> +  FILE_GUID       = 8507642B-AE92-4664-B713-807F7774A96D
> +  MODULE_TYPE     = DXE_DRIVER
> +  VERSION_STRING  = 1.0
> +  LIBRARY_CLASS   = FmpDeviceLib|DXE_DRIVER
> +
> +#
> +# The following information is for reference only and not required by the 
> build
> tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF ARM AARCH64
> +#
> +
> +[Sources]
> +  FmpDeviceLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  FmpDevicePkg/FmpDevicePkg.dec
> diff --git a/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.uni
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.uni
> new file mode 100644
> index 0000000000..bedb38e9cf
> --- /dev/null
> +++ b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNull.uni
> @@ -0,0 +1,18 @@
> +// /** @file
> +// Provides firmware device specific services to support updates of a 
> firmware
> +// image stored in a firmware device.
> +//
> +// Copyright (c) 2018, 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.
> +//
> +// **/
> +
> +#string STR_MODULE_ABSTRACT     #language en-US  "Provides firmware
> device specific services to support updates of a firmware image stored in a
> firmware device."
> +
> +#string STR_MODULE_DESCRIPTION  #language en-US  "Provides firmware
> device specific services to support updates of a firmware image stored in a
> firmware device."
> diff --git
> a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
> new file mode 100644
> index 0000000000..5f08e8b0fd
> --- /dev/null
> +++
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLib.c
> @@ -0,0 +1,188 @@
> +/**  @file
> +  Provides services to retrieve values from Version 1 of a capsule's FMP
> Payload
> +  Header. The FMP Payload Header structure is not defined in the library 
> class.
> +  Instead, services are provided to retrieve information from the FMP Payload
> +  Header.  If information is added to the FMP Payload Header, then new
> services
> +  may be added to this library class to retrieve the new information.
> +
> +  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> +
> +  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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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 <PiDxe.h>
> +#include <Library/FmpPayloadHeaderLib.h>
> +
> +///
> +/// Define FMP Payload Header structure here so it is not public
> +///
> +
> +#pragma pack(1)
> +
> +typedef struct {
> +  UINT32  Signature;
> +  UINT32  HeaderSize;
> +  UINT32  FwVersion;
> +  UINT32  LowestSupportedVersion;
> +} FMP_PAYLOAD_HEADER;
> +
> +#pragma pack()
> +
> +///
> +/// Identifier is used to make sure the data in the header is for this 
> structure
> +/// and version.  If the structure changes update the last digit.
> +///
> +#define FMP_PAYLOAD_HEADER_SIGNATURE SIGNATURE_32 ('M', 'S', 'S', '1')
> +
> +/**
> +  Returns the FMP Payload Header size in bytes.
> +
> +  @param[in]  Header          FMP Payload Header to evaluate
> +  @param[in]  FmpPayloadSize  Size of FMP payload
> +  @param[out] Size            The size, in bytes, of the FMP Payload
> Header.
> +
> +  @retval EFI_SUCCESS            The firmware version was returned.
> +  @retval EFI_INVALID_PARAMETER  Header is NULL.
> +  @retval EFI_INVALID_PARAMETER  Size is NULL.
> +  @retval EFI_INVALID_PARAMETER  Header is not a valid FMP Payload
> Header.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetFmpPayloadHeaderSize (
> +  IN  CONST VOID   *Header,
> +  IN  CONST UINTN  FmpPayloadSize,
> +  OUT UINT32       *Size
> +  )
> +{
> +  FMP_PAYLOAD_HEADER  *FmpPayloadHeader;
> +
> +  FmpPayloadHeader = NULL;
> +
> +  if (Header == NULL || Size == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
> +  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) <
> (UINTN)FmpPayloadHeader ||
> +      (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >=
> (UINTN)FmpPayloadHeader + FmpPayloadSize ||
> +      FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *Size = FmpPayloadHeader->HeaderSize;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Returns the version described in the FMP Payload Header.
> +
> +  @param[in]  Header          FMP Payload Header to evaluate
> +  @param[in]  FmpPayloadSize  Size of FMP payload
> +  @param[out] Version         The firmware version described in the FMP
> Payload
> +                              Header.
> +
> +  @retval EFI_SUCCESS            The firmware version was returned.
> +  @retval EFI_INVALID_PARAMETER  Header is NULL.
> +  @retval EFI_INVALID_PARAMETER  Version is NULL.
> +  @retval EFI_INVALID_PARAMETER  Header is not a valid FMP Payload
> Header.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetFmpPayloadHeaderVersion (
> +  IN  CONST VOID   *Header,
> +  IN  CONST UINTN  FmpPayloadSize,
> +  OUT UINT32       *Version
> +  )
> +{
> +  FMP_PAYLOAD_HEADER  *FmpPayloadHeader;
> +
> +  FmpPayloadHeader = NULL;
> +
> +  if (Header == NULL || Version == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
> +  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) <
> (UINTN)FmpPayloadHeader ||
> +      (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >=
> (UINTN)FmpPayloadHeader + FmpPayloadSize ||
> +      FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *Version = FmpPayloadHeader->FwVersion;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Returns the lowest supported version described in the FMP Payload Header.
> +
> +  @param[in]  Header                  FMP Payload Header to evaluate
> +  @param[in]  FmpPayloadSize          Size of FMP payload
> +  @param[out] LowestSupportedVersion  The lowest supported version
> described in
> +                                      the FMP Payload Header.
> +
> +  @retval EFI_SUCCESS            The lowest support version was
> returned.
> +  @retval EFI_INVALID_PARAMETER  Header is NULL.
> +  @retval EFI_INVALID_PARAMETER  LowestSupportedVersion is NULL.
> +  @retval EFI_INVALID_PARAMETER  Header is not a valid FMP Payload
> Header.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetFmpPayloadHeaderLowestSupportedVersion (
> +  IN     CONST VOID   *Header,
> +  IN     CONST UINTN  FmpPayloadSize,
> +  IN OUT UINT32       *LowestSupportedVersion
> +  )
> +{
> +  FMP_PAYLOAD_HEADER  *FmpPayloadHeader;
> +
> +  FmpPayloadHeader = NULL;
> +
> +  if (Header == NULL || LowestSupportedVersion == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  FmpPayloadHeader = (FMP_PAYLOAD_HEADER *)Header;
> +  if ((UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) <
> (UINTN)FmpPayloadHeader ||
> +      (UINTN)FmpPayloadHeader + sizeof (FMP_PAYLOAD_HEADER) >=
> (UINTN)FmpPayloadHeader + FmpPayloadSize ||
> +      FmpPayloadHeader->HeaderSize < sizeof (FMP_PAYLOAD_HEADER)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (FmpPayloadHeader->Signature != FMP_PAYLOAD_HEADER_SIGNATURE) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *LowestSupportedVersion = FmpPayloadHeader->LowestSupportedVersion;
> +  return EFI_SUCCESS;
> +}
> diff --git
> a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.in
> f
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.in
> f
> new file mode 100644
> index 0000000000..41ed6e2aca
> --- /dev/null
> +++
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.in
> f
> @@ -0,0 +1,48 @@
> +## @file
> +#  Provides services to retrieve values from Version 1 of a capsule's FMP
> Payload
> +#  Header. The FMP Payload Header structure is not defined in the library
> class.
> +#  Instead, services are provided to retrieve information from the FMP
> Payload
> +#  Header.  If information is added to the FMP Payload Header, then new
> services
> +#  may be added to this library class to retrieve the new information.
> +#
> +#  Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
> +#
> +#  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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = FmpPayloadHeaderLibV1
> +  FILE_GUID                      =
> 98A79A6C-513C-4E72-8375-39C0A7244C4B
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = FmpPayloadHeaderLib|DXE_DRIVER
> UEFI_APPLICATION
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 IPF ARM AARCH64
> +#
> +
> +[Sources]
> +  FmpPayloadHeaderLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  FmpDevicePkg/FmpDevicePkg.dec
> diff --git
> a/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.u
> ni
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.u
> ni
> new file mode 100644
> index 0000000000..4eef31753d
> --- /dev/null
> +++
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.u
> ni
> @@ -0,0 +1,21 @@
> +// /** @file
> +// Provides services to retrieve values from Version 1 of a capsule's FMP
> Payload
> +// Header. The FMP Payload Header structure is not defined in the library 
> class.
> +// Instead, services are provided to retrieve information from the FMP 
> Payload
> +// Header.  If information is added to the FMP Payload Header, then new
> services
> +// may be added to this library class to retrieve the new information.
> +//
> +// Copyright (c) 2018, 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.
> +//
> +// **/
> +
> +#string STR_MODULE_ABSTRACT     #language en-US  "Provides services to
> retrieve values from Version 1 of a capsule's FMP Payload Header."
> +
> +#string STR_MODULE_DESCRIPTION  #language en-US  "Provides services to
> retrieve values from Version 1 of a capsule's FMP Payload Header."
> --
> 2.14.2.windows.3

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to