]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkPlatformPkg/Platform/SpiFvbServices/FwBlockService.h
UefiCpuPkg/PiSmmCpu: Check for untested memory in GCD
[mirror_edk2.git] / QuarkPlatformPkg / Platform / SpiFvbServices / FwBlockService.h
CommitLineData
b303605e
MK
1/** @file\r
2Firmware volume block driver for SPI device\r
3\r
4Copyright (c) 2013-2015 Intel Corporation.\r
5\r
6This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14\r
15**/\r
16\r
17#ifndef _FW_BLOCK_SERVICE_H\r
18#define _FW_BLOCK_SERVICE_H\r
19\r
20\r
21#include "SpiFlashDevice.h"\r
22\r
23//\r
24// Statements that include other header files\r
25\r
26#include <Library/IoLib.h>\r
27#include <Library/HobLib.h>\r
28#include <Library/PcdLib.h>\r
29#include <Library/UefiLib.h>\r
30#include <Library/DebugLib.h>\r
31#include <Library/BaseMemoryLib.h>\r
32#include <Library/DevicePathLib.h>\r
33#include <Library/UefiRuntimeLib.h>\r
34#include <Library/UefiDriverEntryPoint.h>\r
35#include <Library/UefiBootServicesTableLib.h>\r
36#include <Library/UefiRuntimeServicesTableLib.h>\r
37#include <Library/DxeServicesTableLib.h>\r
38#include <Library/MemoryAllocationLib.h>\r
39\r
40#include <Guid/EventGroup.h>\r
41#include <Guid/HobList.h>\r
42#include <Guid/FirmwareFileSystem2.h>\r
43#include <Guid/SystemNvDataGuid.h>\r
44\r
45#include <Protocol/SmmBase2.h>\r
46#include <Protocol/LoadedImage.h>\r
47#include <Protocol/PlatformSmmSpiReady.h>\r
48\r
49//\r
50// Define two helper macro to extract the Capability field or Status field in FVB\r
51// bit fields\r
52//\r
53#define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \\r
54 EFI_FVB2_READ_ENABLED_CAP | \\r
55 EFI_FVB2_WRITE_DISABLED_CAP | \\r
56 EFI_FVB2_WRITE_ENABLED_CAP | \\r
57 EFI_FVB2_LOCK_CAP \\r
58 )\r
59\r
60#define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)\r
61\r
62#define EFI_INTERNAL_POINTER 0x00000004\r
63#define FVB_PHYSICAL 0\r
64#define FVB_VIRTUAL 1\r
65\r
66typedef struct {\r
67 EFI_LOCK FvbDevLock;\r
68 UINTN FvBase[2];\r
69 UINTN FvWriteBase[2];\r
70 UINTN NumOfBlocks;\r
71 BOOLEAN WriteEnabled;\r
72 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;\r
73} EFI_FW_VOL_INSTANCE;\r
74\r
75typedef struct {\r
76 UINT32 NumFv;\r
77 EFI_FW_VOL_INSTANCE *FvInstance[2];\r
78 UINT8 *FvbScratchSpace[2];\r
79 EFI_SPI_PROTOCOL *SpiProtocol;\r
80 EFI_SPI_PROTOCOL *SmmSpiProtocol;\r
81} ESAL_FWB_GLOBAL;\r
82\r
83//\r
84// SPI default opcode slots\r
85//\r
86#define SPI_OPCODE_JEDEC_ID_INDEX 0\r
87#define SPI_OPCODE_READ_ID_INDEX 1\r
88#define SPI_OPCODE_WRITE_S_INDEX 2\r
89#define SPI_OPCODE_WRITE_INDEX 3\r
90#define SPI_OPCODE_READ_INDEX 4\r
91#define SPI_OPCODE_ERASE_INDEX 5\r
92#define SPI_OPCODE_READ_S_INDEX 6\r
93#define SPI_OPCODE_CHIP_ERASE_INDEX 7\r
94\r
95#define SPI_ERASE_SECTOR_SIZE SIZE_4KB //This is the chipset requirement\r
96\r
97//\r
98// Fvb Protocol instance data\r
99//\r
100#define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)\r
101#define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)\r
102#define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'C')\r
103//\r
104// Device Path\r
105//\r
106#define EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff\r
107#define EfiDevicePathType(a) (((a)->Type) & 0x7f)\r
108#define EfiIsDevicePathEndType(a) (EfiDevicePathType (a) == 0x7f)\r
109#define EfiIsDevicePathEndSubType(a) ((a)->SubType == EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE)\r
110#define EfiIsDevicePathEnd(a) (EfiIsDevicePathEndType (a) && EfiIsDevicePathEndSubType (a))\r
111\r
112typedef struct {\r
113 MEMMAP_DEVICE_PATH MemMapDevPath;\r
114 EFI_DEVICE_PATH_PROTOCOL EndDevPath;\r
115} FV_DEVICE_PATH;\r
116\r
117//\r
118// UEFI Specification define FV device path format if FV provide name GUID in extension header\r
119//\r
120typedef struct {\r
121 MEDIA_FW_VOL_DEVICE_PATH FvDevPath;\r
122 EFI_DEVICE_PATH_PROTOCOL EndDevPath;\r
123} UEFI_FV_DEVICE_PATH;\r
124\r
125typedef struct {\r
126 UINTN Signature;\r
127 FV_DEVICE_PATH FvDevicePath;\r
128 UEFI_FV_DEVICE_PATH UefiFvDevicePath;\r
129 UINTN Instance;\r
130 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;\r
131} EFI_FW_VOL_BLOCK_DEVICE;\r
132\r
133typedef struct {\r
134 EFI_PHYSICAL_ADDRESS BaseAddress;\r
135 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;\r
136 //\r
137 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0\r
138 //\r
139 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
140} EFI_FVB_MEDIA_INFO;\r
141\r
142VOID\r
143FvbVirtualddressChangeEvent (\r
144 IN EFI_EVENT Event,\r
145 IN VOID *Context\r
146 );\r
147\r
148EFI_STATUS\r
149GetFvbInfo (\r
150 IN EFI_PHYSICAL_ADDRESS FvBaseAddress,\r
151 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
152 );\r
153\r
154BOOLEAN\r
155SetPlatformFvbLock (\r
156 IN UINTN LbaAddress\r
157 );\r
158\r
159EFI_STATUS\r
160FvbReadBlock (\r
161 IN UINTN Instance,\r
162 IN EFI_LBA Lba,\r
163 IN UINTN BlockOffset,\r
164 IN OUT UINTN *NumBytes,\r
165 IN UINT8 *Buffer,\r
166 IN ESAL_FWB_GLOBAL *Global,\r
167 IN BOOLEAN Virtual\r
168 );\r
169\r
170EFI_STATUS\r
171FvbWriteBlock (\r
172 IN UINTN Instance,\r
173 IN EFI_LBA Lba,\r
174 IN UINTN BlockOffset,\r
175 IN OUT UINTN *NumBytes,\r
176 IN UINT8 *Buffer,\r
177 IN ESAL_FWB_GLOBAL *Global,\r
178 IN BOOLEAN Virtual\r
179 );\r
180\r
181EFI_STATUS\r
182FvbEraseBlock (\r
183 IN UINTN Instance,\r
184 IN EFI_LBA Lba,\r
185 IN ESAL_FWB_GLOBAL *Global,\r
186 IN BOOLEAN Virtual\r
187 );\r
188\r
189EFI_STATUS\r
190FvbSetVolumeAttributes (\r
191 IN UINTN Instance,\r
192 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
193 IN ESAL_FWB_GLOBAL *Global,\r
194 IN BOOLEAN Virtual\r
195 );\r
196\r
197EFI_STATUS\r
198FvbGetVolumeAttributes (\r
199 IN UINTN Instance,\r
200 OUT EFI_FVB_ATTRIBUTES_2 *Attributes,\r
201 IN ESAL_FWB_GLOBAL *Global,\r
202 IN BOOLEAN Virtual\r
203 );\r
204\r
205EFI_STATUS\r
206FvbGetPhysicalAddress (\r
207 IN UINTN Instance,\r
208 OUT EFI_PHYSICAL_ADDRESS *Address,\r
209 IN ESAL_FWB_GLOBAL *Global,\r
210 IN BOOLEAN Virtual\r
211 );\r
212\r
213EFI_STATUS\r
214FvbInitialize (\r
215 IN EFI_HANDLE ImageHandle,\r
216 IN EFI_SYSTEM_TABLE *SystemTable\r
217 );\r
218\r
219VOID\r
220FvbClassAddressChangeEvent (\r
221 IN EFI_EVENT Event,\r
222 IN VOID *Context\r
223 );\r
224\r
225EFI_STATUS\r
226FvbSpecificInitialize (\r
227 IN ESAL_FWB_GLOBAL *mFvbModuleGlobal\r
228 );\r
229\r
230EFI_STATUS\r
231FvbGetLbaAddress (\r
232 IN UINTN Instance,\r
233 IN EFI_LBA Lba,\r
234 OUT UINTN *LbaAddress,\r
235 OUT UINTN *LbaWriteAddress,\r
236 OUT UINTN *LbaLength,\r
237 OUT UINTN *NumOfBlocks,\r
238 IN ESAL_FWB_GLOBAL *Global,\r
239 IN BOOLEAN Virtual\r
240 );\r
241\r
242EFI_STATUS\r
243FvbEraseCustomBlockRange (\r
244 IN UINTN Instance,\r
245 IN EFI_LBA StartLba,\r
246 IN UINTN OffsetStartLba,\r
247 IN EFI_LBA LastLba,\r
248 IN UINTN OffsetLastLba,\r
249 IN ESAL_FWB_GLOBAL *Global,\r
250 IN BOOLEAN Virtual\r
251 );\r
252\r
253//\r
254// Protocol APIs\r
255//\r
256EFI_STATUS\r
257EFIAPI\r
258FvbProtocolGetAttributes (\r
259 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
260 OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
261 );\r
262\r
263EFI_STATUS\r
264EFIAPI\r
265FvbProtocolSetAttributes (\r
266 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
267 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes\r
268 );\r
269\r
270EFI_STATUS\r
271EFIAPI\r
272FvbProtocolGetPhysicalAddress (\r
273 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
274 OUT EFI_PHYSICAL_ADDRESS *Address\r
275 );\r
276\r
277EFI_STATUS\r
278FvbProtocolGetBlockSize (\r
279 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
280 IN EFI_LBA Lba,\r
281 OUT UINTN *BlockSize,\r
282 OUT UINTN *NumOfBlocks\r
283 );\r
284\r
285EFI_STATUS\r
286EFIAPI\r
287FvbProtocolRead (\r
288 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
289 IN EFI_LBA Lba,\r
290 IN UINTN Offset,\r
291 IN OUT UINTN *NumBytes,\r
292 IN UINT8 *Buffer\r
293 );\r
294\r
295EFI_STATUS\r
296EFIAPI\r
297FvbProtocolWrite (\r
298 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
299 IN EFI_LBA Lba,\r
300 IN UINTN Offset,\r
301 IN OUT UINTN *NumBytes,\r
302 IN UINT8 *Buffer\r
303 );\r
304\r
305EFI_STATUS\r
306EFIAPI\r
307FvbProtocolEraseBlocks (\r
308 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,\r
309 ...\r
310 );\r
311\r
312extern SPI_INIT_TABLE mSpiInitTable[];\r
313\r
314#endif\r