2 Provide EFI_SIMPLE_FILE_SYSTEM_PROTOCOL instances on virtio-fs devices.
4 Copyright (C) 2020, Red Hat, Inc.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <Library/BaseLib.h> // AsciiStrCmp()
10 #include <Library/MemoryAllocationLib.h> // AllocatePool()
11 #include <Library/UefiBootServicesTableLib.h> // gBS
12 #include <Protocol/ComponentName2.h> // EFI_COMPONENT_NAME2_PROTOCOL
13 #include <Protocol/DriverBinding.h> // EFI_DRIVER_BINDING_PROTOCOL
15 #include "VirtioFsDxe.h"
18 // UEFI Driver Model protocol instances.
20 STATIC EFI_DRIVER_BINDING_PROTOCOL mDriverBinding
;
21 STATIC EFI_COMPONENT_NAME2_PROTOCOL mComponentName2
;
24 // UEFI Driver Model protocol member functions.
28 VirtioFsBindingSupported (
29 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
30 IN EFI_HANDLE ControllerHandle
,
31 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
35 VIRTIO_DEVICE_PROTOCOL
*Virtio
;
36 EFI_STATUS CloseStatus
;
38 Status
= gBS
->OpenProtocol (ControllerHandle
, &gVirtioDeviceProtocolGuid
,
39 (VOID
**)&Virtio
, This
->DriverBindingHandle
,
40 ControllerHandle
, EFI_OPEN_PROTOCOL_BY_DRIVER
);
41 if (EFI_ERROR (Status
)) {
45 if (Virtio
->SubSystemDeviceId
!= VIRTIO_SUBSYSTEM_FILESYSTEM
) {
46 Status
= EFI_UNSUPPORTED
;
49 CloseStatus
= gBS
->CloseProtocol (ControllerHandle
,
50 &gVirtioDeviceProtocolGuid
, This
->DriverBindingHandle
,
52 ASSERT_EFI_ERROR (CloseStatus
);
59 VirtioFsBindingStart (
60 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
61 IN EFI_HANDLE ControllerHandle
,
62 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
67 EFI_STATUS CloseStatus
;
69 VirtioFs
= AllocatePool (sizeof *VirtioFs
);
70 if (VirtioFs
== NULL
) {
71 return EFI_OUT_OF_RESOURCES
;
73 VirtioFs
->Signature
= VIRTIO_FS_SIG
;
75 Status
= gBS
->OpenProtocol (ControllerHandle
, &gVirtioDeviceProtocolGuid
,
76 (VOID
**)&VirtioFs
->Virtio
, This
->DriverBindingHandle
,
77 ControllerHandle
, EFI_OPEN_PROTOCOL_BY_DRIVER
);
78 if (EFI_ERROR (Status
)) {
82 Status
= VirtioFsInit (VirtioFs
);
83 if (EFI_ERROR (Status
)) {
87 Status
= VirtioFsFuseInitSession (VirtioFs
);
88 if (EFI_ERROR (Status
)) {
92 Status
= gBS
->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES
, TPL_CALLBACK
,
93 VirtioFsExitBoot
, VirtioFs
, &VirtioFs
->ExitBoot
);
94 if (EFI_ERROR (Status
)) {
98 InitializeListHead (&VirtioFs
->OpenFiles
);
99 VirtioFs
->SimpleFs
.Revision
= EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION
;
100 VirtioFs
->SimpleFs
.OpenVolume
= VirtioFsOpenVolume
;
102 Status
= gBS
->InstallProtocolInterface (&ControllerHandle
,
103 &gEfiSimpleFileSystemProtocolGuid
, EFI_NATIVE_INTERFACE
,
104 &VirtioFs
->SimpleFs
);
105 if (EFI_ERROR (Status
)) {
112 CloseStatus
= gBS
->CloseEvent (VirtioFs
->ExitBoot
);
113 ASSERT_EFI_ERROR (CloseStatus
);
116 VirtioFsUninit (VirtioFs
);
119 CloseStatus
= gBS
->CloseProtocol (ControllerHandle
,
120 &gVirtioDeviceProtocolGuid
, This
->DriverBindingHandle
,
122 ASSERT_EFI_ERROR (CloseStatus
);
132 VirtioFsBindingStop (
133 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
134 IN EFI_HANDLE ControllerHandle
,
135 IN UINTN NumberOfChildren
,
136 IN EFI_HANDLE
*ChildHandleBuffer OPTIONAL
140 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*SimpleFs
;
143 Status
= gBS
->OpenProtocol (ControllerHandle
,
144 &gEfiSimpleFileSystemProtocolGuid
, (VOID
**)&SimpleFs
,
145 This
->DriverBindingHandle
, ControllerHandle
,
146 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
147 if (EFI_ERROR (Status
)) {
151 VirtioFs
= VIRTIO_FS_FROM_SIMPLE_FS (SimpleFs
);
153 if (!IsListEmpty (&VirtioFs
->OpenFiles
)) {
154 return EFI_ACCESS_DENIED
;
157 Status
= gBS
->UninstallProtocolInterface (ControllerHandle
,
158 &gEfiSimpleFileSystemProtocolGuid
, SimpleFs
);
159 if (EFI_ERROR (Status
)) {
163 Status
= gBS
->CloseEvent (VirtioFs
->ExitBoot
);
164 ASSERT_EFI_ERROR (Status
);
166 VirtioFsUninit (VirtioFs
);
168 Status
= gBS
->CloseProtocol (ControllerHandle
, &gVirtioDeviceProtocolGuid
,
169 This
->DriverBindingHandle
, ControllerHandle
);
170 ASSERT_EFI_ERROR (Status
);
179 VirtioFsGetDriverName (
180 IN EFI_COMPONENT_NAME2_PROTOCOL
*This
,
182 OUT CHAR16
**DriverName
185 if (AsciiStrCmp (Language
, "en") != 0) {
186 return EFI_UNSUPPORTED
;
188 *DriverName
= L
"Virtio Filesystem Driver";
194 VirtioFsGetControllerName (
195 IN EFI_COMPONENT_NAME2_PROTOCOL
*This
,
196 IN EFI_HANDLE ControllerHandle
,
197 IN EFI_HANDLE ChildHandle OPTIONAL
,
199 OUT CHAR16
**ControllerName
202 return EFI_UNSUPPORTED
;
206 // Entry point of this driver.
211 IN EFI_HANDLE ImageHandle
,
212 IN EFI_SYSTEM_TABLE
*SystemTable
217 mDriverBinding
.Supported
= VirtioFsBindingSupported
;
218 mDriverBinding
.Start
= VirtioFsBindingStart
;
219 mDriverBinding
.Stop
= VirtioFsBindingStop
;
220 mDriverBinding
.Version
= 0x10;
221 mDriverBinding
.ImageHandle
= ImageHandle
;
222 mDriverBinding
.DriverBindingHandle
= ImageHandle
;
224 mComponentName2
.GetDriverName
= VirtioFsGetDriverName
;
225 mComponentName2
.GetControllerName
= VirtioFsGetControllerName
;
226 mComponentName2
.SupportedLanguages
= "en";
228 Status
= gBS
->InstallMultipleProtocolInterfaces (&ImageHandle
,
229 &gEfiDriverBindingProtocolGuid
, &mDriverBinding
,
230 &gEfiComponentName2ProtocolGuid
, &mComponentName2
, NULL
);