]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / UdfDxe / Udf.c
CommitLineData
99c9b949
PA
1/** @file\r
2 UDF/ECMA-167 file system driver.\r
3\r
4 Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>\r
5\r
9d510e61 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
99c9b949
PA
7**/\r
8\r
9#include "Udf.h"\r
10\r
11//\r
12// UDF filesystem driver's Global Variables.\r
13//\r
1436aea4 14EFI_DRIVER_BINDING_PROTOCOL gUdfDriverBinding = {\r
99c9b949
PA
15 UdfDriverBindingSupported,\r
16 UdfDriverBindingStart,\r
17 UdfDriverBindingStop,\r
18 0x10,\r
19 NULL,\r
20 NULL\r
21};\r
22\r
1436aea4 23EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gUdfSimpleFsTemplate = {\r
99c9b949
PA
24 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,\r
25 UdfOpenVolume\r
26};\r
27\r
28/**\r
29 Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
30 than contains a BlockIo and DiskIo protocol or a BlockIo2 protocol can be\r
31 supported.\r
32\r
33 @param[in] This Protocol instance pointer.\r
34 @param[in] ControllerHandle Handle of device to test.\r
35 @param[in] RemainingDevicePath Optional parameter use to pick a specific\r
36 child device to start.\r
37\r
38 @retval EFI_SUCCESS This driver supports this device.\r
39 @retval EFI_ALREADY_STARTED This driver is already running on this device.\r
40 @retval other This driver does not support this device.\r
41\r
42**/\r
43EFI_STATUS\r
44EFIAPI\r
45UdfDriverBindingSupported (\r
46 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
47 IN EFI_HANDLE ControllerHandle,\r
48 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
49 )\r
50{\r
51 EFI_STATUS Status;\r
52 EFI_DISK_IO_PROTOCOL *DiskIo;\r
53\r
54 //\r
55 // Open DiskIo protocol on ControllerHandle\r
56 //\r
57 Status = gBS->OpenProtocol (\r
1436aea4
MK
58 ControllerHandle,\r
59 &gEfiDiskIoProtocolGuid,\r
60 (VOID **)&DiskIo,\r
61 This->DriverBindingHandle,\r
62 ControllerHandle,\r
63 EFI_OPEN_PROTOCOL_BY_DRIVER\r
64 );\r
99c9b949
PA
65 if (EFI_ERROR (Status)) {\r
66 return Status;\r
67 }\r
68\r
69 //\r
70 // Close DiskIo protocol on ControllerHandle\r
71 //\r
72 gBS->CloseProtocol (\r
1436aea4
MK
73 ControllerHandle,\r
74 &gEfiDiskIoProtocolGuid,\r
75 This->DriverBindingHandle,\r
76 ControllerHandle\r
77 );\r
99c9b949
PA
78\r
79 //\r
80 // Test whether ControllerHandle supports BlockIo protocol\r
81 //\r
82 Status = gBS->OpenProtocol (\r
1436aea4
MK
83 ControllerHandle,\r
84 &gEfiBlockIoProtocolGuid,\r
85 NULL,\r
86 This->DriverBindingHandle,\r
87 ControllerHandle,\r
88 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
89 );\r
99c9b949
PA
90\r
91 return Status;\r
92}\r
93\r
94/**\r
95 Start this driver on ControllerHandle by opening a Block IO or a Block IO2\r
96 or both, and Disk IO protocol, reading Device Path, and creating a child\r
97 handle with a Disk IO and device path protocol.\r
98\r
99 @param[in] This Protocol instance pointer.\r
100 @param[in] ControllerHandle Handle of device to bind driver to\r
101 @param[in] RemainingDevicePath Optional parameter use to pick a specific\r
102 child device to start.\r
103\r
104 @retval EFI_SUCCESS This driver is added to ControllerHandle.\r
105 @retval EFI_ALREADY_STARTED This driver is already running on\r
106 ControllerHandle.\r
107 @retval other This driver does not support this device.\r
108\r
109**/\r
110EFI_STATUS\r
111EFIAPI\r
112UdfDriverBindingStart (\r
113 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
114 IN EFI_HANDLE ControllerHandle,\r
115 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
116 )\r
117{\r
118 EFI_TPL OldTpl;\r
119 EFI_STATUS Status;\r
120 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
121 EFI_DISK_IO_PROTOCOL *DiskIo;\r
122 PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData;\r
123\r
124 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
125\r
126 //\r
127 // Open BlockIo protocol on ControllerHandle\r
128 //\r
129 Status = gBS->OpenProtocol (\r
1436aea4
MK
130 ControllerHandle,\r
131 &gEfiBlockIoProtocolGuid,\r
132 (VOID **)&BlockIo,\r
133 This->DriverBindingHandle,\r
134 ControllerHandle,\r
135 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
136 );\r
99c9b949
PA
137 ASSERT_EFI_ERROR (Status);\r
138\r
139 //\r
140 // Open DiskIo protocol on ControllerHandle\r
141 //\r
142 Status = gBS->OpenProtocol (\r
1436aea4
MK
143 ControllerHandle,\r
144 &gEfiDiskIoProtocolGuid,\r
145 (VOID **)&DiskIo,\r
146 This->DriverBindingHandle,\r
147 ControllerHandle,\r
148 EFI_OPEN_PROTOCOL_BY_DRIVER\r
149 );\r
99c9b949
PA
150 ASSERT_EFI_ERROR (Status);\r
151\r
152 //\r
153 // Check if ControllerHandle supports an UDF file system\r
154 //\r
155 Status = SupportUdfFileSystem (This, ControllerHandle);\r
156 if (EFI_ERROR (Status)) {\r
157 goto Exit;\r
158 }\r
159\r
160 //\r
161 // Initialize private file system structure\r
162 //\r
163 PrivFsData =\r
164 (PRIVATE_UDF_SIMPLE_FS_DATA *)\r
165 AllocateZeroPool (sizeof (PRIVATE_UDF_SIMPLE_FS_DATA));\r
166 if (PrivFsData == NULL) {\r
167 Status = EFI_OUT_OF_RESOURCES;\r
168 goto Exit;\r
169 }\r
170\r
171 //\r
172 // Create new child handle\r
173 //\r
174 PrivFsData->Signature = PRIVATE_UDF_SIMPLE_FS_DATA_SIGNATURE;\r
175 PrivFsData->BlockIo = BlockIo;\r
176 PrivFsData->DiskIo = DiskIo;\r
177 PrivFsData->Handle = ControllerHandle;\r
178\r
179 //\r
180 // Set up SimpleFs protocol\r
181 //\r
1436aea4
MK
182 CopyMem (\r
183 (VOID *)&PrivFsData->SimpleFs,\r
184 (VOID *)&gUdfSimpleFsTemplate,\r
185 sizeof (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL)\r
186 );\r
99c9b949
PA
187\r
188 //\r
189 // Install child handle\r
190 //\r
191 Status = gBS->InstallMultipleProtocolInterfaces (\r
1436aea4
MK
192 &PrivFsData->Handle,\r
193 &gEfiSimpleFileSystemProtocolGuid,\r
194 &PrivFsData->SimpleFs,\r
195 NULL\r
196 );\r
99c9b949
PA
197\r
198Exit:\r
199 if (EFI_ERROR (Status)) {\r
200 //\r
201 // Close DiskIo protocol on ControllerHandle\r
202 //\r
203 gBS->CloseProtocol (\r
1436aea4
MK
204 ControllerHandle,\r
205 &gEfiDiskIoProtocolGuid,\r
206 This->DriverBindingHandle,\r
207 ControllerHandle\r
208 );\r
99c9b949
PA
209 //\r
210 // Close BlockIo protocol on ControllerHandle\r
211 //\r
212 gBS->CloseProtocol (\r
1436aea4
MK
213 ControllerHandle,\r
214 &gEfiBlockIoProtocolGuid,\r
215 This->DriverBindingHandle,\r
216 ControllerHandle\r
217 );\r
99c9b949
PA
218 }\r
219\r
220 gBS->RestoreTPL (OldTpl);\r
221\r
222 return Status;\r
223}\r
224\r
225/**\r
226 Stop this driver on ControllerHandle. Support stopping any child handles\r
227 created by this driver.\r
228\r
229 @param This Protocol instance pointer.\r
230 @param ControllerHandle Handle of device to stop driver on\r
231 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
232 children is zero stop the entire bus driver.\r
233 @param ChildHandleBuffer List of Child Handles to Stop.\r
234\r
235 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
236 @retval other This driver was not removed from this device\r
237\r
238**/\r
239EFI_STATUS\r
240EFIAPI\r
241UdfDriverBindingStop (\r
1436aea4
MK
242 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
243 IN EFI_HANDLE ControllerHandle,\r
244 IN UINTN NumberOfChildren,\r
245 IN EFI_HANDLE *ChildHandleBuffer\r
99c9b949
PA
246 )\r
247{\r
1436aea4
MK
248 PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData;\r
249 EFI_STATUS Status;\r
250 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
99c9b949
PA
251\r
252 //\r
253 // Open SimpleFs protocol on ControllerHandle\r
254 //\r
255 Status = gBS->OpenProtocol (\r
1436aea4
MK
256 ControllerHandle,\r
257 &gEfiSimpleFileSystemProtocolGuid,\r
258 (VOID **)&SimpleFs,\r
259 This->DriverBindingHandle,\r
260 ControllerHandle,\r
261 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
262 );\r
99c9b949
PA
263 if (!EFI_ERROR (Status)) {\r
264 PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (SimpleFs);\r
265\r
266 //\r
267 // Uninstall child handle\r
268 //\r
269 Status = gBS->UninstallMultipleProtocolInterfaces (\r
1436aea4
MK
270 PrivFsData->Handle,\r
271 &gEfiSimpleFileSystemProtocolGuid,\r
272 &PrivFsData->SimpleFs,\r
273 NULL\r
274 );\r
99c9b949 275\r
99c9b949
PA
276 FreePool ((VOID *)PrivFsData);\r
277 }\r
278\r
279 if (!EFI_ERROR (Status)) {\r
280 //\r
281 // Close DiskIo protocol on ControllerHandle\r
282 //\r
283 gBS->CloseProtocol (\r
1436aea4
MK
284 ControllerHandle,\r
285 &gEfiDiskIoProtocolGuid,\r
286 This->DriverBindingHandle,\r
287 ControllerHandle\r
288 );\r
99c9b949
PA
289 //\r
290 // Close BlockIo protocol on ControllerHandle\r
291 //\r
292 gBS->CloseProtocol (\r
1436aea4
MK
293 ControllerHandle,\r
294 &gEfiBlockIoProtocolGuid,\r
295 This->DriverBindingHandle,\r
296 ControllerHandle\r
297 );\r
99c9b949
PA
298 }\r
299\r
300 return Status;\r
301}\r
302\r
303/**\r
304 The user Entry Point for UDF file system driver. The user code starts with\r
305 this function.\r
306\r
307 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
308 @param[in] SystemTable A pointer to the EFI System Table.\r
309\r
310 @retval EFI_SUCCESS The entry point is executed successfully.\r
311 @retval other Some error occurs when executing this entry point.\r
312\r
313**/\r
314EFI_STATUS\r
315EFIAPI\r
316InitializeUdf (\r
1436aea4
MK
317 IN EFI_HANDLE ImageHandle,\r
318 IN EFI_SYSTEM_TABLE *SystemTable\r
99c9b949
PA
319 )\r
320{\r
1436aea4 321 EFI_STATUS Status;\r
99c9b949
PA
322\r
323 Status = EfiLibInstallDriverBindingComponentName2 (\r
1436aea4
MK
324 ImageHandle,\r
325 SystemTable,\r
326 &gUdfDriverBinding,\r
327 ImageHandle,\r
328 &gUdfComponentName,\r
329 &gUdfComponentName2\r
330 );\r
99c9b949
PA
331 ASSERT_EFI_ERROR (Status);\r
332\r
333 return Status;\r
334}\r