]> git.proxmox.com Git - mirror_edk2.git/blob - DuetPkg/FvbRuntimeService/FwBlockService.h
bec2572a3cde401d201f770aa3bd5915a56174a3
[mirror_edk2.git] / DuetPkg / FvbRuntimeService / FwBlockService.h
1 /**@file
2 Copyright (c) 2007, Intel Corporation
3 All rights reserved. This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
7
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
10
11 Module Name:
12
13 FwBlockService.h
14
15 Abstract:
16
17 Firmware volume block driver for Intel Firmware Hub (FWH) device
18
19 **/
20 #ifndef _FW_BLOCK_SERVICE_H
21 #define _FW_BLOCK_SERVICE_H
22
23 //
24 // The package level header files this module uses
25 //
26 #include <PiDxe.h>
27
28 //
29 // The protocols, PPI and GUID defintions for this module
30 //
31 #include <Guid/EventGroup.h>
32 #include <Guid/FirmwareFileSystem2.h>
33 #include <Protocol/FirmwareVolumeBlock.h>
34 #include <Protocol/DevicePath.h>
35 #include <Protocol/SimpleFileSystem.h>
36 #include <Protocol/BlockIo.h>
37 #include <Library/DevicePathLib.h>
38 #include <Guid/SystemNvDataGuid.h>
39 #include <Guid/FlashMapHob.h>
40 #include <Guid/HobList.h>
41
42 //
43 // The Library classes this module consumes
44 //
45 #include <Library/UefiLib.h>
46 #include <Library/UefiDriverEntryPoint.h>
47 #include <Library/BaseLib.h>
48 #include <Library/DxeServicesTableLib.h>
49 #include <Library/UefiRuntimeLib.h>
50 #include <Library/DebugLib.h>
51 #include <Library/HobLib.h>
52 #include <Library/BaseMemoryLib.h>
53 #include <Library/MemoryAllocationLib.h>
54 #include <Library/UefiBootServicesTableLib.h>
55 #include <Library/PcdLib.h>
56
57
58 #define FWH_READ_LOCK (1 << 2)
59 #define FWH_LOCK_DOWN (1 << 1)
60 #define FWH_WRITE_LOCK 1
61 #define FWH_WRITE_STATE_STATUS (1 << 7)
62 #define FWH_ERASE_STATUS (1 << 5)
63 #define FWH_PROGRAM_STATUS (1 << 4)
64 #define FWH_VPP_STATUS (1 << 3)
65 #define STALL_TIME 5
66 #define FWH_ERASE_STATUS_BITS (FWH_ERASE_STATUS || FWH_VPP_STATUS)
67 #define FWH_WRITE_STATUS_BITS (FWH_WRITE_STATUS || FWH_VPP_STATUS)
68
69 //
70 // BugBug: Add documentation here for data structure!!!!
71 //
72 #define FVB_PHYSICAL 0
73 #define FVB_VIRTUAL 1
74
75 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
76 EFI_FVB2_READ_ENABLED_CAP | \
77 EFI_FVB2_WRITE_DISABLED_CAP | \
78 EFI_FVB2_WRITE_ENABLED_CAP | \
79 EFI_FVB2_LOCK_CAP \
80 )
81 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
82
83 typedef struct {
84 EFI_LOCK FvbDevLock;
85 UINTN FvBase[2];
86 //
87 // We can treat VolumeSignature combined with MappedFile
88 // as a unique key to locate the mapped file.
89 #define MAX_PATH 256
90 UINT32 VolumeId;
91 CHAR16 MappedFile[MAX_PATH];
92 UINT32 ActuralSize;
93 UINT32 Offset;
94
95 EFI_DEVICE_PATH_PROTOCOL *Device; // only used in BS period, won't use after memory map changed
96 UINTN NumOfBlocks;
97 BOOLEAN WriteEnabled;
98 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
99 } EFI_FW_VOL_INSTANCE;
100
101 typedef struct {
102 UINT32 NumFv;
103 EFI_FW_VOL_INSTANCE *FvInstance[2];
104 UINT8 *FvbScratchSpace[2];
105 } ESAL_FWB_GLOBAL;
106
107 //
108 // Fvb Protocol instance data
109 //
110 #define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
111 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
112 #define FVB_DEVICE_SIGNATURE SIGNATURE_32 ('F', 'V', 'B', 'C')
113
114 typedef struct {
115 MEMMAP_DEVICE_PATH MemMapDevPath;
116 EFI_DEVICE_PATH_PROTOCOL EndDevPath;
117 } FV_DEVICE_PATH;
118
119 typedef struct {
120 UINTN Signature;
121 FV_DEVICE_PATH DevicePath;
122 UINTN Instance;
123 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
124 } EFI_FW_VOL_BLOCK_DEVICE;
125
126 EFI_STATUS
127 GetFvbInfo (
128 IN EFI_PHYSICAL_ADDRESS FvBaseAddress,
129 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
130 );
131
132 EFI_STATUS
133 EnableFvbWrites (
134 IN BOOLEAN EnableWrites
135 );
136
137 EFI_STATUS
138 PlatformGetFvbWriteBase (
139 IN UINTN CurrentBaseAddress,
140 IN UINTN *NewBaseAddress,
141 IN BOOLEAN *WriteEnabled
142 );
143
144 EFI_STATUS
145 EnablePlatformFvb (
146 VOID
147 );
148
149 BOOLEAN
150 SetPlatformFvbLock (
151 IN UINTN LbaAddress
152 );
153
154 EFI_STATUS
155 FvbReadBlock (
156 IN UINTN Instance,
157 IN EFI_LBA Lba,
158 IN UINTN BlockOffset,
159 IN OUT UINTN *NumBytes,
160 IN UINT8 *Buffer,
161 IN ESAL_FWB_GLOBAL *Global,
162 IN BOOLEAN Virtual
163 );
164
165 EFI_STATUS
166 FvbWriteBlock (
167 IN UINTN Instance,
168 IN EFI_LBA Lba,
169 IN UINTN BlockOffset,
170 IN OUT UINTN *NumBytes,
171 IN UINT8 *Buffer,
172 IN ESAL_FWB_GLOBAL *Global,
173 IN BOOLEAN Virtual
174 );
175
176 EFI_STATUS
177 FvbEraseBlock (
178 IN UINTN Instance,
179 IN EFI_LBA Lba,
180 IN ESAL_FWB_GLOBAL *Global,
181 IN BOOLEAN Virtual
182 );
183
184 EFI_STATUS
185 FvbSetVolumeAttributes (
186 IN UINTN Instance,
187 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
188 IN ESAL_FWB_GLOBAL *Global,
189 IN BOOLEAN Virtual
190 );
191
192 EFI_STATUS
193 FvbGetVolumeAttributes (
194 IN UINTN Instance,
195 OUT EFI_FVB_ATTRIBUTES_2 *Attributes,
196 IN ESAL_FWB_GLOBAL *Global,
197 IN BOOLEAN Virtual
198 );
199
200 EFI_STATUS
201 FvbGetPhysicalAddress (
202 IN UINTN Instance,
203 OUT EFI_PHYSICAL_ADDRESS *Address,
204 IN ESAL_FWB_GLOBAL *Global,
205 IN BOOLEAN Virtual
206 );
207
208 EFI_STATUS
209 EFIAPI
210 FvbInitialize (
211 IN EFI_HANDLE ImageHandle,
212 IN EFI_SYSTEM_TABLE *SystemTable
213 );
214
215 VOID
216 EFIAPI
217 FvbClassAddressChangeEvent (
218 IN EFI_EVENT Event,
219 IN VOID *Context
220 );
221
222 EFI_STATUS
223 FvbSpecificInitialize (
224 IN ESAL_FWB_GLOBAL *mFvbModuleGlobal
225 );
226
227 EFI_STATUS
228 FvbGetLbaAddress (
229 IN UINTN Instance,
230 IN EFI_LBA Lba,
231 OUT UINTN *LbaAddress,
232 OUT UINTN *LbaLength,
233 OUT UINTN *NumOfBlocks,
234 IN ESAL_FWB_GLOBAL *Global,
235 IN BOOLEAN Virtual
236 );
237
238 //
239 // Protocol APIs
240 //
241 EFI_STATUS
242 EFIAPI
243 FvbProtocolGetAttributes (
244 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
245 OUT EFI_FVB_ATTRIBUTES_2 *Attributes
246 );
247
248 EFI_STATUS
249 EFIAPI
250 FvbProtocolSetAttributes (
251 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
252 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
253 );
254
255 EFI_STATUS
256 EFIAPI
257 FvbProtocolGetPhysicalAddress (
258 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
259 OUT EFI_PHYSICAL_ADDRESS *Address
260 );
261
262 EFI_STATUS
263 EFIAPI
264 FvbProtocolGetBlockSize (
265 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
266 IN EFI_LBA Lba,
267 OUT UINTN *BlockSize,
268 OUT UINTN *NumOfBlocks
269 );
270
271 EFI_STATUS
272 EFIAPI
273 FvbProtocolRead (
274 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
275 IN EFI_LBA Lba,
276 IN UINTN Offset,
277 IN OUT UINTN *NumBytes,
278 IN UINT8 *Buffer
279 );
280
281 EFI_STATUS
282 EFIAPI
283 FvbProtocolWrite (
284 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
285 IN EFI_LBA Lba,
286 IN UINTN Offset,
287 IN OUT UINTN *NumBytes,
288 IN UINT8 *Buffer
289 );
290
291 EFI_STATUS
292 EFIAPI
293 FvbProtocolEraseBlocks (
294 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
295 ...
296 );
297
298 #endif