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/MsCapsuleSupport/MsCapsuleUpdatePkg
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/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/CapsuleUpdatePolicyLibNull.c b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.c
new file mode 100644
index 0000000000..b4cccc8f01
--- /dev/null
+++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.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/CapsuleUpdatePolicyLibNull.inf b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.inf
new file mode 100644
index 0000000000..c7c669e3e0
--- /dev/null
+++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.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/CapsuleUpdatePolicyLibNull.uni b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.uni
new file mode 100644
index 0000000000..0f16fea391
--- /dev/null
+++ b/FmpDevicePkg/Library/CapsuleUpdatePolicyLibNull/CapsuleUpdatePolicyLibNull.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.inf b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf
new file mode 100644
index 0000000000..41ed6e2aca
--- /dev/null
+++ b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.inf
@@ -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.uni b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.uni
new file mode 100644
index 0000000000..4eef31753d
--- /dev/null
+++ b/FmpDevicePkg/Library/FmpPayloadHeaderLibV1/FmpPayloadHeaderLibV1.uni
@@ -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
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
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/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 <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/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
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
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
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2026 Red Hat, Inc.