]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkPlatformPkg/Platform/SpiFvbServices/FwBlockService.h
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / QuarkPlatformPkg / Platform / SpiFvbServices / FwBlockService.h
1 /** @file
2 Firmware volume block driver for SPI device
3
4 Copyright (c) 2013-2015 Intel Corporation.
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8
9 **/
10
11 #ifndef _FW_BLOCK_SERVICE_H
12 #define _FW_BLOCK_SERVICE_H
13
14
15 #include "SpiFlashDevice.h"
16
17 //
18 // Statements that include other header files
19
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>
33
34 #include <Guid/EventGroup.h>
35 #include <Guid/HobList.h>
36 #include <Guid/FirmwareFileSystem2.h>
37 #include <Guid/SystemNvDataGuid.h>
38
39 #include <Protocol/SmmBase2.h>
40 #include <Protocol/LoadedImage.h>
41 #include <Protocol/PlatformSmmSpiReady.h>
42
43 //
44 // Define two helper macro to extract the Capability field or Status field in FVB
45 // bit fields
46 //
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 | \
51 EFI_FVB2_LOCK_CAP \
52 )
53
54 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
55
56 #define EFI_INTERNAL_POINTER 0x00000004
57 #define FVB_PHYSICAL 0
58 #define FVB_VIRTUAL 1
59
60 typedef struct {
61 EFI_LOCK FvbDevLock;
62 UINTN FvBase[2];
63 UINTN FvWriteBase[2];
64 UINTN NumOfBlocks;
65 BOOLEAN WriteEnabled;
66 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
67 } EFI_FW_VOL_INSTANCE;
68
69 typedef struct {
70 UINT32 NumFv;
71 EFI_FW_VOL_INSTANCE *FvInstance[2];
72 UINT8 *FvbScratchSpace[2];
73 EFI_SPI_PROTOCOL *SpiProtocol;
74 EFI_SPI_PROTOCOL *SmmSpiProtocol;
75 } ESAL_FWB_GLOBAL;
76
77 //
78 // SPI default opcode slots
79 //
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
88
89 #define SPI_ERASE_SECTOR_SIZE SIZE_4KB //This is the chipset requirement
90
91 //
92 // Fvb Protocol instance data
93 //
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')
97 //
98 // Device Path
99 //
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))
105
106 typedef struct {
107 MEMMAP_DEVICE_PATH MemMapDevPath;
108 EFI_DEVICE_PATH_PROTOCOL EndDevPath;
109 } FV_DEVICE_PATH;
110
111 //
112 // UEFI Specification define FV device path format if FV provide name GUID in extension header
113 //
114 typedef struct {
115 MEDIA_FW_VOL_DEVICE_PATH FvDevPath;
116 EFI_DEVICE_PATH_PROTOCOL EndDevPath;
117 } UEFI_FV_DEVICE_PATH;
118
119 typedef struct {
120 UINTN Signature;
121 FV_DEVICE_PATH FvDevicePath;
122 UEFI_FV_DEVICE_PATH UefiFvDevicePath;
123 UINTN Instance;
124 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
125 } EFI_FW_VOL_BLOCK_DEVICE;
126
127 typedef struct {
128 EFI_PHYSICAL_ADDRESS BaseAddress;
129 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;
130 //
131 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
132 //
133 EFI_FV_BLOCK_MAP_ENTRY End[1];
134 } EFI_FVB_MEDIA_INFO;
135
136 VOID
137 FvbVirtualddressChangeEvent (
138 IN EFI_EVENT Event,
139 IN VOID *Context
140 );
141
142 EFI_STATUS
143 GetFvbInfo (
144 IN EFI_PHYSICAL_ADDRESS FvBaseAddress,
145 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
146 );
147
148 BOOLEAN
149 SetPlatformFvbLock (
150 IN UINTN LbaAddress
151 );
152
153 EFI_STATUS
154 FvbReadBlock (
155 IN UINTN Instance,
156 IN EFI_LBA Lba,
157 IN UINTN BlockOffset,
158 IN OUT UINTN *NumBytes,
159 IN UINT8 *Buffer,
160 IN ESAL_FWB_GLOBAL *Global,
161 IN BOOLEAN Virtual
162 );
163
164 EFI_STATUS
165 FvbWriteBlock (
166 IN UINTN Instance,
167 IN EFI_LBA Lba,
168 IN UINTN BlockOffset,
169 IN OUT UINTN *NumBytes,
170 IN UINT8 *Buffer,
171 IN ESAL_FWB_GLOBAL *Global,
172 IN BOOLEAN Virtual
173 );
174
175 EFI_STATUS
176 FvbEraseBlock (
177 IN UINTN Instance,
178 IN EFI_LBA Lba,
179 IN ESAL_FWB_GLOBAL *Global,
180 IN BOOLEAN Virtual
181 );
182
183 EFI_STATUS
184 FvbSetVolumeAttributes (
185 IN UINTN Instance,
186 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
187 IN ESAL_FWB_GLOBAL *Global,
188 IN BOOLEAN Virtual
189 );
190
191 EFI_STATUS
192 FvbGetVolumeAttributes (
193 IN UINTN Instance,
194 OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
195 IN ESAL_FWB_GLOBAL *Global,
196 IN BOOLEAN Virtual
197 );
198
199 EFI_STATUS
200 FvbGetPhysicalAddress (
201 IN UINTN Instance,
202 OUT EFI_PHYSICAL_ADDRESS *Address,
203 IN ESAL_FWB_GLOBAL *Global,
204 IN BOOLEAN Virtual
205 );
206
207 EFI_STATUS
208 FvbInitialize (
209 IN EFI_HANDLE ImageHandle,
210 IN EFI_SYSTEM_TABLE *SystemTable
211 );
212
213 VOID
214 FvbClassAddressChangeEvent (
215 IN EFI_EVENT Event,
216 IN VOID *Context
217 );
218
219 EFI_STATUS
220 FvbSpecificInitialize (
221 IN ESAL_FWB_GLOBAL *mFvbModuleGlobal
222 );
223
224 EFI_STATUS
225 FvbGetLbaAddress (
226 IN UINTN Instance,
227 IN EFI_LBA Lba,
228 OUT UINTN *LbaAddress,
229 OUT UINTN *LbaWriteAddress,
230 OUT UINTN *LbaLength,
231 OUT UINTN *NumOfBlocks,
232 IN ESAL_FWB_GLOBAL *Global,
233 IN BOOLEAN Virtual
234 );
235
236 EFI_STATUS
237 FvbEraseCustomBlockRange (
238 IN UINTN Instance,
239 IN EFI_LBA StartLba,
240 IN UINTN OffsetStartLba,
241 IN EFI_LBA LastLba,
242 IN UINTN OffsetLastLba,
243 IN ESAL_FWB_GLOBAL *Global,
244 IN BOOLEAN Virtual
245 );
246
247 //
248 // Protocol APIs
249 //
250 EFI_STATUS
251 EFIAPI
252 FvbProtocolGetAttributes (
253 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
254 OUT EFI_FVB_ATTRIBUTES_2 *Attributes
255 );
256
257 EFI_STATUS
258 EFIAPI
259 FvbProtocolSetAttributes (
260 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
261 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
262 );
263
264 EFI_STATUS
265 EFIAPI
266 FvbProtocolGetPhysicalAddress (
267 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
268 OUT EFI_PHYSICAL_ADDRESS *Address
269 );
270
271 EFI_STATUS
272 FvbProtocolGetBlockSize (
273 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
274 IN EFI_LBA Lba,
275 OUT UINTN *BlockSize,
276 OUT UINTN *NumOfBlocks
277 );
278
279 EFI_STATUS
280 EFIAPI
281 FvbProtocolRead (
282 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
283 IN EFI_LBA Lba,
284 IN UINTN Offset,
285 IN OUT UINTN *NumBytes,
286 IN UINT8 *Buffer
287 );
288
289 EFI_STATUS
290 EFIAPI
291 FvbProtocolWrite (
292 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
293 IN EFI_LBA Lba,
294 IN UINTN Offset,
295 IN OUT UINTN *NumBytes,
296 IN UINT8 *Buffer
297 );
298
299 EFI_STATUS
300 EFIAPI
301 FvbProtocolEraseBlocks (
302 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
303 ...
304 );
305
306 extern SPI_INIT_TABLE mSpiInitTable[];
307
308 #endif