]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Fat.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Fat.c
CommitLineData
cae7420b
DB
1/** @file\r
2 Fat File System driver routines that support EFI driver model.\r
b9ec9330 3\r
b6efb80a 4Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>\r
eb6cb4ce 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
b9ec9330 6\r
cae7420b 7**/\r
b9ec9330
QH
8\r
9#include "Fat.h"\r
10\r
205cc663
DB
11/**\r
12\r
13 Register Driver Binding protocol for this driver.\r
14\r
15 @param ImageHandle - Handle for the image of this driver.\r
16 @param SystemTable - Pointer to the EFI System Table.\r
17\r
18 @retval EFI_SUCCESS - Driver loaded.\r
19 @return other - Driver not loaded.\r
20\r
21**/\r
b9ec9330
QH
22EFI_STATUS\r
23EFIAPI\r
24FatEntryPoint (\r
bcdcc416
MK
25 IN EFI_HANDLE ImageHandle,\r
26 IN EFI_SYSTEM_TABLE *SystemTable\r
b9ec9330
QH
27 );\r
28\r
205cc663
DB
29/**\r
30\r
31 Unload function for this image. Uninstall DriverBinding protocol.\r
32\r
33 @param ImageHandle - Handle for the image of this driver.\r
34\r
35 @retval EFI_SUCCESS - Driver unloaded successfully.\r
36 @return other - Driver can not unloaded.\r
37\r
38**/\r
b9ec9330
QH
39EFI_STATUS\r
40EFIAPI\r
41FatUnload (\r
bcdcc416 42 IN EFI_HANDLE ImageHandle\r
b9ec9330
QH
43 );\r
44\r
205cc663
DB
45/**\r
46\r
47 Test to see if this driver can add a file system to ControllerHandle.\r
48 ControllerHandle must support both Disk IO and Block IO protocols.\r
49\r
50 @param This - Protocol instance pointer.\r
51 @param ControllerHandle - Handle of device to test.\r
52 @param RemainingDevicePath - Not used.\r
53\r
54 @retval EFI_SUCCESS - This driver supports this device.\r
55 @retval EFI_ALREADY_STARTED - This driver is already running on this device.\r
56 @return other - This driver does not support this device.\r
57\r
58**/\r
b9ec9330
QH
59EFI_STATUS\r
60EFIAPI\r
61FatDriverBindingSupported (\r
62 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
63 IN EFI_HANDLE Controller,\r
64 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
65 );\r
66\r
205cc663
DB
67/**\r
68\r
69 Start this driver on ControllerHandle by opening a Block IO and Disk IO\r
70 protocol, reading Device Path. Add a Simple File System protocol to\r
71 ControllerHandle if the media contains a valid file system.\r
72\r
73 @param This - Protocol instance pointer.\r
74 @param ControllerHandle - Handle of device to bind driver to.\r
75 @param RemainingDevicePath - Not used.\r
76\r
77 @retval EFI_SUCCESS - This driver is added to DeviceHandle.\r
78 @retval EFI_ALREADY_STARTED - This driver is already running on DeviceHandle.\r
79 @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory.\r
80 @return other - This driver does not support this device.\r
81\r
82**/\r
b9ec9330
QH
83EFI_STATUS\r
84EFIAPI\r
85FatDriverBindingStart (\r
86 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
87 IN EFI_HANDLE Controller,\r
88 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
89 );\r
90\r
205cc663
DB
91/**\r
92\r
93 Stop this driver on ControllerHandle.\r
94\r
95 @param This - Protocol instance pointer.\r
96 @param ControllerHandle - Handle of device to stop driver on.\r
97 @param NumberOfChildren - Not used.\r
98 @param ChildHandleBuffer - Not used.\r
99\r
100 @retval EFI_SUCCESS - This driver is removed DeviceHandle.\r
101 @return other - This driver was not removed from this device.\r
102\r
103**/\r
b9ec9330
QH
104EFI_STATUS\r
105EFIAPI\r
106FatDriverBindingStop (\r
107 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
108 IN EFI_HANDLE Controller,\r
109 IN UINTN NumberOfChildren,\r
110 IN EFI_HANDLE *ChildHandleBuffer\r
111 );\r
112\r
113//\r
114// DriverBinding protocol instance\r
115//\r
bcdcc416 116EFI_DRIVER_BINDING_PROTOCOL gFatDriverBinding = {\r
b9ec9330
QH
117 FatDriverBindingSupported,\r
118 FatDriverBindingStart,\r
119 FatDriverBindingStop,\r
120 0xa,\r
121 NULL,\r
122 NULL\r
123};\r
124\r
cae7420b
DB
125/**\r
126\r
127 Register Driver Binding protocol for this driver.\r
128\r
129 @param ImageHandle - Handle for the image of this driver.\r
130 @param SystemTable - Pointer to the EFI System Table.\r
131\r
132 @retval EFI_SUCCESS - Driver loaded.\r
133 @return other - Driver not loaded.\r
134\r
135**/\r
b9ec9330
QH
136EFI_STATUS\r
137EFIAPI\r
138FatEntryPoint (\r
bcdcc416
MK
139 IN EFI_HANDLE ImageHandle,\r
140 IN EFI_SYSTEM_TABLE *SystemTable\r
b9ec9330 141 )\r
b9ec9330 142{\r
bcdcc416 143 EFI_STATUS Status;\r
b9ec9330
QH
144\r
145 //\r
146 // Initialize the EFI Driver Library\r
147 //\r
148 Status = EfiLibInstallDriverBindingComponentName2 (\r
149 ImageHandle,\r
150 SystemTable,\r
151 &gFatDriverBinding,\r
152 ImageHandle,\r
153 &gFatComponentName,\r
154 &gFatComponentName2\r
155 );\r
156 ASSERT_EFI_ERROR (Status);\r
157\r
158 return Status;\r
159}\r
160\r
cae7420b 161/**\r
b9ec9330
QH
162\r
163 Unload function for this image. Uninstall DriverBinding protocol.\r
164\r
cae7420b 165 @param ImageHandle - Handle for the image of this driver.\r
b9ec9330 166\r
cae7420b
DB
167 @retval EFI_SUCCESS - Driver unloaded successfully.\r
168 @return other - Driver can not unloaded.\r
b9ec9330 169\r
cae7420b
DB
170**/\r
171EFI_STATUS\r
172EFIAPI\r
173FatUnload (\r
174 IN EFI_HANDLE ImageHandle\r
175 )\r
b9ec9330
QH
176{\r
177 EFI_STATUS Status;\r
178 EFI_HANDLE *DeviceHandleBuffer;\r
179 UINTN DeviceHandleCount;\r
180 UINTN Index;\r
b6efb80a
RN
181 VOID *ComponentName;\r
182 VOID *ComponentName2;\r
b9ec9330
QH
183\r
184 Status = gBS->LocateHandleBuffer (\r
185 AllHandles,\r
186 NULL,\r
187 NULL,\r
188 &DeviceHandleCount,\r
189 &DeviceHandleBuffer\r
190 );\r
b6efb80a
RN
191 if (EFI_ERROR (Status)) {\r
192 return Status;\r
193 }\r
194\r
195 for (Index = 0; Index < DeviceHandleCount; Index++) {\r
196 Status = EfiTestManagedDevice (DeviceHandleBuffer[Index], ImageHandle, &gEfiDiskIoProtocolGuid);\r
197 if (!EFI_ERROR (Status)) {\r
b9ec9330
QH
198 Status = gBS->DisconnectController (\r
199 DeviceHandleBuffer[Index],\r
200 ImageHandle,\r
201 NULL\r
202 );\r
b6efb80a
RN
203 if (EFI_ERROR (Status)) {\r
204 break;\r
205 }\r
206 }\r
207 }\r
208\r
209 if (Index == DeviceHandleCount) {\r
210 //\r
211 // Driver is stopped successfully.\r
212 //\r
213 Status = gBS->HandleProtocol (ImageHandle, &gEfiComponentNameProtocolGuid, &ComponentName);\r
214 if (EFI_ERROR (Status)) {\r
215 ComponentName = NULL;\r
b9ec9330
QH
216 }\r
217\r
b6efb80a
RN
218 Status = gBS->HandleProtocol (ImageHandle, &gEfiComponentName2ProtocolGuid, &ComponentName2);\r
219 if (EFI_ERROR (Status)) {\r
220 ComponentName2 = NULL;\r
b9ec9330 221 }\r
b6efb80a
RN
222\r
223 if (ComponentName == NULL) {\r
224 if (ComponentName2 == NULL) {\r
225 Status = gBS->UninstallMultipleProtocolInterfaces (\r
226 ImageHandle,\r
bcdcc416
MK
227 &gEfiDriverBindingProtocolGuid,\r
228 &gFatDriverBinding,\r
b6efb80a
RN
229 NULL\r
230 );\r
231 } else {\r
232 Status = gBS->UninstallMultipleProtocolInterfaces (\r
233 ImageHandle,\r
bcdcc416
MK
234 &gEfiDriverBindingProtocolGuid,\r
235 &gFatDriverBinding,\r
236 &gEfiComponentName2ProtocolGuid,\r
237 ComponentName2,\r
b6efb80a
RN
238 NULL\r
239 );\r
240 }\r
241 } else {\r
242 if (ComponentName2 == NULL) {\r
243 Status = gBS->UninstallMultipleProtocolInterfaces (\r
244 ImageHandle,\r
bcdcc416
MK
245 &gEfiDriverBindingProtocolGuid,\r
246 &gFatDriverBinding,\r
247 &gEfiComponentNameProtocolGuid,\r
248 ComponentName,\r
b6efb80a
RN
249 NULL\r
250 );\r
251 } else {\r
252 Status = gBS->UninstallMultipleProtocolInterfaces (\r
253 ImageHandle,\r
bcdcc416
MK
254 &gEfiDriverBindingProtocolGuid,\r
255 &gFatDriverBinding,\r
256 &gEfiComponentNameProtocolGuid,\r
257 ComponentName,\r
258 &gEfiComponentName2ProtocolGuid,\r
259 ComponentName2,\r
b6efb80a
RN
260 NULL\r
261 );\r
262 }\r
263 }\r
264 }\r
265\r
266 if (DeviceHandleBuffer != NULL) {\r
267 FreePool (DeviceHandleBuffer);\r
b9ec9330
QH
268 }\r
269\r
270 return Status;\r
271}\r
272\r
cae7420b
DB
273/**\r
274\r
275 Test to see if this driver can add a file system to ControllerHandle.\r
276 ControllerHandle must support both Disk IO and Block IO protocols.\r
277\r
278 @param This - Protocol instance pointer.\r
279 @param ControllerHandle - Handle of device to test.\r
280 @param RemainingDevicePath - Not used.\r
281\r
282 @retval EFI_SUCCESS - This driver supports this device.\r
283 @retval EFI_ALREADY_STARTED - This driver is already running on this device.\r
284 @return other - This driver does not support this device.\r
285\r
286**/\r
b9ec9330
QH
287EFI_STATUS\r
288EFIAPI\r
289FatDriverBindingSupported (\r
290 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
291 IN EFI_HANDLE ControllerHandle,\r
292 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
293 )\r
b9ec9330
QH
294{\r
295 EFI_STATUS Status;\r
296 EFI_DISK_IO_PROTOCOL *DiskIo;\r
297\r
298 //\r
299 // Open the IO Abstraction(s) needed to perform the supported test\r
300 //\r
301 Status = gBS->OpenProtocol (\r
302 ControllerHandle,\r
303 &gEfiDiskIoProtocolGuid,\r
bcdcc416 304 (VOID **)&DiskIo,\r
b9ec9330
QH
305 This->DriverBindingHandle,\r
306 ControllerHandle,\r
307 EFI_OPEN_PROTOCOL_BY_DRIVER\r
308 );\r
309\r
310 if (EFI_ERROR (Status)) {\r
311 return Status;\r
312 }\r
bcdcc416 313\r
b9ec9330
QH
314 //\r
315 // Close the I/O Abstraction(s) used to perform the supported test\r
316 //\r
317 gBS->CloseProtocol (\r
318 ControllerHandle,\r
319 &gEfiDiskIoProtocolGuid,\r
320 This->DriverBindingHandle,\r
321 ControllerHandle\r
322 );\r
323\r
324 //\r
325 // Open the IO Abstraction(s) needed to perform the supported test\r
326 //\r
327 Status = gBS->OpenProtocol (\r
328 ControllerHandle,\r
329 &gEfiBlockIoProtocolGuid,\r
330 NULL,\r
331 This->DriverBindingHandle,\r
332 ControllerHandle,\r
333 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
334 );\r
335\r
336 return Status;\r
337}\r
338\r
cae7420b 339/**\r
b9ec9330
QH
340\r
341 Start this driver on ControllerHandle by opening a Block IO and Disk IO\r
342 protocol, reading Device Path. Add a Simple File System protocol to\r
343 ControllerHandle if the media contains a valid file system.\r
344\r
cae7420b
DB
345 @param This - Protocol instance pointer.\r
346 @param ControllerHandle - Handle of device to bind driver to.\r
347 @param RemainingDevicePath - Not used.\r
b9ec9330 348\r
cae7420b
DB
349 @retval EFI_SUCCESS - This driver is added to DeviceHandle.\r
350 @retval EFI_ALREADY_STARTED - This driver is already running on DeviceHandle.\r
351 @retval EFI_OUT_OF_RESOURCES - Can not allocate the memory.\r
352 @return other - This driver does not support this device.\r
b9ec9330 353\r
cae7420b
DB
354**/\r
355EFI_STATUS\r
356EFIAPI\r
357FatDriverBindingStart (\r
358 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
359 IN EFI_HANDLE ControllerHandle,\r
360 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
361 )\r
b9ec9330 362{\r
bcdcc416
MK
363 EFI_STATUS Status;\r
364 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
365 EFI_DISK_IO_PROTOCOL *DiskIo;\r
366 EFI_DISK_IO2_PROTOCOL *DiskIo2;\r
367 BOOLEAN LockedByMe;\r
5251cb9d
QH
368\r
369 LockedByMe = FALSE;\r
370 //\r
371 // Acquire the lock.\r
372 // If caller has already acquired the lock, cannot lock it again.\r
373 //\r
374 Status = FatAcquireLockOrFail ();\r
375 if (!EFI_ERROR (Status)) {\r
376 LockedByMe = TRUE;\r
377 }\r
b9ec9330
QH
378\r
379 Status = InitializeUnicodeCollationSupport (This->DriverBindingHandle);\r
380 if (EFI_ERROR (Status)) {\r
5251cb9d 381 goto Exit;\r
b9ec9330 382 }\r
bcdcc416 383\r
b9ec9330
QH
384 //\r
385 // Open our required BlockIo and DiskIo\r
386 //\r
387 Status = gBS->OpenProtocol (\r
388 ControllerHandle,\r
389 &gEfiBlockIoProtocolGuid,\r
bcdcc416 390 (VOID **)&BlockIo,\r
b9ec9330
QH
391 This->DriverBindingHandle,\r
392 ControllerHandle,\r
393 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
394 );\r
395 if (EFI_ERROR (Status)) {\r
5251cb9d 396 goto Exit;\r
b9ec9330
QH
397 }\r
398\r
399 Status = gBS->OpenProtocol (\r
400 ControllerHandle,\r
401 &gEfiDiskIoProtocolGuid,\r
bcdcc416 402 (VOID **)&DiskIo,\r
b9ec9330
QH
403 This->DriverBindingHandle,\r
404 ControllerHandle,\r
405 EFI_OPEN_PROTOCOL_BY_DRIVER\r
406 );\r
407 if (EFI_ERROR (Status)) {\r
5251cb9d 408 goto Exit;\r
b9ec9330 409 }\r
149d6335
RN
410\r
411 Status = gBS->OpenProtocol (\r
412 ControllerHandle,\r
413 &gEfiDiskIo2ProtocolGuid,\r
bcdcc416 414 (VOID **)&DiskIo2,\r
149d6335
RN
415 This->DriverBindingHandle,\r
416 ControllerHandle,\r
417 EFI_OPEN_PROTOCOL_BY_DRIVER\r
418 );\r
419 if (EFI_ERROR (Status)) {\r
420 DiskIo2 = NULL;\r
421 }\r
422\r
b9ec9330
QH
423 //\r
424 // Allocate Volume structure. In FatAllocateVolume(), Resources\r
425 // are allocated with protocol installed and cached initialized\r
426 //\r
149d6335 427 Status = FatAllocateVolume (ControllerHandle, DiskIo, DiskIo2, BlockIo);\r
b9ec9330
QH
428\r
429 //\r
db62b65c 430 // When the media changes on a device it will Reinstall the BlockIo interface.\r
b9ec9330
QH
431 // This will cause a call to our Stop(), and a subsequent reentrant call to our\r
432 // Start() successfully. We should leave the device open when this happen.\r
433 //\r
434 if (EFI_ERROR (Status)) {\r
435 Status = gBS->OpenProtocol (\r
436 ControllerHandle,\r
437 &gEfiSimpleFileSystemProtocolGuid,\r
438 NULL,\r
439 This->DriverBindingHandle,\r
440 ControllerHandle,\r
441 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
442 );\r
443 if (EFI_ERROR (Status)) {\r
444 gBS->CloseProtocol (\r
445 ControllerHandle,\r
446 &gEfiDiskIoProtocolGuid,\r
447 This->DriverBindingHandle,\r
448 ControllerHandle\r
449 );\r
149d6335
RN
450 gBS->CloseProtocol (\r
451 ControllerHandle,\r
452 &gEfiDiskIo2ProtocolGuid,\r
453 This->DriverBindingHandle,\r
454 ControllerHandle\r
455 );\r
b9ec9330
QH
456 }\r
457 }\r
458\r
5251cb9d
QH
459Exit:\r
460 //\r
461 // Unlock if locked by myself.\r
462 //\r
463 if (LockedByMe) {\r
464 FatReleaseLock ();\r
465 }\r
bcdcc416 466\r
b9ec9330
QH
467 return Status;\r
468}\r
469\r
cae7420b
DB
470/**\r
471\r
472 Stop this driver on ControllerHandle.\r
473\r
474 @param This - Protocol instance pointer.\r
475 @param ControllerHandle - Handle of device to stop driver on.\r
476 @param NumberOfChildren - Not used.\r
477 @param ChildHandleBuffer - Not used.\r
478\r
479 @retval EFI_SUCCESS - This driver is removed DeviceHandle.\r
480 @return other - This driver was not removed from this device.\r
481\r
482**/\r
b9ec9330
QH
483EFI_STATUS\r
484EFIAPI\r
485FatDriverBindingStop (\r
bcdcc416
MK
486 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
487 IN EFI_HANDLE ControllerHandle,\r
488 IN UINTN NumberOfChildren,\r
489 IN EFI_HANDLE *ChildHandleBuffer\r
b9ec9330 490 )\r
b9ec9330 491{\r
bcdcc416
MK
492 EFI_STATUS Status;\r
493 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;\r
494 FAT_VOLUME *Volume;\r
495 EFI_DISK_IO2_PROTOCOL *DiskIo2;\r
b9ec9330 496\r
9e710bc9 497 DiskIo2 = NULL;\r
b9ec9330
QH
498 //\r
499 // Get our context back\r
500 //\r
501 Status = gBS->OpenProtocol (\r
502 ControllerHandle,\r
503 &gEfiSimpleFileSystemProtocolGuid,\r
bcdcc416 504 (VOID **)&FileSystem,\r
b9ec9330
QH
505 This->DriverBindingHandle,\r
506 ControllerHandle,\r
507 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
508 );\r
509\r
510 if (!EFI_ERROR (Status)) {\r
9e710bc9
RN
511 Volume = VOLUME_FROM_VOL_INTERFACE (FileSystem);\r
512 DiskIo2 = Volume->DiskIo2;\r
513 Status = FatAbandonVolume (Volume);\r
b9ec9330
QH
514 }\r
515\r
9e710bc9
RN
516 if (!EFI_ERROR (Status)) {\r
517 if (DiskIo2 != NULL) {\r
518 Status = gBS->CloseProtocol (\r
bcdcc416
MK
519 ControllerHandle,\r
520 &gEfiDiskIo2ProtocolGuid,\r
521 This->DriverBindingHandle,\r
522 ControllerHandle\r
523 );\r
9e710bc9
RN
524 ASSERT_EFI_ERROR (Status);\r
525 }\r
bcdcc416 526\r
9e710bc9 527 Status = gBS->CloseProtocol (\r
bcdcc416
MK
528 ControllerHandle,\r
529 &gEfiDiskIoProtocolGuid,\r
530 This->DriverBindingHandle,\r
531 ControllerHandle\r
532 );\r
9e710bc9
RN
533 ASSERT_EFI_ERROR (Status);\r
534 }\r
b9ec9330
QH
535\r
536 return Status;\r
537}\r