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