3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Firmware volume block driver for Intel Firmware Hub (FWH) device
22 #ifndef _FW_BLOCK_SERVICE_H
23 #define _FW_BLOCK_SERVICE_H
26 // Statements that include other header files
29 #include "EfiFirmwareVolumeHeader.h"
30 #include "EfiRuntimeLib.h"
31 #include "EfiHobLib.h"
32 #include "EfiScriptLib.h"
34 #include EFI_PROTOCOL_PRODUCER (FirmwareVolumeBlock)
35 #include EFI_PROTOCOL_PRODUCER (FvbExtension)
36 #include EFI_GUID_DEFINITION (AlternateFvBlock)
37 #include EFI_GUID_DEFINITION (Hob)
38 #include EFI_GUID_DEFINITION (DxeServices)
39 #include EFI_PROTOCOL_CONSUMER (CpuIo)
41 #define FVB_MAX_RETRY_TIMES 10000000
42 #define FWH_BLOCK_ERASE_SETUP_COMMAND 0x20
43 #define FWH_BLOCK_ERASE_CONFIRM_COMMAND 0xd0
44 #define FWH_READ_STATUS_COMMAND 0x70
45 #define FWH_CLEAR_STATUS_COMMAND 0x50
46 #define FWH_READ_ARRAY_COMMAND 0xff
47 #define FWH_WRITE_SETUP_COMMAND 0x40
48 #define FWH_OPEN_FEATURE_SPACE_COMMAND 0x91
49 #define FWH_READ_LOCK (1 << 2)
50 #define FWH_WRITE_LOCK (1 << 1)
51 #define FWH_LOCK_DOWN 1
52 #define FWH_WRITE_STATE_STATUS (1 << 7)
53 #define FWH_ERASE_STATUS (1 << 5)
54 #define FWH_PROGRAM_STATUS (1 << 4)
55 #define FWH_VPP_STATUS (1 << 3)
57 #define FWH_ERASE_STATUS_BITS (FWH_ERASE_STATUS || FWH_VPP_STATUS)
58 #define FWH_WRITE_STATUS_BITS (FWH_WRITE_STATUS || FWH_VPP_STATUS)
59 #define CFI_BLOCK_LOCK_UNLOCK 0x60
60 #define CFI_BLOCK_LOCK_CONFIRM 1
61 #define CFI_BLOCK_UNLOCK_CONFIRM 0xD0
62 #define CFI_QUERY 0x98
65 // BugBug: Add documentation here for data structure!!!!
67 #define FVB_PHYSICAL 0
76 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader
;
77 } EFI_FW_VOL_INSTANCE
;
81 EFI_FW_VOL_INSTANCE
*FvInstance
[2];
82 UINT8
*FvbScratchSpace
[2];
86 // Fvb Protocol instance data
88 #define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
89 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
90 #define FVB_DEVICE_SIGNATURE EFI_SIGNATURE_32 ('F', 'V', 'B', 'C')
93 MEMMAP_DEVICE_PATH MemMapDevPath
;
94 EFI_DEVICE_PATH_PROTOCOL EndDevPath
;
99 FV_DEVICE_PATH DevicePath
;
101 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance
;
102 EFI_FVB_EXTENSION_PROTOCOL FvbExtension
;
103 } EFI_FW_VOL_BLOCK_DEVICE
;
107 IN EFI_PHYSICAL_ADDRESS FvBaseAddress
,
108 OUT EFI_FIRMWARE_VOLUME_HEADER
**FvbInfo
114 IN BOOLEAN EnableWrites
119 PlatformGetFvbWriteBase (
120 IN UINTN CurrentBaseAddress
,
121 IN UINTN
*NewBaseAddress
,
122 IN BOOLEAN
*WriteEnabled
142 IN UINTN BlockOffset
,
143 IN OUT UINTN
*NumBytes
,
145 IN ESAL_FWB_GLOBAL
*Global
,
154 IN UINTN BlockOffset
,
155 IN OUT UINTN
*NumBytes
,
157 IN ESAL_FWB_GLOBAL
*Global
,
166 IN ESAL_FWB_GLOBAL
*Global
,
172 FvbSetVolumeAttributes (
174 IN OUT EFI_FVB_ATTRIBUTES
*Attributes
,
175 IN ESAL_FWB_GLOBAL
*Global
,
181 FvbGetVolumeAttributes (
183 OUT EFI_FVB_ATTRIBUTES
*Attributes
,
184 IN ESAL_FWB_GLOBAL
*Global
,
190 FvbGetPhysicalAddress (
192 OUT EFI_PHYSICAL_ADDRESS
*Address
,
193 IN ESAL_FWB_GLOBAL
*Global
,
201 IN EFI_HANDLE ImageHandle
,
202 IN EFI_SYSTEM_TABLE
*SystemTable
209 FvbClassAddressChangeEvent (
216 FvbSpecificInitialize (
217 IN ESAL_FWB_GLOBAL
*mFvbModuleGlobal
225 OUT UINTN
*LbaAddress
,
226 OUT UINTN
*LbaWriteAddress
,
227 OUT UINTN
*LbaLength
,
228 OUT UINTN
*NumOfBlocks
,
229 IN ESAL_FWB_GLOBAL
*Global
,
235 FvbEraseCustomBlockRange (
238 IN UINTN OffsetStartLba
,
240 IN UINTN OffsetLastLba
,
241 IN ESAL_FWB_GLOBAL
*Global
,
251 FvbProtocolGetAttributes (
252 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
253 OUT EFI_FVB_ATTRIBUTES
*Attributes
259 FvbProtocolSetAttributes (
260 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
261 IN OUT EFI_FVB_ATTRIBUTES
*Attributes
267 FvbProtocolGetPhysicalAddress (
268 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
269 OUT EFI_PHYSICAL_ADDRESS
*Address
275 FvbProtocolGetBlockSize (
276 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
278 OUT UINTN
*BlockSize
,
279 OUT UINTN
*NumOfBlocks
286 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
289 IN OUT UINTN
*NumBytes
,
297 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
300 IN OUT UINTN
*NumBytes
,
307 FvbProtocolEraseBlocks (
308 IN EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
315 FvbExtendProtocolEraseCustomBlockRange (
316 IN EFI_FVB_EXTENSION_PROTOCOL
*This
,
318 IN UINTN OffsetStartLba
,
320 IN UINTN OffsetLastLba