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
182 CopyMem ((VOID
*)&PrivFsData
->SimpleFs
, (VOID
*)&gUdfSimpleFsTemplate
,
183 sizeof (EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
));
186 // Install child handle
188 Status
= gBS
->InstallMultipleProtocolInterfaces (
190 &gEfiSimpleFileSystemProtocolGuid
,
191 &PrivFsData
->SimpleFs
,
196 if (EFI_ERROR (Status
)) {
198 // Close DiskIo protocol on ControllerHandle
202 &gEfiDiskIoProtocolGuid
,
203 This
->DriverBindingHandle
,
207 // Close BlockIo protocol on ControllerHandle
211 &gEfiBlockIoProtocolGuid
,
212 This
->DriverBindingHandle
,
217 gBS
->RestoreTPL (OldTpl
);
223 Stop this driver on ControllerHandle. Support stopping any child handles
224 created by this driver.
226 @param This Protocol instance pointer.
227 @param ControllerHandle Handle of device to stop driver on
228 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
229 children is zero stop the entire bus driver.
230 @param ChildHandleBuffer List of Child Handles to Stop.
232 @retval EFI_SUCCESS This driver is removed ControllerHandle
233 @retval other This driver was not removed from this device
238 UdfDriverBindingStop (
239 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
240 IN EFI_HANDLE ControllerHandle
,
241 IN UINTN NumberOfChildren
,
242 IN EFI_HANDLE
*ChildHandleBuffer
245 PRIVATE_UDF_SIMPLE_FS_DATA
*PrivFsData
;
247 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*SimpleFs
;
250 // Open SimpleFs protocol on ControllerHandle
252 Status
= gBS
->OpenProtocol (
254 &gEfiSimpleFileSystemProtocolGuid
,
256 This
->DriverBindingHandle
,
258 EFI_OPEN_PROTOCOL_GET_PROTOCOL
260 if (!EFI_ERROR (Status
)) {
261 PrivFsData
= PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (SimpleFs
);
264 // Uninstall child handle
266 Status
= gBS
->UninstallMultipleProtocolInterfaces (
268 &gEfiSimpleFileSystemProtocolGuid
,
269 &PrivFsData
->SimpleFs
,
273 FreePool ((VOID
*)PrivFsData
);
276 if (!EFI_ERROR (Status
)) {
278 // Close DiskIo protocol on ControllerHandle
282 &gEfiDiskIoProtocolGuid
,
283 This
->DriverBindingHandle
,
287 // Close BlockIo protocol on ControllerHandle
291 &gEfiBlockIoProtocolGuid
,
292 This
->DriverBindingHandle
,
301 The user Entry Point for UDF file system driver. The user code starts with
304 @param[in] ImageHandle The firmware allocated handle for the EFI image.
305 @param[in] SystemTable A pointer to the EFI System Table.
307 @retval EFI_SUCCESS The entry point is executed successfully.
308 @retval other Some error occurs when executing this entry point.
314 IN EFI_HANDLE ImageHandle
,
315 IN EFI_SYSTEM_TABLE
*SystemTable
320 Status
= EfiLibInstallDriverBindingComponentName2 (
328 ASSERT_EFI_ERROR (Status
);