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 (
40 &gVirtioDeviceProtocolGuid
,
42 This
->DriverBindingHandle
,
44 EFI_OPEN_PROTOCOL_BY_DRIVER
46 if (EFI_ERROR (Status
)) {
50 if (Virtio
->SubSystemDeviceId
!= VIRTIO_SUBSYSTEM_FILESYSTEM
) {
51 Status
= EFI_UNSUPPORTED
;
54 CloseStatus
= gBS
->CloseProtocol (
56 &gVirtioDeviceProtocolGuid
,
57 This
->DriverBindingHandle
,
60 ASSERT_EFI_ERROR (CloseStatus
);
67 VirtioFsBindingStart (
68 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
69 IN EFI_HANDLE ControllerHandle
,
70 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
75 EFI_STATUS CloseStatus
;
77 VirtioFs
= AllocatePool (sizeof *VirtioFs
);
78 if (VirtioFs
== NULL
) {
79 return EFI_OUT_OF_RESOURCES
;
82 VirtioFs
->Signature
= VIRTIO_FS_SIG
;
84 Status
= gBS
->OpenProtocol (
86 &gVirtioDeviceProtocolGuid
,
87 (VOID
**)&VirtioFs
->Virtio
,
88 This
->DriverBindingHandle
,
90 EFI_OPEN_PROTOCOL_BY_DRIVER
92 if (EFI_ERROR (Status
)) {
96 Status
= VirtioFsInit (VirtioFs
);
97 if (EFI_ERROR (Status
)) {
101 Status
= VirtioFsFuseInitSession (VirtioFs
);
102 if (EFI_ERROR (Status
)) {
106 Status
= gBS
->CreateEvent (
107 EVT_SIGNAL_EXIT_BOOT_SERVICES
,
113 if (EFI_ERROR (Status
)) {
117 InitializeListHead (&VirtioFs
->OpenFiles
);
118 VirtioFs
->SimpleFs
.Revision
= EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION
;
119 VirtioFs
->SimpleFs
.OpenVolume
= VirtioFsOpenVolume
;
121 Status
= gBS
->InstallProtocolInterface (
123 &gEfiSimpleFileSystemProtocolGuid
,
124 EFI_NATIVE_INTERFACE
,
127 if (EFI_ERROR (Status
)) {
134 CloseStatus
= gBS
->CloseEvent (VirtioFs
->ExitBoot
);
135 ASSERT_EFI_ERROR (CloseStatus
);
138 VirtioFsUninit (VirtioFs
);
141 CloseStatus
= gBS
->CloseProtocol (
143 &gVirtioDeviceProtocolGuid
,
144 This
->DriverBindingHandle
,
147 ASSERT_EFI_ERROR (CloseStatus
);
157 VirtioFsBindingStop (
158 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
159 IN EFI_HANDLE ControllerHandle
,
160 IN UINTN NumberOfChildren
,
161 IN EFI_HANDLE
*ChildHandleBuffer OPTIONAL
165 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*SimpleFs
;
168 Status
= gBS
->OpenProtocol (
170 &gEfiSimpleFileSystemProtocolGuid
,
172 This
->DriverBindingHandle
,
174 EFI_OPEN_PROTOCOL_GET_PROTOCOL
176 if (EFI_ERROR (Status
)) {
180 VirtioFs
= VIRTIO_FS_FROM_SIMPLE_FS (SimpleFs
);
182 if (!IsListEmpty (&VirtioFs
->OpenFiles
)) {
183 return EFI_ACCESS_DENIED
;
186 Status
= gBS
->UninstallProtocolInterface (
188 &gEfiSimpleFileSystemProtocolGuid
,
191 if (EFI_ERROR (Status
)) {
195 Status
= gBS
->CloseEvent (VirtioFs
->ExitBoot
);
196 ASSERT_EFI_ERROR (Status
);
198 VirtioFsUninit (VirtioFs
);
200 Status
= gBS
->CloseProtocol (
202 &gVirtioDeviceProtocolGuid
,
203 This
->DriverBindingHandle
,
206 ASSERT_EFI_ERROR (Status
);
215 VirtioFsGetDriverName (
216 IN EFI_COMPONENT_NAME2_PROTOCOL
*This
,
218 OUT CHAR16
**DriverName
221 if ((Language
== NULL
) || (DriverName
== NULL
)) {
222 return EFI_INVALID_PARAMETER
;
225 if (AsciiStrCmp (Language
, "en") != 0) {
226 return EFI_UNSUPPORTED
;
229 *DriverName
= L
"Virtio Filesystem Driver";
235 VirtioFsGetControllerName (
236 IN EFI_COMPONENT_NAME2_PROTOCOL
*This
,
237 IN EFI_HANDLE ControllerHandle
,
238 IN EFI_HANDLE ChildHandle OPTIONAL
,
240 OUT CHAR16
**ControllerName
243 return EFI_UNSUPPORTED
;
247 // Entry point of this driver.
252 IN EFI_HANDLE ImageHandle
,
253 IN EFI_SYSTEM_TABLE
*SystemTable
258 mDriverBinding
.Supported
= VirtioFsBindingSupported
;
259 mDriverBinding
.Start
= VirtioFsBindingStart
;
260 mDriverBinding
.Stop
= VirtioFsBindingStop
;
261 mDriverBinding
.Version
= 0x10;
262 mDriverBinding
.ImageHandle
= ImageHandle
;
263 mDriverBinding
.DriverBindingHandle
= ImageHandle
;
265 mComponentName2
.GetDriverName
= VirtioFsGetDriverName
;
266 mComponentName2
.GetControllerName
= VirtioFsGetControllerName
;
267 mComponentName2
.SupportedLanguages
= "en";
269 Status
= gBS
->InstallMultipleProtocolInterfaces (
271 &gEfiDriverBindingProtocolGuid
,
273 &gEfiComponentName2ProtocolGuid
,