]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/FatPei/FatLitePeim.h
FatPkg: Apply uncrustify changes
[mirror_edk2.git] / FatPkg / FatPei / FatLitePeim.h
CommitLineData
2f4dfa84
JJ
1/** @file\r
2 Data structures for FAT recovery PEIM\r
3\r
0d18f5db 4Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
2f4dfa84 5\r
eb6cb4ce 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
2f4dfa84
JJ
7\r
8**/\r
9\r
10#ifndef _FAT_PEIM_H_\r
11#define _FAT_PEIM_H_\r
12\r
13#include <PiPei.h>\r
14\r
15#include <Guid/RecoveryDevice.h>\r
16#include <Ppi/BlockIo.h>\r
8a467be1 17#include <Ppi/BlockIo2.h>\r
2f4dfa84
JJ
18#include <Ppi/DeviceRecoveryModule.h>\r
19\r
20#include <Library/DebugLib.h>\r
21#include <Library/BaseLib.h>\r
22#include <Library/PeimEntryPoint.h>\r
23#include <Library/BaseMemoryLib.h>\r
0d18f5db 24#include <Library/MemoryAllocationLib.h>\r
2f4dfa84
JJ
25#include <Library/PcdLib.h>\r
26#include <Library/PeiServicesTablePointerLib.h>\r
27#include <Library/PeiServicesLib.h>\r
28\r
29#include "FatLiteApi.h"\r
30#include "FatLiteFmt.h"\r
31\r
32//\r
33// Definitions\r
34//\r
2f4dfa84 35\r
bcdcc416
MK
36#define PEI_FAT_CACHE_SIZE 4\r
37#define PEI_FAT_MAX_BLOCK_SIZE 8192\r
38#define FAT_MAX_FILE_NAME_LENGTH 128\r
39#define PEI_FAT_MAX_BLOCK_DEVICE 64\r
40#define PEI_FAT_MAX_BLOCK_IO_PPI 32\r
41#define PEI_FAT_MAX_VOLUME 64\r
2f4dfa84 42\r
bcdcc416 43#define PEI_FAT_MEMORY_PAGE_SIZE 0x1000\r
2f4dfa84
JJ
44\r
45//\r
46// Data Structures\r
47//\r
48//\r
49// The block device\r
50//\r
51typedef struct {\r
bcdcc416
MK
52 UINT32 BlockSize;\r
53 UINT64 LastBlock;\r
54 UINT32 IoAlign;\r
55 BOOLEAN Logical;\r
56 BOOLEAN PartitionChecked;\r
2f4dfa84
JJ
57\r
58 //\r
59 // Following fields only valid for logical device\r
60 //\r
bcdcc416
MK
61 CHAR8 PartitionFlag[8];\r
62 UINT64 StartingPos;\r
63 UINTN ParentDevNo;\r
2f4dfa84
JJ
64\r
65 //\r
66 // Following fields only valid for physical device\r
67 //\r
bcdcc416
MK
68 EFI_PEI_BLOCK_DEVICE_TYPE DevType;\r
69 UINT8 InterfaceType;\r
2f4dfa84
JJ
70 //\r
71 // EFI_PEI_READ_BLOCKS ReadFunc;\r
72 //\r
bcdcc416
MK
73 EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIo;\r
74 EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2;\r
75 UINT8 PhysicalDevNo;\r
2f4dfa84
JJ
76} PEI_FAT_BLOCK_DEVICE;\r
77\r
78//\r
79// the Volume structure\r
80//\r
81typedef struct {\r
bcdcc416
MK
82 UINTN BlockDeviceNo;\r
83 UINTN VolumeNo;\r
84 UINT64 VolumeSize;\r
85 UINTN MaxCluster;\r
86 CHAR16 VolumeLabel[FAT_MAX_FILE_NAME_LENGTH];\r
87 PEI_FAT_TYPE FatType;\r
88 UINT64 FatPos;\r
89 UINT32 SectorSize;\r
90 UINT32 ClusterSize;\r
91 UINT64 FirstClusterPos;\r
92 UINT64 RootDirPos;\r
93 UINT32 RootEntries;\r
94 UINT32 RootDirCluster;\r
2f4dfa84
JJ
95} PEI_FAT_VOLUME;\r
96\r
97//\r
98// File instance\r
99//\r
100typedef struct {\r
bcdcc416
MK
101 PEI_FAT_VOLUME *Volume;\r
102 CHAR16 FileName[FAT_MAX_FILE_NAME_LENGTH];\r
2f4dfa84 103\r
bcdcc416 104 BOOLEAN IsFixedRootDir;\r
2f4dfa84 105\r
bcdcc416
MK
106 UINT32 StartingCluster;\r
107 UINT32 CurrentPos;\r
108 UINT32 StraightReadAmount;\r
109 UINT32 CurrentCluster;\r
2f4dfa84 110\r
bcdcc416
MK
111 UINT8 Attributes;\r
112 UINT32 FileSize;\r
2f4dfa84
JJ
113} PEI_FAT_FILE;\r
114\r
115//\r
116// Cache Buffer\r
117//\r
118typedef struct {\r
bcdcc416
MK
119 BOOLEAN Valid;\r
120 UINTN BlockDeviceNo;\r
121 UINT64 Lba;\r
122 UINT32 Lru;\r
123 UINT64 Buffer[PEI_FAT_MAX_BLOCK_SIZE / 8];\r
124 UINTN Size;\r
2f4dfa84
JJ
125} PEI_FAT_CACHE_BUFFER;\r
126\r
127//\r
128// Private Data.\r
129// This structure abstracts the whole memory usage in FAT PEIM.\r
130// The entry point routine will get a chunk of memory (by whatever\r
131// means) whose size is sizeof(PEI_FAT_PRIVATE_DATA), which is clean\r
132// in both 32 and 64 bit environment. The boundary of the memory chunk\r
133// should be 64bit aligned.\r
134//\r
135#define PEI_FAT_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 'f', 'a', 't')\r
136\r
137typedef struct {\r
bcdcc416
MK
138 UINTN Signature;\r
139 EFI_PEI_DEVICE_RECOVERY_MODULE_PPI DeviceRecoveryPpi;\r
140 EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;\r
141 EFI_PEI_NOTIFY_DESCRIPTOR NotifyDescriptor[2];\r
142\r
143 UINT8 UnicodeCaseMap[0x300];\r
144 CHAR8 *EngUpperMap;\r
145 CHAR8 *EngLowerMap;\r
146 CHAR8 *EngInfoMap;\r
147\r
148 UINT64 BlockData[PEI_FAT_MAX_BLOCK_SIZE / 8];\r
149 UINTN BlockDeviceCount;\r
150 PEI_FAT_BLOCK_DEVICE BlockDevice[PEI_FAT_MAX_BLOCK_DEVICE];\r
151 UINTN VolumeCount;\r
152 PEI_FAT_VOLUME Volume[PEI_FAT_MAX_VOLUME];\r
153 PEI_FAT_FILE File;\r
154 PEI_FAT_CACHE_BUFFER CacheBuffer[PEI_FAT_CACHE_SIZE];\r
2f4dfa84
JJ
155} PEI_FAT_PRIVATE_DATA;\r
156\r
157#define PEI_FAT_PRIVATE_DATA_FROM_THIS(a) \\r
158 CR (a, PEI_FAT_PRIVATE_DATA, DeviceRecoveryPpi, PEI_FAT_PRIVATE_DATA_SIGNATURE)\r
159\r
160//\r
161// Extract INT32 from char array\r
162//\r
163#define UNPACK_INT32(a) \\r
164 (INT32) ((((UINT8 *) a)[0] << 0) | (((UINT8 *) a)[1] << 8) | (((UINT8 *) a)[2] << 16) | (((UINT8 *) a)[3] << 24))\r
165\r
166//\r
167// Extract UINT32 from char array\r
168//\r
169#define UNPACK_UINT32(a) \\r
170 (UINT32) ((((UINT8 *) a)[0] << 0) | (((UINT8 *) a)[1] << 8) | (((UINT8 *) a)[2] << 16) | (((UINT8 *) a)[3] << 24))\r
171\r
2f4dfa84
JJ
172//\r
173// API functions\r
174//\r
175\r
176/**\r
177 Finds the recovery file on a FAT volume.\r
7feed950 178 This function finds the recovery file named FileName on a specified FAT volume and returns\r
2f4dfa84
JJ
179 its FileHandle pointer.\r
180\r
e38f26a2
LG
181 @param PrivateData Global memory map for accessing global\r
182 variables.\r
183 @param VolumeIndex The index of the volume.\r
184 @param FileName The recovery file name to find.\r
185 @param Handle The output file handle.\r
2f4dfa84 186\r
44c9618a 187 @retval EFI_DEVICE_ERROR Some error occurred when operating the FAT\r
e38f26a2
LG
188 volume.\r
189 @retval EFI_NOT_FOUND The recovery file was not found.\r
190 @retval EFI_SUCCESS The recovery file was successfully found on the\r
2f4dfa84
JJ
191 FAT volume.\r
192\r
193**/\r
194EFI_STATUS\r
195FindRecoveryFile (\r
196 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
197 IN UINTN VolumeIndex,\r
198 IN CHAR16 *FileName,\r
199 OUT PEI_FILE_HANDLE *Handle\r
200 );\r
201\r
2f4dfa84
JJ
202/**\r
203 Returns the number of DXE capsules residing on the device.\r
204 This function, by whatever mechanism, searches for DXE capsules from the associated device and\r
205 returns the number and maximum size in bytes of the capsules discovered.Entry 1 is assumed to be\r
206 the highest load priority and entry N is assumed to be the lowest priority.\r
207\r
e38f26a2
LG
208 @param PeiServices General-purpose services that are available to\r
209 every PEIM.\r
210 @param This Indicates the\r
211 EFI_PEI_DEVICE_RECOVERY_MODULE_PPI instance.\r
212 @param NumberRecoveryCapsules Pointer to a caller-allocated UINTN.On output,\r
213 *NumberRecoveryCapsules contains the number of\r
214 recovery capsule images available for retrieval\r
215 from this PEIM instance.\r
2f4dfa84
JJ
216\r
217 @retval EFI_SUCCESS The function completed successfully.\r
218\r
219**/\r
220EFI_STATUS\r
221EFIAPI\r
222GetNumberRecoveryCapsules (\r
bcdcc416
MK
223 IN EFI_PEI_SERVICES **PeiServices,\r
224 IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This,\r
225 OUT UINTN *NumberRecoveryCapsules\r
2f4dfa84
JJ
226 );\r
227\r
2f4dfa84
JJ
228/**\r
229 Returns the size and type of the requested recovery capsule.\r
230 This function returns the size and type of the capsule specified by CapsuleInstance.\r
231\r
e38f26a2
LG
232 @param PeiServices General-purpose services that are available to\r
233 every PEIM.\r
234 @param This Indicates the\r
235 EFI_PEI_DEVICE_RECOVERY_MODULE_PPI instance.\r
236 @param CapsuleInstance Specifies for which capsule instance to\r
237 retrieve the information.T his parameter must\r
238 be between one and the value returned by\r
239 GetNumberRecoveryCapsules() in\r
240 NumberRecoveryCapsules.\r
241 @param Size A pointer to a caller-allocated UINTN in which\r
242 the size of the requested recovery module is\r
243 returned.\r
244 @param CapsuleType A pointer to a caller-allocated EFI_GUID in\r
245 which the type of the requested recovery\r
246 capsule is returned.T he semantic meaning of\r
247 the value returned is defined by the\r
248 implementation.\r
249\r
250 @retval EFI_SUCCESS The capsule type and size were retrieved.\r
251 @retval EFI_INVALID_PARAMETER The input CapsuleInstance does not match any\r
2f4dfa84
JJ
252 discovered recovery capsule.\r
253\r
254**/\r
255EFI_STATUS\r
256EFIAPI\r
257GetRecoveryCapsuleInfo (\r
bcdcc416
MK
258 IN EFI_PEI_SERVICES **PeiServices,\r
259 IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This,\r
260 IN UINTN CapsuleInstance,\r
261 OUT UINTN *Size,\r
262 OUT EFI_GUID *CapsuleType\r
2f4dfa84
JJ
263 );\r
264\r
2f4dfa84
JJ
265/**\r
266 Loads a DXE capsule from some media into memory.\r
267\r
268 This function, by whatever mechanism, retrieves a DXE capsule from some device\r
269 and loads it into memory. Note that the published interface is device neutral.\r
270\r
e38f26a2 271 @param[in] PeiServices General-purpose services that are available\r
2f4dfa84
JJ
272 to every PEIM\r
273 @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI\r
274 instance.\r
275 @param[in] CapsuleInstance Specifies which capsule instance to retrieve.\r
e38f26a2 276 @param[out] Buffer Specifies a caller-allocated buffer in which\r
2f4dfa84
JJ
277 the requested recovery capsule will be returned.\r
278\r
279 @retval EFI_SUCCESS The capsule was loaded correctly.\r
280 @retval EFI_DEVICE_ERROR A device error occurred.\r
281 @retval EFI_NOT_FOUND A requested recovery DXE capsule cannot be found.\r
282\r
283**/\r
284EFI_STATUS\r
285EFIAPI\r
286LoadRecoveryCapsule (\r
bcdcc416
MK
287 IN EFI_PEI_SERVICES **PeiServices,\r
288 IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This,\r
289 IN UINTN CapsuleInstance,\r
290 OUT VOID *Buffer\r
2f4dfa84
JJ
291 );\r
292\r
2f4dfa84
JJ
293/**\r
294 This version is different from the version in Unicode collation\r
295 protocol in that this version strips off trailing blanks.\r
296 Converts an 8.3 FAT file name using an OEM character set\r
297 to a Null-terminated Unicode string.\r
298 Here does not expand DBCS FAT chars.\r
299\r
e38f26a2
LG
300 @param FatSize The size of the string Fat in bytes.\r
301 @param Fat A pointer to a Null-terminated string that contains\r
302 an 8.3 file name using an OEM character set.\r
303 @param Str A pointer to a Null-terminated Unicode string. The\r
304 string must be allocated in advance to hold FatSize\r
2f4dfa84
JJ
305 Unicode characters\r
306\r
307**/\r
308VOID\r
309EngFatToStr (\r
bcdcc416
MK
310 IN UINTN FatSize,\r
311 IN CHAR8 *Fat,\r
312 OUT CHAR16 *Str\r
2f4dfa84
JJ
313 );\r
314\r
2f4dfa84
JJ
315/**\r
316 Performs a case-insensitive comparison of two Null-terminated Unicode strings.\r
317\r
e38f26a2
LG
318 @param PrivateData Global memory map for accessing global variables\r
319 @param Str1 First string to perform case insensitive comparison.\r
2f4dfa84
JJ
320 @param Str2 Second string to perform case insensitive comparison.\r
321\r
322**/\r
323BOOLEAN\r
324EngStriColl (\r
325 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
326 IN CHAR16 *Str1,\r
327 IN CHAR16 *Str2\r
328 );\r
329\r
2f4dfa84
JJ
330/**\r
331 Reads a block of data from the block device by calling\r
332 underlying Block I/O service.\r
333\r
e38f26a2
LG
334 @param PrivateData Global memory map for accessing global variables\r
335 @param BlockDeviceNo The index for the block device number.\r
336 @param Lba The logic block address to read data from.\r
337 @param BufferSize The size of data in byte to read.\r
338 @param Buffer The buffer of the\r
2f4dfa84 339\r
e38f26a2
LG
340 @retval EFI_DEVICE_ERROR The specified block device number exceeds the maximum\r
341 device number.\r
342 @retval EFI_DEVICE_ERROR The maximum address has exceeded the maximum address\r
2f4dfa84
JJ
343 of the block device.\r
344\r
345**/\r
346EFI_STATUS\r
347FatReadBlock (\r
bcdcc416
MK
348 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
349 IN UINTN BlockDeviceNo,\r
350 IN EFI_PEI_LBA Lba,\r
351 IN UINTN BufferSize,\r
352 OUT VOID *Buffer\r
2f4dfa84
JJ
353 );\r
354\r
2f4dfa84
JJ
355/**\r
356 Check if there is a valid FAT in the corresponding Block device\r
357 of the volume and if yes, fill in the relevant fields for the\r
358 volume structure. Note there should be a valid Block device number\r
359 already set.\r
360\r
e38f26a2
LG
361 @param PrivateData Global memory map for accessing global\r
362 variables.\r
363 @param Volume On input, the BlockDeviceNumber field of the\r
364 Volume should be a valid value. On successful\r
365 output, all fields except the VolumeNumber\r
366 field is initialized.\r
2f4dfa84 367\r
e38f26a2
LG
368 @retval EFI_SUCCESS A FAT is found and the volume structure is\r
369 initialized.\r
370 @retval EFI_NOT_FOUND There is no FAT on the corresponding device.\r
2f4dfa84
JJ
371 @retval EFI_DEVICE_ERROR There is something error while accessing device.\r
372\r
373**/\r
374EFI_STATUS\r
375FatGetBpbInfo (\r
376 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
377 IN OUT PEI_FAT_VOLUME *Volume\r
378 );\r
379\r
2f4dfa84
JJ
380/**\r
381 Gets the next cluster in the cluster chain.\r
382\r
e38f26a2
LG
383 @param PrivateData Global memory map for accessing global variables\r
384 @param Volume The volume\r
385 @param Cluster The cluster\r
386 @param NextCluster The cluster number of the next cluster\r
2f4dfa84 387\r
e38f26a2
LG
388 @retval EFI_SUCCESS The address is got\r
389 @retval EFI_INVALID_PARAMETER ClusterNo exceeds the MaxCluster of the volume.\r
2f4dfa84
JJ
390 @retval EFI_DEVICE_ERROR Read disk error\r
391\r
392**/\r
393EFI_STATUS\r
394FatGetNextCluster (\r
395 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
396 IN PEI_FAT_VOLUME *Volume,\r
397 IN UINT32 Cluster,\r
398 OUT UINT32 *NextCluster\r
399 );\r
400\r
2f4dfa84
JJ
401/**\r
402 Disk reading.\r
403\r
e38f26a2
LG
404 @param PrivateData the global memory map;\r
405 @param BlockDeviceNo the block device to read;\r
406 @param StartingAddress the starting address.\r
407 @param Size the amount of data to read.\r
408 @param Buffer the buffer holding the data\r
2f4dfa84
JJ
409\r
410 @retval EFI_SUCCESS The function completed successfully.\r
411 @retval EFI_DEVICE_ERROR Something error.\r
412\r
413**/\r
414EFI_STATUS\r
415FatReadDisk (\r
416 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
417 IN UINTN BlockDeviceNo,\r
418 IN UINT64 StartingAddress,\r
419 IN UINTN Size,\r
420 OUT VOID *Buffer\r
421 );\r
422\r
2f4dfa84
JJ
423/**\r
424 Set a file's CurrentPos and CurrentCluster, then compute StraightReadAmount.\r
425\r
e38f26a2
LG
426 @param PrivateData the global memory map\r
427 @param File the file\r
428 @param Pos the Position which is offset from the file's\r
429 CurrentPos\r
2f4dfa84 430\r
e38f26a2
LG
431 @retval EFI_SUCCESS Success.\r
432 @retval EFI_INVALID_PARAMETER Pos is beyond file's size.\r
2f4dfa84
JJ
433 @retval EFI_DEVICE_ERROR Something error while accessing media.\r
434\r
435**/\r
436EFI_STATUS\r
437FatSetFilePos (\r
438 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
439 IN PEI_FAT_FILE *File,\r
440 IN UINT32 Pos\r
441 );\r
442\r
2f4dfa84
JJ
443/**\r
444 Reads file data. Updates the file's CurrentPos.\r
445\r
e38f26a2
LG
446 @param PrivateData Global memory map for accessing global variables\r
447 @param File The file.\r
448 @param Size The amount of data to read.\r
449 @param Buffer The buffer storing the data.\r
2f4dfa84 450\r
e38f26a2
LG
451 @retval EFI_SUCCESS The data is read.\r
452 @retval EFI_INVALID_PARAMETER File is invalid.\r
2f4dfa84
JJ
453 @retval EFI_DEVICE_ERROR Something error while accessing media.\r
454\r
455**/\r
456EFI_STATUS\r
457FatReadFile (\r
458 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
459 IN PEI_FAT_FILE *File,\r
460 IN UINTN Size,\r
461 OUT VOID *Buffer\r
462 );\r
463\r
2f4dfa84
JJ
464/**\r
465 This function reads the next item in the parent directory and\r
466 initializes the output parameter SubFile (CurrentPos is initialized to 0).\r
467 The function updates the CurrentPos of the parent dir to after the item read.\r
468 If no more items were found, the function returns EFI_NOT_FOUND.\r
469\r
e38f26a2
LG
470 @param PrivateData Global memory map for accessing global variables\r
471 @param ParentDir The parent directory.\r
472 @param SubFile The File structure containing the sub file that\r
473 is caught.\r
2f4dfa84 474\r
e38f26a2
LG
475 @retval EFI_SUCCESS The next sub file is obtained.\r
476 @retval EFI_INVALID_PARAMETER The ParentDir is not a directory.\r
477 @retval EFI_NOT_FOUND No more sub file exists.\r
2f4dfa84
JJ
478 @retval EFI_DEVICE_ERROR Something error while accessing media.\r
479\r
480**/\r
481EFI_STATUS\r
482FatReadNextDirectoryEntry (\r
483 IN PEI_FAT_PRIVATE_DATA *PrivateData,\r
484 IN PEI_FAT_FILE *ParentDir,\r
485 OUT PEI_FAT_FILE *SubFile\r
486 );\r
487\r
2f4dfa84
JJ
488/**\r
489 This function finds partitions (logical devices) in physical block devices.\r
490\r
491 @param PrivateData Global memory map for accessing global variables.\r
492\r
493**/\r
494VOID\r
495FatFindPartitions (\r
496 IN PEI_FAT_PRIVATE_DATA *PrivateData\r
497 );\r
498\r
499#endif // _FAT_PEIM_H_\r