/** @file | |
Common defines and definitions for a component update driver. | |
Copyright (c) 2002 - 2010, 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. | |
**/ | |
#ifndef _EFI_UPDATE_DRIVER_H_ | |
#define _EFI_UPDATE_DRIVER_H_ | |
#include <PiDxe.h> | |
#include <Protocol/LoadedImage.h> | |
#include <Guid/Capsule.h> | |
#include <Guid/CapsuleDataFile.h> | |
#include <Protocol/FaultTolerantWrite.h> | |
#include <Protocol/FirmwareVolumeBlock.h> | |
#include <Protocol/FirmwareVolume2.h> | |
#include <Library/BaseLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/UefiRuntimeServicesTableLib.h> | |
#include <Library/UefiDriverEntryPoint.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Library/UefiLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/DxeServicesTableLib.h> | |
#include <Library/HiiLib.h> | |
#include <Library/PrintLib.h> | |
#include <Library/DevicePathLib.h> | |
extern EFI_HII_HANDLE gHiiHandle; | |
typedef enum { | |
UpdateWholeFV = 0, // 0, update whole FV | |
UpdateFvFile, // 1, update a set of FV files asynchronously | |
UpdateFvRange, // 2, update part of FV or flash | |
UpdateOperationMaximum // 3 | |
} UPDATE_OPERATION_TYPE; | |
typedef struct { | |
UINTN Index; | |
UPDATE_OPERATION_TYPE UpdateType; | |
EFI_DEVICE_PATH_PROTOCOL DevicePath; | |
EFI_PHYSICAL_ADDRESS BaseAddress; | |
EFI_GUID FileGuid; | |
UINTN Length; | |
BOOLEAN FaultTolerant; | |
} UPDATE_CONFIG_DATA; | |
typedef struct _SECTION_ITEM SECTION_ITEM; | |
struct _SECTION_ITEM { | |
CHAR8 *ptrSection; | |
UINTN SecNameLen; | |
CHAR8 *ptrEntry; | |
CHAR8 *ptrValue; | |
SECTION_ITEM *ptrNext; | |
}; | |
typedef struct _COMMENT_LINE COMMENT_LINE; | |
struct _COMMENT_LINE { | |
CHAR8 *ptrComment; | |
COMMENT_LINE *ptrNext; | |
}; | |
typedef struct { | |
EFI_GUID FileGuid; | |
} UPDATE_PRIVATE_DATA; | |
#define MAX_LINE_LENGTH 512 | |
#define EFI_D_UPDATE EFI_D_ERROR | |
#define MIN_ALIGNMENT_SIZE 4 | |
#define ALIGN_SIZE(a) ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0) | |
/** | |
Parse Config data file to get the updated data array. | |
@param DataBuffer Config raw file buffer. | |
@param BufferSize Size of raw buffer. | |
@param NumOfUpdates Pointer to the number of update data. | |
@param UpdateArray Pointer to the config of update data. | |
@retval EFI_NOT_FOUND No config data is found. | |
@retval EFI_OUT_OF_RESOURCES No enough memory is allocated. | |
@retval EFI_SUCCESS Parse the config file successfully. | |
**/ | |
EFI_STATUS | |
ParseUpdateDataFile ( | |
IN UINT8 *DataBuffer, | |
IN UINTN BufferSize, | |
IN OUT UINTN *NumOfUpdates, | |
IN OUT UPDATE_CONFIG_DATA **UpdateArray | |
); | |
/** | |
Update the whole FV image, and reinsall FVB protocol for the updated FV image. | |
@param FvbHandle Handle of FVB protocol for the updated flash range. | |
@param FvbProtocol FVB protocol. | |
@param ConfigData Config data on updating driver. | |
@param ImageBuffer Image buffer to be updated. | |
@param ImageSize Image size. | |
@retval EFI_INVALID_PARAMETER Update type is not UpdateWholeFV. | |
Or Image size is not same to the size of whole FV. | |
@retval EFI_OUT_OF_RESOURCES No enoug memory is allocated. | |
@retval EFI_SUCCESS FV image is updated, and its FVB protocol is reinstalled. | |
**/ | |
EFI_STATUS | |
PerformUpdateOnWholeFv ( | |
IN EFI_HANDLE FvbHandle, | |
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol, | |
IN UPDATE_CONFIG_DATA *ConfigData, | |
IN UINT8 *ImageBuffer, | |
IN UINTN ImageSize | |
); | |
/** | |
Update certain file in the FV. | |
@param FvbHandle Handle of FVB protocol for the updated flash range. | |
@param FvbProtocol FVB protocol. | |
@param ConfigData Config data on updating driver. | |
@param ImageBuffer Image buffer to be updated. | |
@param ImageSize Image size. | |
@param FileType FFS file type. | |
@param FileAttributes FFS file attribute | |
@retval EFI_INVALID_PARAMETER Update type is not UpdateFvFile. | |
Or Image size is not same to the size of whole FV. | |
@retval EFI_UNSUPPORTED PEIM FFS is unsupported to be updated. | |
@retval EFI_SUCCESS The FFS file is added into FV. | |
**/ | |
EFI_STATUS | |
PerformUpdateOnFvFile ( | |
IN EFI_HANDLE FvbHandle, | |
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol, | |
IN UPDATE_CONFIG_DATA *ConfigData, | |
IN UINT8 *ImageBuffer, | |
IN UINTN ImageSize, | |
IN EFI_FV_FILETYPE FileType, | |
IN EFI_FV_FILE_ATTRIBUTES FileAttributes | |
); | |
/** | |
Update the buffer into flash area in fault tolerant write method. | |
@param ImageBuffer Image buffer to be updated. | |
@param SizeLeft Size of the image buffer. | |
@param UpdatedSize Size of the updated buffer. | |
@param ConfigData Config data on updating driver. | |
@param FlashAddress Flash address to be updated as start address. | |
@param FvbProtocol FVB protocol. | |
@param FvbHandle Handle of FVB protocol for the updated flash range. | |
@retval EFI_SUCCESS Buffer data is updated into flash. | |
@retval EFI_INVALID_PARAMETER Base flash address is not in FVB flash area. | |
@retval EFI_NOT_FOUND FTW protocol doesn't exist. | |
@retval EFI_OUT_OF_RESOURCES No enough backup space. | |
@retval EFI_ABORTED Error happen when update flash area. | |
**/ | |
EFI_STATUS | |
FaultTolerantUpdateOnPartFv ( | |
IN UINT8 *ImageBuffer, | |
IN UINTN SizeLeft, | |
IN OUT UINTN *UpdatedSize, | |
IN UPDATE_CONFIG_DATA *ConfigData, | |
IN EFI_PHYSICAL_ADDRESS FlashAddress, | |
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol, | |
IN EFI_HANDLE FvbHandle | |
); | |
/** | |
Directly update the buffer into flash area without fault tolerant write method. | |
@param ImageBuffer Image buffer to be updated. | |
@param SizeLeft Size of the image buffer. | |
@param UpdatedSize Size of the updated buffer. | |
@param FlashAddress Flash address to be updated as start address. | |
@param FvbProtocol FVB protocol. | |
@param FvbHandle Handle of FVB protocol for the updated flash range. | |
@retval EFI_SUCCESS Buffer data is updated into flash. | |
@retval EFI_INVALID_PARAMETER Base flash address is not in FVB flash area. | |
@retval EFI_OUT_OF_RESOURCES No enough backup space. | |
**/ | |
EFI_STATUS | |
NonFaultTolerantUpdateOnPartFv ( | |
IN UINT8 *ImageBuffer, | |
IN UINTN SizeLeft, | |
IN OUT UINTN *UpdatedSize, | |
IN EFI_PHYSICAL_ADDRESS FlashAddress, | |
IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol, | |
IN EFI_HANDLE FvbHandle | |
); | |
#endif |