public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kinney, Michael D" <michael.d.kinney@intel.com>
To: "Yao, Jiewen" <jiewen.yao@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [RFC v3 2/4] FmpDevicePkg: Add library instances
Date: Mon, 4 Jun 2018 23:54:18 +0000	[thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F5B8A66B9C@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <74D8A39837DF1E4DA445A8C0B3885C503AC27A65@shsmsx102.ccr.corp.intel.com>

Jiewen,

Good suggestion.  I will add then in next version.

Mike

> -----Original Message-----
> From: Yao, Jiewen
> Sent: Monday, June 4, 2018 4:09 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>;
> edk2-devel@lists.01.org
> Cc: Sean Brogan <sean.brogan@microsoft.com>
> Subject: RE: [RFC v3 2/4] FmpDevicePkg: Add library
> instances
> 
> 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: edk2-devel@lists.01.org
> > Cc: Kinney, Michael D <michael.d.kinney@intel.com>;
> Sean Brogan
> > <sean.brogan@microsoft.com>; Yao, Jiewen
> <jiewen.yao@intel.com>
> > Subject: [RFC v3 2/4] FmpDevicePkg: Add library
> instances
> >
> > From: "Kinney, Michael D"
> <michael.d.kinney@intel.com>
> >
> > https://bugzilla.tianocore.org/show_bug.cgi?id=922
> >
> > Based on content from the following branch:
> >
> >
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsu
> leSupport/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 <sean.brogan@microsoft.com>
> > Cc: Jiewen Yao <jiewen.yao@intel.com>
> > Contributed-under: TianoCore Contribution Agreement
> 1.1
> > Signed-off-by: Michael D Kinney
> <michael.d.kinney@intel.com>
> > ---
> >  .../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/Capsule
> UpdatePolicyLibNull
> > .c
> >  create mode 100644
> >
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsule
> UpdatePolicyLibNull
> > .inf
> >  create mode 100644
> >
> FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsule
> UpdatePolicyLibNull
> > .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/FmpPayloadHe
> aderLib.c
> >  create mode 100644
> >
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHe
> aderLibV1.inf
> >  create mode 100644
> >
> FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHe
> aderLibV1.uni
> >
> > diff --git
> >
> a/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > ull.c
> >
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > ull.c
> > new file mode 100644
> > index 0000000000..b4cccc8f01
> > --- /dev/null
> > +++
> >
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > 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/Capsu
> leUpdatePolicyLibN
> > ull.inf
> >
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > ull.inf
> > new file mode 100644
> > index 0000000000..c7c669e3e0
> > --- /dev/null
> > +++
> >
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > 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/Capsu
> leUpdatePolicyLibN
> > ull.uni
> >
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > ull.uni
> > new file mode 100644
> > index 0000000000..0f16fea391
> > --- /dev/null
> > +++
> >
> b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/Capsu
> leUpdatePolicyLibN
> > 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/FmpDeviceLibNul
> l.inf
> >
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul
> l.inf
> > new file mode 100644
> > index 0000000000..d51f69d0b9
> > --- /dev/null
> > +++
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul
> l.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/FmpDeviceLibNul
> l.uni
> >
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul
> l.uni
> > new file mode 100644
> > index 0000000000..bedb38e9cf
> > --- /dev/null
> > +++
> b/FmpDevicePkg/Library/FmpDeviceLibNull/FmpDeviceLibNul
> l.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/FmpPayload
> HeaderLib.c
> >
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload
> HeaderLib.c
> > new file mode 100644
> > index 0000000000..5f08e8b0fd
> > --- /dev/null
> > +++
> >
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload
> HeaderLib.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/FmpPayload
> HeaderLibV1.in
> > f
> >
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload
> HeaderLibV1.in
> > f
> > new file mode 100644
> > index 0000000000..41ed6e2aca
> > --- /dev/null
> > +++
> >
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload
> HeaderLibV1.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/FmpPayload
> HeaderLibV1.u
> > ni
> >
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload
> HeaderLibV1.u
> > ni
> > new file mode 100644
> > index 0000000000..4eef31753d
> > --- /dev/null
> > +++
> >
> b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayload
> HeaderLibV1.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



  reply	other threads:[~2018-06-04 23:54 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-29 22:37 [RFC v3 0/4] Add FmpDevicePkg Michael D Kinney
2018-05-29 22:37 ` [RFC v3 1/4] FmpDevicePkg: Add package, library classes, and PCDs Michael D Kinney
2018-05-29 22:37 ` [RFC v3 2/4] FmpDevicePkg: Add library instances Michael D Kinney
2018-06-04 23:09   ` Yao, Jiewen
2018-06-04 23:54     ` Kinney, Michael D [this message]
2018-05-29 22:37 ` [RFC v3 3/4] FmpDevicePkg: Add FmpDxe module Michael D Kinney
2018-05-29 22:37 ` [RFC v3 4/4] FmpDevicePkg: Add DSC file to build all package components Michael D Kinney
2018-05-30  7:08 ` [RFC v3 0/4] Add FmpDevicePkg Ard Biesheuvel
2018-05-30 15:15   ` Kinney, Michael D
2018-05-31 11:13     ` 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=E92EE9817A31E24EB0585FDF735412F5B8A66B9C@ORSMSX113.amr.corp.intel.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