--- /dev/null
+## @file\r
+# Firmware Management Protocol Device Package\r
+#\r
+# This package provides an implementation of a Firmware Management Protocol\r
+# instance that supports the update of firmware storage devices using UEFI\r
+# Capsules. The behavior of the Firmware Management Protocol instance is\r
+# customized using libraries and PCDs.\r
+#\r
+# Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# Redistribution and use in source and binary forms, with or without\r
+# modification, are permitted provided that the following conditions are met:\r
+# 1. Redistributions of source code must retain the above copyright notice,\r
+# this list of conditions and the following disclaimer.\r
+# 2. Redistributions in binary form must reproduce the above copyright notice,\r
+# this list of conditions and the following disclaimer in the documentation\r
+# and/or other materials provided with the distribution.\r
+#\r
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+#\r
+##\r
+\r
+[Defines]\r
+ DEC_SPECIFICATION = 0x00010005\r
+ PACKAGE_NAME = FmpDevicePkg\r
+ PACKAGE_UNI_FILE = FmpDevicePkg.uni\r
+ PACKAGE_GUID = 080b5b4f-27c6-11e8-84d1-f8597177a00a\r
+ PACKAGE_VERSION = 0.1\r
+\r
+[Includes]\r
+ Include\r
+\r
+[LibraryClasses]\r
+ ## @libraryclass Provides services to retrieve values from a capsule's FMP\r
+ # Payload Header. The structure is not included in the\r
+ # library class. Instead, services are provided to retrieve\r
+ # information from the FMP Payload Header. If information is\r
+ # added to the FMP Payload Header, then new services may be\r
+ # added to this library class to retrieve the new information.\r
+ FmpPayloadHeaderLib|Include/Library/FmpPayloadHeaderLib.h\r
+\r
+ ## @libraryclass Provides platform policy services used during a capsule\r
+ # update.\r
+ CapsuleUpdatePolicyLib|Include/Library/CapsuleUpdatePolicyLib.h\r
+\r
+ ## @libraryclass Provides firmware device specific services to support\r
+ # updates of a firmware image stored in a firmware device.\r
+ FmpDeviceLib|Include/Library/FmpDeviceLib.h\r
+\r
+[Guids]\r
+ ## Firmware Management Protocol Device Package Token Space GUID\r
+ gFmpDevicePkgTokenSpaceGuid = { 0x40b2d964, 0xfe11, 0x40dc, { 0x82, 0x83, 0x2e, 0xfb, 0xda, 0x29, 0x53, 0x56 } }\r
+\r
+[PcdsFixedAtBuild]\r
+ ## Indicates if a full system reset is required before a firmware update to a\r
+ # firmware devices takes effect.<BR><BR>\r
+ # TRUE - System reset is required.<BR>\r
+ # FALSE - System reset is not required.<BR>\r
+ # @Prompt FMP Device System Reset Required.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceSystemResetRequired|TRUE|BOOLEAN|0x40000008\r
+\r
+ ## The SHA-256 hash of a PKCS7 test key that is used to detect if a test key\r
+ # is being used to authenticate capsules. Test key detection is disabled by\r
+ # setting the value to {0}.\r
+ # @Prompt SHA-256 hash of PKCS7 test key.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceTestKeySha256Digest|{0x2E, 0x97, 0x89, 0x1B, 0xDB, 0xE7, 0x08, 0xAA, 0x8C, 0xB2, 0x8F, 0xAD, 0x20, 0xA9, 0x83, 0xC7, 0x84, 0x7D, 0x4F, 0xEE, 0x48, 0x25, 0xE9, 0x4D, 0x39, 0xFA, 0x34, 0x9A, 0xB8, 0xB1, 0xC4, 0x26}|VOID*|0x40000009\r
+\r
+[PcdsFixedAtBuild, PcdsPatchableInModule]\r
+ ## The color of the progress bar during a firmware update. Each firmware\r
+ # device can set its own color. The default color is white.<BR><BR>\r
+ # Bits 7..0 - Red<BR>\r
+ # Bits 15..8 - Green<BR>\r
+ # Bits 23..16 - Blue<BR>\r
+ # @Prompt Firmware Device Progress Bar Color.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressColor|0x00FFFFFF|UINT32|0x40000004\r
+\r
+ ## The Null-terminated Unicode string used to fill in the ImageIdName field of\r
+ # the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the\r
+ # GetImageInfo() service of the Firmware Management Protocol for the firmware\r
+ # device. An ImageIdName string must be provided for each firmware device.\r
+ # The default value is an empty string.\r
+ # @Prompt Firmware Device ImageIdName string.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceImageIdName|L""|VOID*|0x40000007\r
+\r
+ ## The build time value used to fill in the LowestSupportedVersion field of\r
+ # the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the\r
+ # GetImageInfo() service of the Firmware Management Protocol. This value is\r
+ # only used if the firmware device does not provide a method to report the\r
+ # lowest supported version value from the current firmware image and the\r
+ # UEFI variable used to provide the lowest supported version value does not\r
+ # exist. The default value is 0.\r
+ # @Prompt Build Time Firmware Device Lowest Support Version.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceBuildTimeLowestSupportedVersion|0x0|UINT32|0x4000000C\r
+\r
+ ## The time in seconds to arm a watchdog timer during the update of a firmware\r
+ # device. The watchdog is re-armed each time the FmpDeviceLib calls the\r
+ # Progress() function passed into FmpDeviceSetImage() function. The\r
+ # FmpDeviceLib calls Progress() to update the percent completion of a\r
+ # firmware update. If the watchdog timer expires, the system reboots. A\r
+ # value of 0 disables the watchdog timer. The default value is 0 (watchdog\r
+ # disabled).\r
+ # @Prompt Firmware Device Watchdog Time in Seconds.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceProgressWatchdogTimeInSeconds|0x0|UINT8|0x4000000D\r
+\r
+[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]\r
+ ## One or more PKCS7 certificates used to verify a firmware device capsule\r
+ # update image. Encoded using the Variable-Length Opaque Data format of RFC\r
+ # 4506 External Data Representation Standard (XDR). The default value is\r
+ # empty with 0 certificates.\r
+ # @Prompt One or more XDR encoded PKCS7 certificates used to verify firmware device capsule update images.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDevicePkcs7CertBufferXdr|{0x0}|VOID*|0x4000000E\r
+\r
+ ## An event GUID that locks the firmware device when the event is signaled.\r
+ # If this PCD is not a valid GUID value, then the firmware device is locked\r
+ # when gEfiEndOfDxeEventGroupGuid (End of DXE Phase) is signaled. The\r
+ # default value is empty, so by default the firmware device is locked at the\r
+ # end of the DXE phase.\r
+ # @Prompt Firmware Device Lock Event GUID.\r
+ gFmpDevicePkgTokenSpaceGuid.PcdFmpDeviceLockEventGuid|{0}|VOID*|0x4000000F\r
+\r
+[UserExtensions.TianoCore."ExtraFiles"]\r
+ FmpDevicePkgExtra.uni\r
--- /dev/null
+// /** @file\r
+// Firmware Management Protocol Device Package\r
+//\r
+// This package provides an implementation of a Firmware Management Protocol\r
+// instance that supports the update of firmware storage devices using UEFI\r
+// Capsules. The behavior of the Firmware Management Protocol instance is\r
+// customized using libraries and PCDs.\r
+//\r
+// Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// This program and the accompanying materials are licensed and made available under\r
+// the terms and conditions of the BSD License which accompanies this distribution.\r
+// The full text of the license may be found at\r
+// http://opensource.org/licenses/bsd-license.php\r
+//\r
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+// **/\r
+\r
+#string STR_PACKAGE_ABSTRACT #language en-US "Firmware Management Protocol Software Development Kit"\r
+\r
+#string STR_PACKAGE_DESCRIPTION #language en-US "This package provides libraries that support the implementation of a module that produces the Firmware Management Protocol to support the update of a system firmware component."\r
+\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceSystemResetRequired_PROMPT #language en-US "FMP Device System Reset Required."\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceSystemResetRequired_HELP #language en-US "Indicates if a full system reset is required before a firmware update to a firmware device takes effect.<BR><BR>\n"\r
+ "TRUE - System reset is required.<BR>\n"\r
+ "FALSE - System reset is not required.<BR>"\r
+\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceTestKeySha256Digest_PROMPT #language en-US "SHA-256 hash of PKCS7 test key."\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceTestKeySha256Digest_HELP #language en-US "The SHA-256 hash of a PKCS7 test key that is used to detect if a test key"\r
+ "is being used to authenticate capsules. Test key detection can be disabled"\r
+ "by setting the value to {0}"\r
+\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceProgressColor_PROMPT #language en-US "Firmware Device Progress Bar Color."\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceProgressColor_HELP #language en-US "The color of the progress bar during a firmware update. Each firmware"\r
+ "device can set its own color. The default color is white.<BR><BR>\n"\r
+ "Bits 7..0 - Red<BR>\n"\r
+ "Bits 15..8 - Green<BR>\n"\r
+ "Bits 23..16 - Blue<BR>\n"\r
+\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceImageIdName_PROMPT #language en-US "Firmware Device ImageIdName string."\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceImageIdName_HELP #language en-US "The Null-terminated Unicode string used to fill in the ImageIdName field of"\r
+ "the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the"\r
+ "GetImageInfo() service of the Firmware Management Protocol for the firmware"\r
+ "device. An ImageIdName string must be provided for each firmware device."\r
+ "The default value is an empty string."\r
+\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceBuildTimeLowestSupportedVersion_PROMPT #language en-US "Build Time Firmware Device Lowest Support Version."\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceBuildTimeLowestSupportedVersion_HELP #language en-US "The build time value used to fill in the LowestSupportedVersion field of"\r
+ "the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the"\r
+ "GetImageInfo() service of the Firmware Management Protocol. This value is"\r
+ "only used if the firmware device does not provide a method to report the"\r
+ "lowest supported version value from the current firmware image and the"\r
+ "UEFI variable used to provide the lowest supported version value does not"\r
+ "exist. The default value is 0."\r
+\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceProgressWatchdogTimeInSeconds_PROMPT #language en-US "Firmware Device Watchdog Time in Seconds."\r
+#string STR_gFmpDevicePkgTokenSpaceGuid_PcdFmpDeviceProgressWatchdogTimeInSeconds_HELP #language en-US "Indicates the time in seconds to arm a watchdog timer during the update of"\r
+ "a firmware device. The watchdog is re-armed each time the FmpDeviceLib"\r
+ "calls the Progress() function passed into FmpDeviceSetImage() function."\r
+ "The FmpDeviceLib calls Progress() to update the percent completion of a"\r
+ "firmware update. If the watchdog timer expires, the system reboots. A"\r
+ "value of 0 disables the watchdog timer. The default value is 0 (watchdog"\r
+ "disabled)."\r
+\r
+#string STR_gEfiSecurityPkgTokenSpaceGuid_PcdFmpDevicePkcs7CertBufferXdr_PROMPT #language en-US "One or more XDR encoded PKCS7 certificates used to verify firmware device capsule update images"\r
+#string STR_gEfiSecurityPkgTokenSpaceGuid_PcdFmpDevicePkcs7CertBufferXdr_HELP #language en-US "Provides one or more PKCS7 certificates used to verify a firmware device"\r
+ "capsule update image. This PCD is encoded using the Variable-Length Opaque"\r
+ "Data format of RFC 4506 External Data Representation Standard (XDR)."\r
+ "The default value is empty with 0 certificates."\r
+\r
+#string STR_gEfiSecurityPkgTokenSpaceGuid_PcdFmpDeviceLockEventGuid_PROMPT #language en-US "Firmware Device Lock Event GUID."\r
+#string STR_gEfiSecurityPkgTokenSpaceGuid_PcdFmpDeviceLockEventGuid_HELP #language en-US "An event GUID that locks the firmware device when the event is signaled."\r
+ "If this PCD is not a valid GUID value, then the firmware device is locked"\r
+ "when gEfiEndOfDxeEventGroupGuid (End of DXE Phase) is signaled. The"\r
+ "default value is empty, so by default the firmware device is locked at the"\r
+ "end of the DXE phase."\r
+\r
+\r
--- /dev/null
+// /** @file\r
+// Firmware Management Protocol Device Package Localized Strings and Content.\r
+//\r
+// Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// This program and the accompanying materials are licensed and made available under\r
+// the terms and conditions of the BSD License which accompanies this distribution.\r
+// The full text of the license may be found at\r
+// http://opensource.org/licenses/bsd-license.php\r
+//\r
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+// **/\r
+\r
+#string STR_PROPERTIES_PACKAGE_NAME\r
+#language en-US\r
+"Firmware Management Protocol Device package"\r
--- /dev/null
+/** @file\r
+ Provides platform policy services used during a capsule update.\r
+\r
+ Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+\r
+ Redistribution and use in source and binary forms, with or without\r
+ modification, are permitted provided that the following conditions are met:\r
+ 1. Redistributions of source code must retain the above copyright notice,\r
+ this list of conditions and the following disclaimer.\r
+ 2. Redistributions in binary form must reproduce the above copyright notice,\r
+ this list of conditions and the following disclaimer in the documentation\r
+ and/or other materials provided with the distribution.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+**/\r
+\r
+#ifndef __CAPSULE_UPDATE_POLICY_LIB__\r
+#define __CAPSULE_UPDATE_POLICY_LIB__\r
+\r
+/**\r
+ Determine if the system power state supports a capsule update.\r
+\r
+ @param[out] Good Returns TRUE if system power state supports a capsule\r
+ update. Returns FALSE if system power state does not\r
+ support a capsule update. Return value is only valid if\r
+ return status is EFI_SUCCESS.\r
+\r
+ @retval EFI_SUCCESS Good parameter has been updated with result.\r
+ @retval EFI_INVALID_PARAMETER Good is NULL.\r
+ @retval EFI_DEVICE_ERROR System power state can not be determined.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CheckSystemPower (\r
+ OUT BOOLEAN *Good\r
+ );\r
+\r
+/**\r
+ Determines if the system thermal state supports a capsule update.\r
+\r
+ @param[out] Good Returns TRUE if system thermal state supports a capsule\r
+ update. Returns FALSE if system thermal state does not\r
+ support a capsule update. Return value is only valid if\r
+ return status is EFI_SUCCESS.\r
+\r
+ @retval EFI_SUCCESS Good parameter has been updated with result.\r
+ @retval EFI_INVALID_PARAMETER Good is NULL.\r
+ @retval EFI_DEVICE_ERROR System thermal state can not be determined.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CheckSystemThermal (\r
+ IN OUT BOOLEAN *Good\r
+ );\r
+\r
+/**\r
+ Determines if the system environment state supports a capsule update.\r
+\r
+ @param[out] Good Returns TRUE if system environment state supports a capsule\r
+ update. Returns FALSE if system environment state does not\r
+ support a capsule update. Return value is only valid if\r
+ return status is EFI_SUCCESS.\r
+\r
+ @retval EFI_SUCCESS Good parameter has been updated with result.\r
+ @retval EFI_INVALID_PARAMETER Good is NULL.\r
+ @retval EFI_DEVICE_ERROR System environment state can not be determined.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+CheckSystemEnvironment (\r
+ IN OUT BOOLEAN *Good\r
+ );\r
+\r
+/**\r
+ Determines if the Lowest Supported Version checks should be performed. The\r
+ expected result from this function is TRUE. A platform can choose to return\r
+ FALSE (e.g. during manufacturing or servicing) to allow a capsule update to a\r
+ version below the current Lowest Supported Version.\r
+\r
+ @retval TRUE The lowest supported version check is required.\r
+ @retval FALSE Do not perform lowest support version check.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsLowestSupportedVersionCheckRequired (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Determines if the FMP device should be locked when the event specified by\r
+ PcdFmpDeviceLockEventGuid is signaled. The expected result from this function\r
+ is TRUE so the FMP device is always locked. A platform can choose to return\r
+ FALSE (e.g. during manufacturing) to allow FMP devices to remain unlocked.\r
+\r
+ @retval TRUE The FMP device lock action is required at lock event guid.\r
+ @retval FALSE Do not perform FMP device lock at lock event guid.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsLockFmpDeviceAtLockEventGuidRequired (\r
+ VOID\r
+ );\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ Provides firmware device specific services to support updates of a firmware\r
+ image stored in a firmware device.\r
+\r
+ Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+\r
+ Redistribution and use in source and binary forms, with or without\r
+ modification, are permitted provided that the following conditions are met:\r
+ 1. Redistributions of source code must retain the above copyright notice,\r
+ this list of conditions and the following disclaimer.\r
+ 2. Redistributions in binary form must reproduce the above copyright notice,\r
+ this list of conditions and the following disclaimer in the documentation\r
+ and/or other materials provided with the distribution.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+**/\r
+\r
+#ifndef __FMP_DEVICE_LIB__\r
+#define __FMP_DEVICE_LIB__\r
+\r
+#include <Protocol/FirmwareManagement.h>\r
+\r
+/**\r
+ Callback function that installs a Firmware Management Protocol instance onto\r
+ a handle.\r
+\r
+ @param[in] Handle The device handle to install a Firmware Management\r
+ Protocol instance.\r
+\r
+ @retval EFI_SUCCESS A Firmware Management Protocol instance was\r
+ installed onto Handle.\r
+ @retval EFI_INVALID_PARAMETER Handle is invalid\r
+ @retval other A Firmware Management Protocol instance could\r
+ not be installed onto Handle.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER)(\r
+ IN EFI_HANDLE Handle\r
+ );\r
+\r
+/**\r
+ Provide a function to install the Firmware Management Protocol instance onto a\r
+ device handle when the device is managed by a driver that follows the UEFI\r
+ Driver Model. If the device is not managed by a driver that follows the UEFI\r
+ Driver Model, then EFI_UNSUPPORTED is returned.\r
+\r
+ @param[in] FmpInstaller Function that installs the Firmware Management\r
+ Protocol.\r
+\r
+ @retval EFI_SUCCESS The device is managed by a driver that follows the\r
+ UEFI Driver Model. FmpInstaller must be called on\r
+ each Driver Binding Start().\r
+ @retval EFI_UNSUPPORTED The device is not managed by a driver that follows\r
+ the UEFI Driver Model.\r
+ @retval other The Firmware Management Protocol for this firmware\r
+ device is not installed. The firmware device is\r
+ still locked using FmpDeviceLock().\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegisterFmpInstaller (\r
+ IN FMP_DEVICE_LIB_REGISTER_FMP_INSTALLER FmpInstaller\r
+ );\r
+\r
+/**\r
+ Returns the size, in bytes, of the firmware image currently stored in the\r
+ firmware device. This function is used to by the GetImage() and\r
+ GetImageInfo() services of the Firmware Management Protocol. If the image\r
+ size can not be determined from the firmware device, then 0 must be returned.\r
+\r
+ @param[out] Size Pointer to the size, in bytes, of the firmware image\r
+ currently stored in the firmware device.\r
+\r
+ @retval EFI_SUCCESS The size of the firmware image currently\r
+ stored in the firmware device was returned.\r
+ @retval EFI_INVALID_PARAMETER Size is NULL.\r
+ @retval EFI_UNSUPPORTED The firmware device does not support reporting\r
+ the size of the currently stored firmware image.\r
+ @retval EFI_DEVICE_ERROR An error occured attempting to determine the\r
+ size of the firmware image currently stored in\r
+ in the firmware device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetSize (\r
+ OUT UINTN *Size\r
+ );\r
+\r
+/**\r
+ Returns the GUID value used to fill in the ImageTypeId field of the\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()\r
+ service of the Firmware Management Protocol. If EFI_UNSUPPORTED is returned,\r
+ then the ImageTypeId field is set to gEfiCallerIdGuid. If EFI_SUCCESS is\r
+ returned, then ImageTypeId is set to the Guid returned from this function.\r
+\r
+ @param[out] Guid Double pointer to a GUID value that is updated to point to\r
+ to a GUID value. The GUID value is not allocated and must\r
+ not be modified or freed by the caller.\r
+\r
+ @retval EFI_SUCCESS EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set\r
+ to the returned Guid value.\r
+ @retval EFI_UNSUPPORTED EFI_FIRMWARE_IMAGE_DESCRIPTOR ImageTypeId GUID is set\r
+ to gEfiCallerIdGuid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetImageTypeIdGuidPtr (\r
+ OUT EFI_GUID **Guid\r
+ );\r
+\r
+/**\r
+ Returns values used to fill in the AttributesSupported and AttributesSettings\r
+ fields of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the\r
+ GetImageInfo() service of the Firmware Management Protocol. The following\r
+ bit values from the Firmware Management Protocol may be combined:\r
+ IMAGE_ATTRIBUTE_IMAGE_UPDATABLE\r
+ IMAGE_ATTRIBUTE_RESET_REQUIRED\r
+ IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED\r
+ IMAGE_ATTRIBUTE_IN_USE\r
+ IMAGE_ATTRIBUTE_UEFI_IMAGE\r
+\r
+ @param[out] Supported Attributes supported by this firmware device.\r
+ @param[out] Setting Attributes settings for this firmware device.\r
+\r
+ @retval EFI_SUCCESS The attributes supported by the firmware\r
+ device were returned.\r
+ @retval EFI_INVALID_PARAMETER Supported is NULL.\r
+ @retval EFI_INVALID_PARAMETER Setting is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetAttributes (\r
+ IN OUT UINT64 *Supported,\r
+ IN OUT UINT64 *Setting\r
+ );\r
+\r
+/**\r
+ Returns the value used to fill in the LowestSupportedVersion field of the\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()\r
+ service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then\r
+ the firmware device supports a method to report the LowestSupportedVersion\r
+ value from the currently stored firmware image. If the value can not be\r
+ reported for the firmware image currently stored in the firmware device, then\r
+ EFI_UNSUPPORTED must be returned. EFI_DEVICE_ERROR is returned if an error\r
+ occurs attempting to retrieve the LowestSupportedVersion value for the\r
+ currently stored firmware image.\r
+\r
+ @note It is recommended that all firmware devices support a method to report\r
+ the LowestSupportedVersion value from the currently stored firmware\r
+ image.\r
+\r
+ @param[out] LowestSupportedVersion LowestSupportedVersion value retrieved\r
+ from the currently stored firmware image.\r
+\r
+ @retval EFI_SUCCESS The lowest supported version of currently stored\r
+ firmware image was returned in LowestSupportedVersion.\r
+ @retval EFI_UNSUPPORTED The firmware device does not support a method to\r
+ report the lowest supported version of the currently\r
+ stored firmware image.\r
+ @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the lowest\r
+ supported version of the currently stored firmware\r
+ image.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetLowestSupportedVersion (\r
+ OUT UINT32 *LowestSupportedVersion\r
+ );\r
+\r
+/**\r
+ Returns the Null-terminated Unicode string that is used to fill in the\r
+ VersionName field of the EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is\r
+ returned by the GetImageInfo() service of the Firmware Management Protocol.\r
+ The returned string must be allocated using EFI_BOOT_SERVICES.AllocatePool().\r
+\r
+ @note It is recommended that all firmware devices support a method to report\r
+ the VersionName string from the currently stored firmware image.\r
+\r
+ @param[out] VersionString The version string retrieved from the currently\r
+ stored firmware image.\r
+\r
+ @retval EFI_SUCCESS The version string of currently stored\r
+ firmware image was returned in Version.\r
+ @retval EFI_INVALID_PARAMETER VersionString is NULL.\r
+ @retval EFI_UNSUPPORTED The firmware device does not support a method\r
+ to report the version string of the currently\r
+ stored firmware image.\r
+ @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the\r
+ version string of the currently stored\r
+ firmware image.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate the\r
+ buffer for the version string of the currently\r
+ stored firmware image.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetVersionString (\r
+ OUT CHAR16 **VersionString\r
+ );\r
+\r
+/**\r
+ Returns the value used to fill in the Version field of the\r
+ EFI_FIRMWARE_IMAGE_DESCRIPTOR structure that is returned by the GetImageInfo()\r
+ service of the Firmware Management Protocol. If EFI_SUCCESS is returned, then\r
+ the firmware device supports a method to report the Version value from the\r
+ currently stored firmware image. If the value can not be reported for the\r
+ firmware image currently stored in the firmware device, then EFI_UNSUPPORTED\r
+ must be returned. EFI_DEVICE_ERROR is returned if an error occurs attempting\r
+ to retrieve the LowestSupportedVersion value for the currently stored firmware\r
+ image.\r
+\r
+ @note It is recommended that all firmware devices support a method to report\r
+ the Version value from the currently stored firmware image.\r
+\r
+ @param[out] Version The version value retrieved from the currently stored\r
+ firmware image.\r
+\r
+ @retval EFI_SUCCESS The version of currently stored firmware image was\r
+ returned in Version.\r
+ @retval EFI_UNSUPPORTED The firmware device does not support a method to\r
+ report the version of the currently stored firmware\r
+ image.\r
+ @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the version\r
+ of the currently stored firmware image.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetVersion (\r
+ OUT UINT32 *Version\r
+ );\r
+\r
+/**\r
+ Returns a copy of the firmware image currently stored in the firmware device.\r
+\r
+ @note It is recommended that all firmware devices support a method to retrieve\r
+ a copy currently stored firmware image. This can be used to support\r
+ features such as recovery and rollback.\r
+\r
+ @param[out] Image Pointer to a caller allocated buffer where the\r
+ currently stored firmware image is copied to.\r
+ @param[in out] ImageSize Pointer the size, in bytes, of the Image buffer.\r
+ On return, points to the size, in bytes, of firmware\r
+ image currently stored in the firmware device.\r
+\r
+ @retval EFI_SUCCESS Image contains a copy of the firmware image\r
+ currently stored in the firmware device, and\r
+ ImageSize contains the size, in bytes, of the\r
+ firmware image currently stored in the\r
+ firmware device.\r
+ @retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small\r
+ to hold the firmware image currently stored in\r
+ the firmware device. The buffer size required\r
+ is returned in ImageSize.\r
+ @retval EFI_INVALID_PARAMETER The Image is NULL.\r
+ @retval EFI_INVALID_PARAMETER The ImageSize is NULL.\r
+ @retval EFI_UNSUPPORTED The operation is not supported.\r
+ @retval EFI_DEVICE_ERROR An error occurred attempting to retrieve the\r
+ firmware image currently stored in the firmware\r
+ device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceGetImage (\r
+ IN OUT VOID *Image,\r
+ IN IN OUT UINTN *ImageSize\r
+ );\r
+\r
+/**\r
+ Checks if a new firmware image is valid for the firmware device. This\r
+ function allows firmware update operation to validate the firmware image\r
+ before FmpDeviceSetImage() is called.\r
+\r
+ @param[in] Image Points to a new firmware image.\r
+ @param[in] ImageSize Size, in bytes, of a new firmware image.\r
+ @param[out] ImageUpdatable Indicates if a new firmware image is valid for\r
+ a firmware update to the firmware device. The\r
+ following values from the Firmware Management\r
+ Protocol are supported:\r
+ IMAGE_UPDATABLE_VALID\r
+ IMAGE_UPDATABLE_INVALID\r
+ IMAGE_UPDATABLE_INVALID_TYPE\r
+ IMAGE_UPDATABLE_INVALID_OLD\r
+ IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE\r
+\r
+ @retval EFI_SUCCESS The image was successfully checked. Additional\r
+ status information is returned in\r
+ ImageUpdateable.\r
+ @retval EFI_INVALID_PARAMETER Image is NULL.\r
+ @retval EFI_INVALID_PARAMETER ImageUpdateable is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceCheckImage (\r
+ IN CONST VOID *Image,\r
+ IN UINTN ImageSize,\r
+ OUT UINT32 *ImageUpdateable\r
+ );\r
+\r
+/**\r
+ Updates a firmware device with a new firmware image. This function returns\r
+ EFI_UNSUPPORTED if the firmware image is not updatable. If the firmware image\r
+ is updatable, the function should perform the following minimal validations\r
+ before proceeding to do the firmware image update.\r
+ - Validate that the image is a supported image for this firmware device.\r
+ Return EFI_ABORTED if the image is not supported. Additional details\r
+ on why the image is not a supported image may be returned in AbortReason.\r
+ - Validate the data from VendorCode if is not NULL. Firmware image\r
+ validation must be performed before VendorCode data validation.\r
+ VendorCode data is ignored or considered invalid if image validation\r
+ fails. Return EFI_ABORTED if the VendorCode data is invalid.\r
+\r
+ VendorCode enables vendor to implement vendor-specific firmware image update\r
+ policy. Null if the caller did not specify the policy or use the default\r
+ policy. As an example, vendor can implement a policy to allow an option to\r
+ force a firmware image update when the abort reason is due to the new firmware\r
+ image version is older than the current firmware image version or bad image\r
+ checksum. Sensitive operations such as those wiping the entire firmware image\r
+ and render the device to be non-functional should be encoded in the image\r
+ itself rather than passed with the VendorCode. AbortReason enables vendor to\r
+ have the option to provide a more detailed description of the abort reason to\r
+ the caller.\r
+\r
+ @param[in] Image Points to the new firmware image.\r
+ @param[in] ImageSize Size, in bytes, of the new firmware image.\r
+ @param[in] VendorCode This enables vendor to implement vendor-specific\r
+ firmware image update policy. NULL indicates\r
+ the caller did not specify the policy or use the\r
+ default policy.\r
+ @param[in] Progress A function used to report the progress of\r
+ updating the firmware device with the new\r
+ firmware image.\r
+ @param[in] CapsuleFwVersion The version of the new firmware image from the\r
+ update capsule that provided the new firmware\r
+ image.\r
+ @param[out] AbortReason A pointer to a pointer to a Null-terminated\r
+ Unicode string providing more details on an\r
+ aborted operation. The buffer is allocated by\r
+ this function with\r
+ EFI_BOOT_SERVICES.AllocatePool(). It is the\r
+ caller's responsibility to free this buffer with\r
+ EFI_BOOT_SERVICES.FreePool().\r
+\r
+ @retval EFI_SUCCESS The firmware device was successfully updated\r
+ with the new firmware image.\r
+ @retval EFI_ABORTED The operation is aborted. Additional details\r
+ are provided in AbortReason.\r
+ @retval EFI_INVALID_PARAMETER The Image was NULL.\r
+ @retval EFI_UNSUPPORTED The operation is not supported.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceSetImage (\r
+ IN CONST VOID *Image,\r
+ IN UINTN ImageSize,\r
+ IN CONST VOID *VendorCode, OPTIONAL\r
+ IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, OPTIONAL\r
+ IN UINT32 CapsuleFwVersion,\r
+ OUT CHAR16 **AbortReason\r
+ );\r
+\r
+/**\r
+ Lock the firmware device that contains a firmware image. Once a firmware\r
+ device is locked, any attempts to modify the firmware image contents in the\r
+ firmware device must fail.\r
+\r
+ @note It is recommended that all firmware devices support a lock method to\r
+ prevent modifications to a stored firmware image.\r
+\r
+ @note A firmware device lock mechanism is typically only cleared by a full\r
+ system reset (not just sleep state/low power mode).\r
+\r
+ @retval EFI_SUCCESS The firmware device was locked.\r
+ @retval EFI_UNSUPPORTED The firmware device does not support locking\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FmpDeviceLock (\r
+ VOID\r
+ );\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ Provides services to retrieve values from a capsule's FMP Payload Header.\r
+ The structure is not included in the library class. Instead, services are\r
+ provided to retrieve information from the FMP Payload Header. If information\r
+ is added to the FMP Payload Header, then new services may be added to this\r
+ library class to retrieve the new information.\r
+\r
+ Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>\r
+\r
+ Redistribution and use in source and binary forms, with or without\r
+ modification, are permitted provided that the following conditions are met:\r
+ 1. Redistributions of source code must retain the above copyright notice,\r
+ this list of conditions and the following disclaimer.\r
+ 2. Redistributions in binary form must reproduce the above copyright notice,\r
+ this list of conditions and the following disclaimer in the documentation\r
+ and/or other materials provided with the distribution.\r
+\r
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+**/\r
+\r
+#ifndef _FMP_PAYLOAD_HEADER_LIB_H__\r
+#define _FMP_PAYLOAD_HEADER_LIB_H__\r
+\r
+/**\r
+ Returns the FMP Payload Header size in bytes.\r
+\r
+ @param[in] Header FMP Payload Header to evaluate\r
+ @param[in] FmpPayloadSize Size of FMP payload\r
+ @param[out] Size The size, in bytes, of the FMP Payload Header.\r
+\r
+ @retval EFI_SUCCESS The firmware version was returned.\r
+ @retval EFI_INVALID_PARAMETER Header is NULL.\r
+ @retval EFI_INVALID_PARAMETER Size is NULL.\r
+ @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetFmpPayloadHeaderSize (\r
+ IN CONST VOID *Header,\r
+ IN CONST UINTN FmpPayloadSize,\r
+ OUT UINT32 *Size\r
+ );\r
+\r
+/**\r
+ Returns the version described in the FMP Payload Header.\r
+\r
+ @param[in] Header FMP Payload Header to evaluate\r
+ @param[in] FmpPayloadSize Size of FMP payload\r
+ @param[out] Version The firmware version described in the FMP Payload\r
+ Header.\r
+\r
+ @retval EFI_SUCCESS The firmware version was returned.\r
+ @retval EFI_INVALID_PARAMETER Header is NULL.\r
+ @retval EFI_INVALID_PARAMETER Version is NULL.\r
+ @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetFmpPayloadHeaderVersion (\r
+ IN CONST VOID *Header,\r
+ IN CONST UINTN FmpPayloadSize,\r
+ OUT UINT32 *Version\r
+ );\r
+\r
+/**\r
+ Returns the lowest supported version described in the FMP Payload Header.\r
+\r
+ @param[in] Header FMP Payload Header to evaluate\r
+ @param[in] FmpPayloadSize Size of FMP payload\r
+ @param[out] LowestSupportedVersion The lowest supported version described in\r
+ the FMP Payload Header.\r
+\r
+ @retval EFI_SUCCESS The lowest support version was returned.\r
+ @retval EFI_INVALID_PARAMETER Header is NULL.\r
+ @retval EFI_INVALID_PARAMETER LowestSupportedVersion is NULL.\r
+ @retval EFI_INVALID_PARAMETER Header is not a valid FMP Payload Header.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetFmpPayloadHeaderLowestSupportedVersion (\r
+ IN CONST VOID *Header,\r
+ IN CONST UINTN FmpPayloadSize,\r
+ IN OUT UINT32 *LowestSupportedVersion\r
+ );\r
+\r
+#endif\r