TianoCore EDK2 master
Loading...
Searching...
No Matches
PlatDriOverrideDxe.c
Go to the documentation of this file.
1
22#include "PlatOverMngr.h"
23
24#define EFI_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('C', 'l', 'b', 'k')
25#define EFI_CALLBACK_INFO_FROM_THIS(a) CR (a, EFI_CALLBACK_INFO, ConfigAccess, EFI_CALLBACK_INFO_SIGNATURE)
26
27typedef struct {
28 UINTN Signature;
29 EFI_HANDLE DriverHandle;
30 EFI_HII_HANDLE RegisteredHandle;
31 PLAT_OVER_MNGR_DATA FakeNvData;
32 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
34 EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL PlatformDriverOverride;
36
37#pragma pack(1)
38
42typedef struct {
43 VENDOR_DEVICE_PATH VendorDevicePath;
46
47#pragma pack()
48
49//
50// uni string and Vfr Binary data.
51//
52extern UINT8 VfrBin[];
53extern UINT8 PlatDriOverrideDxeStrings[];
54
55//
56// module global data
57//
58CHAR16 mVariableName[] = L"Data";
59LIST_ENTRY mMappingDataBase = INITIALIZE_LIST_HEAD_VARIABLE (mMappingDataBase);
60BOOLEAN mEnvironmentVariableRead = FALSE;
61EFI_HANDLE mCallerImageHandle = NULL;
62
63EFI_HANDLE *mDevicePathHandleBuffer;
64EFI_HANDLE *mDriverImageHandleBuffer;
65
66INTN mSelectedCtrIndex;
67EFI_STRING_ID *mControllerToken;
68UINTN mDriverImageHandleCount;
69EFI_STRING_ID *mDriverImageToken;
70EFI_DEVICE_PATH_PROTOCOL **mControllerDevicePathProtocol;
71UINTN mSelectedDriverImageNum;
72UINTN mLastSavedDriverImageNum;
73UINT16 mCurrentPage;
74EFI_CALLBACK_INFO *mCallbackInfo;
75BOOLEAN *mDriSelection;
76UINTN mMaxDeviceCount;
77
78HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
79 {
80 {
83 {
84 (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
85 (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
86 }
87 },
88 PLAT_OVER_MNGR_GUID
89 },
90 {
91 END_DEVICE_PATH_TYPE,
92 END_ENTIRE_DEVICE_PATH_SUBTYPE,
93 {
94 (UINT8)(END_DEVICE_PATH_LENGTH),
95 (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
96 }
97 }
98};
99
108CHAR16 *
111 )
112{
113 CHAR16 *Text;
114
116 DevPath,
117 FALSE,
118 TRUE
119 );
120 if (Text == NULL) {
121 Text = AllocateCopyPool (sizeof (L"?"), L"?");
122 ASSERT (Text != NULL);
123 }
124
125 return Text;
126}
127
140CHAR16 *
142 IN EFI_HANDLE DriverBindingHandle,
143 IN EFI_GUID *ProtocolGuid,
144 IN CONST CHAR16 *VariableName
145 )
146{
147 EFI_STATUS Status;
148 EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
149 CHAR16 *DriverName;
150 CHAR8 *Language;
151 CHAR8 *BestLanguage;
152
153 Status = gBS->OpenProtocol (
154 DriverBindingHandle,
155 ProtocolGuid,
156 (VOID *)&ComponentName,
157 NULL,
158 NULL,
159 EFI_OPEN_PROTOCOL_GET_PROTOCOL
160 );
161 if (EFI_ERROR (Status)) {
162 return NULL;
163 }
164
165 //
166 // Find the best matching language.
167 //
168 GetEfiGlobalVariable2 (VariableName, (VOID **)&Language, NULL);
169 BestLanguage = GetBestLanguage (
170 ComponentName->SupportedLanguages,
171 (BOOLEAN)(ProtocolGuid == &gEfiComponentNameProtocolGuid),
172 Language,
173 NULL
174 );
175
176 DriverName = NULL;
177 if (BestLanguage != NULL) {
178 ComponentName->GetDriverName (
179 ComponentName,
180 BestLanguage,
181 &DriverName
182 );
183 FreePool (BestLanguage);
184 }
185
186 if (Language != NULL) {
187 FreePool (Language);
188 }
189
190 return DriverName;
191}
192
203CHAR16 *
205 IN EFI_HANDLE DriverBindingHandle
206 )
207{
208 CHAR16 *DriverName;
209
210 //
211 // Try RFC 4646 Component Name 2 protocol first.
212 //
213 DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentName2ProtocolGuid, L"PlatformLang");
214 if (DriverName == NULL) {
215 //
216 // If we can not get driver name from Component Name 2 protocol, we can try ISO 639-2 Component Name protocol.
217 //
218 DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentNameProtocolGuid, L"Lang");
219 }
220
221 return DriverName;
222}
223
234CHAR16 *
237 )
238{
239 EFI_STATUS Status;
240 EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
241 EFI_DEVICE_PATH_PROTOCOL *AlignedDevPathNode;
243 VOID *Buffer;
244 UINTN BufferSize;
245 UINT32 AuthenticationStatus;
246 EFI_GUID *NameGuid;
248
249 Fv2 = NULL;
250 Buffer = NULL;
251 BufferSize = 0;
252
253 if (Image->FilePath == NULL) {
254 return NULL;
255 }
256
257 DevPathNode = Image->FilePath;
258
259 while (!IsDevicePathEnd (DevPathNode)) {
260 //
261 // Make sure device path node is aligned when accessing it's FV Name Guid field.
262 //
263 AlignedDevPathNode = AllocateCopyPool (DevicePathNodeLength (DevPathNode), DevPathNode);
264
265 //
266 // Find the Fv File path
267 //
269 if (NameGuid != NULL) {
270 FvFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)AlignedDevPathNode;
271 Status = gBS->HandleProtocol (
272 Image->DeviceHandle,
273 &gEfiFirmwareVolume2ProtocolGuid,
274 (VOID **)&Fv2
275 );
276 //
277 // Locate Image EFI UI section to get the image name.
278 //
279 if (!EFI_ERROR (Status)) {
280 Status = Fv2->ReadSection (
281 Fv2,
282 &FvFilePath->FvFileName,
283 EFI_SECTION_USER_INTERFACE,
284 0,
285 &Buffer,
286 &BufferSize,
287 &AuthenticationStatus
288 );
289 if (!EFI_ERROR (Status)) {
290 FreePool (AlignedDevPathNode);
291 break;
292 }
293
294 Buffer = NULL;
295 }
296 }
297
298 FreePool (AlignedDevPathNode);
299
300 //
301 // Next device path node
302 //
303 DevPathNode = NextDevicePathNode (DevPathNode);
304 }
305
306 return Buffer;
307}
308
324 IN EFI_CALLBACK_INFO *Private,
325 IN UINT16 KeyValue,
326 IN PLAT_OVER_MNGR_DATA *FakeNvData
327 )
328{
329 EFI_STATUS Status;
330 UINTN Index;
331 UINTN DevicePathHandleCount;
332 UINTN NewStrSize;
333 CHAR16 *NewString;
334 EFI_STRING_ID NewStringToken;
335 CHAR16 *ControllerName;
336 EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath;
337 EFI_PCI_IO_PROTOCOL *PciIo;
338 EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;
339 UINTN Len;
340 VOID *StartOpCodeHandle;
341 VOID *EndOpCodeHandle;
342 EFI_IFR_GUID_LABEL *StartLabel;
343 EFI_IFR_GUID_LABEL *EndLabel;
344
345 //
346 // Set current page form ID.
347 //
348 mCurrentPage = FORM_ID_DEVICE;
349
350 //
351 // Initial the mapping database in memory
352 //
353 FreeMappingDatabase (&mMappingDataBase);
354 InitOverridesMapping (&mMappingDataBase);
355
356 //
357 // Init OpCode Handle
358 //
359 StartOpCodeHandle = HiiAllocateOpCodeHandle ();
360 ASSERT (StartOpCodeHandle != NULL);
361
362 EndOpCodeHandle = HiiAllocateOpCodeHandle ();
363 ASSERT (EndOpCodeHandle != NULL);
364
365 //
366 // Create Hii Extend Label OpCode as the start opcode
367 //
368 StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
370 StartLabel->Number = FORM_ID_DEVICE;
371
372 //
373 // Create Hii Extend Label OpCode as the end opcode
374 //
375 EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
377 EndLabel->Number = LABEL_END;
378
379 //
380 // Clear first page form
381 //
383 Private->RegisteredHandle,
384 &gPlatformOverridesManagerGuid,
385 FORM_ID_DEVICE,
386 StartOpCodeHandle, // Label FORM_ID_DEVICE
387 EndOpCodeHandle // LABEL_END
388 );
389
390 //
391 // When user enter the page at first time, the 'first refresh' string is given to notify user to refresh all the drivers,
392 // then the 'first refresh' string will be replaced by the 'refresh' string, and the two strings content are same after the replacement
393 //
394 NewStringToken = STRING_TOKEN (STR_FIRST_REFRESH);
395 NewString = HiiGetString (Private->RegisteredHandle, STRING_TOKEN (STR_REFRESH), NULL);
396 ASSERT (NewString != NULL);
397 if (HiiSetString (Private->RegisteredHandle, NewStringToken, NewString, NULL) == 0) {
398 ASSERT (FALSE);
399 }
400
402
403 NewStringToken = STRING_TOKEN (STR_FIRST_REFRESH_HELP);
404 NewString = HiiGetString (Private->RegisteredHandle, STRING_TOKEN (STR_REFRESH_HELP), NULL);
405 ASSERT (NewString != NULL);
406 if (HiiSetString (Private->RegisteredHandle, NewStringToken, NewString, NULL) == 0) {
407 ASSERT (FALSE);
408 }
409
411
412 //
413 // created needed controller device item in first page
414 //
415 DevicePathHandleCount = 0;
416 Status = gBS->LocateHandleBuffer (
418 &gEfiDevicePathProtocolGuid,
419 NULL,
420 &DevicePathHandleCount,
421 &mDevicePathHandleBuffer
422 );
423 if (EFI_ERROR (Status) || (DevicePathHandleCount == 0)) {
424 HiiFreeOpCodeHandle (StartOpCodeHandle);
425 HiiFreeOpCodeHandle (EndOpCodeHandle);
426 return EFI_SUCCESS;
427 }
428
429 mMaxDeviceCount = DevicePathHandleCount;
430 mControllerDevicePathProtocol = AllocateZeroPool (DevicePathHandleCount * sizeof (EFI_DEVICE_PATH_PROTOCOL *));
431 ASSERT (mControllerDevicePathProtocol != NULL);
432 mControllerToken = AllocateZeroPool (DevicePathHandleCount * sizeof (EFI_STRING_ID));
433 ASSERT (mControllerToken != NULL);
434
435 for (Index = 0; Index < DevicePathHandleCount; Index++) {
436 if (FakeNvData->PciDeviceFilter == 0x01) {
437 //
438 // Only care PCI device which contain efi driver in its option rom.
439 //
440
441 //
442 // Check whether it is a pci device
443 //
444 ControllerDevicePath = NULL;
445 Status = gBS->OpenProtocol (
446 mDevicePathHandleBuffer[Index],
447 &gEfiPciIoProtocolGuid,
448 (VOID **)&PciIo,
449 NULL,
450 NULL,
451 EFI_OPEN_PROTOCOL_GET_PROTOCOL
452 );
453 if (EFI_ERROR (Status)) {
454 continue;
455 }
456
457 //
458 // Check whether it contain efi driver in its option rom
459 //
460 Status = gBS->HandleProtocol (
461 mDevicePathHandleBuffer[Index],
462 &gEfiBusSpecificDriverOverrideProtocolGuid,
463 (VOID **)&BusSpecificDriverOverride
464 );
465 if (EFI_ERROR (Status) || (BusSpecificDriverOverride == NULL)) {
466 continue;
467 }
468 }
469
470 ControllerDevicePath = NULL;
471 Status = gBS->OpenProtocol (
472 mDevicePathHandleBuffer[Index],
473 &gEfiDevicePathProtocolGuid,
474 (VOID **)&ControllerDevicePath,
475 NULL,
476 NULL,
477 EFI_OPEN_PROTOCOL_GET_PROTOCOL
478 );
479 ASSERT_EFI_ERROR (Status);
480 //
481 // Save the device path protocol interface
482 //
483 mControllerDevicePathProtocol[Index] = ControllerDevicePath;
484
485 //
486 // Get the driver name
487 //
488 ControllerName = DevicePathToStr (ControllerDevicePath);
489
490 //
491 // Export the driver name string and create item in set options page
492 //
493 Len = StrSize (ControllerName);
494 NewStrSize = Len + StrSize (L"--");
495 NewString = AllocateZeroPool (NewStrSize);
496 ASSERT (NewString != NULL);
497 if (EFI_ERROR (CheckMapping (ControllerDevicePath, NULL, &mMappingDataBase, NULL, NULL))) {
498 StrCatS (NewString, NewStrSize/sizeof (CHAR16), L"--");
499 } else {
500 StrCatS (NewString, NewStrSize/sizeof (CHAR16), L"**");
501 }
502
503 StrCatS (NewString, NewStrSize/sizeof (CHAR16), ControllerName);
504
505 NewStringToken = HiiSetString (Private->RegisteredHandle, mControllerToken[Index], NewString, NULL);
506 ASSERT (NewStringToken != 0);
508 //
509 // Save the device path string toke for next access use
510 //
511 mControllerToken[Index] = NewStringToken;
512
514 StartOpCodeHandle,
515 FORM_ID_DRIVER,
516 NewStringToken,
517 STRING_TOKEN (STR_GOTO_HELP_DRIVER),
518 EFI_IFR_FLAG_CALLBACK,
519 (UINT16)(Index + KEY_VALUE_DEVICE_OFFSET)
520 );
521 }
522
523 //
524 // Update first page form
525 //
527 Private->RegisteredHandle,
528 &gPlatformOverridesManagerGuid,
529 FORM_ID_DEVICE,
530 StartOpCodeHandle, // Label FORM_ID_DEVICE
531 EndOpCodeHandle // LABEL_END
532 );
533
534 HiiFreeOpCodeHandle (StartOpCodeHandle);
535 HiiFreeOpCodeHandle (EndOpCodeHandle);
536
537 return EFI_SUCCESS;
538}
539
551 IN EFI_HANDLE ImageHandle
552 )
553{
554 EFI_STATUS Status;
555 UINTN Index;
556 UINTN DriverBindingHandleCount;
557 EFI_HANDLE *DriverBindingHandleBuffer;
558 EFI_DRIVER_BINDING_PROTOCOL *DriverBindingInterface;
559 EFI_HANDLE DriverBindingHandle;
560
561 DriverBindingHandle = NULL;
562
563 if (ImageHandle == NULL) {
564 return NULL;
565 }
566
567 //
568 // Get all drivers which support driver binding protocol
569 //
570 DriverBindingHandleCount = 0;
571 Status = gBS->LocateHandleBuffer (
573 &gEfiDriverBindingProtocolGuid,
574 NULL,
575 &DriverBindingHandleCount,
576 &DriverBindingHandleBuffer
577 );
578 if (EFI_ERROR (Status) || (DriverBindingHandleCount == 0)) {
579 return NULL;
580 }
581
582 //
583 // Get the first Driver Binding handle which has the specific image handle.
584 //
585 for (Index = 0; Index < DriverBindingHandleCount; Index++) {
586 DriverBindingInterface = NULL;
587 Status = gBS->OpenProtocol (
588 DriverBindingHandleBuffer[Index],
589 &gEfiDriverBindingProtocolGuid,
590 (VOID **)&DriverBindingInterface,
591 NULL,
592 NULL,
593 EFI_OPEN_PROTOCOL_GET_PROTOCOL
594 );
595 if (EFI_ERROR (Status)) {
596 continue;
597 }
598
599 if (DriverBindingInterface->ImageHandle == ImageHandle) {
600 DriverBindingHandle = DriverBindingHandleBuffer[Index];
601 break;
602 }
603 }
604
605 FreePool (DriverBindingHandleBuffer);
606 return DriverBindingHandle;
607}
608
624 IN EFI_CALLBACK_INFO *Private,
625 IN UINT16 KeyValue,
626 IN PLAT_OVER_MNGR_DATA *FakeNvData
627 )
628{
629 EFI_STATUS Status;
630 UINTN Index;
631 UINTN NewStrSize;
632 CHAR16 *NewString;
633 EFI_STRING_ID NewStringToken;
634 EFI_STRING_ID NewStringHelpToken;
635 UINTN DriverImageHandleCount;
636 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
637 CHAR16 *DriverName;
638 BOOLEAN FreeDriverName;
639 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
640 EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;
641 EFI_HANDLE DriverBindingHandle;
642 VOID *StartOpCodeHandle;
643 VOID *EndOpCodeHandle;
644 EFI_IFR_GUID_LABEL *StartLabel;
645 EFI_IFR_GUID_LABEL *EndLabel;
646 EFI_LOADED_IMAGE_PROTOCOL **DriverImageProtocol;
647 EFI_STRING_ID *DriverImageFilePathToken;
648 UINT8 CheckFlags;
649
650 //
651 // If user select a controller item in the first page the following code will be run.
652 // During second page, user will see all currnet driver bind protocol driver, the driver name and its device path will be shown
653 //
654 // First acquire the list of Loaded Image Protocols, and then when want the name of the driver, look up all the Driver Binding Protocols
655 // and find the first one whose ImageHandle field matches the image handle of the Loaded Image Protocol.
656 // then use the Component Name Protocol on the same handle as the first matching Driver Binding Protocol to look up the name of the driver.
657 //
658
659 mCurrentPage = FORM_ID_DRIVER;
660 //
661 // Switch the item callback key value to its NO. in mDevicePathHandleBuffer
662 //
663 mSelectedCtrIndex = KeyValue - KEY_VALUE_DEVICE_OFFSET;
664 ASSERT (mSelectedCtrIndex >= 0 && mSelectedCtrIndex < MAX_CHOICE_NUM);
665
666 mLastSavedDriverImageNum = 0;
667
668 //
669 // Init OpCode Handle
670 //
671 StartOpCodeHandle = HiiAllocateOpCodeHandle ();
672 ASSERT (StartOpCodeHandle != NULL);
673
674 EndOpCodeHandle = HiiAllocateOpCodeHandle ();
675 ASSERT (EndOpCodeHandle != NULL);
676
677 //
678 // Create Hii Extend Label OpCode as the start opcode
679 //
680 StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
682 StartLabel->Number = FORM_ID_DRIVER;
683
684 //
685 // Create Hii Extend Label OpCode as the end opcode
686 //
687 EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
689 EndLabel->Number = LABEL_END;
690
691 //
692 // Clear second page form
693 //
695 Private->RegisteredHandle,
696 &gPlatformOverridesManagerGuid,
697 FORM_ID_DRIVER,
698 StartOpCodeHandle,
699 EndOpCodeHandle
700 );
701
702 //
703 // Show all driver which support loaded image protocol in second page
704 //
705 DriverImageHandleCount = 0;
706 Status = gBS->LocateHandleBuffer (
708 &gEfiLoadedImageProtocolGuid,
709 NULL,
710 &DriverImageHandleCount,
711 &mDriverImageHandleBuffer
712 );
713 if (EFI_ERROR (Status) || (DriverImageHandleCount == 0)) {
714 HiiFreeOpCodeHandle (StartOpCodeHandle);
715 HiiFreeOpCodeHandle (EndOpCodeHandle);
716 return EFI_NOT_FOUND;
717 }
718
719 mDriverImageToken = AllocateZeroPool (DriverImageHandleCount * sizeof (EFI_STRING_ID));
720 ASSERT (mDriverImageToken != NULL);
721 mDriSelection = AllocateZeroPool (DriverImageHandleCount * sizeof (BOOLEAN));
722 ASSERT (mDriSelection != NULL);
723
724 DriverImageProtocol = AllocateZeroPool (DriverImageHandleCount * sizeof (EFI_LOADED_IMAGE_PROTOCOL *));
725 ASSERT (DriverImageProtocol != NULL);
726 DriverImageFilePathToken = AllocateZeroPool (DriverImageHandleCount * sizeof (EFI_STRING_ID));
727 ASSERT (DriverImageFilePathToken != NULL);
728
729 mDriverImageHandleCount = DriverImageHandleCount;
730 for (Index = 0; Index < DriverImageHandleCount; Index++) {
731 //
732 // Step1: Get the driver image total file path for help string and the driver name.
733 //
734
735 //
736 // Find driver's Loaded Image protocol
737 //
738 LoadedImage = NULL;
739
740 Status = gBS->OpenProtocol (
741 mDriverImageHandleBuffer[Index],
742 &gEfiLoadedImageProtocolGuid,
743 (VOID **)&LoadedImage,
744 NULL,
745 NULL,
746 EFI_OPEN_PROTOCOL_GET_PROTOCOL
747 );
748 if (EFI_ERROR (Status)) {
749 mDriSelection[Index] = FALSE;
750 continue;
751 }
752
753 DriverImageProtocol[Index] = LoadedImage;
754 //
755 // Find its related driver binding protocol
756 //
757 DriverBindingHandle = GetDriverBindingHandleFromImageHandle (mDriverImageHandleBuffer[Index]);
758 if (DriverBindingHandle == NULL) {
759 mDriSelection[Index] = FALSE;
760 continue;
761 }
762
763 //
764 // Get the EFI Loaded Image Device Path Protocol
765 //
766 LoadedImageDevicePath = NULL;
767 Status = gBS->HandleProtocol (
768 mDriverImageHandleBuffer[Index],
769 &gEfiLoadedImageDevicePathProtocolGuid,
770 (VOID **)&LoadedImageDevicePath
771 );
772 if (LoadedImageDevicePath == NULL) {
773 mDriSelection[Index] = FALSE;
774 continue;
775 }
776
777 if (FakeNvData->PciDeviceFilter == 0x01) {
778 //
779 // only care the driver which is in a Pci device option rom,
780 // and the driver's LoadedImage->DeviceHandle must point to a pci device which has efi option rom
781 //
782 if (!EFI_ERROR (Status)) {
783 Status = gBS->HandleProtocol (
784 LoadedImage->DeviceHandle,
785 &gEfiBusSpecificDriverOverrideProtocolGuid,
786 (VOID **)&BusSpecificDriverOverride
787 );
788 if (EFI_ERROR (Status) || (BusSpecificDriverOverride == NULL)) {
789 mDriSelection[Index] = FALSE;
790 continue;
791 }
792 } else {
793 mDriSelection[Index] = FALSE;
794 continue;
795 }
796 }
797
798 //
799 // For driver name, try to get its component name, if fail, get its image name,
800 // if also fail, give a default name.
801 //
802 FreeDriverName = FALSE;
803 DriverName = GetComponentName (DriverBindingHandle);
804 if (DriverName == NULL) {
805 //
806 // get its image name
807 //
808 DriverName = GetImageName (LoadedImage);
809 }
810
811 if (DriverName == NULL) {
812 //
813 // give a default name
814 //
815 DriverName = HiiGetString (Private->RegisteredHandle, STRING_TOKEN (STR_DRIVER_DEFAULT_NAME), NULL);
816 ASSERT (DriverName != NULL);
817 FreeDriverName = TRUE; // the DriverName string need to free pool
818 }
819
820 //
821 // Step2 Export the driver name string and create check box item in second page
822 //
823
824 //
825 // First create the driver image name
826 //
827 NewStrSize = StrSize (DriverName);
828 NewString = AllocateZeroPool (NewStrSize);
829 ASSERT (NewString != NULL);
830 if (EFI_ERROR (CheckMapping (mControllerDevicePathProtocol[mSelectedCtrIndex], LoadedImageDevicePath, &mMappingDataBase, NULL, NULL))) {
831 mDriSelection[Index] = FALSE;
832 } else {
833 mDriSelection[Index] = TRUE;
834 mLastSavedDriverImageNum++;
835 }
836
837 StrCatS (NewString, NewStrSize/sizeof (CHAR16), DriverName);
838 NewStringToken = HiiSetString (Private->RegisteredHandle, mDriverImageToken[Index], NewString, NULL);
839 ASSERT (NewStringToken != 0);
840 mDriverImageToken[Index] = NewStringToken;
842 if (FreeDriverName) {
843 FreePool (DriverName);
844 }
845
846 //
847 // Second create the driver image device path as item help string
848 //
849 DriverName = DevicePathToStr (LoadedImageDevicePath);
850
851 NewStrSize = StrSize (DriverName);
852 NewString = AllocateZeroPool (NewStrSize);
853 ASSERT (NewString != NULL);
854 StrCatS (NewString, NewStrSize/sizeof (CHAR16), DriverName);
855 NewStringHelpToken = HiiSetString (Private->RegisteredHandle, DriverImageFilePathToken[Index], NewString, NULL);
856 ASSERT (NewStringHelpToken != 0);
857 DriverImageFilePathToken[Index] = NewStringHelpToken;
859 FreePool (DriverName);
860
861 CheckFlags = 0;
862 if (mDriSelection[Index]) {
863 CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
864 }
865
867 StartOpCodeHandle,
868 (UINT16)(KEY_VALUE_DRIVER_OFFSET + Index),
869 0,
870 0,
871 NewStringToken,
872 NewStringHelpToken,
873 EFI_IFR_FLAG_CALLBACK,
874 CheckFlags,
875 NULL
876 );
877 }
878
879 //
880 // Update second page form
881 //
883 Private->RegisteredHandle,
884 &gPlatformOverridesManagerGuid,
885 FORM_ID_DRIVER,
886 StartOpCodeHandle, // Label FORM_ID_DRIVER
887 EndOpCodeHandle // LABEL_END
888 );
889
890 HiiFreeOpCodeHandle (StartOpCodeHandle);
891 HiiFreeOpCodeHandle (EndOpCodeHandle);
892
893 if (DriverImageProtocol != NULL) {
894 FreePool (DriverImageProtocol);
895 }
896
897 if (DriverImageFilePathToken != NULL) {
898 FreePool (DriverImageFilePathToken);
899 }
900
901 return EFI_SUCCESS;
902}
903
917 IN EFI_CALLBACK_INFO *Private,
918 IN UINT16 KeyValue,
919 IN PLAT_OVER_MNGR_DATA *FakeNvData
920 )
921{
922 UINTN Index;
923 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
924 UINTN SelectedDriverImageNum;
925 UINT32 DriverImageNO;
926 UINTN MinNO;
927 UINTN Index1;
928 UINTN TempNO[100];
929 UINTN OrderNO[100];
930 VOID *StartOpCodeHandle;
931 VOID *EndOpCodeHandle;
932 VOID *OptionsOpCodeHandle;
933 EFI_IFR_GUID_LABEL *StartLabel;
934 EFI_IFR_GUID_LABEL *EndLabel;
935
936 //
937 // Following code will be run if user select 'order ... priority' item in second page
938 // Prepare third page. In third page, user will order the drivers priority which are selected in second page
939 //
940 mCurrentPage = FORM_ID_ORDER;
941
942 //
943 // Init OpCode Handle
944 //
945 StartOpCodeHandle = HiiAllocateOpCodeHandle ();
946 ASSERT (StartOpCodeHandle != NULL);
947
948 EndOpCodeHandle = HiiAllocateOpCodeHandle ();
949 ASSERT (EndOpCodeHandle != NULL);
950
951 //
952 // Create Hii Extend Label OpCode as the start opcode
953 //
954 StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
956 StartLabel->Number = FORM_ID_ORDER;
957
958 //
959 // Create Hii Extend Label OpCode as the end opcode
960 //
961 EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
963 EndLabel->Number = LABEL_END;
964
965 //
966 // Clear third page form
967 //
969 Private->RegisteredHandle,
970 &gPlatformOverridesManagerGuid,
971 FORM_ID_ORDER,
972 StartOpCodeHandle,
973 EndOpCodeHandle
974 );
975
976 //
977 // Check how many drivers have been selected
978 //
979 SelectedDriverImageNum = 0;
980 for (Index = 0; Index < mDriverImageHandleCount; Index++) {
981 if (mDriSelection[Index]) {
982 SelectedDriverImageNum++;
983 }
984 }
985
986 mSelectedDriverImageNum = SelectedDriverImageNum;
987 if (SelectedDriverImageNum == 0) {
988 return EFI_SUCCESS;
989 }
990
991 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
992 ASSERT (OptionsOpCodeHandle != NULL);
993
994 //
995 // Create order list for those selected drivers
996 //
997 SelectedDriverImageNum = 0;
998 for (Index = 0; Index < mDriverImageHandleCount; Index++) {
999 if (mDriSelection[Index]) {
1000 //
1001 // Use the NO. in driver binding buffer as value, will use it later
1002 //
1004 OptionsOpCodeHandle,
1005 mDriverImageToken[Index],
1006 0,
1007 EFI_IFR_NUMERIC_SIZE_1,
1008 Index + 1
1009 );
1010
1011 //
1012 // Get the EFI Loaded Image Device Path Protocol
1013 //
1014 LoadedImageDevicePath = NULL;
1015 gBS->HandleProtocol (
1016 mDriverImageHandleBuffer[Index],
1017 &gEfiLoadedImageDevicePathProtocolGuid,
1018 (VOID **)&LoadedImageDevicePath
1019 );
1020 ASSERT (LoadedImageDevicePath != NULL);
1021
1022 //
1023 // Check the driver DriverImage's order number in mapping database
1024 //
1025 DriverImageNO = 0;
1026 CheckMapping (
1027 mControllerDevicePathProtocol[mSelectedCtrIndex],
1028 LoadedImageDevicePath,
1029 &mMappingDataBase,
1030 NULL,
1031 &DriverImageNO
1032 );
1033 if (DriverImageNO == 0) {
1034 DriverImageNO = (UINT32)mLastSavedDriverImageNum + 1;
1035 mLastSavedDriverImageNum++;
1036 }
1037
1038 TempNO[SelectedDriverImageNum] = DriverImageNO;
1039 OrderNO[SelectedDriverImageNum] = Index + 1;
1040 SelectedDriverImageNum++;
1041 }
1042 }
1043
1044 ASSERT (SelectedDriverImageNum == mSelectedDriverImageNum);
1045 //
1046 // NvRamMap Must be clear firstly
1047 //
1048 ZeroMem (FakeNvData->DriOrder, sizeof (FakeNvData->DriOrder));
1049
1050 //
1051 // Order the selected drivers according to the info already in mapping database
1052 // the less order number in mapping database the less order number in NvRamMap
1053 //
1054 for (Index = 0; Index < SelectedDriverImageNum; Index++) {
1055 //
1056 // Find the minimal order number in TempNO array, its index in TempNO is same as IfrOptionList array
1057 //
1058 MinNO = 0;
1059 for (Index1 = 0; Index1 < SelectedDriverImageNum; Index1++) {
1060 if (TempNO[Index1] < TempNO[MinNO]) {
1061 MinNO = Index1;
1062 }
1063 }
1064
1065 //
1066 // the IfrOptionList[MinNO].Value = the driver NO. in driver binding buffer
1067 //
1068 FakeNvData->DriOrder[Index] = (UINT8)OrderNO[MinNO];
1069 TempNO[MinNO] = MAX_CHOICE_NUM + 1;
1070 }
1071
1072 //
1073 // Create Order List OpCode
1074 //
1076 StartOpCodeHandle,
1077 (UINT16)DRIVER_ORDER_QUESTION_ID,
1078 VARSTORE_ID_PLAT_OVER_MNGR,
1079 (UINT16)DRIVER_ORDER_VAR_OFFSET,
1080 mControllerToken[mSelectedCtrIndex],
1081 mControllerToken[mSelectedCtrIndex],
1082 EFI_IFR_FLAG_RESET_REQUIRED,
1083 0,
1084 EFI_IFR_NUMERIC_SIZE_1,
1085 (UINT8)MAX_CHOICE_NUM,
1086 OptionsOpCodeHandle,
1087 NULL
1088 );
1089
1090 //
1091 // Update third page form
1092 //
1094 Private->RegisteredHandle,
1095 &gPlatformOverridesManagerGuid,
1096 FORM_ID_ORDER,
1097 StartOpCodeHandle, // Label FORM_ID_ORDER
1098 EndOpCodeHandle // LABEL_END
1099 );
1100
1101 HiiFreeOpCodeHandle (StartOpCodeHandle);
1102 HiiFreeOpCodeHandle (EndOpCodeHandle);
1103 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
1104
1105 return EFI_SUCCESS;
1106}
1107
1120 IN EFI_CALLBACK_INFO *Private,
1121 IN UINT16 KeyValue,
1122 IN PLAT_OVER_MNGR_DATA *FakeNvData
1123 )
1124{
1125 EFI_STATUS Status;
1126 UINTN Index;
1127 UINTN SelectedDriverImageNum;
1128 EFI_DEVICE_PATH_PROTOCOL *LoadedImageDevicePath;
1129
1130 //
1131 // Following code will be run if user select 'commint changes' in third page
1132 // user enter 'Commit Changes' to save the mapping database
1133 //
1134 DeleteDriverImage (mControllerDevicePathProtocol[mSelectedCtrIndex], NULL, &mMappingDataBase);
1135 for (SelectedDriverImageNum = 0; SelectedDriverImageNum < mSelectedDriverImageNum; SelectedDriverImageNum++) {
1136 //
1137 // DriOrder[SelectedDriverImageNum] = the driver NO. in driver binding buffer
1138 //
1139 Index = FakeNvData->DriOrder[SelectedDriverImageNum] - 1;
1140
1141 //
1142 // Get the EFI Loaded Image Device Path Protocol
1143 //
1144 LoadedImageDevicePath = NULL;
1145 Status = gBS->HandleProtocol (
1146 mDriverImageHandleBuffer[Index],
1147 &gEfiLoadedImageDevicePathProtocolGuid,
1148 (VOID **)&LoadedImageDevicePath
1149 );
1150 ASSERT (LoadedImageDevicePath != NULL);
1151
1153 mControllerDevicePathProtocol[mSelectedCtrIndex],
1154 LoadedImageDevicePath,
1155 &mMappingDataBase,
1156 (UINT32)SelectedDriverImageNum + 1
1157 );
1158 }
1159
1160 Status = SaveOverridesMapping (&mMappingDataBase);
1161
1162 return Status;
1163}
1164
1187EFIAPI
1190 IN CONST EFI_STRING Request,
1191 OUT EFI_STRING *Progress,
1192 OUT EFI_STRING *Results
1193 )
1194{
1195 EFI_STATUS Status;
1196 EFI_CALLBACK_INFO *Private;
1197 EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
1198 EFI_STRING ConfigRequestHdr;
1199 EFI_STRING ConfigRequest;
1200 BOOLEAN AllocatedRequest;
1201 UINTN Size;
1202 UINTN BufferSize;
1203
1204 if ((Progress == NULL) || (Results == NULL)) {
1205 return EFI_INVALID_PARAMETER;
1206 }
1207
1208 *Progress = Request;
1209 if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gPlatformOverridesManagerGuid, mVariableName)) {
1210 return EFI_NOT_FOUND;
1211 }
1212
1213 ConfigRequestHdr = NULL;
1214 ConfigRequest = NULL;
1215 Size = 0;
1216 AllocatedRequest = FALSE;
1217
1218 Private = EFI_CALLBACK_INFO_FROM_THIS (This);
1219 HiiConfigRouting = Private->HiiConfigRouting;
1220 ConfigRequest = Request;
1221 if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
1222 //
1223 // Request has no request element, construct full request string.
1224 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
1225 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
1226 //
1227 ConfigRequestHdr = HiiConstructConfigHdr (&gPlatformOverridesManagerGuid, mVariableName, Private->DriverHandle);
1228 if (ConfigRequestHdr == NULL) {
1229 return EFI_OUT_OF_RESOURCES;
1230 }
1231
1232 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
1233 ConfigRequest = AllocateZeroPool (Size);
1234 if (ConfigRequest == NULL) {
1235 FreePool (ConfigRequestHdr);
1236 return EFI_OUT_OF_RESOURCES;
1237 }
1238
1239 AllocatedRequest = TRUE;
1240 BufferSize = sizeof (PLAT_OVER_MNGR_DATA);
1241 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
1242 FreePool (ConfigRequestHdr);
1243 }
1244
1245 //
1246 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
1247 //
1248 Status = HiiConfigRouting->BlockToConfig (
1249 HiiConfigRouting,
1250 ConfigRequest,
1251 (UINT8 *)&Private->FakeNvData,
1252 sizeof (PLAT_OVER_MNGR_DATA),
1253 Results,
1254 Progress
1255 );
1256
1257 //
1258 // Free the allocated config request string.
1259 //
1260 if (AllocatedRequest) {
1261 FreePool (ConfigRequest);
1262 ConfigRequest = NULL;
1263 }
1264
1265 //
1266 // Set Progress string to the original request string.
1267 //
1268 if (Request == NULL) {
1269 *Progress = NULL;
1270 } else if (StrStr (Request, L"OFFSET") == NULL) {
1271 *Progress = Request + StrLen (Request);
1272 }
1273
1274 return Status;
1275}
1276
1293EFIAPI
1296 IN CONST EFI_STRING Configuration,
1297 OUT EFI_STRING *Progress
1298 )
1299{
1300 EFI_CALLBACK_INFO *Private;
1301 UINT16 KeyValue;
1302 PLAT_OVER_MNGR_DATA *FakeNvData;
1303 EFI_STATUS Status;
1304
1305 if ((Configuration == NULL) || (Progress == NULL)) {
1306 return EFI_INVALID_PARAMETER;
1307 }
1308
1309 *Progress = Configuration;
1310
1311 if (!HiiIsConfigHdrMatch (Configuration, &gPlatformOverridesManagerGuid, mVariableName)) {
1312 return EFI_NOT_FOUND;
1313 }
1314
1315 *Progress = Configuration + StrLen (Configuration);
1316 Private = EFI_CALLBACK_INFO_FROM_THIS (This);
1317 FakeNvData = &Private->FakeNvData;
1318 if (!HiiGetBrowserData (&gPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA), (UINT8 *)FakeNvData)) {
1319 //
1320 // FakeNvData can't be got from SetupBrowser, which doesn't need to be set.
1321 //
1322 return EFI_SUCCESS;
1323 }
1324
1325 Status = EFI_SUCCESS;
1326
1327 if (mCurrentPage == FORM_ID_ORDER) {
1328 KeyValue = KEY_VALUE_ORDER_SAVE_AND_EXIT;
1329 Status = CommitChanges (Private, KeyValue, FakeNvData);
1330 }
1331
1332 return Status;
1333}
1334
1361EFIAPI
1364 IN EFI_BROWSER_ACTION Action,
1365 IN EFI_QUESTION_ID KeyValue,
1366 IN UINT8 Type,
1367 IN EFI_IFR_TYPE_VALUE *Value,
1368 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
1369 )
1370{
1371 EFI_CALLBACK_INFO *Private;
1372 EFI_STATUS Status;
1373 EFI_STRING_ID NewStringToken;
1374 EFI_INPUT_KEY Key;
1375 PLAT_OVER_MNGR_DATA *FakeNvData;
1376
1377 if ((Action != EFI_BROWSER_ACTION_CHANGING) && (Action != EFI_BROWSER_ACTION_CHANGED)) {
1378 //
1379 // All other action return unsupported.
1380 //
1381 return EFI_UNSUPPORTED;
1382 }
1383
1384 if (Value == NULL) {
1385 return EFI_INVALID_PARAMETER;
1386 }
1387
1388 Private = EFI_CALLBACK_INFO_FROM_THIS (This);
1389 FakeNvData = &Private->FakeNvData;
1390 if (!HiiGetBrowserData (&gPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA), (UINT8 *)FakeNvData)) {
1391 return EFI_NOT_FOUND;
1392 }
1393
1394 if (Action == EFI_BROWSER_ACTION_CHANGING) {
1395 if (KeyValue == KEY_VALUE_DRIVER_GOTO_PREVIOUS) {
1396 UpdateDeviceSelectPage (Private, KeyValue, FakeNvData);
1397 //
1398 // Update page title string
1399 //
1400 NewStringToken = STRING_TOKEN (STR_TITLE);
1401 if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"First, Select the controller by device path", NULL) == 0) {
1402 ASSERT (FALSE);
1403 }
1404 }
1405
1406 if (((KeyValue >= KEY_VALUE_DEVICE_OFFSET) && (KeyValue < KEY_VALUE_DEVICE_OFFSET + mMaxDeviceCount)) || (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS)) {
1407 if (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS) {
1408 KeyValue = (EFI_QUESTION_ID)(mSelectedCtrIndex + KEY_VALUE_DEVICE_OFFSET);
1409 }
1410
1411 UpdateBindingDriverSelectPage (Private, KeyValue, FakeNvData);
1412 //
1413 // Update page title string
1414 //
1415 NewStringToken = STRING_TOKEN (STR_TITLE);
1416 if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"Second, Select drivers for the previous selected controller", NULL) == 0) {
1417 ASSERT (FALSE);
1418 }
1419 }
1420
1421 if (KeyValue == KEY_VALUE_DRIVER_GOTO_ORDER) {
1422 UpdatePrioritySelectPage (Private, KeyValue, FakeNvData);
1423 //
1424 // Update page title string
1425 //
1426 NewStringToken = STRING_TOKEN (STR_TITLE);
1427 if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"Finally, Set the priority order for the drivers and save them", NULL) == 0) {
1428 ASSERT (FALSE);
1429 }
1430 }
1431
1432 if (KeyValue == KEY_VALUE_DEVICE_CLEAR) {
1433 //
1434 // Deletes all environment variable(s) that contain the override mappings info
1435 //
1436 FreeMappingDatabase (&mMappingDataBase);
1437 Status = SaveOverridesMapping (&mMappingDataBase);
1438 UpdateDeviceSelectPage (Private, KeyValue, FakeNvData);
1439 }
1440 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
1441 if ((KeyValue >= KEY_VALUE_DRIVER_OFFSET) && (KeyValue < KEY_VALUE_DRIVER_OFFSET + mDriverImageHandleCount)) {
1442 mDriSelection[KeyValue - KEY_VALUE_DRIVER_OFFSET] = Value->b;
1443 } else {
1444 switch (KeyValue) {
1445 case KEY_VALUE_DEVICE_REFRESH:
1446 case KEY_VALUE_DEVICE_FILTER:
1447 UpdateDeviceSelectPage (Private, KeyValue, FakeNvData);
1448 //
1449 // Update page title string
1450 //
1451 NewStringToken = STRING_TOKEN (STR_TITLE);
1452 if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"First, Select the controller by device path", NULL) == 0) {
1453 ASSERT (FALSE);
1454 }
1455
1456 break;
1457
1458 case KEY_VALUE_ORDER_SAVE_AND_EXIT:
1459 Status = CommitChanges (Private, KeyValue, FakeNvData);
1460 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;
1461 if (EFI_ERROR (Status)) {
1462 CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Single Override Info too large, Saving Error!", NULL);
1463 return EFI_DEVICE_ERROR;
1464 }
1465
1466 break;
1467
1468 default:
1469 break;
1470 }
1471 }
1472 }
1473
1474 //
1475 // Pass changed uncommitted data back to Form Browser
1476 //
1477 HiiSetBrowserData (&gPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA), (UINT8 *)FakeNvData, NULL);
1478
1479 return EFI_SUCCESS;
1480}
1481
1505EFIAPI
1508 IN EFI_HANDLE ControllerHandle,
1509 IN OUT EFI_HANDLE *DriverImageHandle
1510 )
1511{
1512 EFI_STATUS Status;
1513
1514 //
1515 // Check that ControllerHandle is a valid handle
1516 //
1517 if (ControllerHandle == NULL) {
1518 return EFI_INVALID_PARAMETER;
1519 }
1520
1521 //
1522 // Read the environment variable(s) that contain the override mappings from Controller Device Path to
1523 // a set of Driver Device Paths, and initialize in memory database of the overrides that map Controller
1524 // Device Paths to an ordered set of Driver Device Paths and Driver Handles. This action is only performed
1525 // once and finished in first call.
1526 //
1527 if (!mEnvironmentVariableRead) {
1528 mEnvironmentVariableRead = TRUE;
1529
1530 Status = InitOverridesMapping (&mMappingDataBase);
1531 if (EFI_ERROR (Status)) {
1532 DEBUG ((DEBUG_INFO, "The status to Get Platform Driver Override Variable is %r\n", Status));
1533 InitializeListHead (&mMappingDataBase);
1534 return EFI_NOT_FOUND;
1535 }
1536 }
1537
1538 //
1539 // if the environment variable does not exist, just return not found
1540 //
1541 if (IsListEmpty (&mMappingDataBase)) {
1542 return EFI_NOT_FOUND;
1543 }
1544
1545 return GetDriverFromMapping (
1546 ControllerHandle,
1547 DriverImageHandle,
1548 &mMappingDataBase,
1549 mCallerImageHandle
1550 );
1551}
1552
1569EFIAPI
1572 IN EFI_HANDLE ControllerHandle,
1573 IN OUT EFI_DEVICE_PATH_PROTOCOL **DriverImagePath
1574 )
1575{
1576 return EFI_UNSUPPORTED;
1577}
1578
1596EFIAPI
1599 IN EFI_HANDLE ControllerHandle,
1600 IN EFI_DEVICE_PATH_PROTOCOL *DriverImagePath,
1601 IN EFI_HANDLE DriverImageHandle
1602 )
1603{
1604 return EFI_UNSUPPORTED;
1605}
1606
1619EFIAPI
1621 IN EFI_HANDLE ImageHandle,
1622 IN EFI_SYSTEM_TABLE *SystemTable
1623 )
1624{
1625 EFI_STATUS Status;
1626 EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;
1627 VOID *Instance;
1628
1629 //
1630 // There should only be one Form Configuration protocol
1631 //
1632 Status = gBS->LocateProtocol (
1633 &gEfiFormBrowser2ProtocolGuid,
1634 NULL,
1635 (VOID **)&FormBrowser2
1636 );
1637 if (EFI_ERROR (Status)) {
1638 return Status;
1639 }
1640
1641 //
1642 // According to UEFI spec, there can be at most a single instance
1643 // in the system of the EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL.
1644 // So here we check the existence.
1645 //
1646 Status = gBS->LocateProtocol (
1647 &gEfiPlatformDriverOverrideProtocolGuid,
1648 NULL,
1649 &Instance
1650 );
1651 //
1652 // If there was no error, assume there is an installation and return error
1653 //
1654 if (!EFI_ERROR (Status)) {
1655 return EFI_ALREADY_STARTED;
1656 }
1657
1658 mCallerImageHandle = ImageHandle;
1659 mCallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));
1660 if (mCallbackInfo == NULL) {
1661 return EFI_BAD_BUFFER_SIZE;
1662 }
1663
1664 mCallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;
1665 mCallbackInfo->ConfigAccess.ExtractConfig = PlatOverMngrExtractConfig;
1666 mCallbackInfo->ConfigAccess.RouteConfig = PlatOverMngrRouteConfig;
1667 mCallbackInfo->ConfigAccess.Callback = PlatOverMngrCallback;
1668 mCallbackInfo->PlatformDriverOverride.GetDriver = GetDriver;
1669 mCallbackInfo->PlatformDriverOverride.GetDriverPath = GetDriverPath;
1670 mCallbackInfo->PlatformDriverOverride.DriverLoaded = DriverLoaded;
1671
1672 //
1673 // Locate ConfigRouting protocol
1674 //
1675 Status = gBS->LocateProtocol (
1676 &gEfiHiiConfigRoutingProtocolGuid,
1677 NULL,
1678 (VOID **)&mCallbackInfo->HiiConfigRouting
1679 );
1680 if (EFI_ERROR (Status)) {
1681 goto Finish;
1682 }
1683
1684 //
1685 // Install Device Path Protocol and Config Access protocol to driver handle
1686 // Install Platform Driver Override Protocol to driver handle
1687 //
1688 Status = gBS->InstallMultipleProtocolInterfaces (
1689 &mCallbackInfo->DriverHandle,
1690 &gEfiDevicePathProtocolGuid,
1691 &mHiiVendorDevicePath,
1692 &gEfiHiiConfigAccessProtocolGuid,
1693 &mCallbackInfo->ConfigAccess,
1694 &gEfiPlatformDriverOverrideProtocolGuid,
1695 &mCallbackInfo->PlatformDriverOverride,
1696 NULL
1697 );
1698 if (EFI_ERROR (Status)) {
1699 goto Finish;
1700 }
1701
1702 //
1703 // Publish our HII data
1704 //
1705 mCallbackInfo->RegisteredHandle = HiiAddPackages (
1706 &gPlatformOverridesManagerGuid,
1707 mCallbackInfo->DriverHandle,
1708 VfrBin,
1709 PlatDriOverrideDxeStrings,
1710 NULL
1711 );
1712 if (mCallbackInfo->RegisteredHandle == NULL) {
1713 Status = EFI_OUT_OF_RESOURCES;
1714 goto Finish;
1715 }
1716
1717 //
1718 // Clear all the globle variable
1719 //
1720 mDriverImageHandleCount = 0;
1721 mCurrentPage = 0;
1722
1723 return EFI_SUCCESS;
1724
1725Finish:
1726 PlatDriOverrideDxeUnload (ImageHandle);
1727
1728 return Status;
1729}
1730
1739EFIAPI
1741 IN EFI_HANDLE ImageHandle
1742 )
1743{
1744 ASSERT (mCallbackInfo != NULL);
1745
1746 if (mCallbackInfo->DriverHandle != NULL) {
1747 gBS->UninstallMultipleProtocolInterfaces (
1748 mCallbackInfo->DriverHandle,
1749 &gEfiDevicePathProtocolGuid,
1750 &mHiiVendorDevicePath,
1751 &gEfiHiiConfigAccessProtocolGuid,
1752 &mCallbackInfo->ConfigAccess,
1753 &gEfiPlatformDriverOverrideProtocolGuid,
1754 &mCallbackInfo->PlatformDriverOverride,
1755 NULL
1756 );
1757 }
1758
1759 if (mCallbackInfo->RegisteredHandle != NULL) {
1760 HiiRemovePackages (mCallbackInfo->RegisteredHandle);
1761 }
1762
1763 FreePool (mCallbackInfo);
1764
1765 if (mControllerToken != NULL) {
1766 FreePool (mControllerToken);
1767 }
1768
1769 if (mControllerDevicePathProtocol != NULL) {
1770 FreePool (mControllerDevicePathProtocol);
1771 }
1772
1773 if (mDriverImageToken != NULL) {
1774 FreePool (mDriverImageToken);
1775 }
1776
1777 return EFI_SUCCESS;
1778}
UINT64 UINTN
INT64 INTN
UINTN EFIAPI StrSize(IN CONST CHAR16 *String)
Definition: String.c:72
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
Definition: LinkedList.c:403
RETURN_STATUS EFIAPI StrCatS(IN OUT CHAR16 *Destination, IN UINTN DestMax, IN CONST CHAR16 *Source)
Definition: SafeString.c:405
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
Definition: LinkedList.c:182
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)
Definition: BaseLib.h:2884
UINTN EFIAPI StrLen(IN CONST CHAR16 *String)
Definition: String.c:30
CHAR16 *EFIAPI StrStr(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString)
Definition: String.c:224
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
#define HARDWARE_DEVICE_PATH
Definition: DevicePath.h:68
#define HW_VENDOR_DP
Definition: DevicePath.h:133
UINTN EFIAPI DevicePathNodeLength(IN CONST VOID *Node)
BOOLEAN EFIAPI IsDevicePathEnd(IN CONST VOID *Node)
EFI_DEVICE_PATH_PROTOCOL *EFIAPI NextDevicePathNode(IN CONST VOID *Node)
CHAR16 *EFIAPI ConvertDevicePathToText(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN BOOLEAN DisplayOnly, IN BOOLEAN AllowShortcuts)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
VOID *EFIAPI AllocateCopyPool(IN UINTN AllocationSize, IN CONST VOID *Buffer)
EFI_STRING EFIAPI HiiConstructConfigHdr(IN CONST EFI_GUID *Guid OPTIONAL, IN CONST CHAR16 *Name OPTIONAL, IN EFI_HANDLE DriverHandle)
Definition: HiiLib.c:723
BOOLEAN EFIAPI HiiGetBrowserData(IN CONST EFI_GUID *VariableGuid OPTIONAL, IN CONST CHAR16 *VariableName OPTIONAL, IN UINTN BufferSize, OUT UINT8 *Buffer)
Definition: HiiLib.c:2872
UINT8 *EFIAPI HiiCreateGotoOpCode(IN VOID *OpCodeHandle, IN EFI_FORM_ID FormId, IN EFI_STRING_ID Prompt, IN EFI_STRING_ID Help, IN UINT8 QuestionFlags, IN EFI_QUESTION_ID QuestionId)
Definition: HiiLib.c:3551
VOID *EFIAPI HiiAllocateOpCodeHandle(VOID)
Definition: HiiLib.c:3051
VOID EFIAPI HiiFreeOpCodeHandle(VOID *OpCodeHandle)
Definition: HiiLib.c:3085
EFI_HII_HANDLE EFIAPI HiiAddPackages(IN CONST EFI_GUID *PackageListGuid, IN EFI_HANDLE DeviceHandle OPTIONAL,...)
Definition: HiiLib.c:141
UINT8 *EFIAPI HiiCreateGuidOpCode(IN VOID *OpCodeHandle, IN CONST EFI_GUID *Guid, IN CONST VOID *GuidOpCode OPTIONAL, IN UINTN OpCodeSize)
Definition: HiiLib.c:3411
UINT8 *EFIAPI HiiCreateCheckBoxOpCode(IN VOID *OpCodeHandle, IN EFI_QUESTION_ID QuestionId, IN EFI_VARSTORE_ID VarStoreId, IN UINT16 VarOffset, IN EFI_STRING_ID Prompt, IN EFI_STRING_ID Help, IN UINT8 QuestionFlags, IN UINT8 CheckBoxFlags, IN VOID *DefaultsOpCodeHandle OPTIONAL)
Definition: HiiLib.c:3675
BOOLEAN EFIAPI HiiSetBrowserData(IN CONST EFI_GUID *VariableGuid OPTIONAL, IN CONST CHAR16 *VariableName OPTIONAL, IN UINTN BufferSize, IN CONST UINT8 *Buffer, IN CONST CHAR16 *RequestElement OPTIONAL)
Definition: HiiLib.c:2954
EFI_STRING EFIAPI HiiGetString(IN EFI_HII_HANDLE HiiHandle, IN EFI_STRING_ID StringId, IN CONST CHAR8 *Language OPTIONAL)
Definition: HiiString.c:211
UINT8 *EFIAPI HiiCreateOneOfOptionOpCode(IN VOID *OpCodeHandle, IN UINT16 StringId, IN UINT8 Flags, IN UINT8 Type, IN UINT64 Value)
Definition: HiiLib.c:3329
EFI_STATUS EFIAPI HiiUpdateForm(IN EFI_HII_HANDLE HiiHandle, IN EFI_GUID *FormSetGuid OPTIONAL, IN EFI_FORM_ID FormId, IN VOID *StartOpCodeHandle, IN VOID *EndOpCodeHandle OPTIONAL)
Definition: HiiLib.c:4410
BOOLEAN EFIAPI HiiIsConfigHdrMatch(IN CONST EFI_STRING ConfigHdr, IN CONST EFI_GUID *Guid OPTIONAL, IN CONST CHAR16 *Name OPTIONAL)
Definition: HiiLib.c:2813
EFI_STRING_ID EFIAPI HiiSetString(IN EFI_HII_HANDLE HiiHandle, IN EFI_STRING_ID StringId OPTIONAL, IN CONST EFI_STRING String, IN CONST CHAR8 *SupportedLanguages OPTIONAL)
Definition: HiiString.c:52
UINT8 *EFIAPI HiiCreateOrderedListOpCode(IN VOID *OpCodeHandle, IN EFI_QUESTION_ID QuestionId, IN EFI_VARSTORE_ID VarStoreId, IN UINT16 VarOffset, IN EFI_STRING_ID Prompt, IN EFI_STRING_ID Help, IN UINT8 QuestionFlags, IN UINT8 OrderedListFlags, IN UINT8 DataType, IN UINT8 MaxContainers, IN VOID *OptionsOpCodeHandle, IN VOID *DefaultsOpCodeHandle OPTIONAL)
Definition: HiiLib.c:3979
VOID EFIAPI HiiRemovePackages(IN EFI_HII_HANDLE HiiHandle)
Definition: HiiLib.c:253
EFI_STATUS EFIAPI DeleteDriverImage(IN EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DriverImageDevicePath, IN LIST_ENTRY *MappingDataBase)
EFI_STATUS EFIAPI FreeMappingDatabase(IN OUT LIST_ENTRY *MappingDataBase)
EFI_STATUS EFIAPI SaveOverridesMapping(IN LIST_ENTRY *MappingDataBase)
EFI_STATUS EFIAPI CheckMapping(IN EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DriverImageDevicePath OPTIONAL, IN LIST_ENTRY *MappingDataBase, OUT UINT32 *DriverInfoNum OPTIONAL, OUT UINT32 *DriverImageNO OPTIONAL)
EFI_STATUS EFIAPI InsertDriverImage(IN EFI_DEVICE_PATH_PROTOCOL *ControllerDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DriverImageDevicePath, IN LIST_ENTRY *MappingDataBase, IN UINT32 DriverImageNO)
EFI_STATUS EFIAPI InitOverridesMapping(OUT LIST_ENTRY *MappingDataBase)
EFI_STATUS EFIAPI GetDriverFromMapping(IN EFI_HANDLE ControllerHandle, IN OUT EFI_HANDLE *DriverImageHandle, IN LIST_ENTRY *MappingDataBase, IN EFI_HANDLE CallerImageHandle)
#define EFI_IFR_EXTEND_OP_LABEL
Definition: MdeModuleHii.h:33
UINTN EFIAPI UnicodeSPrint(OUT CHAR16 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR16 *FormatString,...)
Definition: PrintLib.c:408
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define VOID
Definition: Base.h:269
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define ASSERT_EFI_ERROR(StatusParameter)
Definition: DebugLib.h:463
#define DEBUG(Expression)
Definition: DebugLib.h:435
EFI_STATUS EFIAPI PlatDriOverrideDxeUnload(IN EFI_HANDLE ImageHandle)
EFI_STATUS UpdateDeviceSelectPage(IN EFI_CALLBACK_INFO *Private, IN UINT16 KeyValue, IN PLAT_OVER_MNGR_DATA *FakeNvData)
CHAR16 * GetComponentNameWorker(IN EFI_HANDLE DriverBindingHandle, IN EFI_GUID *ProtocolGuid, IN CONST CHAR16 *VariableName)
EFI_STATUS UpdateBindingDriverSelectPage(IN EFI_CALLBACK_INFO *Private, IN UINT16 KeyValue, IN PLAT_OVER_MNGR_DATA *FakeNvData)
CHAR16 * DevicePathToStr(IN EFI_DEVICE_PATH_PROTOCOL *DevPath)
EFI_HANDLE GetDriverBindingHandleFromImageHandle(IN EFI_HANDLE ImageHandle)
EFI_STATUS EFIAPI DriverLoaded(IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *DriverImagePath, IN EFI_HANDLE DriverImageHandle)
EFI_STATUS EFIAPI GetDriverPath(IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN OUT EFI_DEVICE_PATH_PROTOCOL **DriverImagePath)
EFI_STATUS EFIAPI PlatDriOverrideDxeInit(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS EFIAPI PlatOverMngrRouteConfig(IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Configuration, OUT EFI_STRING *Progress)
CHAR16 * GetComponentName(IN EFI_HANDLE DriverBindingHandle)
EFI_STATUS CommitChanges(IN EFI_CALLBACK_INFO *Private, IN UINT16 KeyValue, IN PLAT_OVER_MNGR_DATA *FakeNvData)
EFI_STATUS EFIAPI GetDriver(IN EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN OUT EFI_HANDLE *DriverImageHandle)
EFI_STATUS EFIAPI PlatOverMngrCallback(IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID KeyValue, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest)
CHAR16 * GetImageName(IN EFI_LOADED_IMAGE_PROTOCOL *Image)
EFI_STATUS EFIAPI PlatOverMngrExtractConfig(IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Request, OUT EFI_STRING *Progress, OUT EFI_STRING *Results)
EFI_STATUS UpdatePrioritySelectPage(IN EFI_CALLBACK_INFO *Private, IN UINT16 KeyValue, IN PLAT_OVER_MNGR_DATA *FakeNvData)
EFI_STRING_ID NewString(IN CHAR16 *String, IN EFI_HII_HANDLE HiiHandle)
Definition: Setup.c:1012
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS
#define STRING_TOKEN(t)
VOID * EFI_HII_HANDLE
EFI_STATUS EFIAPI GetEfiGlobalVariable2(IN CONST CHAR16 *Name, OUT VOID **Value, OUT UINTN *Size OPTIONAL)
Definition: UefiLib.c:1466
VOID EFIAPI CreatePopUp(IN UINTN Attribute, OUT EFI_INPUT_KEY *Key OPTIONAL,...)
Definition: Console.c:393
CHAR8 *EFIAPI GetBestLanguage(IN CONST CHAR8 *SupportedLanguages, IN UINTN Iso639Language,...)
Definition: UefiLib.c:1518
EFI_GUID *EFIAPI EfiGetNameGuidFromFwVolDevicePathNode(IN CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode)
Definition: UefiNotTiano.c:292
@ ByProtocol
Definition: UefiSpec.h:1528
Definition: Base.h:213