]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[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
14EFI_DRIVER_BINDING_PROTOCOL gUdfDriverBinding = {\r
15 UdfDriverBindingSupported,\r
16 UdfDriverBindingStart,\r
17 UdfDriverBindingStop,\r
18 0x10,\r
19 NULL,\r
20 NULL\r
21};\r
22\r
23EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gUdfSimpleFsTemplate = {\r
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
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
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
73 ControllerHandle,\r
74 &gEfiDiskIoProtocolGuid,\r
75 This->DriverBindingHandle,\r
76 ControllerHandle\r
77 );\r
78\r
79 //\r
80 // Test whether ControllerHandle supports BlockIo protocol\r
81 //\r
82 Status = gBS->OpenProtocol (\r
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
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
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
137 ASSERT_EFI_ERROR (Status);\r
138\r
139 //\r
140 // Open DiskIo protocol on ControllerHandle\r
141 //\r
142 Status = gBS->OpenProtocol (\r
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
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
182 CopyMem ((VOID *)&PrivFsData->SimpleFs, (VOID *)&gUdfSimpleFsTemplate,\r
183 sizeof (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL));\r
184\r
185 //\r
186 // Install child handle\r
187 //\r
188 Status = gBS->InstallMultipleProtocolInterfaces (\r
189 &PrivFsData->Handle,\r
190 &gEfiSimpleFileSystemProtocolGuid,\r
191 &PrivFsData->SimpleFs,\r
192 NULL\r
193 );\r
194\r
195Exit:\r
196 if (EFI_ERROR (Status)) {\r
197 //\r
198 // Close DiskIo protocol on ControllerHandle\r
199 //\r
200 gBS->CloseProtocol (\r
201 ControllerHandle,\r
202 &gEfiDiskIoProtocolGuid,\r
203 This->DriverBindingHandle,\r
204 ControllerHandle\r
205 );\r
206 //\r
207 // Close BlockIo protocol on ControllerHandle\r
208 //\r
209 gBS->CloseProtocol (\r
210 ControllerHandle,\r
211 &gEfiBlockIoProtocolGuid,\r
212 This->DriverBindingHandle,\r
213 ControllerHandle\r
214 );\r
215 }\r
216\r
217 gBS->RestoreTPL (OldTpl);\r
218\r
219 return Status;\r
220}\r
221\r
222/**\r
223 Stop this driver on ControllerHandle. Support stopping any child handles\r
224 created by this driver.\r
225\r
226 @param This Protocol instance pointer.\r
227 @param ControllerHandle Handle of device to stop driver on\r
228 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
229 children is zero stop the entire bus driver.\r
230 @param ChildHandleBuffer List of Child Handles to Stop.\r
231\r
232 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
233 @retval other This driver was not removed from this device\r
234\r
235**/\r
236EFI_STATUS\r
237EFIAPI\r
238UdfDriverBindingStop (\r
239 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
240 IN EFI_HANDLE ControllerHandle,\r
241 IN UINTN NumberOfChildren,\r
242 IN EFI_HANDLE *ChildHandleBuffer\r
243 )\r
244{\r
245 PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData;\r
246 EFI_STATUS Status;\r
247 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
248\r
249 //\r
250 // Open SimpleFs protocol on ControllerHandle\r
251 //\r
252 Status = gBS->OpenProtocol (\r
253 ControllerHandle,\r
254 &gEfiSimpleFileSystemProtocolGuid,\r
255 (VOID **)&SimpleFs,\r
256 This->DriverBindingHandle,\r
257 ControllerHandle,\r
258 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
259 );\r
260 if (!EFI_ERROR (Status)) {\r
261 PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (SimpleFs);\r
262\r
263 //\r
264 // Uninstall child handle\r
265 //\r
266 Status = gBS->UninstallMultipleProtocolInterfaces (\r
267 PrivFsData->Handle,\r
268 &gEfiSimpleFileSystemProtocolGuid,\r
269 &PrivFsData->SimpleFs,\r
270 NULL\r
271 );\r
272\r
99c9b949
PA
273 FreePool ((VOID *)PrivFsData);\r
274 }\r
275\r
276 if (!EFI_ERROR (Status)) {\r
277 //\r
278 // Close DiskIo protocol on ControllerHandle\r
279 //\r
280 gBS->CloseProtocol (\r
281 ControllerHandle,\r
282 &gEfiDiskIoProtocolGuid,\r
283 This->DriverBindingHandle,\r
284 ControllerHandle\r
285 );\r
286 //\r
287 // Close BlockIo protocol on ControllerHandle\r
288 //\r
289 gBS->CloseProtocol (\r
290 ControllerHandle,\r
291 &gEfiBlockIoProtocolGuid,\r
292 This->DriverBindingHandle,\r
293 ControllerHandle\r
294 );\r
295 }\r
296\r
297 return Status;\r
298}\r
299\r
300/**\r
301 The user Entry Point for UDF file system driver. The user code starts with\r
302 this function.\r
303\r
304 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
305 @param[in] SystemTable A pointer to the EFI System Table.\r
306\r
307 @retval EFI_SUCCESS The entry point is executed successfully.\r
308 @retval other Some error occurs when executing this entry point.\r
309\r
310**/\r
311EFI_STATUS\r
312EFIAPI\r
313InitializeUdf (\r
314 IN EFI_HANDLE ImageHandle,\r
315 IN EFI_SYSTEM_TABLE *SystemTable\r
316 )\r
317{\r
318 EFI_STATUS Status;\r
319\r
320 Status = EfiLibInstallDriverBindingComponentName2 (\r
321 ImageHandle,\r
322 SystemTable,\r
323 &gUdfDriverBinding,\r
324 ImageHandle,\r
325 &gUdfComponentName,\r
326 &gUdfComponentName2\r
327 );\r
328 ASSERT_EFI_ERROR (Status);\r
329\r
330 return Status;\r
331}\r