1 /**@file 2 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> 3 This program and the accompanying materials 4 are licensed and made available under the terms and conditions of the BSD License 5 which accompanies this distribution. The full text of the license may be found at 6 http://opensource.org/licenses/bsd-license.php 7 8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 10 11 Module Name: 12 13 FwBlockService.h 14 15 Abstract: 16 17 Firmware volume block driver for Intel Firmware Hub (FWH) device 18 19 **/ 20 #ifndef _FW_BLOCK_SERVICE_H 21 #define _FW_BLOCK_SERVICE_H 22 23 // 24 // The package level header files this module uses 25 // 26 #include <PiDxe.h> 27 28 // 29 // The protocols, PPI and GUID defintions for this module 30 // 31 #include <Guid/EventGroup.h> 32 #include <Guid/FirmwareFileSystem2.h> 33 #include <Protocol/FirmwareVolumeBlock.h> 34 #include <Protocol/DevicePath.h> 35 #include <Protocol/SimpleFileSystem.h> 36 #include <Protocol/BlockIo.h> 37 #include <Library/DevicePathLib.h> 38 #include <Guid/SystemNvDataGuid.h> 39 #include <Guid/FlashMapHob.h> 40 #include <Guid/HobList.h> 41 42 // 43 // The Library classes this module consumes 44 // 45 #include <Library/UefiLib.h> 46 #include <Library/UefiDriverEntryPoint.h> 47 #include <Library/BaseLib.h> 48 #include <Library/DxeServicesTableLib.h> 49 #include <Library/UefiRuntimeLib.h> 50 #include <Library/DebugLib.h> 51 #include <Library/HobLib.h> 52 #include <Library/BaseMemoryLib.h> 53 #include <Library/MemoryAllocationLib.h> 54 #include <Library/UefiBootServicesTableLib.h> 55 #include <Library/PcdLib.h> 56 57 58 #define FWH_READ_LOCK (1 << 2) 59 #define FWH_LOCK_DOWN (1 << 1) 60 #define FWH_WRITE_LOCK 1 61 #define FWH_WRITE_STATE_STATUS (1 << 7) 62 #define FWH_ERASE_STATUS (1 << 5) 63 #define FWH_PROGRAM_STATUS (1 << 4) 64 #define FWH_VPP_STATUS (1 << 3) 65 #define STALL_TIME 5 66 #define FWH_ERASE_STATUS_BITS (FWH_ERASE_STATUS || FWH_VPP_STATUS) 67 #define FWH_WRITE_STATUS_BITS (FWH_WRITE_STATUS || FWH_VPP_STATUS) 68 69 // 70 // BugBug: Add documentation here for data structure!!!! 71 // 72 #define FVB_PHYSICAL 0 73 #define FVB_VIRTUAL 1 74 75 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \ 76 EFI_FVB2_READ_ENABLED_CAP | \ 77 EFI_FVB2_WRITE_DISABLED_CAP | \ 78 EFI_FVB2_WRITE_ENABLED_CAP | \ 79 EFI_FVB2_LOCK_CAP \ 80 ) 81 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS) 82 83 typedef struct { 84 EFI_LOCK FvbDevLock; 85 UINTN FvBase[2]; 86 // 87 // We can treat VolumeSignature combined with MappedFile 88 // as a unique key to locate the mapped file. 89 #define MAX_PATH 256 90 UINT32 VolumeId; 91 CHAR16 MappedFile[MAX_PATH]; 92 UINT32 ActuralSize; 93 UINT32 Offset; 94 95 EFI_DEVICE_PATH_PROTOCOL *Device; // only used in BS period, won't use after memory map changed 96 UINTN NumOfBlocks; 97 BOOLEAN WriteEnabled; 98 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader; 99 } EFI_FW_VOL_INSTANCE; 100 101 typedef struct { 102 UINT32 NumFv; 103 EFI_FW_VOL_INSTANCE *FvInstance[2]; 104 UINT8 *FvbScratchSpace[2]; 105 } ESAL_FWB_GLOBAL; 106 107 // 108 // Fvb Protocol instance data 109 // 110 #define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE) 111 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE) 112 #define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'C') 113 114 typedef struct { 115 MEMMAP_DEVICE_PATH MemMapDevPath; 116 EFI_DEVICE_PATH_PROTOCOL EndDevPath; 117 } FV_DEVICE_PATH; 118 119 typedef struct { 120 UINTN Signature; 121 FV_DEVICE_PATH DevicePath; 122 UINTN Instance; 123 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; 124 } EFI_FW_VOL_BLOCK_DEVICE; 125 126 EFI_STATUS 127 GetFvbInfo ( 128 IN EFI_PHYSICAL_ADDRESS FvBaseAddress, 129 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo 130 ); 131 132 EFI_STATUS 133 EnableFvbWrites ( 134 IN BOOLEAN EnableWrites 135 ); 136 137 EFI_STATUS 138 PlatformGetFvbWriteBase ( 139 IN UINTN CurrentBaseAddress, 140 IN UINTN *NewBaseAddress, 141 IN BOOLEAN *WriteEnabled 142 ); 143 144 EFI_STATUS 145 EnablePlatformFvb ( 146 VOID 147 ); 148 149 BOOLEAN 150 SetPlatformFvbLock ( 151 IN UINTN LbaAddress 152 ); 153 154 EFI_STATUS 155 FvbReadBlock ( 156 IN UINTN Instance, 157 IN EFI_LBA Lba, 158 IN UINTN BlockOffset, 159 IN OUT UINTN *NumBytes, 160 IN UINT8 *Buffer, 161 IN ESAL_FWB_GLOBAL *Global, 162 IN BOOLEAN Virtual 163 ); 164 165 EFI_STATUS 166 FvbWriteBlock ( 167 IN UINTN Instance, 168 IN EFI_LBA Lba, 169 IN UINTN BlockOffset, 170 IN OUT UINTN *NumBytes, 171 IN UINT8 *Buffer, 172 IN ESAL_FWB_GLOBAL *Global, 173 IN BOOLEAN Virtual 174 ); 175 176 EFI_STATUS 177 FvbEraseBlock ( 178 IN UINTN Instance, 179 IN EFI_LBA Lba, 180 IN ESAL_FWB_GLOBAL *Global, 181 IN BOOLEAN Virtual 182 ); 183 184 EFI_STATUS 185 FvbSetVolumeAttributes ( 186 IN UINTN Instance, 187 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes, 188 IN ESAL_FWB_GLOBAL *Global, 189 IN BOOLEAN Virtual 190 ); 191 192 EFI_STATUS 193 FvbGetVolumeAttributes ( 194 IN UINTN Instance, 195 OUT EFI_FVB_ATTRIBUTES_2 *Attributes, 196 IN ESAL_FWB_GLOBAL *Global, 197 IN BOOLEAN Virtual 198 ); 199 200 EFI_STATUS 201 FvbGetPhysicalAddress ( 202 IN UINTN Instance, 203 OUT EFI_PHYSICAL_ADDRESS *Address, 204 IN ESAL_FWB_GLOBAL *Global, 205 IN BOOLEAN Virtual 206 ); 207 208 EFI_STATUS 209 EFIAPI 210 FvbInitialize ( 211 IN EFI_HANDLE ImageHandle, 212 IN EFI_SYSTEM_TABLE *SystemTable 213 ); 214 215 VOID 216 EFIAPI 217 FvbClassAddressChangeEvent ( 218 IN EFI_EVENT Event, 219 IN VOID *Context 220 ); 221 222 EFI_STATUS 223 FvbSpecificInitialize ( 224 IN ESAL_FWB_GLOBAL *mFvbModuleGlobal 225 ); 226 227 EFI_STATUS 228 FvbGetLbaAddress ( 229 IN UINTN Instance, 230 IN EFI_LBA Lba, 231 OUT UINTN *LbaAddress, 232 OUT UINTN *LbaLength, 233 OUT UINTN *NumOfBlocks, 234 IN ESAL_FWB_GLOBAL *Global, 235 IN BOOLEAN Virtual 236 ); 237 238 // 239 // Protocol APIs 240 // 241 EFI_STATUS 242 EFIAPI 243 FvbProtocolGetAttributes ( 244 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 245 OUT EFI_FVB_ATTRIBUTES_2 *Attributes 246 ); 247 248 EFI_STATUS 249 EFIAPI 250 FvbProtocolSetAttributes ( 251 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 252 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes 253 ); 254 255 EFI_STATUS 256 EFIAPI 257 FvbProtocolGetPhysicalAddress ( 258 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 259 OUT EFI_PHYSICAL_ADDRESS *Address 260 ); 261 262 EFI_STATUS 263 EFIAPI 264 FvbProtocolGetBlockSize ( 265 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 266 IN EFI_LBA Lba, 267 OUT UINTN *BlockSize, 268 OUT UINTN *NumOfBlocks 269 ); 270 271 EFI_STATUS 272 EFIAPI 273 FvbProtocolRead ( 274 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 275 IN EFI_LBA Lba, 276 IN UINTN Offset, 277 IN OUT UINTN *NumBytes, 278 IN UINT8 *Buffer 279 ); 280 281 EFI_STATUS 282 EFIAPI 283 FvbProtocolWrite ( 284 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 285 IN EFI_LBA Lba, 286 IN UINTN Offset, 287 IN OUT UINTN *NumBytes, 288 IN UINT8 *Buffer 289 ); 290 291 EFI_STATUS 292 EFIAPI 293 FvbProtocolEraseBlocks ( 294 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 295 ... 296 ); 297 298 #endif 299