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 - 2024 Red Hat, Inc.