2 Firmware volume block driver for SPI device
4 Copyright (c) 2013-2015 Intel Corporation.
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #ifndef _FW_BLOCK_SERVICE_H
18 #define _FW_BLOCK_SERVICE_H
21 #include "SpiFlashDevice.h"
24 // Statements that include other header files
26 #include <Library/IoLib.h>
27 #include <Library/HobLib.h>
28 #include <Library/PcdLib.h>
29 #include <Library/UefiLib.h>
30 #include <Library/DebugLib.h>
31 #include <Library/BaseMemoryLib.h>
32 #include <Library/DevicePathLib.h>
33 #include <Library/UefiRuntimeLib.h>
34 #include <Library/UefiDriverEntryPoint.h>
35 #include <Library/UefiBootServicesTableLib.h>
36 #include <Library/UefiRuntimeServicesTableLib.h>
37 #include <Library/DxeServicesTableLib.h>
38 #include <Library/MemoryAllocationLib.h>
40 #include <Guid/EventGroup.h>
41 #include <Guid/HobList.h>
42 #include <Guid/FirmwareFileSystem2.h>
43 #include <Guid/SystemNvDataGuid.h>
45 #include <Protocol/SmmBase2.h>
46 #include <Protocol/LoadedImage.h>
47 #include <Protocol/PlatformSmmSpiReady.h>
50 // Define two helper macro to extract the Capability field or Status field in FVB
53 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
54 EFI_FVB2_READ_ENABLED_CAP | \
55 EFI_FVB2_WRITE_DISABLED_CAP | \
56 EFI_FVB2_WRITE_ENABLED_CAP | \
60 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
62 #define EFI_INTERNAL_POINTER 0x00000004
63 #define FVB_PHYSICAL 0
72 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader
;
73 } EFI_FW_VOL_INSTANCE
;
77 EFI_FW_VOL_INSTANCE
*FvInstance
[2];
78 UINT8
*FvbScratchSpace
[2];
79 EFI_SPI_PROTOCOL
*SpiProtocol
;
80 EFI_SPI_PROTOCOL
*SmmSpiProtocol
;
84 // SPI default opcode slots
86 #define SPI_OPCODE_JEDEC_ID_INDEX 0
87 #define SPI_OPCODE_READ_ID_INDEX 1
88 #define SPI_OPCODE_WRITE_S_INDEX 2
89 #define SPI_OPCODE_WRITE_INDEX 3
90 #define SPI_OPCODE_READ_INDEX 4
91 #define SPI_OPCODE_ERASE_INDEX 5
92 #define SPI_OPCODE_READ_S_INDEX 6
93 #define SPI_OPCODE_CHIP_ERASE_INDEX 7
95 #define SPI_ERASE_SECTOR_SIZE SIZE_4KB //This is the chipset requirement
98 // Fvb Protocol instance data
100 #define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
101 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
102 #define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'C')
106 #define EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff
107 #define EfiDevicePathType(a) (((a)->Type) & 0x7f)
108 #define EfiIsDevicePathEndType(a) (EfiDevicePathType (a) == 0x7f)
109 #define EfiIsDevicePathEndSubType(a) ((a)->SubType == EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE)
110 #define EfiIsDevicePathEnd(a) (EfiIsDevicePathEndType (a) && EfiIsDevicePathEndSubType (a))
113 MEMMAP_DEVICE_PATH MemMapDevPath
;
114 EFI_DEVICE_PATH_PROTOCOL EndDevPath
;
118 // UEFI Specification define FV device path format if FV provide name GUID in extension header
121 MEDIA_FW_VOL_DEVICE_PATH FvDevPath
;
122 EFI_DEVICE_PATH_PROTOCOL EndDevPath
;
123 } UEFI_FV_DEVICE_PATH
;
127 FV_DEVICE_PATH FvDevicePath
;
128 UEFI_FV_DEVICE_PATH UefiFvDevicePath
;
130 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance
;
131 } EFI_FW_VOL_BLOCK_DEVICE
;
134 EFI_PHYSICAL_ADDRESS BaseAddress
;
135 EFI_FIRMWARE_VOLUME_HEADER FvbInfo
;
137 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
139 EFI_FV_BLOCK_MAP_ENTRY End
[1];
140 } EFI_FVB_MEDIA_INFO
;
143 FvbVirtualddressChangeEvent (
150 IN EFI_PHYSICAL_ADDRESS FvBaseAddress
,
151 OUT EFI_FIRMWARE_VOLUME_HEADER
**FvbInfo
163 IN UINTN BlockOffset
,
164 IN OUT UINTN
*NumBytes
,
166 IN ESAL_FWB_GLOBAL
*Global
,
174 IN UINTN BlockOffset
,
175 IN OUT UINTN
*NumBytes
,
177 IN ESAL_FWB_GLOBAL
*Global
,
185 IN ESAL_FWB_GLOBAL
*Global
,
190 FvbSetVolumeAttributes (
192 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
,
193 IN ESAL_FWB_GLOBAL
*Global
,
198 FvbGetVolumeAttributes (
200 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
,
201 IN ESAL_FWB_GLOBAL
*Global
,
206 FvbGetPhysicalAddress (
208 OUT EFI_PHYSICAL_ADDRESS
*Address
,
209 IN ESAL_FWB_GLOBAL
*Global
,
215 IN EFI_HANDLE ImageHandle
,
216 IN EFI_SYSTEM_TABLE
*SystemTable
220 FvbClassAddressChangeEvent (
226 FvbSpecificInitialize (
227 IN ESAL_FWB_GLOBAL
*mFvbModuleGlobal
234 OUT UINTN
*LbaAddress
,
235 OUT UINTN
*LbaWriteAddress
,
236 OUT UINTN
*LbaLength
,
237 OUT UINTN
*NumOfBlocks
,
238 IN ESAL_FWB_GLOBAL
*Global
,
243 FvbEraseCustomBlockRange (
246 IN UINTN OffsetStartLba
,
248 IN UINTN OffsetLastLba
,
249 IN ESAL_FWB_GLOBAL
*Global
,
258 FvbProtocolGetAttributes (
259 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
260 OUT EFI_FVB_ATTRIBUTES_2
*Attributes
265 FvbProtocolSetAttributes (
266 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
267 IN OUT EFI_FVB_ATTRIBUTES_2
*Attributes
272 FvbProtocolGetPhysicalAddress (
273 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
274 OUT EFI_PHYSICAL_ADDRESS
*Address
278 FvbProtocolGetBlockSize (
279 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
281 OUT UINTN
*BlockSize
,
282 OUT UINTN
*NumOfBlocks
288 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
291 IN OUT UINTN
*NumBytes
,
298 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
301 IN OUT UINTN
*NumBytes
,
307 FvbProtocolEraseBlocks (
308 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL
*This
,
312 extern SPI_INIT_TABLE mSpiInitTable
[];