]> git.proxmox.com Git - mirror_edk2.git/blobdiff - FmpDevicePkg/Include/Library/FmpDeviceLib.h
FmpDevicePkg: Add package, library classes, and PCDs
[mirror_edk2.git] / FmpDevicePkg / Include / Library / FmpDeviceLib.h
diff --git a/FmpDevicePkg/Include/Library/FmpDeviceLib.h b/FmpDevicePkg/Include/Library/FmpDeviceLib.h
new file mode 100644 (file)
index 0000000..08125f0
--- /dev/null
@@ -0,0 +1,405 @@
+/**  @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