2 Main file for DrvCfg shell Driver1 function.
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDriver1CommandsLib.h"
16 #include <Protocol/HiiConfigAccess.h>
17 #include <Protocol/HiiDatabase.h>
19 STATIC CONST EFI_GUID
*CfgGuidList
[] = {&gEfiDriverConfigurationProtocolGuid
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
};
22 Find the EFI_HII_HANDLE by device path.
24 @param[in] DevPath1 The Device Path to match.
25 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
26 @param[in] HiiDb The Hii database protocol
28 @retval EFI_SUCCESS The operation was successful.
29 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.
33 FindHiiHandleViaDevPath(
34 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath1
,
35 OUT EFI_HII_HANDLE
*HiiHandle
,
36 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
39 EFI_HII_HANDLE
*HandleBuffer
;
40 UINTN HandleBufferSize
;
43 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
44 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
46 EFI_DEVICE_PATH_PROTOCOL
*DevPath2
;
49 ASSERT(DevPath1
!= NULL
);
50 ASSERT(HiiHandle
!= NULL
);
51 ASSERT(*HiiHandle
== NULL
);
52 ASSERT(HiiDb
!= NULL
);
56 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
57 if (Status
== EFI_BUFFER_TOO_SMALL
) {
58 HandleBuffer
= AllocateZeroPool(HandleBufferSize
);
59 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
61 if (EFI_ERROR(Status
)) {
62 SHELL_FREE_NON_NULL(HandleBuffer
);
66 for (LoopVariable
= 0 ; LoopVariable
< (HandleBufferSize
/sizeof(HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
69 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
70 if (Status
== EFI_BUFFER_TOO_SMALL
) {
71 MainBuffer
= AllocateZeroPool(MainBufferSize
);
72 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
75 // Enumerate through the block of returned memory.
76 // This should actually be a small block, but we need to be sure.
78 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
79 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
80 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
81 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
82 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
83 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
84 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
85 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
86 if (DevicePathCompare(&DevPath1
, &DevPath2
) == 0) {
87 *HiiHandle
= HandleBuffer
[LoopVariable
];
93 SHELL_FREE_NON_NULL(MainBuffer
);
95 SHELL_FREE_NON_NULL(HandleBuffer
);
97 if (*HiiHandle
== NULL
) {
98 return (EFI_NOT_FOUND
);
100 return (EFI_SUCCESS
);
104 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
106 @param[in] Handle The EFI_HANDLE to convert.
107 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
108 @param[in] HiiDb The Hii database protocol
110 @retval EFI_SUCCESS The operation was successful.
114 ConvertHandleToHiiHandle(
115 IN CONST EFI_HANDLE Handle
,
116 OUT EFI_HII_HANDLE
*HiiHandle
,
117 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
121 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
123 if (HiiHandle
== NULL
|| HiiDb
== NULL
) {
124 return (EFI_INVALID_PARAMETER
);
128 if (Handle
== NULL
) {
129 return (EFI_SUCCESS
);
133 Status
= gBS
->OpenProtocol(Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
134 if (EFI_ERROR(Status
) || DevPath1
== NULL
) {
135 return (EFI_NOT_FOUND
);
138 return (FindHiiHandleViaDevPath(DevPath1
, HiiHandle
, HiiDb
));
142 Function to print out all HII configuration information to a file.
144 @param[in] Handle The handle to get info on. NULL to do all handles.
145 @param[in] FileName The filename to rwite the info to.
150 IN CONST EFI_HANDLE Handle
,
151 IN CONST CHAR16
*FileName
154 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
157 UINTN MainBufferSize
;
158 EFI_HII_HANDLE HiiHandle
;
159 SHELL_FILE_HANDLE FileHandle
;
166 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
167 if (EFI_ERROR(Status
)) {
172 STRING_TOKEN(STR_GEN_FILE_OPEN
),
173 gShellDriver1HiiHandle
,
176 return (SHELL_DEVICE_ERROR
);
180 // Locate HII Database protocol
182 Status
= gBS
->LocateProtocol (
183 &gEfiHiiDatabaseProtocolGuid
,
185 (VOID
**) &HiiDatabase
188 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
193 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
194 gShellDriver1HiiHandle
,
195 L
"EfiHiiDatabaseProtocol",
196 &gEfiHiiDatabaseProtocolGuid
);
197 ShellCloseFile(&FileHandle
);
198 return (SHELL_NOT_FOUND
);
201 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
202 if (EFI_ERROR(Status
)) {
207 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
208 gShellDriver1HiiHandle
,
209 ConvertHandleToHandleIndex(Handle
),
211 ShellCloseFile(&FileHandle
);
212 return (SHELL_DEVICE_ERROR
);
215 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
216 if (Status
== EFI_BUFFER_TOO_SMALL
) {
217 MainBuffer
= AllocateZeroPool(MainBufferSize
);
218 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
221 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
223 ShellCloseFile(&FileHandle
);
224 SHELL_FREE_NON_NULL(MainBuffer
);
226 if (EFI_ERROR(Status
)) {
231 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
232 gShellDriver1HiiHandle
,
235 return (SHELL_DEVICE_ERROR
);
241 STRING_TOKEN(STR_DRVCFG_COMP
),
242 gShellDriver1HiiHandle
);
244 return (SHELL_SUCCESS
);
248 Function to read in HII configuration information from a file.
250 @param[in] Handle The handle to get info for.
251 @param[in] FileName The filename to read the info from.
256 IN EFI_HANDLE Handle
,
257 IN CONST CHAR16
*FileName
260 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
264 UINTN MainBufferSize
;
265 EFI_HII_HANDLE HiiHandle
;
266 SHELL_FILE_HANDLE FileHandle
;
267 CHAR16
*TempDevPathString
;
268 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
269 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
270 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
278 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
279 if (EFI_ERROR(Status
)) {
284 STRING_TOKEN(STR_GEN_FILE_OPEN
),
285 gShellDriver1HiiHandle
,
288 return (SHELL_DEVICE_ERROR
);
292 // Locate HII Database protocol
294 Status
= gBS
->LocateProtocol (
295 &gEfiHiiDatabaseProtocolGuid
,
297 (VOID
**) &HiiDatabase
300 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
305 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
306 gShellDriver1HiiHandle
,
307 L
"EfiHiiDatabaseProtocol",
308 &gEfiHiiDatabaseProtocolGuid
);
309 ShellCloseFile(&FileHandle
);
310 return (SHELL_NOT_FOUND
);
313 Status
= ShellGetFileSize(FileHandle
, &Temp
);
314 MainBufferSize
= (UINTN
)Temp
;
315 if (EFI_ERROR(Status
)) {
320 STRING_TOKEN(STR_FILE_READ_FAIL
),
321 gShellDriver1HiiHandle
,
324 ShellCloseFile(&FileHandle
);
325 return (SHELL_DEVICE_ERROR
);
327 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
328 if (EFI_ERROR(Status
)) {
333 STRING_TOKEN(STR_GEN_OUT_MEM
),
334 gShellDriver1HiiHandle
);
335 ShellCloseFile(&FileHandle
);
336 return (SHELL_DEVICE_ERROR
);
338 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
339 if (EFI_ERROR(Status
)) {
344 STRING_TOKEN(STR_FILE_READ_FAIL
),
345 gShellDriver1HiiHandle
,
348 ShellCloseFile(&FileHandle
);
349 SHELL_FREE_NON_NULL(MainBuffer
);
350 return (SHELL_DEVICE_ERROR
);
353 ShellCloseFile(&FileHandle
);
355 if (Handle
!= NULL
) {
357 // User override in place. Just do it.
360 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
361 if (EFI_ERROR(Status
)) {
366 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
367 gShellDriver1HiiHandle
,
368 ConvertHandleToHandleIndex(Handle
),
370 ShellCloseFile(&FileHandle
);
371 return (SHELL_DEVICE_ERROR
);
373 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
374 if (EFI_ERROR(Status
)) {
379 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
380 gShellDriver1HiiHandle
,
381 L
"HiiDatabase->UpdatePackageList",
383 return (SHELL_DEVICE_ERROR
);
387 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
390 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
391 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
392 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
393 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
394 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
395 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
396 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
398 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
399 if (EFI_ERROR(Status
)) {
401 // print out an error.
403 TempDevPathString
= gDevPathToText
->ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
408 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
409 gShellDriver1HiiHandle
,
411 SHELL_FREE_NON_NULL(TempDevPathString
);
413 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
414 if (EFI_ERROR(Status
)) {
419 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
420 gShellDriver1HiiHandle
,
421 L
"HiiDatabase->UpdatePackageList",
423 return (SHELL_DEVICE_ERROR
);
425 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
426 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
427 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
432 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
433 gShellDriver1HiiHandle
,
442 SHELL_FREE_NON_NULL(MainBuffer
);
449 STRING_TOKEN(STR_DRVCFG_COMP
),
450 gShellDriver1HiiHandle
);
451 return (SHELL_SUCCESS
);
456 ShellCmdDriverConfigurationProcessActionRequired (
457 EFI_HANDLE DriverImageHandle
,
458 EFI_HANDLE ControllerHandle
,
459 EFI_HANDLE ChildHandle
,
460 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
463 EFI_HANDLE ConnectControllerContextOverride
[2];
465 switch (ActionRequired
) {
466 case EfiDriverConfigurationActionNone
:
467 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
470 case EfiDriverConfigurationActionStopController
:
471 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
472 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
473 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
475 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
476 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
479 case EfiDriverConfigurationActionRestartController
:
480 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
481 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
482 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
484 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
485 ConnectControllerContextOverride
[0] = DriverImageHandle
;
486 ConnectControllerContextOverride
[1] = NULL
;
487 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
488 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
491 case EfiDriverConfigurationActionRestartPlatform
:
492 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
493 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
494 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
496 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
500 return (EFI_INVALID_PARAMETER
);
510 IN CONST CHAR8
*Language
,
511 IN BOOLEAN ForceDefaults
,
512 IN UINT32 DefaultType
,
513 IN BOOLEAN AllChildren
,
514 IN BOOLEAN ValidateOptions
,
515 IN BOOLEAN SetOptions
,
516 IN EFI_HANDLE DriverImageHandle
,
517 IN EFI_HANDLE DeviceHandle
,
518 IN EFI_HANDLE ChildHandle
522 SHELL_STATUS ShellStatus
;
523 UINTN OuterLoopCounter
;
525 UINTN DriverImageHandleCount
;
526 EFI_HANDLE
*DriverImageHandleBuffer
;
528 EFI_HANDLE
*HandleBuffer
;
532 UINTN ChildHandleCount
;
533 EFI_HANDLE
*ChildHandleBuffer
;
534 UINTN
*ChildHandleType
;
535 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
536 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
537 BOOLEAN Iso639Language
;
542 ShellStatus
= SHELL_SUCCESS
;
544 if (ChildHandle
== NULL
&& AllChildren
) {
553 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
554 gShellDriver1HiiHandle
,
556 } else if (ValidateOptions
) {
561 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
562 gShellDriver1HiiHandle
);
563 } else if (SetOptions
) {
568 STRING_TOKEN (STR_DRVCFG_SET
),
569 gShellDriver1HiiHandle
);
572 if (DriverImageHandle
== 0) {
573 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
574 if (DriverImageHandleBuffer
== NULL
) {
575 ShellStatus
= SHELL_NOT_FOUND
;
579 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
580 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
581 ; HandleBuffer
++,DriverImageHandleCount
++);
583 DriverImageHandleCount
= 1;
585 // Allocate buffer to hold the image handle so as to
586 // keep consistent with the above clause
588 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
589 ASSERT (DriverImageHandleBuffer
);
590 DriverImageHandleBuffer
[0] = DriverImageHandle
;
593 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
594 Iso639Language
= FALSE
;
595 Status
= gBS
->OpenProtocol (
596 DriverImageHandleBuffer
[OuterLoopCounter
],
597 &gEfiDriverConfiguration2ProtocolGuid
,
598 (VOID
**) &DriverConfiguration
,
601 EFI_OPEN_PROTOCOL_GET_PROTOCOL
603 if (EFI_ERROR (Status
)) {
604 Iso639Language
= TRUE
;
605 Status
= gBS
->OpenProtocol (
606 DriverImageHandleBuffer
[OuterLoopCounter
],
607 &gEfiDriverConfigurationProtocolGuid
,
608 (VOID
**) &DriverConfiguration
,
611 EFI_OPEN_PROTOCOL_GET_PROTOCOL
614 if (EFI_ERROR (Status
)) {
619 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
620 // gShellDriver1HiiHandle,
621 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
623 ShellStatus
= SHELL_UNSUPPORTED
;
627 BestLanguage
= GetBestLanguage (
628 DriverConfiguration
->SupportedLanguages
,
630 Language
!=NULL
?Language
:"",
631 DriverConfiguration
->SupportedLanguages
,
634 if (BestLanguage
== NULL
) {
639 STRING_TOKEN (STR_GEN_PROBLEM_VAL
),
640 gShellDriver1HiiHandle
,
643 ShellStatus
= SHELL_INVALID_PARAMETER
;
647 Status
= ParseHandleDatabaseByRelationshipWithType (
648 DriverImageHandleBuffer
[OuterLoopCounter
],
654 if (EFI_ERROR (Status
)) {
658 if (SetOptions
&& DeviceHandle
== NULL
) {
660 gST
->ConOut
->ClearScreen (gST
->ConOut
);
661 Status
= DriverConfiguration
->SetOptions (
668 gST
->ConOut
->ClearScreen (gST
->ConOut
);
674 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
675 gShellDriver1HiiHandle
,
676 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
677 DriverConfiguration
->SupportedLanguages
679 if (!EFI_ERROR (Status
)) {
684 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
685 gShellDriver1HiiHandle
);
686 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
687 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
688 ShellCmdDriverConfigurationProcessActionRequired (
689 DriverImageHandleBuffer
[OuterLoopCounter
],
690 HandleBuffer
[LoopCounter
],
701 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
702 gShellDriver1HiiHandle
,
708 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
709 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
712 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
715 if (ChildHandle
== NULL
) {
716 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
717 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
722 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
723 gShellDriver1HiiHandle
,
726 DriverConfiguration
->SupportedLanguages
730 Status
= DriverConfiguration
->ForceDefaults (
732 HandleBuffer
[LoopCounter
],
738 if (!EFI_ERROR (Status
)) {
743 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
744 gShellDriver1HiiHandle
);
745 ShellCmdDriverConfigurationProcessActionRequired (
746 DriverImageHandleBuffer
[OuterLoopCounter
],
747 HandleBuffer
[LoopCounter
],
756 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
757 gShellDriver1HiiHandle
,
759 ShellStatus
= SHELL_DEVICE_ERROR
;
761 } else if (ValidateOptions
) {
762 Status
= DriverConfiguration
->OptionsValid (
764 HandleBuffer
[LoopCounter
],
768 if (!EFI_ERROR (Status
)) {
773 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
774 gShellDriver1HiiHandle
);
780 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
781 gShellDriver1HiiHandle
,
783 ShellStatus
= SHELL_DEVICE_ERROR
;
785 } else if (SetOptions
) {
786 gST
->ConOut
->ClearScreen (gST
->ConOut
);
787 Status
= DriverConfiguration
->SetOptions (
789 HandleBuffer
[LoopCounter
],
794 gST
->ConOut
->ClearScreen (gST
->ConOut
);
795 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
796 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
801 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
802 gShellDriver1HiiHandle
,
805 DriverConfiguration
->SupportedLanguages
807 if (!EFI_ERROR (Status
)) {
812 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
813 gShellDriver1HiiHandle
);
815 ShellCmdDriverConfigurationProcessActionRequired (
816 DriverImageHandleBuffer
[OuterLoopCounter
],
817 HandleBuffer
[LoopCounter
],
827 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
828 gShellDriver1HiiHandle
,
830 ShellStatus
= SHELL_DEVICE_ERROR
;
837 if (ChildHandle
== NULL
&& !AllChildren
) {
841 Status
= ParseHandleDatabaseByRelationshipWithType (
842 DriverImageHandleBuffer
[OuterLoopCounter
],
843 HandleBuffer
[LoopCounter
],
848 if (EFI_ERROR (Status
)) {
852 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
854 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
858 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
862 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
863 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
864 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
869 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
870 gShellDriver1HiiHandle
,
874 DriverConfiguration
->SupportedLanguages
);
877 Status
= DriverConfiguration
->ForceDefaults (
879 HandleBuffer
[LoopCounter
],
880 ChildHandleBuffer
[ChildIndex
],
885 if (!EFI_ERROR (Status
)) {
890 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
891 gShellDriver1HiiHandle
);
893 ShellCmdDriverConfigurationProcessActionRequired (
894 DriverImageHandleBuffer
[OuterLoopCounter
],
895 HandleBuffer
[LoopCounter
],
896 ChildHandleBuffer
[ChildIndex
],
905 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
906 gShellDriver1HiiHandle
,
908 ShellStatus
= SHELL_DEVICE_ERROR
;
910 } else if (ValidateOptions
) {
911 Status
= DriverConfiguration
->OptionsValid (
913 HandleBuffer
[LoopCounter
],
914 ChildHandleBuffer
[ChildIndex
]
917 if (!EFI_ERROR (Status
)) {
922 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
923 gShellDriver1HiiHandle
);
929 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
930 gShellDriver1HiiHandle
,
932 ShellStatus
= SHELL_DEVICE_ERROR
;
934 } else if (SetOptions
) {
935 gST
->ConOut
->ClearScreen (gST
->ConOut
);
936 Status
= DriverConfiguration
->SetOptions (
938 HandleBuffer
[LoopCounter
],
939 ChildHandleBuffer
[ChildIndex
],
943 gST
->ConOut
->ClearScreen (gST
->ConOut
);
944 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
945 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
946 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
951 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
952 gShellDriver1HiiHandle
,
956 DriverConfiguration
->SupportedLanguages
958 if (!EFI_ERROR (Status
)) {
963 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
964 gShellDriver1HiiHandle
);
966 ShellCmdDriverConfigurationProcessActionRequired (
967 DriverImageHandleBuffer
[OuterLoopCounter
],
968 HandleBuffer
[LoopCounter
],
969 ChildHandleBuffer
[ChildIndex
],
978 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
979 gShellDriver1HiiHandle
,
981 ShellStatus
= SHELL_DEVICE_ERROR
;
988 FreePool (ChildHandleBuffer
);
989 FreePool (ChildHandleType
);
992 FreePool (BestLanguage
);
993 FreePool (HandleBuffer
);
994 FreePool (HandleType
);
997 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
998 FreePool (DriverImageHandleBuffer
);
1006 Function to print out configuration information on all configurable handles.
1008 @param[in] ChildrenToo TRUE to tewst for children.
1009 @param[in] Language ASCII string for language code.
1010 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1012 @retval SHELL_SUCCESS The operation was successful.
1016 PrintConfigInfoOnAll(
1017 IN CONST BOOLEAN ChildrenToo
,
1018 IN CONST CHAR8
*Language
,
1019 IN CONST BOOLEAN UseHii
1022 EFI_HANDLE
*HandleList
;
1023 EFI_HANDLE
*CurrentHandle
;
1030 CurrentHandle
= NULL
;
1036 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1037 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1039 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1044 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1045 gShellDriver1HiiHandle
,
1049 SHELL_FREE_NON_NULL(HandleList
);
1061 0) == SHELL_SUCCESS
) {
1066 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
1067 return (SHELL_SUCCESS
);
1070 return (SHELL_SUCCESS
);
1073 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1081 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1091 Function for 'drvcfg' command.
1093 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1094 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1098 ShellCommandRunDrvCfg (
1099 IN EFI_HANDLE ImageHandle
,
1100 IN EFI_SYSTEM_TABLE
*SystemTable
1104 LIST_ENTRY
*Package
;
1105 CHAR16
*ProblemParam
;
1106 SHELL_STATUS ShellStatus
;
1109 CONST CHAR16
*HandleIndex1
;
1110 CONST CHAR16
*HandleIndex2
;
1111 CONST CHAR16
*HandleIndex3
;
1112 CONST CHAR16
*ForceTypeString
;
1118 BOOLEAN AllChildren
;
1121 UINT64 Intermediate
;
1125 CONST CHAR16
*FileName
;
1127 ShellStatus
= SHELL_SUCCESS
;
1128 Status
= EFI_SUCCESS
;
1133 // initialize the shell lib (we must be in non-auto-init...)
1135 Status
= ShellInitialize();
1136 ASSERT_EFI_ERROR(Status
);
1138 Status
= CommandInit();
1139 ASSERT_EFI_ERROR(Status
);
1142 // parse the command line
1144 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1145 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1147 if (Package
!= NULL
) {
1148 ShellCommandLineFreeVarList (Package
);
1150 SHELL_FREE_NON_NULL(ProblemParam
);
1151 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1152 if (EFI_ERROR(Status
)) {
1153 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1154 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
1155 FreePool(ProblemParam
);
1156 ShellStatus
= SHELL_INVALID_PARAMETER
;
1163 if (ShellStatus
== SHELL_SUCCESS
) {
1164 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1166 Language
= AllocateZeroPool(StrSize(Lang
));
1167 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1168 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1169 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
1170 ShellStatus
= SHELL_INVALID_PARAMETER
;
1173 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1174 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1175 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1176 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1177 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1178 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1179 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1182 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1183 } else if (InFromFile
) {
1184 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1189 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1190 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, FileName
);
1191 ShellStatus
= SHELL_INVALID_PARAMETER
;
1194 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1195 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, FileName
);
1196 ShellStatus
= SHELL_INVALID_PARAMETER
;
1199 if (Force
&& ForceTypeString
== NULL
) {
1200 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-f");
1201 ShellStatus
= SHELL_INVALID_PARAMETER
;
1205 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1206 if (EFI_ERROR(Status
)) {
1207 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"-f");
1208 ShellStatus
= SHELL_INVALID_PARAMETER
;
1211 ForceType
= (UINT32
)Intermediate
;
1215 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1217 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1218 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1219 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1220 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex1
);
1221 ShellStatus
= SHELL_INVALID_PARAMETER
;
1225 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1227 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1228 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1229 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1230 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex2
);
1231 ShellStatus
= SHELL_INVALID_PARAMETER
;
1235 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1237 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1238 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1239 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1240 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex3
);
1241 ShellStatus
= SHELL_INVALID_PARAMETER
;
1246 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1247 if (FileName
== NULL
) {
1248 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, InFromFile
?L
"-i":L
"-o");
1250 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
);
1252 ShellStatus
= SHELL_INVALID_PARAMETER
;
1255 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1257 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-i");
1258 ShellStatus
= SHELL_INVALID_PARAMETER
;
1262 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-o");
1263 ShellStatus
= SHELL_INVALID_PARAMETER
;
1267 if (Validate
&& Force
) {
1268 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-f");
1269 ShellStatus
= SHELL_INVALID_PARAMETER
;
1272 if (Validate
&& Set
) {
1273 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-s");
1274 ShellStatus
= SHELL_INVALID_PARAMETER
;
1278 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-s", L
"-f");
1279 ShellStatus
= SHELL_INVALID_PARAMETER
;
1282 if (OutToFile
&& InFromFile
) {
1283 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-i", L
"-o");
1284 ShellStatus
= SHELL_INVALID_PARAMETER
;
1292 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1294 // no HII on this handle.
1296 ShellStatus
= SHELL_UNSUPPORTED
;
1297 } else if (Validate
) {
1300 } else if (InFromFile
) {
1301 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1302 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1305 } else if (OutToFile
) {
1306 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1307 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1310 } else if (HandleIndex1
== NULL
) {
1312 // display all that are configurable
1314 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1317 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1322 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1323 gShellDriver1HiiHandle
,
1324 ConvertHandleToHandleIndex(Handle1
)
1332 // We allways need to do this one since it does both by default.
1334 if (!InFromFile
&& !OutToFile
) {
1335 ShellStatus
= PreHiiDrvCfg (
1347 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1352 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1353 gShellDriver1HiiHandle
,
1354 ConvertHandleToHandleIndex(Handle1
)
1360 ShellCommandLineFreeVarList (Package
);
1361 SHELL_FREE_NON_NULL(Language
);
1362 return (ShellStatus
);