1/** @file 2 The header file for Firmware volume block driver. 3 4Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> 5 6 7 This program and the accompanying materials are licensed and made available under 8 9 the terms and conditions of the BSD License that accompanies this distribution. 10 11 The full text of the license may be found at 12 13 http://opensource.org/licenses/bsd-license.php. 14 15 16 17 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 18 19 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 20 21 22 23 24**/ 25 26#ifndef _FW_BLOCK_SERVICE_H 27#define _FW_BLOCK_SERVICE_H 28 29#include <Guid/EventGroup.h> 30#include <Guid/FirmwareFileSystem2.h> 31#include <Guid/SystemNvDataGuid.h> 32#include <Protocol/DevicePath.h> 33#include <Protocol/FirmwareVolumeBlock.h> 34 35#include <Library/UefiDriverEntryPoint.h> 36#include <Library/UefiBootServicesTableLib.h> 37#include <Library/UefiLib.h> 38#include <Library/BaseLib.h> 39#include <Library/DebugLib.h> 40#include <Library/BaseMemoryLib.h> 41#include <Library/IoLib.h> 42#include <Library/CacheMaintenanceLib.h> 43#include <Library/MemoryAllocationLib.h> 44#include <Library/PcdLib.h> 45#include <Library/FlashDeviceLib.h> 46#include <Library/DevicePathLib.h> 47 48// 49// Define two helper macro to extract the Capability field or Status field in FVB 50// bit fields. 51// 52#define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \ 53 EFI_FVB2_READ_ENABLED_CAP | \ 54 EFI_FVB2_WRITE_DISABLED_CAP | \ 55 EFI_FVB2_WRITE_ENABLED_CAP | \ 56 EFI_FVB2_LOCK_CAP \ 57 ) 58 59#define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS) 60 61 62typedef struct { 63 UINTN FvBase; 64 UINTN NumOfBlocks; 65 // 66 // Note!!!: VolumeHeader must be the last element 67 // of the structure. 68 // 69 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader; 70} EFI_FW_VOL_INSTANCE; 71 72typedef struct { 73 EFI_FW_VOL_INSTANCE *FvInstance; 74 UINT32 NumFv; 75} FWB_GLOBAL; 76 77// 78// Fvb Protocol instance data. 79// 80#define FVB_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE) 81#define FVB_EXTEND_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE) 82#define FVB_DEVICE_SIGNATURE SIGNATURE_32('F','V','B','C') 83 84typedef struct { 85 MEDIA_FW_VOL_DEVICE_PATH FvDevPath; 86 EFI_DEVICE_PATH_PROTOCOL EndDevPath; 87} FV_PIWG_DEVICE_PATH; 88 89typedef struct { 90 MEMMAP_DEVICE_PATH MemMapDevPath; 91 EFI_DEVICE_PATH_PROTOCOL EndDevPath; 92} FV_MEMMAP_DEVICE_PATH; 93 94typedef struct { 95 UINT32 Signature; 96 EFI_DEVICE_PATH_PROTOCOL *DevicePath; 97 UINTN Instance; 98 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance; 99} EFI_FW_VOL_BLOCK_DEVICE; 100 101EFI_STATUS 102GetFvbInfo ( 103 IN EFI_PHYSICAL_ADDRESS FvBaseAddress, 104 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo 105 ); 106 107// 108// Protocol APIs 109// 110EFI_STATUS 111EFIAPI 112FvbProtocolGetAttributes ( 113 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 114 OUT EFI_FVB_ATTRIBUTES_2 *Attributes 115 ); 116 117EFI_STATUS 118EFIAPI 119FvbProtocolSetAttributes ( 120 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 121 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes 122 ); 123 124EFI_STATUS 125EFIAPI 126FvbProtocolGetPhysicalAddress ( 127 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 128 OUT EFI_PHYSICAL_ADDRESS *Address 129 ); 130 131EFI_STATUS 132EFIAPI 133FvbProtocolGetBlockSize ( 134 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 135 IN EFI_LBA Lba, 136 OUT UINTN *BlockSize, 137 OUT UINTN *NumOfBlocks 138 ); 139 140EFI_STATUS 141EFIAPI 142FvbProtocolRead ( 143 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 144 IN EFI_LBA Lba, 145 IN UINTN Offset, 146 IN OUT UINTN *NumBytes, 147 OUT UINT8 *Buffer 148 ); 149 150EFI_STATUS 151EFIAPI 152FvbProtocolWrite ( 153 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 154 IN EFI_LBA Lba, 155 IN UINTN Offset, 156 IN OUT UINTN *NumBytes, 157 IN UINT8 *Buffer 158 ); 159 160EFI_STATUS 161EFIAPI 162FvbProtocolEraseBlocks ( 163 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, 164 ... 165 ); 166 167EFI_FW_VOL_INSTANCE * 168GetFvbInstance ( 169 IN UINTN Instance 170 ); 171 172BOOLEAN 173IsFvHeaderValid ( 174 IN EFI_PHYSICAL_ADDRESS FvBase, 175 IN CONST EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader 176 ); 177 178VOID 179InstallFvbProtocol ( 180 IN EFI_FW_VOL_INSTANCE *FwhInstance, 181 IN UINTN InstanceNum 182 ); 183 184EFI_STATUS 185FvbInitialize ( 186 VOID 187 ); 188 189extern FWB_GLOBAL mFvbModuleGlobal; 190extern EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate; 191extern FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate; 192extern FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate; 193extern UINT32 mPlatformFvBaseAddress[3]; 194 195#endif 196 197