2 UDF/ECMA-167 file system driver.
4 Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
12 // UDF filesystem driver's Global Variables.
14 EFI_DRIVER_BINDING_PROTOCOL gUdfDriverBinding
= {
15 UdfDriverBindingSupported
,
16 UdfDriverBindingStart
,
23 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gUdfSimpleFsTemplate
= {
24 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION
,
29 Test to see if this driver supports ControllerHandle. Any ControllerHandle
30 than contains a BlockIo and DiskIo protocol or a BlockIo2 protocol can be
33 @param[in] This Protocol instance pointer.
34 @param[in] ControllerHandle Handle of device to test.
35 @param[in] RemainingDevicePath Optional parameter use to pick a specific
36 child device to start.
38 @retval EFI_SUCCESS This driver supports this device.
39 @retval EFI_ALREADY_STARTED This driver is already running on this device.
40 @retval other This driver does not support this device.
45 UdfDriverBindingSupported (
46 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
47 IN EFI_HANDLE ControllerHandle
,
48 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
52 EFI_DISK_IO_PROTOCOL
*DiskIo
;
55 // Open DiskIo protocol on ControllerHandle
57 Status
= gBS
->OpenProtocol (
59 &gEfiDiskIoProtocolGuid
,
61 This
->DriverBindingHandle
,
63 EFI_OPEN_PROTOCOL_BY_DRIVER
65 if (EFI_ERROR (Status
)) {
70 // Close DiskIo protocol on ControllerHandle
74 &gEfiDiskIoProtocolGuid
,
75 This
->DriverBindingHandle
,
80 // Test whether ControllerHandle supports BlockIo protocol
82 Status
= gBS
->OpenProtocol (
84 &gEfiBlockIoProtocolGuid
,
86 This
->DriverBindingHandle
,
88 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
95 Start this driver on ControllerHandle by opening a Block IO or a Block IO2
96 or both, and Disk IO protocol, reading Device Path, and creating a child
97 handle with a Disk IO and device path protocol.
99 @param[in] This Protocol instance pointer.
100 @param[in] ControllerHandle Handle of device to bind driver to
101 @param[in] RemainingDevicePath Optional parameter use to pick a specific
102 child device to start.
104 @retval EFI_SUCCESS This driver is added to ControllerHandle.
105 @retval EFI_ALREADY_STARTED This driver is already running on
107 @retval other This driver does not support this device.
112 UdfDriverBindingStart (
113 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
114 IN EFI_HANDLE ControllerHandle
,
115 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
120 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
121 EFI_DISK_IO_PROTOCOL
*DiskIo
;
122 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
124 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
127 // Open BlockIo protocol on ControllerHandle
129 Status
= gBS
->OpenProtocol (
131 &gEfiBlockIoProtocolGuid
,
133 This
->DriverBindingHandle
,
135 EFI_OPEN_PROTOCOL_GET_PROTOCOL
137 ASSERT_EFI_ERROR (Status
);
140 // Open DiskIo protocol on ControllerHandle
142 Status
= gBS
->OpenProtocol (
144 &gEfiDiskIoProtocolGuid
,
146 This
->DriverBindingHandle
,
148 EFI_OPEN_PROTOCOL_BY_DRIVER
150 ASSERT_EFI_ERROR (Status
);
153 // Check if ControllerHandle supports an UDF file system
155 Status
= SupportUdfFileSystem (This
, ControllerHandle
);
156 if (EFI_ERROR (Status
)) {
161 // Initialize private file system structure
164 (PRIVATE_UDF_SIMPLE_FS_DATA
*)
165 AllocateZeroPool (sizeof (PRIVATE_UDF_SIMPLE_FS_DATA
));
166 if (PrivFsData
== NULL
) {
167 Status
= EFI_OUT_OF_RESOURCES
;
172 // Create new child handle
174 PrivFsData
->Signature
= PRIVATE_UDF_SIMPLE_FS_DATA_SIGNATURE
;
175 PrivFsData
->BlockIo
= BlockIo
;
176 PrivFsData
->DiskIo
= DiskIo
;
177 PrivFsData
->Handle
= ControllerHandle
;
180 // Set up SimpleFs protocol
183 (VOID
*)&PrivFsData
->SimpleFs
,
184 (VOID
*)&gUdfSimpleFsTemplate
,
185 sizeof (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
)
189 // Install child handle
191 Status
= gBS
->InstallMultipleProtocolInterfaces (
193 &gEfiSimpleFileSystemProtocolGuid
,
194 &PrivFsData
->SimpleFs
,
199 if (EFI_ERROR (Status
)) {
201 // Close DiskIo protocol on ControllerHandle
205 &gEfiDiskIoProtocolGuid
,
206 This
->DriverBindingHandle
,
210 // Close BlockIo protocol on ControllerHandle
214 &gEfiBlockIoProtocolGuid
,
215 This
->DriverBindingHandle
,
220 gBS
->RestoreTPL (OldTpl
);
226 Stop this driver on ControllerHandle. Support stopping any child handles
227 created by this driver.
229 @param This Protocol instance pointer.
230 @param ControllerHandle Handle of device to stop driver on
231 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
232 children is zero stop the entire bus driver.
233 @param ChildHandleBuffer List of Child Handles to Stop.
235 @retval EFI_SUCCESS This driver is removed ControllerHandle
236 @retval other This driver was not removed from this device
241 UdfDriverBindingStop (
242 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
243 IN EFI_HANDLE ControllerHandle
,
244 IN UINTN NumberOfChildren
,
245 IN EFI_HANDLE
*ChildHandleBuffer
248 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
250 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*SimpleFs
;
253 // Open SimpleFs protocol on ControllerHandle
255 Status
= gBS
->OpenProtocol (
257 &gEfiSimpleFileSystemProtocolGuid
,
259 This
->DriverBindingHandle
,
261 EFI_OPEN_PROTOCOL_GET_PROTOCOL
263 if (!EFI_ERROR (Status
)) {
264 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (SimpleFs
);
267 // Uninstall child handle
269 Status
= gBS
->UninstallMultipleProtocolInterfaces (
271 &gEfiSimpleFileSystemProtocolGuid
,
272 &PrivFsData
->SimpleFs
,
276 FreePool ((VOID
*)PrivFsData
);
279 if (!EFI_ERROR (Status
)) {
281 // Close DiskIo protocol on ControllerHandle
285 &gEfiDiskIoProtocolGuid
,
286 This
->DriverBindingHandle
,
290 // Close BlockIo protocol on ControllerHandle
294 &gEfiBlockIoProtocolGuid
,
295 This
->DriverBindingHandle
,
304 The user Entry Point for UDF file system driver. The user code starts with
307 @param[in] ImageHandle The firmware allocated handle for the EFI image.
308 @param[in] SystemTable A pointer to the EFI System Table.
310 @retval EFI_SUCCESS The entry point is executed successfully.
311 @retval other Some error occurs when executing this entry point.
317 IN EFI_HANDLE ImageHandle
,
318 IN EFI_SYSTEM_TABLE
*SystemTable
323 Status
= EfiLibInstallDriverBindingComponentName2 (
331 ASSERT_EFI_ERROR (Status
);