]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/CdExpressPei/PeiCdExpress.h
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / CdExpressPei / PeiCdExpress.h
CommitLineData
30c00a1c 1/** @file\r
2 Header file for CD recovery PEIM\r
3\r
d1102dba 4Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
30c00a1c 5\r
6This program and the accompanying materials\r
7are licensed and made available under the terms and conditions\r
8of the BSD License which accompanies this distribution. The\r
9full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#ifndef _PEI_CD_EXPRESS_H_\r
18#define _PEI_CD_EXPRESS_H_\r
19\r
20\r
21#include <PiPei.h>\r
22\r
23#include <Ppi/BlockIo.h>\r
f9964c80 24#include <Ppi/BlockIo2.h>\r
30c00a1c 25#include <Guid/RecoveryDevice.h>\r
26#include <Ppi/DeviceRecoveryModule.h>\r
27\r
28#include <Library/DebugLib.h>\r
29#include <Library/PcdLib.h>\r
30#include <Library/PeimEntryPoint.h>\r
31#include <Library/BaseMemoryLib.h>\r
32#include <Library/PeiServicesTablePointerLib.h>\r
33#include <Library/PeiServicesLib.h>\r
34#include <Library/MemoryAllocationLib.h>\r
35\r
36\r
37#pragma pack(1)\r
38\r
39#define PEI_CD_EXPRESS_MAX_BLOCK_IO_PPI 8\r
40#define PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER 16\r
41\r
42#define PEI_CD_BLOCK_SIZE 0x800\r
43#define PEI_MEMMORY_PAGE_SIZE 0x1000\r
44\r
30c00a1c 45//\r
46// Following are defined according to ISO-9660 specification\r
47//\r
48#define PEI_CD_STANDARD_ID "CD001"\r
49#define PEI_CD_EXPRESS_STANDARD_ID_SIZE 5\r
50\r
51#define PEI_CD_EXPRESS_VOLUME_TYPE_OFFSET 0\r
52#define PEI_CD_EXPRESS_STANDARD_ID_OFFSET 1\r
53#define PEI_CD_EXPRESS_VOLUME_SPACE_OFFSET 80\r
54#define PEI_CD_EXPRESS_ROOT_DIR_RECORD_OFFSET 156\r
55\r
56#define PEI_CD_EXPRESS_VOLUME_TYPE_PRIMARY 1\r
57#define PEI_CD_EXPRESS_VOLUME_TYPE_TERMINATOR 255\r
58\r
59#define PEI_CD_EXPRESS_DIR_FILE_REC_FLAG_ISDIR 0x02\r
60\r
61typedef struct {\r
62 UINTN CapsuleStartLBA;\r
63 UINTN CapsuleSize;\r
9381ad87 64 UINTN CapsuleBlockAlignedSize;\r
30c00a1c 65 UINTN IndexBlock;\r
66 EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIo;\r
f9964c80 67 EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2;\r
30c00a1c 68} PEI_CD_EXPRESS_CAPSULE_DATA;\r
69\r
70#define PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 'c', 'd', 'e')\r
71\r
72typedef struct {\r
73\r
74 UINTN Signature;\r
30c00a1c 75 EFI_PEI_DEVICE_RECOVERY_MODULE_PPI DeviceRecoveryPpi;\r
76 EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;\r
77 EFI_PEI_NOTIFY_DESCRIPTOR NotifyDescriptor;\r
f9964c80 78 EFI_PEI_NOTIFY_DESCRIPTOR NotifyDescriptor2;\r
30c00a1c 79\r
80 UINT8 *BlockBuffer;\r
81 UINTN CapsuleCount;\r
82 PEI_CD_EXPRESS_CAPSULE_DATA CapsuleData[PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER];\r
83\r
84} PEI_CD_EXPRESS_PRIVATE_DATA;\r
85\r
86#define PEI_CD_EXPRESS_PRIVATE_DATA_FROM_THIS(a) \\r
87 CR (a, \\r
88 PEI_CD_EXPRESS_PRIVATE_DATA, \\r
89 DeviceRecoveryPpi, \\r
90 PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE \\r
91 )\r
92\r
93typedef struct {\r
94 UINT8 Length;\r
95 UINT8 ExtendedAttributeRecordLength;\r
96 UINT32 LocationOfExtent[2];\r
97 UINT32 DataLength[2];\r
98 UINT8 DateTime[7];\r
99 UINT8 Flag;\r
100 UINT8 FileUnitSize;\r
101 UINT8 InterleaveGapSize;\r
102 UINT32 VolumeSequenceNumber;\r
103 UINT8 FileIDLength;\r
104 UINT8 FileID[1];\r
105} PEI_CD_EXPRESS_DIR_FILE_RECORD;\r
106\r
107/**\r
d1102dba
LG
108 BlockIo installation notification function.\r
109\r
30c00a1c 110 This function finds out all the current Block IO PPIs in the system and add them\r
111 into private data.\r
112\r
113 @param PeiServices Indirect reference to the PEI Services Table.\r
114 @param NotifyDescriptor Address of the notification descriptor data structure.\r
115 @param Ppi Address of the PPI that was installed.\r
116\r
117 @retval EFI_SUCCESS The function completes successfully.\r
118\r
119**/\r
120EFI_STATUS\r
121EFIAPI\r
122BlockIoNotifyEntry (\r
123 IN EFI_PEI_SERVICES **PeiServices,\r
124 IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,\r
125 IN VOID *Ppi\r
126 );\r
127\r
128/**\r
129 Finds out all the current Block IO PPIs in the system and add them into private data.\r
130\r
131 @param PrivateData The private data structure that contains recovery module information.\r
f9964c80 132 @param BlockIo2 Boolean to show whether using BlockIo2 or BlockIo.\r
30c00a1c 133\r
134 @retval EFI_SUCCESS The blocks and volumes are updated successfully.\r
135\r
136**/\r
137EFI_STATUS\r
138UpdateBlocksAndVolumes (\r
f9964c80
FT
139 IN OUT PEI_CD_EXPRESS_PRIVATE_DATA *PrivateData,\r
140 IN BOOLEAN BlockIo2\r
30c00a1c 141 );\r
142\r
143/**\r
144 Returns the number of DXE capsules residing on the device.\r
145\r
146 This function searches for DXE capsules from the associated device and returns\r
d1102dba
LG
147 the number and maximum size in bytes of the capsules discovered. Entry 1 is\r
148 assumed to be the highest load priority and entry N is assumed to be the lowest\r
30c00a1c 149 priority.\r
150\r
d1102dba 151 @param[in] PeiServices General-purpose services that are available\r
30c00a1c 152 to every PEIM\r
153 @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI\r
154 instance.\r
d1102dba
LG
155 @param[out] NumberRecoveryCapsules Pointer to a caller-allocated UINTN. On\r
156 output, *NumberRecoveryCapsules contains\r
157 the number of recovery capsule images\r
158 available for retrieval from this PEIM\r
30c00a1c 159 instance.\r
160\r
161 @retval EFI_SUCCESS One or more capsules were discovered.\r
162 @retval EFI_DEVICE_ERROR A device error occurred.\r
163 @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found.\r
164\r
165**/\r
166EFI_STATUS\r
167EFIAPI\r
168GetNumberRecoveryCapsules (\r
169 IN EFI_PEI_SERVICES **PeiServices,\r
170 IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This,\r
171 OUT UINTN *NumberRecoveryCapsules\r
172 );\r
173\r
174/**\r
175 Returns the size and type of the requested recovery capsule.\r
176\r
177 This function gets the size and type of the capsule specified by CapsuleInstance.\r
178\r
179 @param[in] PeiServices General-purpose services that are available to every PEIM\r
d1102dba 180 @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI\r
30c00a1c 181 instance.\r
d1102dba
LG
182 @param[in] CapsuleInstance Specifies for which capsule instance to retrieve\r
183 the information. This parameter must be between\r
184 one and the value returned by GetNumberRecoveryCapsules()\r
30c00a1c 185 in NumberRecoveryCapsules.\r
d1102dba
LG
186 @param[out] Size A pointer to a caller-allocated UINTN in which\r
187 the size of the requested recovery module is\r
30c00a1c 188 returned.\r
d1102dba
LG
189 @param[out] CapsuleType A pointer to a caller-allocated EFI_GUID in which\r
190 the type of the requested recovery capsule is\r
191 returned. The semantic meaning of the value\r
30c00a1c 192 returned is defined by the implementation.\r
193\r
194 @retval EFI_SUCCESS One or more capsules were discovered.\r
195 @retval EFI_DEVICE_ERROR A device error occurred.\r
196 @retval EFI_NOT_FOUND A recovery DXE capsule cannot be found.\r
197\r
198**/\r
199EFI_STATUS\r
200EFIAPI\r
201GetRecoveryCapsuleInfo (\r
202 IN EFI_PEI_SERVICES **PeiServices,\r
203 IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This,\r
204 IN UINTN CapsuleInstance,\r
205 OUT UINTN *Size,\r
206 OUT EFI_GUID *CapsuleType\r
207 );\r
208\r
209/**\r
210 Loads a DXE capsule from some media into memory.\r
211\r
212 This function, by whatever mechanism, retrieves a DXE capsule from some device\r
213 and loads it into memory. Note that the published interface is device neutral.\r
214\r
d1102dba 215 @param[in] PeiServices General-purpose services that are available\r
30c00a1c 216 to every PEIM\r
217 @param[in] This Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI\r
218 instance.\r
219 @param[in] CapsuleInstance Specifies which capsule instance to retrieve.\r
d1102dba 220 @param[out] Buffer Specifies a caller-allocated buffer in which\r
30c00a1c 221 the requested recovery capsule will be returned.\r
222\r
223 @retval EFI_SUCCESS The capsule was loaded correctly.\r
224 @retval EFI_DEVICE_ERROR A device error occurred.\r
225 @retval EFI_NOT_FOUND A requested recovery DXE capsule cannot be found.\r
226\r
227**/\r
228EFI_STATUS\r
229EFIAPI\r
230LoadRecoveryCapsule (\r
231 IN EFI_PEI_SERVICES **PeiServices,\r
232 IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI *This,\r
233 IN UINTN CapsuleInstance,\r
234 OUT VOID *Buffer\r
235 );\r
236\r
237/**\r
238 Finds out the recovery capsule in the current volume.\r
239\r
240 @param PrivateData The private data structure that contains recovery module information.\r
241\r
242 @retval EFI_SUCCESS The recovery capsule is successfully found in the volume.\r
243 @retval EFI_NOT_FOUND The recovery capsule is not found in the volume.\r
244\r
245**/\r
246EFI_STATUS\r
247EFIAPI\r
248FindRecoveryCapsules (\r
249 IN OUT PEI_CD_EXPRESS_PRIVATE_DATA *PrivateData\r
250 );\r
251\r
252/**\r
253 Retrieves the recovery capsule in root directory of the current volume.\r
254\r
255 @param PrivateData The private data structure that contains recovery module information.\r
256 @param BlockIoPpi The Block IO PPI used to access the volume.\r
f9964c80 257 @param BlockIo2Ppi The Block IO 2 PPI used to access the volume.\r
30c00a1c 258 @param IndexBlockDevice The index of current block device.\r
259 @param Lba The starting logic block address to retrieve capsule.\r
260\r
261 @retval EFI_SUCCESS The recovery capsule is successfully found in the volume.\r
262 @retval EFI_NOT_FOUND The recovery capsule is not found in the volume.\r
d1102dba 263 @retval Others\r
30c00a1c 264\r
265**/\r
266EFI_STATUS\r
267EFIAPI\r
268RetrieveCapsuleFileFromRoot (\r
269 IN OUT PEI_CD_EXPRESS_PRIVATE_DATA *PrivateData,\r
270 IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *BlockIoPpi,\r
f9964c80 271 IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *BlockIo2Ppi,\r
30c00a1c 272 IN UINTN IndexBlockDevice,\r
273 IN UINT32 Lba\r
274 );\r
275\r
276\r
277/**\r
278 This function compares two ASCII strings in case sensitive/insensitive way.\r
279\r
280 @param Source1 The first string.\r
281 @param Source2 The second string.\r
282 @param Size The maximum comparison length.\r
283 @param CaseSensitive Flag to indicate whether the comparison is case sensitive.\r
284\r
285 @retval TRUE The two strings are the same.\r
286 @retval FALSE The two string are not the same.\r
287\r
288**/\r
289BOOLEAN\r
290StringCmp (\r
291 IN UINT8 *Source1,\r
292 IN UINT8 *Source2,\r
293 IN UINTN Size,\r
294 IN BOOLEAN CaseSensitive\r
295 );\r
296\r
297#pragma pack()\r
298\r
299#endif\r