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
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.
17 Firmware volume block driver for Intel Firmware Hub (FWH) device
20 #ifndef _FW_BLOCK_SERVICE_H
21 #define _FW_BLOCK_SERVICE_H
24 // The package level header files this module uses
29 // The protocols, PPI and GUID defintions for this module
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>
43 // The Library classes this module consumes
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>
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)
66 #define FWH_ERASE_STATUS_BITS (FWH_ERASE_STATUS || FWH_VPP_STATUS)
67 #define FWH_WRITE_STATUS_BITS (FWH_WRITE_STATUS || FWH_VPP_STATUS)
70 // BugBug: Add documentation here for data structure!!!!
72 #define FVB_PHYSICAL 0
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 | \
81 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
87 // We can treat VolumeSignature combined with MappedFile
88 // as a unique key to locate the mapped file.
91 CHAR16 MappedFile
[MAX_PATH
];
95 EFI_DEVICE_PATH_PROTOCOL
*Device
; // only used in BS period, won't use after memory map changed
98 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader
;
99 } EFI_FW_VOL_INSTANCE
;
103 EFI_FW_VOL_INSTANCE
*FvInstance
[2];
104 UINT8
*FvbScratchSpace
[2];
108 // Fvb Protocol instance data
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')
115 MEMMAP_DEVICE_PATH MemMapDevPath
;
116 EFI_DEVICE_PATH_PROTOCOL EndDevPath
;
121 FV_DEVICE_PATH DevicePath
;
123 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance
;
124 } EFI_FW_VOL_BLOCK_DEVICE
;
128 IN EFI_PHYSICAL_ADDRESS FvBaseAddress
,
129 OUT EFI_FIRMWARE_VOLUME_HEADER
**FvbInfo
134 IN BOOLEAN EnableWrites
138 PlatformGetFvbWriteBase (
139 IN UINTN CurrentBaseAddress
,
140 IN UINTN
*NewBaseAddress
,
141 IN BOOLEAN
*WriteEnabled
158 IN UINTN BlockOffset
,
159 IN OUT UINTN
*NumBytes
,
161 IN ESAL_FWB_GLOBAL
*Global
,
169 IN UINTN BlockOffset
,
170 IN OUT UINTN
*NumBytes
,
172 IN ESAL_FWB_GLOBAL
*Global
,
180 IN ESAL_FWB_GLOBAL
*Global
,
185 FvbSetVolumeAttributes (
187 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
,
188 IN ESAL_FWB_GLOBAL
*Global
,
193 FvbGetVolumeAttributes (
195 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
,
196 IN ESAL_FWB_GLOBAL
*Global
,
201 FvbGetPhysicalAddress (
203 OUT EFI_PHYSICAL_ADDRESS
*Address
,
204 IN ESAL_FWB_GLOBAL
*Global
,
211 IN EFI_HANDLE ImageHandle
,
212 IN EFI_SYSTEM_TABLE
*SystemTable
217 FvbClassAddressChangeEvent (
223 FvbSpecificInitialize (
224 IN ESAL_FWB_GLOBAL
*mFvbModuleGlobal
231 OUT UINTN
*LbaAddress
,
232 OUT UINTN
*LbaLength
,
233 OUT UINTN
*NumOfBlocks
,
234 IN ESAL_FWB_GLOBAL
*Global
,
243 FvbProtocolGetAttributes (
244 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
245 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
250 FvbProtocolSetAttributes (
251 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
252 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
257 FvbProtocolGetPhysicalAddress (
258 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
259 OUT EFI_PHYSICAL_ADDRESS
*Address
264 FvbProtocolGetBlockSize (
265 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
267 OUT UINTN
*BlockSize
,
268 OUT UINTN
*NumOfBlocks
274 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
277 IN OUT UINTN
*NumBytes
,
284 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
287 IN OUT UINTN
*NumBytes
,
293 FvbProtocolEraseBlocks (
294 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,