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