2 Main file for DrvCfg shell Driver1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "UefiShellDriver1CommandsLib.h"
11 #include <Protocol/HiiConfigAccess.h>
12 #include <Protocol/HiiDatabase.h>
14 STATIC CONST EFI_GUID
*CfgGuidList
[] = { &gEfiDriverConfigurationProtocolGuid
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
};
17 Find the EFI_HII_HANDLE by device path.
19 @param[in] DevPath1 The Device Path to match.
20 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
21 @param[in] HiiDb The Hii database protocol
23 @retval EFI_SUCCESS The operation was successful.
24 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.
27 FindHiiHandleViaDevPath (
28 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath1
,
29 OUT EFI_HII_HANDLE
*HiiHandle
,
30 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
33 EFI_HII_HANDLE
*HandleBuffer
;
34 UINTN HandleBufferSize
;
37 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
38 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
40 EFI_DEVICE_PATH_PROTOCOL
*DevPath2
;
43 ASSERT (DevPath1
!= NULL
);
44 ASSERT (HiiHandle
!= NULL
);
45 ASSERT (*HiiHandle
== NULL
);
46 ASSERT (HiiDb
!= NULL
);
50 Status
= HiiDb
->ListPackageLists (HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
51 if (Status
== EFI_BUFFER_TOO_SMALL
) {
52 HandleBuffer
= AllocateZeroPool (HandleBufferSize
);
53 if (HandleBuffer
== NULL
) {
54 Status
= EFI_OUT_OF_RESOURCES
;
56 Status
= HiiDb
->ListPackageLists (HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
60 if (EFI_ERROR (Status
)) {
61 SHELL_FREE_NON_NULL (HandleBuffer
);
65 if (HandleBuffer
== NULL
) {
69 for (LoopVariable
= 0; LoopVariable
< (HandleBufferSize
/sizeof (HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
72 Status
= HiiDb
->ExportPackageLists (HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
73 if (Status
== EFI_BUFFER_TOO_SMALL
) {
74 MainBuffer
= AllocateZeroPool (MainBufferSize
);
75 if (MainBuffer
!= NULL
) {
76 Status
= HiiDb
->ExportPackageLists (HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
80 if (EFI_ERROR (Status
)) {
85 // Enumerate through the block of returned memory.
86 // This should actually be a small block, but we need to be sure.
88 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
89 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
90 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
))
92 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof (EFI_HII_PACKAGE_LIST_HEADER
))
93 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
94 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
))
96 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
97 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof (EFI_HII_PACKAGE_HEADER
));
98 if (DevicePathCompare (&DevPath1
, &DevPath2
) == 0) {
99 *HiiHandle
= HandleBuffer
[LoopVariable
];
106 SHELL_FREE_NON_NULL (MainBuffer
);
109 SHELL_FREE_NON_NULL (HandleBuffer
);
111 if (*HiiHandle
== NULL
) {
112 return (EFI_NOT_FOUND
);
115 return (EFI_SUCCESS
);
119 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
121 @param[in] Handle The EFI_HANDLE to convert.
122 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
123 @param[in] HiiDb The Hii database protocol
125 @retval EFI_SUCCESS The operation was successful.
128 ConvertHandleToHiiHandle (
129 IN CONST EFI_HANDLE Handle
,
130 OUT EFI_HII_HANDLE
*HiiHandle
,
131 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
135 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
137 if ((HiiHandle
== NULL
) || (HiiDb
== NULL
)) {
138 return (EFI_INVALID_PARAMETER
);
143 if (Handle
== NULL
) {
144 return (EFI_SUCCESS
);
148 Status
= gBS
->OpenProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
149 if (EFI_ERROR (Status
) || (DevPath1
== NULL
)) {
150 return (EFI_NOT_FOUND
);
153 return (FindHiiHandleViaDevPath (DevPath1
, HiiHandle
, HiiDb
));
157 Function to print out all HII configuration information to a file.
159 @param[in] Handle The handle to get info on. NULL to do all handles.
160 @param[in] FileName The filename to rwite the info to.
164 IN CONST EFI_HANDLE Handle
,
165 IN CONST CHAR16
*FileName
168 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
171 UINTN MainBufferSize
;
172 EFI_HII_HANDLE HiiHandle
;
173 SHELL_FILE_HANDLE FileHandle
;
180 Status
= ShellOpenFileByName (FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
181 if (EFI_ERROR (Status
)) {
186 STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
),
187 gShellDriver1HiiHandle
,
192 return (SHELL_DEVICE_ERROR
);
196 // Locate HII Database protocol
198 Status
= gBS
->LocateProtocol (
199 &gEfiHiiDatabaseProtocolGuid
,
201 (VOID
**)&HiiDatabase
204 if (EFI_ERROR (Status
) || (HiiDatabase
== NULL
)) {
209 STRING_TOKEN (STR_GEN_PROTOCOL_NF
),
210 gShellDriver1HiiHandle
,
212 L
"EfiHiiDatabaseProtocol",
213 &gEfiHiiDatabaseProtocolGuid
215 ShellCloseFile (&FileHandle
);
216 return (SHELL_NOT_FOUND
);
220 Status
= ConvertHandleToHiiHandle (Handle
, &HiiHandle
, HiiDatabase
);
221 if (EFI_ERROR (Status
)) {
226 STRING_TOKEN (STR_GEN_HANDLE_NOT
),
227 gShellDriver1HiiHandle
,
229 ConvertHandleToHandleIndex (Handle
),
232 ShellCloseFile (&FileHandle
);
233 return (SHELL_DEVICE_ERROR
);
236 Status
= HiiDatabase
->ExportPackageLists (HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
237 if (Status
== EFI_BUFFER_TOO_SMALL
) {
238 MainBuffer
= AllocateZeroPool (MainBufferSize
);
239 Status
= HiiDatabase
->ExportPackageLists (HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
242 Status
= ShellWriteFile (FileHandle
, &MainBufferSize
, MainBuffer
);
244 ShellCloseFile (&FileHandle
);
245 SHELL_FREE_NON_NULL (MainBuffer
);
247 if (EFI_ERROR (Status
)) {
252 STRING_TOKEN (STR_FILE_WRITE_FAIL
),
253 gShellDriver1HiiHandle
,
257 return (SHELL_DEVICE_ERROR
);
264 STRING_TOKEN (STR_DRVCFG_COMP
),
265 gShellDriver1HiiHandle
268 return (SHELL_SUCCESS
);
272 Function to read in HII configuration information from a file.
274 @param[in] Handle The handle to get info for.
275 @param[in] FileName The filename to read the info from.
279 IN EFI_HANDLE Handle
,
280 IN CONST CHAR16
*FileName
283 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
287 UINTN MainBufferSize
;
288 EFI_HII_HANDLE HiiHandle
;
289 SHELL_FILE_HANDLE FileHandle
;
290 CHAR16
*TempDevPathString
;
291 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
292 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
293 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
301 Status
= ShellOpenFileByName (FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
302 if (EFI_ERROR (Status
)) {
307 STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
),
308 gShellDriver1HiiHandle
,
313 return (SHELL_DEVICE_ERROR
);
317 // Locate HII Database protocol
319 Status
= gBS
->LocateProtocol (
320 &gEfiHiiDatabaseProtocolGuid
,
322 (VOID
**)&HiiDatabase
325 if (EFI_ERROR (Status
) || (HiiDatabase
== NULL
)) {
330 STRING_TOKEN (STR_GEN_PROTOCOL_NF
),
331 gShellDriver1HiiHandle
,
333 L
"EfiHiiDatabaseProtocol",
334 &gEfiHiiDatabaseProtocolGuid
336 ShellCloseFile (&FileHandle
);
337 return (SHELL_NOT_FOUND
);
340 Status
= ShellGetFileSize (FileHandle
, &Temp
);
341 MainBufferSize
= (UINTN
)Temp
;
342 if (EFI_ERROR (Status
)) {
347 STRING_TOKEN (STR_FILE_READ_FAIL
),
348 gShellDriver1HiiHandle
,
353 ShellCloseFile (&FileHandle
);
354 return (SHELL_DEVICE_ERROR
);
357 MainBuffer
= AllocateZeroPool ((UINTN
)MainBufferSize
);
358 if (EFI_ERROR (Status
)) {
363 STRING_TOKEN (STR_GEN_OUT_MEM
),
364 gShellDriver1HiiHandle
,
367 ShellCloseFile (&FileHandle
);
368 return (SHELL_DEVICE_ERROR
);
371 Status
= ShellReadFile (FileHandle
, &MainBufferSize
, MainBuffer
);
372 if (EFI_ERROR (Status
)) {
377 STRING_TOKEN (STR_FILE_READ_FAIL
),
378 gShellDriver1HiiHandle
,
383 ShellCloseFile (&FileHandle
);
384 SHELL_FREE_NON_NULL (MainBuffer
);
385 return (SHELL_DEVICE_ERROR
);
388 ShellCloseFile (&FileHandle
);
390 if (Handle
!= NULL
) {
392 // User override in place. Just do it.
395 Status
= ConvertHandleToHiiHandle (Handle
, &HiiHandle
, HiiDatabase
);
396 if (EFI_ERROR (Status
)) {
401 STRING_TOKEN (STR_GEN_HANDLE_NOT
),
402 gShellDriver1HiiHandle
,
404 ConvertHandleToHandleIndex (Handle
),
407 ShellCloseFile (&FileHandle
);
408 return (SHELL_DEVICE_ERROR
);
411 Status
= HiiDatabase
->UpdatePackageList (HiiDatabase
, HiiHandle
, MainBuffer
);
412 if (EFI_ERROR (Status
)) {
417 STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN
),
418 gShellDriver1HiiHandle
,
420 L
"HiiDatabase->UpdatePackageList",
423 return (SHELL_DEVICE_ERROR
);
427 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
430 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
431 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
432 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
))
434 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof (EFI_HII_PACKAGE_LIST_HEADER
))
435 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
436 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
))
438 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
440 Status
= FindHiiHandleViaDevPath ((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof (EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
441 if (EFI_ERROR (Status
)) {
443 // print out an error.
445 TempDevPathString
= ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof (EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
450 STRING_TOKEN (STR_DRVCFG_IN_FILE_NF
),
451 gShellDriver1HiiHandle
,
454 SHELL_FREE_NON_NULL (TempDevPathString
);
456 Status
= HiiDatabase
->UpdatePackageList (HiiDatabase
, HiiHandle
, PackageListHeader
);
457 if (EFI_ERROR (Status
)) {
462 STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN
),
463 gShellDriver1HiiHandle
,
465 L
"HiiDatabase->UpdatePackageList",
468 return (SHELL_DEVICE_ERROR
);
470 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof (EFI_HII_PACKAGE_HEADER
));
471 gBS
->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
472 HandleIndex
= ConvertHandleToHandleIndex (Handle
);
477 STRING_TOKEN (STR_DRVCFG_DONE_HII
),
478 gShellDriver1HiiHandle
,
488 SHELL_FREE_NON_NULL (MainBuffer
);
494 STRING_TOKEN (STR_DRVCFG_COMP
),
495 gShellDriver1HiiHandle
497 return (SHELL_SUCCESS
);
501 Present a requested action to the user.
503 @param[in] DriverImageHandle The handle for the driver to configure.
504 @param[in] ControllerHandle The handle of the device being managed by the Driver specified.
505 @param[in] ChildHandle The handle of a child device of the specified device.
506 @param[in] ActionRequired The required HII action.
508 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
511 ShellCmdDriverConfigurationProcessActionRequired (
512 EFI_HANDLE DriverImageHandle
,
513 EFI_HANDLE ControllerHandle
,
514 EFI_HANDLE ChildHandle
,
515 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
518 EFI_HANDLE ConnectControllerContextOverride
[2];
520 switch (ActionRequired
) {
521 case EfiDriverConfigurationActionNone
:
522 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
525 case EfiDriverConfigurationActionStopController
:
526 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
527 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
528 ShellPromptForResponse (ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
530 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
531 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
534 case EfiDriverConfigurationActionRestartController
:
535 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
536 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
537 ShellPromptForResponse (ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
539 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
540 ConnectControllerContextOverride
[0] = DriverImageHandle
;
541 ConnectControllerContextOverride
[1] = NULL
;
542 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
543 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
546 case EfiDriverConfigurationActionRestartPlatform
:
547 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
548 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
549 ShellPromptForResponse (ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
551 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
555 return (EFI_INVALID_PARAMETER
);
562 Do the configuration in an environment without HII.
564 @param[in] Language The language code.
565 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.
566 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.
567 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.
568 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.
569 @param[in] SetOptions TRUE to set options, FALSE otherwise.
570 @param[in] DriverImageHandle The handle for the driver to configure.
571 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.
572 @param[in] ChildHandle The handle of a child device of the specified device.
574 @retval SHELL_NOT_FOUND A specified handle could not be found.
575 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
579 IN CONST CHAR8
*Language
,
580 IN BOOLEAN ForceDefaults
,
581 IN UINT32 DefaultType
,
582 IN BOOLEAN AllChildren
,
583 IN BOOLEAN ValidateOptions
,
584 IN BOOLEAN SetOptions
,
585 IN EFI_HANDLE DriverImageHandle
,
586 IN EFI_HANDLE DeviceHandle
,
587 IN EFI_HANDLE ChildHandle
591 SHELL_STATUS ShellStatus
;
592 UINTN OuterLoopCounter
;
594 UINTN DriverImageHandleCount
;
595 EFI_HANDLE
*DriverImageHandleBuffer
;
597 EFI_HANDLE
*HandleBuffer
;
601 UINTN ChildHandleCount
;
602 EFI_HANDLE
*ChildHandleBuffer
;
603 UINTN
*ChildHandleType
;
604 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
605 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
606 BOOLEAN Iso639Language
;
611 ShellStatus
= SHELL_SUCCESS
;
613 if ((ChildHandle
== NULL
) && AllChildren
) {
622 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
623 gShellDriver1HiiHandle
,
626 } else if (ValidateOptions
) {
631 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
632 gShellDriver1HiiHandle
634 } else if (SetOptions
) {
639 STRING_TOKEN (STR_DRVCFG_SET
),
640 gShellDriver1HiiHandle
644 if (DriverImageHandle
== 0) {
645 DriverImageHandleBuffer
= GetHandleListByProtocolList (CfgGuidList
);
646 if (DriverImageHandleBuffer
== NULL
) {
647 ShellStatus
= SHELL_NOT_FOUND
;
652 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
653 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
654 ; HandleBuffer
++, DriverImageHandleCount
++)
658 DriverImageHandleCount
= 1;
660 // Allocate buffer to hold the image handle so as to
661 // keep consistent with the above clause
663 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
664 ASSERT (DriverImageHandleBuffer
);
665 DriverImageHandleBuffer
[0] = DriverImageHandle
;
668 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
669 Iso639Language
= FALSE
;
670 Status
= gBS
->OpenProtocol (
671 DriverImageHandleBuffer
[OuterLoopCounter
],
672 &gEfiDriverConfiguration2ProtocolGuid
,
673 (VOID
**)&DriverConfiguration
,
676 EFI_OPEN_PROTOCOL_GET_PROTOCOL
678 if (EFI_ERROR (Status
)) {
679 Iso639Language
= TRUE
;
680 Status
= gBS
->OpenProtocol (
681 DriverImageHandleBuffer
[OuterLoopCounter
],
682 &gEfiDriverConfigurationProtocolGuid
,
683 (VOID
**)&DriverConfiguration
,
686 EFI_OPEN_PROTOCOL_GET_PROTOCOL
690 if (EFI_ERROR (Status
)) {
695 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
696 // gShellDriver1HiiHandle,
697 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
699 ShellStatus
= SHELL_UNSUPPORTED
;
703 BestLanguage
= GetBestLanguage (
704 DriverConfiguration
->SupportedLanguages
,
706 Language
!= NULL
? Language
: "",
707 DriverConfiguration
->SupportedLanguages
,
710 if (BestLanguage
== NULL
) {
715 STRING_TOKEN (STR_GEN_NO_VALUE
),
716 gShellDriver1HiiHandle
,
720 ShellStatus
= SHELL_INVALID_PARAMETER
;
724 Status
= ParseHandleDatabaseByRelationshipWithType (
725 DriverImageHandleBuffer
[OuterLoopCounter
],
731 if (EFI_ERROR (Status
)) {
735 if (SetOptions
&& (DeviceHandle
== NULL
)) {
736 gST
->ConOut
->ClearScreen (gST
->ConOut
);
737 Status
= DriverConfiguration
->SetOptions (
744 gST
->ConOut
->ClearScreen (gST
->ConOut
);
750 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
751 gShellDriver1HiiHandle
,
752 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
753 DriverConfiguration
->SupportedLanguages
755 if (!EFI_ERROR (Status
)) {
760 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
761 gShellDriver1HiiHandle
763 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
764 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
765 ShellCmdDriverConfigurationProcessActionRequired (
766 DriverImageHandleBuffer
[OuterLoopCounter
],
767 HandleBuffer
[LoopCounter
],
778 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
779 gShellDriver1HiiHandle
,
787 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
788 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
792 if ((DeviceHandle
!= NULL
) && (DeviceHandle
!= HandleBuffer
[LoopCounter
])) {
796 if (ChildHandle
== NULL
) {
797 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
798 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
803 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
804 gShellDriver1HiiHandle
,
807 DriverConfiguration
->SupportedLanguages
811 Status
= DriverConfiguration
->ForceDefaults (
813 HandleBuffer
[LoopCounter
],
819 if (!EFI_ERROR (Status
)) {
824 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
825 gShellDriver1HiiHandle
827 ShellCmdDriverConfigurationProcessActionRequired (
828 DriverImageHandleBuffer
[OuterLoopCounter
],
829 HandleBuffer
[LoopCounter
],
838 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
839 gShellDriver1HiiHandle
,
842 ShellStatus
= SHELL_DEVICE_ERROR
;
844 } else if (ValidateOptions
) {
845 Status
= DriverConfiguration
->OptionsValid (
847 HandleBuffer
[LoopCounter
],
851 if (!EFI_ERROR (Status
)) {
856 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
857 gShellDriver1HiiHandle
864 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
865 gShellDriver1HiiHandle
,
868 ShellStatus
= SHELL_DEVICE_ERROR
;
870 } else if (SetOptions
) {
871 gST
->ConOut
->ClearScreen (gST
->ConOut
);
872 Status
= DriverConfiguration
->SetOptions (
874 HandleBuffer
[LoopCounter
],
879 gST
->ConOut
->ClearScreen (gST
->ConOut
);
880 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
881 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
886 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
887 gShellDriver1HiiHandle
,
890 DriverConfiguration
->SupportedLanguages
892 if (!EFI_ERROR (Status
)) {
897 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
898 gShellDriver1HiiHandle
901 ShellCmdDriverConfigurationProcessActionRequired (
902 DriverImageHandleBuffer
[OuterLoopCounter
],
903 HandleBuffer
[LoopCounter
],
912 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
913 gShellDriver1HiiHandle
,
916 ShellStatus
= SHELL_DEVICE_ERROR
;
923 if ((ChildHandle
== NULL
) && !AllChildren
) {
927 Status
= ParseHandleDatabaseByRelationshipWithType (
928 DriverImageHandleBuffer
[OuterLoopCounter
],
929 HandleBuffer
[LoopCounter
],
934 if (EFI_ERROR (Status
)) {
938 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
939 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
943 if ((ChildHandle
!= NULL
) && (ChildHandle
!= ChildHandleBuffer
[ChildIndex
])) {
947 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
948 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
949 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
954 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
955 gShellDriver1HiiHandle
,
959 DriverConfiguration
->SupportedLanguages
963 Status
= DriverConfiguration
->ForceDefaults (
965 HandleBuffer
[LoopCounter
],
966 ChildHandleBuffer
[ChildIndex
],
971 if (!EFI_ERROR (Status
)) {
976 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
977 gShellDriver1HiiHandle
980 ShellCmdDriverConfigurationProcessActionRequired (
981 DriverImageHandleBuffer
[OuterLoopCounter
],
982 HandleBuffer
[LoopCounter
],
983 ChildHandleBuffer
[ChildIndex
],
991 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
992 gShellDriver1HiiHandle
,
995 ShellStatus
= SHELL_DEVICE_ERROR
;
997 } else if (ValidateOptions
) {
998 Status
= DriverConfiguration
->OptionsValid (
1000 HandleBuffer
[LoopCounter
],
1001 ChildHandleBuffer
[ChildIndex
]
1004 if (!EFI_ERROR (Status
)) {
1009 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
1010 gShellDriver1HiiHandle
1017 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
1018 gShellDriver1HiiHandle
,
1021 ShellStatus
= SHELL_DEVICE_ERROR
;
1023 } else if (SetOptions
) {
1024 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1025 Status
= DriverConfiguration
->SetOptions (
1026 DriverConfiguration
,
1027 HandleBuffer
[LoopCounter
],
1028 ChildHandleBuffer
[ChildIndex
],
1032 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1033 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
1034 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
1035 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
1040 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
1041 gShellDriver1HiiHandle
,
1045 DriverConfiguration
->SupportedLanguages
1047 if (!EFI_ERROR (Status
)) {
1052 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
1053 gShellDriver1HiiHandle
1056 ShellCmdDriverConfigurationProcessActionRequired (
1057 DriverImageHandleBuffer
[OuterLoopCounter
],
1058 HandleBuffer
[LoopCounter
],
1059 ChildHandleBuffer
[ChildIndex
],
1067 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
1068 gShellDriver1HiiHandle
,
1071 ShellStatus
= SHELL_DEVICE_ERROR
;
1078 FreePool (ChildHandleBuffer
);
1079 FreePool (ChildHandleType
);
1082 FreePool (BestLanguage
);
1083 FreePool (HandleBuffer
);
1084 FreePool (HandleType
);
1087 if ((DriverImageHandle
!= NULL
) && (DriverImageHandleCount
!= 0)) {
1088 FreePool (DriverImageHandleBuffer
);
1096 Function to print out configuration information on all configurable handles.
1098 @param[in] ChildrenToo TRUE to tewst for children.
1099 @param[in] Language ASCII string for language code.
1100 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1102 @retval SHELL_SUCCESS The operation was successful.
1105 PrintConfigInfoOnAll (
1106 IN CONST BOOLEAN ChildrenToo
,
1107 IN CONST CHAR8
*Language
,
1108 IN CONST BOOLEAN UseHii
1111 EFI_HANDLE
*HandleList
;
1112 EFI_HANDLE
*CurrentHandle
;
1118 CurrentHandle
= NULL
;
1124 HandleList
= GetHandleListByProtocol (&gEfiHiiConfigAccessProtocolGuid
);
1125 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++) {
1127 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex (*CurrentHandle
);
1132 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1133 gShellDriver1HiiHandle
,
1138 SHELL_FREE_NON_NULL (HandleList
);
1157 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE_FOUND
), gShellDriver1HiiHandle
);
1158 return (SHELL_SUCCESS
);
1161 return (SHELL_SUCCESS
);
1164 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1165 { L
"-s", TypeFlag
},
1166 { L
"-l", TypeValue
},
1167 { L
"-f", TypeValue
},
1168 { L
"-o", TypeValue
},
1169 { L
"-i", TypeValue
},
1172 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1173 { L
"-c", TypeFlag
},
1174 { L
"-s", TypeFlag
},
1175 { L
"-v", TypeFlag
},
1176 { L
"-l", TypeValue
},
1177 { L
"-f", TypeValue
},
1182 Function for 'drvcfg' command.
1184 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1185 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1189 ShellCommandRunDrvCfg (
1190 IN EFI_HANDLE ImageHandle
,
1191 IN EFI_SYSTEM_TABLE
*SystemTable
1195 LIST_ENTRY
*Package
;
1196 CHAR16
*ProblemParam
;
1197 SHELL_STATUS ShellStatus
;
1200 CONST CHAR16
*HandleIndex1
;
1201 CONST CHAR16
*HandleIndex2
;
1202 CONST CHAR16
*HandleIndex3
;
1203 CONST CHAR16
*ForceTypeString
;
1209 BOOLEAN AllChildren
;
1212 UINT64 Intermediate
;
1216 CONST CHAR16
*FileName
;
1218 ShellStatus
= SHELL_SUCCESS
;
1219 Status
= EFI_SUCCESS
;
1222 ProblemParam
= NULL
;
1225 // initialize the shell lib (we must be in non-auto-init...)
1227 Status
= ShellInitialize ();
1228 ASSERT_EFI_ERROR (Status
);
1230 Status
= CommandInit ();
1231 ASSERT_EFI_ERROR (Status
);
1234 // parse the command line
1236 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1237 if (EFI_ERROR (Status
) || (ShellCommandLineGetCount (Package
) > 2)) {
1239 if (Package
!= NULL
) {
1240 ShellCommandLineFreeVarList (Package
);
1243 SHELL_FREE_NON_NULL (ProblemParam
);
1244 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1245 if (EFI_ERROR (Status
)) {
1246 if ((Status
== EFI_VOLUME_CORRUPTED
) && (ProblemParam
!= NULL
)) {
1247 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"drvcfg", ProblemParam
);
1248 FreePool (ProblemParam
);
1249 ShellStatus
= SHELL_INVALID_PARAMETER
;
1257 if (ShellStatus
== SHELL_SUCCESS
) {
1258 if (ShellCommandLineGetCount (Package
) > 4) {
1259 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"drvcfg");
1260 ShellStatus
= SHELL_INVALID_PARAMETER
;
1264 Lang
= ShellCommandLineGetValue (Package
, L
"-l");
1266 Language
= AllocateZeroPool (StrSize (Lang
));
1267 AsciiSPrint (Language
, StrSize (Lang
), "%S", Lang
);
1268 } else if (ShellCommandLineGetFlag (Package
, L
"-l")) {
1269 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-l");
1270 ShellStatus
= SHELL_INVALID_PARAMETER
;
1274 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1275 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1276 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1277 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1278 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1279 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1280 ForceTypeString
= ShellCommandLineGetValue (Package
, L
"-f");
1283 FileName
= ShellCommandLineGetValue (Package
, L
"-o");
1284 } else if (InFromFile
) {
1285 FileName
= ShellCommandLineGetValue (Package
, L
"-i");
1290 if (InFromFile
&& EFI_ERROR (ShellFileExists (FileName
))) {
1291 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1292 ShellStatus
= SHELL_INVALID_PARAMETER
;
1296 if (OutToFile
&& !EFI_ERROR (ShellFileExists (FileName
))) {
1297 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1298 ShellStatus
= SHELL_INVALID_PARAMETER
;
1302 if (Force
&& (ForceTypeString
== NULL
)) {
1303 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-f");
1304 ShellStatus
= SHELL_INVALID_PARAMETER
;
1309 Status
= ShellConvertStringToUint64 (ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1310 if (EFI_ERROR (Status
)) {
1311 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"drvcfg", ForceTypeString
, L
"-f");
1312 ShellStatus
= SHELL_INVALID_PARAMETER
;
1316 ForceType
= (UINT32
)Intermediate
;
1321 HandleIndex1
= ShellCommandLineGetRawValue (Package
, 1);
1323 if ((HandleIndex1
!= NULL
) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1324 Handle1
= ConvertHandleIndexToHandle ((UINTN
)Intermediate
);
1325 if ((Handle1
== NULL
) || ((UINT64
)(UINTN
)Intermediate
!= Intermediate
)) {
1326 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex1
);
1327 ShellStatus
= SHELL_INVALID_PARAMETER
;
1332 HandleIndex2
= ShellCommandLineGetRawValue (Package
, 2);
1334 if ((HandleIndex2
!= NULL
) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1335 Handle2
= ConvertHandleIndexToHandle ((UINTN
)Intermediate
);
1336 if ((Handle2
== NULL
) || ((UINT64
)(UINTN
)Intermediate
!= Intermediate
)) {
1337 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex2
);
1338 ShellStatus
= SHELL_INVALID_PARAMETER
;
1343 HandleIndex3
= ShellCommandLineGetRawValue (Package
, 3);
1345 if ((HandleIndex3
!= NULL
) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1346 Handle3
= ConvertHandleIndexToHandle ((UINTN
)Intermediate
);
1347 if ((Handle3
== NULL
) || ((UINT64
)(UINTN
)Intermediate
!= Intermediate
)) {
1348 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex3
);
1349 ShellStatus
= SHELL_INVALID_PARAMETER
;
1354 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1355 if (FileName
== NULL
) {
1356 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", InFromFile
? L
"-i" : L
"-o");
1358 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
, L
"drvcfg");
1361 ShellStatus
= SHELL_INVALID_PARAMETER
;
1365 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1367 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i");
1368 ShellStatus
= SHELL_INVALID_PARAMETER
;
1373 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-o");
1374 ShellStatus
= SHELL_INVALID_PARAMETER
;
1379 if (Validate
&& Force
) {
1380 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-f");
1381 ShellStatus
= SHELL_INVALID_PARAMETER
;
1385 if (Validate
&& Set
) {
1386 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-s");
1387 ShellStatus
= SHELL_INVALID_PARAMETER
;
1392 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-s", L
"-f");
1393 ShellStatus
= SHELL_INVALID_PARAMETER
;
1397 if (OutToFile
&& InFromFile
) {
1398 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i", L
"-o");
1399 ShellStatus
= SHELL_INVALID_PARAMETER
;
1407 if ((Handle1
!= NULL
) && EFI_ERROR (gBS
->OpenProtocol (Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1409 // no HII on this handle.
1411 ShellStatus
= SHELL_UNSUPPORTED
;
1412 } else if (Validate
) {
1415 } else if (InFromFile
) {
1416 ShellStatus
= ConfigFromFile (Handle1
, FileName
);
1417 if ((Handle1
!= NULL
) && (ShellStatus
== SHELL_SUCCESS
)) {
1420 } else if (OutToFile
) {
1421 ShellStatus
= ConfigToFile (Handle1
, FileName
);
1422 if ((Handle1
!= NULL
) && (ShellStatus
== SHELL_SUCCESS
)) {
1425 } else if (HandleIndex1
== NULL
) {
1427 // display all that are configurable
1429 ShellStatus
= PrintConfigInfoOnAll (AllChildren
, Language
, UseHii
);
1432 if (!EFI_ERROR (gBS
->OpenProtocol (Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1437 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1438 gShellDriver1HiiHandle
,
1439 ConvertHandleToHandleIndex (Handle1
)
1447 // We allways need to do this one since it does both by default.
1449 if (!InFromFile
&& !OutToFile
) {
1450 ShellStatus
= PreHiiDrvCfg (
1463 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1468 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1469 gShellDriver1HiiHandle
,
1470 ConvertHandleToHandleIndex (Handle1
)
1476 ShellCommandLineFreeVarList (Package
);
1477 SHELL_FREE_NON_NULL (Language
);
1478 return (ShellStatus
);