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