2 Firmware volume block driver for SPI device
4 Copyright (c) 2013-2015 Intel Corporation.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #ifndef _FW_BLOCK_SERVICE_H
12 #define _FW_BLOCK_SERVICE_H
15 #include "SpiFlashDevice.h"
18 // Statements that include other header files
20 #include <Library/IoLib.h>
21 #include <Library/HobLib.h>
22 #include <Library/PcdLib.h>
23 #include <Library/UefiLib.h>
24 #include <Library/DebugLib.h>
25 #include <Library/BaseMemoryLib.h>
26 #include <Library/DevicePathLib.h>
27 #include <Library/UefiRuntimeLib.h>
28 #include <Library/UefiDriverEntryPoint.h>
29 #include <Library/UefiBootServicesTableLib.h>
30 #include <Library/UefiRuntimeServicesTableLib.h>
31 #include <Library/DxeServicesTableLib.h>
32 #include <Library/MemoryAllocationLib.h>
34 #include <Guid/EventGroup.h>
35 #include <Guid/HobList.h>
36 #include <Guid/FirmwareFileSystem2.h>
37 #include <Guid/SystemNvDataGuid.h>
39 #include <Protocol/SmmBase2.h>
40 #include <Protocol/LoadedImage.h>
41 #include <Protocol/PlatformSmmSpiReady.h>
44 // Define two helper macro to extract the Capability field or Status field in FVB
47 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
48 EFI_FVB2_READ_ENABLED_CAP | \
49 EFI_FVB2_WRITE_DISABLED_CAP | \
50 EFI_FVB2_WRITE_ENABLED_CAP | \
54 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
56 #define EFI_INTERNAL_POINTER 0x00000004
57 #define FVB_PHYSICAL 0
66 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader
;
67 } EFI_FW_VOL_INSTANCE
;
71 EFI_FW_VOL_INSTANCE
*FvInstance
[2];
72 UINT8
*FvbScratchSpace
[2];
73 EFI_SPI_PROTOCOL
*SpiProtocol
;
74 EFI_SPI_PROTOCOL
*SmmSpiProtocol
;
78 // SPI default opcode slots
80 #define SPI_OPCODE_JEDEC_ID_INDEX 0
81 #define SPI_OPCODE_READ_ID_INDEX 1
82 #define SPI_OPCODE_WRITE_S_INDEX 2
83 #define SPI_OPCODE_WRITE_INDEX 3
84 #define SPI_OPCODE_READ_INDEX 4
85 #define SPI_OPCODE_ERASE_INDEX 5
86 #define SPI_OPCODE_READ_S_INDEX 6
87 #define SPI_OPCODE_CHIP_ERASE_INDEX 7
89 #define SPI_ERASE_SECTOR_SIZE SIZE_4KB //This is the chipset requirement
92 // Fvb Protocol instance data
94 #define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
95 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
96 #define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'C')
100 #define EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff
101 #define EfiDevicePathType(a) (((a)->Type) & 0x7f)
102 #define EfiIsDevicePathEndType(a) (EfiDevicePathType (a) == 0x7f)
103 #define EfiIsDevicePathEndSubType(a) ((a)->SubType == EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE)
104 #define EfiIsDevicePathEnd(a) (EfiIsDevicePathEndType (a) && EfiIsDevicePathEndSubType (a))
107 MEMMAP_DEVICE_PATH MemMapDevPath
;
108 EFI_DEVICE_PATH_PROTOCOL EndDevPath
;
112 // UEFI Specification define FV device path format if FV provide name GUID in extension header
115 MEDIA_FW_VOL_DEVICE_PATH FvDevPath
;
116 EFI_DEVICE_PATH_PROTOCOL EndDevPath
;
117 } UEFI_FV_DEVICE_PATH
;
121 FV_DEVICE_PATH FvDevicePath
;
122 UEFI_FV_DEVICE_PATH UefiFvDevicePath
;
124 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance
;
125 } EFI_FW_VOL_BLOCK_DEVICE
;
128 EFI_PHYSICAL_ADDRESS BaseAddress
;
129 EFI_FIRMWARE_VOLUME_HEADER FvbInfo
;
131 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
133 EFI_FV_BLOCK_MAP_ENTRY End
[1];
134 } EFI_FVB_MEDIA_INFO
;
137 FvbVirtualddressChangeEvent (
144 IN EFI_PHYSICAL_ADDRESS FvBaseAddress
,
145 OUT EFI_FIRMWARE_VOLUME_HEADER
**FvbInfo
157 IN UINTN BlockOffset
,
158 IN OUT UINTN
*NumBytes
,
160 IN ESAL_FWB_GLOBAL
*Global
,
168 IN UINTN BlockOffset
,
169 IN OUT UINTN
*NumBytes
,
171 IN ESAL_FWB_GLOBAL
*Global
,
179 IN ESAL_FWB_GLOBAL
*Global
,
184 FvbSetVolumeAttributes (
186 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
,
187 IN ESAL_FWB_GLOBAL
*Global
,
192 FvbGetVolumeAttributes (
194 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
,
195 IN ESAL_FWB_GLOBAL
*Global
,
200 FvbGetPhysicalAddress (
202 OUT EFI_PHYSICAL_ADDRESS
*Address
,
203 IN ESAL_FWB_GLOBAL
*Global
,
209 IN EFI_HANDLE ImageHandle
,
210 IN EFI_SYSTEM_TABLE
*SystemTable
214 FvbClassAddressChangeEvent (
220 FvbSpecificInitialize (
221 IN ESAL_FWB_GLOBAL
*mFvbModuleGlobal
228 OUT UINTN
*LbaAddress
,
229 OUT UINTN
*LbaWriteAddress
,
230 OUT UINTN
*LbaLength
,
231 OUT UINTN
*NumOfBlocks
,
232 IN ESAL_FWB_GLOBAL
*Global
,
237 FvbEraseCustomBlockRange (
240 IN UINTN OffsetStartLba
,
242 IN UINTN OffsetLastLba
,
243 IN ESAL_FWB_GLOBAL
*Global
,
252 FvbProtocolGetAttributes (
253 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
254 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
259 FvbProtocolSetAttributes (
260 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
261 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
266 FvbProtocolGetPhysicalAddress (
267 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
268 OUT EFI_PHYSICAL_ADDRESS
*Address
272 FvbProtocolGetBlockSize (
273 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
275 OUT UINTN
*BlockSize
,
276 OUT UINTN
*NumOfBlocks
282 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
285 IN OUT UINTN
*NumBytes
,
292 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
295 IN OUT UINTN
*NumBytes
,
301 FvbProtocolEraseBlocks (
302 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
306 extern SPI_INIT_TABLE mSpiInitTable
[];