Home | History | Annotate | Download | only in UpdateDriverDxe
      1 /** @file
      2   Common defines and definitions for a component update driver.
      3 
      4   Copyright (c) 2002 - 2010, Intel Corporation. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions
      8   of the BSD License which accompanies this distribution.  The
      9   full text of the license may be found at
     10   http://opensource.org/licenses/bsd-license.php
     11 
     12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef _EFI_UPDATE_DRIVER_H_
     18 #define _EFI_UPDATE_DRIVER_H_
     19 
     20 #include <PiDxe.h>
     21 
     22 #include <Protocol/LoadedImage.h>
     23 #include <Guid/Capsule.h>
     24 #include <Guid/CapsuleDataFile.h>
     25 #include <Protocol/FaultTolerantWrite.h>
     26 #include <Protocol/FirmwareVolumeBlock.h>
     27 #include <Protocol/FirmwareVolume2.h>
     28 
     29 #include <Library/BaseLib.h>
     30 #include <Library/DebugLib.h>
     31 #include <Library/BaseMemoryLib.h>
     32 #include <Library/UefiRuntimeServicesTableLib.h>
     33 #include <Library/UefiDriverEntryPoint.h>
     34 #include <Library/UefiBootServicesTableLib.h>
     35 #include <Library/UefiLib.h>
     36 #include <Library/MemoryAllocationLib.h>
     37 #include <Library/DxeServicesTableLib.h>
     38 #include <Library/HiiLib.h>
     39 #include <Library/PrintLib.h>
     40 #include <Library/DevicePathLib.h>
     41 
     42 extern EFI_HII_HANDLE gHiiHandle;
     43 
     44 typedef enum {
     45   UpdateWholeFV = 0,              // 0, update whole FV
     46   UpdateFvFile,                   // 1, update a set of FV files asynchronously
     47   UpdateFvRange,                  // 2, update part of FV or flash
     48   UpdateOperationMaximum          // 3
     49 } UPDATE_OPERATION_TYPE;
     50 
     51 typedef struct {
     52   UINTN                           Index;
     53   UPDATE_OPERATION_TYPE           UpdateType;
     54   EFI_DEVICE_PATH_PROTOCOL        DevicePath;
     55   EFI_PHYSICAL_ADDRESS            BaseAddress;
     56   EFI_GUID                        FileGuid;
     57   UINTN                           Length;
     58   BOOLEAN                         FaultTolerant;
     59 } UPDATE_CONFIG_DATA;
     60 
     61 typedef struct _SECTION_ITEM SECTION_ITEM;
     62 struct _SECTION_ITEM {
     63   CHAR8                           *ptrSection;
     64   UINTN                           SecNameLen;
     65   CHAR8                           *ptrEntry;
     66   CHAR8                           *ptrValue;
     67   SECTION_ITEM                    *ptrNext;
     68 };
     69 
     70 typedef struct _COMMENT_LINE COMMENT_LINE;
     71 struct _COMMENT_LINE {
     72   CHAR8                           *ptrComment;
     73   COMMENT_LINE                    *ptrNext;
     74 };
     75 
     76 typedef struct {
     77   EFI_GUID                        FileGuid;
     78 } UPDATE_PRIVATE_DATA;
     79 
     80 #define MAX_LINE_LENGTH           512
     81 #define EFI_D_UPDATE              EFI_D_ERROR
     82 
     83 #define MIN_ALIGNMENT_SIZE        4
     84 #define ALIGN_SIZE(a)   ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0)
     85 
     86 /**
     87   Parse Config data file to get the updated data array.
     88 
     89   @param DataBuffer      Config raw file buffer.
     90   @param BufferSize      Size of raw buffer.
     91   @param NumOfUpdates    Pointer to the number of update data.
     92   @param UpdateArray     Pointer to the config of update data.
     93 
     94   @retval EFI_NOT_FOUND         No config data is found.
     95   @retval EFI_OUT_OF_RESOURCES  No enough memory is allocated.
     96   @retval EFI_SUCCESS           Parse the config file successfully.
     97 
     98 **/
     99 EFI_STATUS
    100 ParseUpdateDataFile (
    101   IN      UINT8                         *DataBuffer,
    102   IN      UINTN                         BufferSize,
    103   IN OUT  UINTN                         *NumOfUpdates,
    104   IN OUT  UPDATE_CONFIG_DATA            **UpdateArray
    105   );
    106 
    107 /**
    108   Update the whole FV image, and reinsall FVB protocol for the updated FV image.
    109 
    110   @param FvbHandle       Handle of FVB protocol for the updated flash range.
    111   @param FvbProtocol     FVB protocol.
    112   @param ConfigData      Config data on updating driver.
    113   @param ImageBuffer     Image buffer to be updated.
    114   @param ImageSize       Image size.
    115 
    116   @retval EFI_INVALID_PARAMETER  Update type is not UpdateWholeFV.
    117                                  Or Image size is not same to the size of whole FV.
    118   @retval EFI_OUT_OF_RESOURCES   No enoug memory is allocated.
    119   @retval EFI_SUCCESS            FV image is updated, and its FVB protocol is reinstalled.
    120 
    121 **/
    122 EFI_STATUS
    123 PerformUpdateOnWholeFv (
    124   IN EFI_HANDLE                         FvbHandle,
    125   IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol,
    126   IN UPDATE_CONFIG_DATA                 *ConfigData,
    127   IN UINT8                              *ImageBuffer,
    128   IN UINTN                              ImageSize
    129   );
    130 
    131 /**
    132   Update certain file in the FV.
    133 
    134   @param FvbHandle       Handle of FVB protocol for the updated flash range.
    135   @param FvbProtocol     FVB protocol.
    136   @param ConfigData      Config data on updating driver.
    137   @param ImageBuffer     Image buffer to be updated.
    138   @param ImageSize       Image size.
    139   @param FileType        FFS file type.
    140   @param FileAttributes  FFS file attribute
    141 
    142   @retval EFI_INVALID_PARAMETER  Update type is not UpdateFvFile.
    143                                  Or Image size is not same to the size of whole FV.
    144   @retval EFI_UNSUPPORTED        PEIM FFS is unsupported to be updated.
    145   @retval EFI_SUCCESS            The FFS file is added into FV.
    146 
    147 **/
    148 EFI_STATUS
    149 PerformUpdateOnFvFile (
    150   IN EFI_HANDLE                         FvbHandle,
    151   IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol,
    152   IN UPDATE_CONFIG_DATA                 *ConfigData,
    153   IN UINT8                              *ImageBuffer,
    154   IN UINTN                              ImageSize,
    155   IN EFI_FV_FILETYPE                    FileType,
    156   IN EFI_FV_FILE_ATTRIBUTES             FileAttributes
    157   );
    158 
    159 /**
    160   Update the buffer into flash area in fault tolerant write method.
    161 
    162   @param ImageBuffer     Image buffer to be updated.
    163   @param SizeLeft        Size of the image buffer.
    164   @param UpdatedSize     Size of the updated buffer.
    165   @param ConfigData      Config data on updating driver.
    166   @param FlashAddress    Flash address to be updated as start address.
    167   @param FvbProtocol     FVB protocol.
    168   @param FvbHandle       Handle of FVB protocol for the updated flash range.
    169 
    170   @retval EFI_SUCCESS            Buffer data is updated into flash.
    171   @retval EFI_INVALID_PARAMETER  Base flash address is not in FVB flash area.
    172   @retval EFI_NOT_FOUND          FTW protocol doesn't exist.
    173   @retval EFI_OUT_OF_RESOURCES   No enough backup space.
    174   @retval EFI_ABORTED            Error happen when update flash area.
    175 
    176 **/
    177 EFI_STATUS
    178 FaultTolerantUpdateOnPartFv (
    179   IN       UINT8                         *ImageBuffer,
    180   IN       UINTN                         SizeLeft,
    181   IN OUT   UINTN                         *UpdatedSize,
    182   IN       UPDATE_CONFIG_DATA            *ConfigData,
    183   IN       EFI_PHYSICAL_ADDRESS          FlashAddress,
    184   IN       EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol,
    185   IN       EFI_HANDLE                    FvbHandle
    186   );
    187 
    188 /**
    189   Directly update the buffer into flash area without fault tolerant write method.
    190 
    191   @param ImageBuffer     Image buffer to be updated.
    192   @param SizeLeft        Size of the image buffer.
    193   @param UpdatedSize     Size of the updated buffer.
    194   @param FlashAddress    Flash address to be updated as start address.
    195   @param FvbProtocol     FVB protocol.
    196   @param FvbHandle       Handle of FVB protocol for the updated flash range.
    197 
    198   @retval EFI_SUCCESS            Buffer data is updated into flash.
    199   @retval EFI_INVALID_PARAMETER  Base flash address is not in FVB flash area.
    200   @retval EFI_OUT_OF_RESOURCES   No enough backup space.
    201 
    202 **/
    203 EFI_STATUS
    204 NonFaultTolerantUpdateOnPartFv (
    205   IN      UINT8                         *ImageBuffer,
    206   IN      UINTN                         SizeLeft,
    207   IN OUT  UINTN                         *UpdatedSize,
    208   IN      EFI_PHYSICAL_ADDRESS          FlashAddress,
    209   IN      EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol,
    210   IN      EFI_HANDLE                    FvbHandle
    211   );
    212 
    213 #endif
    214