]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioFsDxe/DriverBinding.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / VirtioFsDxe / DriverBinding.c
CommitLineData
5ab6a0e1
LE
1/** @file\r
2 Provide EFI_SIMPLE_FILE_SYSTEM_PROTOCOL instances on virtio-fs devices.\r
3\r
4 Copyright (C) 2020, Red Hat, Inc.\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7**/\r
8\r
9#include <Library/BaseLib.h> // AsciiStrCmp()\r
b55d6622 10#include <Library/MemoryAllocationLib.h> // AllocatePool()\r
5ab6a0e1
LE
11#include <Library/UefiBootServicesTableLib.h> // gBS\r
12#include <Protocol/ComponentName2.h> // EFI_COMPONENT_NAME2_PROTOCOL\r
13#include <Protocol/DriverBinding.h> // EFI_DRIVER_BINDING_PROTOCOL\r
14\r
b55d6622
LE
15#include "VirtioFsDxe.h"\r
16\r
5ab6a0e1
LE
17//\r
18// UEFI Driver Model protocol instances.\r
19//\r
ac0a286f
MK
20STATIC EFI_DRIVER_BINDING_PROTOCOL mDriverBinding;\r
21STATIC EFI_COMPONENT_NAME2_PROTOCOL mComponentName2;\r
5ab6a0e1
LE
22\r
23//\r
24// UEFI Driver Model protocol member functions.\r
25//\r
26EFI_STATUS\r
27EFIAPI\r
28VirtioFsBindingSupported (\r
ac0a286f
MK
29 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
30 IN EFI_HANDLE ControllerHandle,\r
31 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
5ab6a0e1
LE
32 )\r
33{\r
ac0a286f
MK
34 EFI_STATUS Status;\r
35 VIRTIO_DEVICE_PROTOCOL *Virtio;\r
36 EFI_STATUS CloseStatus;\r
37\r
38 Status = gBS->OpenProtocol (\r
39 ControllerHandle,\r
40 &gVirtioDeviceProtocolGuid,\r
41 (VOID **)&Virtio,\r
42 This->DriverBindingHandle,\r
43 ControllerHandle,\r
44 EFI_OPEN_PROTOCOL_BY_DRIVER\r
45 );\r
b55d6622
LE
46 if (EFI_ERROR (Status)) {\r
47 return Status;\r
48 }\r
49\r
50 if (Virtio->SubSystemDeviceId != VIRTIO_SUBSYSTEM_FILESYSTEM) {\r
51 Status = EFI_UNSUPPORTED;\r
52 }\r
53\r
ac0a286f
MK
54 CloseStatus = gBS->CloseProtocol (\r
55 ControllerHandle,\r
56 &gVirtioDeviceProtocolGuid,\r
57 This->DriverBindingHandle,\r
58 ControllerHandle\r
59 );\r
b55d6622
LE
60 ASSERT_EFI_ERROR (CloseStatus);\r
61\r
62 return Status;\r
5ab6a0e1
LE
63}\r
64\r
65EFI_STATUS\r
66EFIAPI\r
67VirtioFsBindingStart (\r
ac0a286f
MK
68 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
69 IN EFI_HANDLE ControllerHandle,\r
70 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
5ab6a0e1
LE
71 )\r
72{\r
ac0a286f
MK
73 VIRTIO_FS *VirtioFs;\r
74 EFI_STATUS Status;\r
75 EFI_STATUS CloseStatus;\r
b55d6622
LE
76\r
77 VirtioFs = AllocatePool (sizeof *VirtioFs);\r
78 if (VirtioFs == NULL) {\r
79 return EFI_OUT_OF_RESOURCES;\r
80 }\r
ac0a286f 81\r
b55d6622
LE
82 VirtioFs->Signature = VIRTIO_FS_SIG;\r
83\r
ac0a286f
MK
84 Status = gBS->OpenProtocol (\r
85 ControllerHandle,\r
86 &gVirtioDeviceProtocolGuid,\r
87 (VOID **)&VirtioFs->Virtio,\r
88 This->DriverBindingHandle,\r
89 ControllerHandle,\r
90 EFI_OPEN_PROTOCOL_BY_DRIVER\r
91 );\r
b55d6622
LE
92 if (EFI_ERROR (Status)) {\r
93 goto FreeVirtioFs;\r
94 }\r
95\r
eaa7115d
LE
96 Status = VirtioFsInit (VirtioFs);\r
97 if (EFI_ERROR (Status)) {\r
98 goto CloseVirtio;\r
99 }\r
100\r
fa97e372
LE
101 Status = VirtioFsFuseInitSession (VirtioFs);\r
102 if (EFI_ERROR (Status)) {\r
103 goto UninitVirtioFs;\r
104 }\r
6a2dc768 105\r
ac0a286f
MK
106 Status = gBS->CreateEvent (\r
107 EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
108 TPL_CALLBACK,\r
109 VirtioFsExitBoot,\r
110 VirtioFs,\r
111 &VirtioFs->ExitBoot\r
112 );\r
eaa7115d
LE
113 if (EFI_ERROR (Status)) {\r
114 goto UninitVirtioFs;\r
115 }\r
116\r
334c13e1 117 InitializeListHead (&VirtioFs->OpenFiles);\r
b55d6622
LE
118 VirtioFs->SimpleFs.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;\r
119 VirtioFs->SimpleFs.OpenVolume = VirtioFsOpenVolume;\r
120\r
ac0a286f
MK
121 Status = gBS->InstallProtocolInterface (\r
122 &ControllerHandle,\r
123 &gEfiSimpleFileSystemProtocolGuid,\r
124 EFI_NATIVE_INTERFACE,\r
125 &VirtioFs->SimpleFs\r
126 );\r
b55d6622 127 if (EFI_ERROR (Status)) {\r
eaa7115d 128 goto CloseExitBoot;\r
b55d6622
LE
129 }\r
130\r
131 return EFI_SUCCESS;\r
132\r
eaa7115d
LE
133CloseExitBoot:\r
134 CloseStatus = gBS->CloseEvent (VirtioFs->ExitBoot);\r
135 ASSERT_EFI_ERROR (CloseStatus);\r
136\r
137UninitVirtioFs:\r
138 VirtioFsUninit (VirtioFs);\r
139\r
b55d6622 140CloseVirtio:\r
ac0a286f
MK
141 CloseStatus = gBS->CloseProtocol (\r
142 ControllerHandle,\r
143 &gVirtioDeviceProtocolGuid,\r
144 This->DriverBindingHandle,\r
145 ControllerHandle\r
146 );\r
b55d6622
LE
147 ASSERT_EFI_ERROR (CloseStatus);\r
148\r
149FreeVirtioFs:\r
150 FreePool (VirtioFs);\r
151\r
152 return Status;\r
5ab6a0e1
LE
153}\r
154\r
155EFI_STATUS\r
156EFIAPI\r
157VirtioFsBindingStop (\r
ac0a286f
MK
158 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
159 IN EFI_HANDLE ControllerHandle,\r
160 IN UINTN NumberOfChildren,\r
161 IN EFI_HANDLE *ChildHandleBuffer OPTIONAL\r
5ab6a0e1
LE
162 )\r
163{\r
ac0a286f
MK
164 EFI_STATUS Status;\r
165 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
166 VIRTIO_FS *VirtioFs;\r
167\r
168 Status = gBS->OpenProtocol (\r
169 ControllerHandle,\r
170 &gEfiSimpleFileSystemProtocolGuid,\r
171 (VOID **)&SimpleFs,\r
172 This->DriverBindingHandle,\r
173 ControllerHandle,\r
174 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
175 );\r
b55d6622
LE
176 if (EFI_ERROR (Status)) {\r
177 return Status;\r
178 }\r
179\r
180 VirtioFs = VIRTIO_FS_FROM_SIMPLE_FS (SimpleFs);\r
181\r
334c13e1
LE
182 if (!IsListEmpty (&VirtioFs->OpenFiles)) {\r
183 return EFI_ACCESS_DENIED;\r
184 }\r
185\r
ac0a286f
MK
186 Status = gBS->UninstallProtocolInterface (\r
187 ControllerHandle,\r
188 &gEfiSimpleFileSystemProtocolGuid,\r
189 SimpleFs\r
190 );\r
b55d6622
LE
191 if (EFI_ERROR (Status)) {\r
192 return Status;\r
193 }\r
194\r
eaa7115d
LE
195 Status = gBS->CloseEvent (VirtioFs->ExitBoot);\r
196 ASSERT_EFI_ERROR (Status);\r
197\r
198 VirtioFsUninit (VirtioFs);\r
199\r
ac0a286f
MK
200 Status = gBS->CloseProtocol (\r
201 ControllerHandle,\r
202 &gVirtioDeviceProtocolGuid,\r
203 This->DriverBindingHandle,\r
204 ControllerHandle\r
205 );\r
b55d6622
LE
206 ASSERT_EFI_ERROR (Status);\r
207\r
208 FreePool (VirtioFs);\r
209\r
210 return EFI_SUCCESS;\r
5ab6a0e1
LE
211}\r
212\r
213EFI_STATUS\r
214EFIAPI\r
215VirtioFsGetDriverName (\r
ac0a286f
MK
216 IN EFI_COMPONENT_NAME2_PROTOCOL *This,\r
217 IN CHAR8 *Language,\r
218 OUT CHAR16 **DriverName\r
5ab6a0e1
LE
219 )\r
220{\r
221 if (AsciiStrCmp (Language, "en") != 0) {\r
222 return EFI_UNSUPPORTED;\r
223 }\r
ac0a286f 224\r
5ab6a0e1
LE
225 *DriverName = L"Virtio Filesystem Driver";\r
226 return EFI_SUCCESS;\r
227}\r
228\r
229EFI_STATUS\r
230EFIAPI\r
231VirtioFsGetControllerName (\r
ac0a286f
MK
232 IN EFI_COMPONENT_NAME2_PROTOCOL *This,\r
233 IN EFI_HANDLE ControllerHandle,\r
234 IN EFI_HANDLE ChildHandle OPTIONAL,\r
235 IN CHAR8 *Language,\r
236 OUT CHAR16 **ControllerName\r
5ab6a0e1
LE
237 )\r
238{\r
239 return EFI_UNSUPPORTED;\r
240}\r
241\r
242//\r
243// Entry point of this driver.\r
244//\r
245EFI_STATUS\r
246EFIAPI\r
247VirtioFsEntryPoint (\r
ac0a286f
MK
248 IN EFI_HANDLE ImageHandle,\r
249 IN EFI_SYSTEM_TABLE *SystemTable\r
5ab6a0e1
LE
250 )\r
251{\r
ac0a286f 252 EFI_STATUS Status;\r
5ab6a0e1
LE
253\r
254 mDriverBinding.Supported = VirtioFsBindingSupported;\r
255 mDriverBinding.Start = VirtioFsBindingStart;\r
256 mDriverBinding.Stop = VirtioFsBindingStop;\r
257 mDriverBinding.Version = 0x10;\r
258 mDriverBinding.ImageHandle = ImageHandle;\r
259 mDriverBinding.DriverBindingHandle = ImageHandle;\r
260\r
261 mComponentName2.GetDriverName = VirtioFsGetDriverName;\r
262 mComponentName2.GetControllerName = VirtioFsGetControllerName;\r
263 mComponentName2.SupportedLanguages = "en";\r
264\r
ac0a286f
MK
265 Status = gBS->InstallMultipleProtocolInterfaces (\r
266 &ImageHandle,\r
267 &gEfiDriverBindingProtocolGuid,\r
268 &mDriverBinding,\r
269 &gEfiComponentName2ProtocolGuid,\r
270 &mComponentName2,\r
271 NULL\r
272 );\r
5ab6a0e1
LE
273 return Status;\r
274}\r