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 ASSERT (HandleBuffer
!= NULL
);
60 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
62 if (EFI_ERROR(Status
)) {
63 SHELL_FREE_NON_NULL(HandleBuffer
);
67 if (HandleBuffer
== NULL
) {
71 for (LoopVariable
= 0 ; LoopVariable
< (HandleBufferSize
/sizeof(HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
74 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
75 if (Status
== EFI_BUFFER_TOO_SMALL
) {
76 MainBuffer
= AllocateZeroPool(MainBufferSize
);
77 ASSERT (MainBuffer
!= NULL
);
78 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
81 // Enumerate through the block of returned memory.
82 // This should actually be a small block, but we need to be sure.
84 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
85 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
86 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
87 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
88 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
89 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
90 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
91 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
92 if (DevicePathCompare(&DevPath1
, &DevPath2
) == 0) {
93 *HiiHandle
= HandleBuffer
[LoopVariable
];
99 SHELL_FREE_NON_NULL(MainBuffer
);
101 SHELL_FREE_NON_NULL(HandleBuffer
);
103 if (*HiiHandle
== NULL
) {
104 return (EFI_NOT_FOUND
);
106 return (EFI_SUCCESS
);
110 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
112 @param[in] Handle The EFI_HANDLE to convert.
113 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
114 @param[in] HiiDb The Hii database protocol
116 @retval EFI_SUCCESS The operation was successful.
120 ConvertHandleToHiiHandle(
121 IN CONST EFI_HANDLE Handle
,
122 OUT EFI_HII_HANDLE
*HiiHandle
,
123 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
127 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
129 if (HiiHandle
== NULL
|| HiiDb
== NULL
) {
130 return (EFI_INVALID_PARAMETER
);
134 if (Handle
== NULL
) {
135 return (EFI_SUCCESS
);
139 Status
= gBS
->OpenProtocol(Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
140 if (EFI_ERROR(Status
) || DevPath1
== NULL
) {
141 return (EFI_NOT_FOUND
);
144 return (FindHiiHandleViaDevPath(DevPath1
, HiiHandle
, HiiDb
));
148 Function to print out all HII configuration information to a file.
150 @param[in] Handle The handle to get info on. NULL to do all handles.
151 @param[in] FileName The filename to rwite the info to.
156 IN CONST EFI_HANDLE Handle
,
157 IN CONST CHAR16
*FileName
160 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
163 UINTN MainBufferSize
;
164 EFI_HII_HANDLE HiiHandle
;
165 SHELL_FILE_HANDLE FileHandle
;
172 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
173 if (EFI_ERROR(Status
)) {
178 STRING_TOKEN(STR_GEN_FILE_OPEN
),
179 gShellDriver1HiiHandle
,
182 return (SHELL_DEVICE_ERROR
);
186 // Locate HII Database protocol
188 Status
= gBS
->LocateProtocol (
189 &gEfiHiiDatabaseProtocolGuid
,
191 (VOID
**) &HiiDatabase
194 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
199 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
200 gShellDriver1HiiHandle
,
201 L
"EfiHiiDatabaseProtocol",
202 &gEfiHiiDatabaseProtocolGuid
);
203 ShellCloseFile(&FileHandle
);
204 return (SHELL_NOT_FOUND
);
207 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
208 if (EFI_ERROR(Status
)) {
213 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
214 gShellDriver1HiiHandle
,
215 ConvertHandleToHandleIndex(Handle
),
217 ShellCloseFile(&FileHandle
);
218 return (SHELL_DEVICE_ERROR
);
221 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
222 if (Status
== EFI_BUFFER_TOO_SMALL
) {
223 MainBuffer
= AllocateZeroPool(MainBufferSize
);
224 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
227 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
229 ShellCloseFile(&FileHandle
);
230 SHELL_FREE_NON_NULL(MainBuffer
);
232 if (EFI_ERROR(Status
)) {
237 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
238 gShellDriver1HiiHandle
,
241 return (SHELL_DEVICE_ERROR
);
247 STRING_TOKEN(STR_DRVCFG_COMP
),
248 gShellDriver1HiiHandle
);
250 return (SHELL_SUCCESS
);
254 Function to read in HII configuration information from a file.
256 @param[in] Handle The handle to get info for.
257 @param[in] FileName The filename to read the info from.
262 IN EFI_HANDLE Handle
,
263 IN CONST CHAR16
*FileName
266 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
270 UINTN MainBufferSize
;
271 EFI_HII_HANDLE HiiHandle
;
272 SHELL_FILE_HANDLE FileHandle
;
273 CHAR16
*TempDevPathString
;
274 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
275 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
276 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
284 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
285 if (EFI_ERROR(Status
)) {
290 STRING_TOKEN(STR_GEN_FILE_OPEN
),
291 gShellDriver1HiiHandle
,
294 return (SHELL_DEVICE_ERROR
);
298 // Locate HII Database protocol
300 Status
= gBS
->LocateProtocol (
301 &gEfiHiiDatabaseProtocolGuid
,
303 (VOID
**) &HiiDatabase
306 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
311 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
312 gShellDriver1HiiHandle
,
313 L
"EfiHiiDatabaseProtocol",
314 &gEfiHiiDatabaseProtocolGuid
);
315 ShellCloseFile(&FileHandle
);
316 return (SHELL_NOT_FOUND
);
319 Status
= ShellGetFileSize(FileHandle
, &Temp
);
320 MainBufferSize
= (UINTN
)Temp
;
321 if (EFI_ERROR(Status
)) {
326 STRING_TOKEN(STR_FILE_READ_FAIL
),
327 gShellDriver1HiiHandle
,
330 ShellCloseFile(&FileHandle
);
331 return (SHELL_DEVICE_ERROR
);
333 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
334 if (EFI_ERROR(Status
)) {
339 STRING_TOKEN(STR_GEN_OUT_MEM
),
340 gShellDriver1HiiHandle
);
341 ShellCloseFile(&FileHandle
);
342 return (SHELL_DEVICE_ERROR
);
344 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
345 if (EFI_ERROR(Status
)) {
350 STRING_TOKEN(STR_FILE_READ_FAIL
),
351 gShellDriver1HiiHandle
,
354 ShellCloseFile(&FileHandle
);
355 SHELL_FREE_NON_NULL(MainBuffer
);
356 return (SHELL_DEVICE_ERROR
);
359 ShellCloseFile(&FileHandle
);
361 if (Handle
!= NULL
) {
363 // User override in place. Just do it.
366 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
367 if (EFI_ERROR(Status
)) {
372 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
373 gShellDriver1HiiHandle
,
374 ConvertHandleToHandleIndex(Handle
),
376 ShellCloseFile(&FileHandle
);
377 return (SHELL_DEVICE_ERROR
);
379 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
380 if (EFI_ERROR(Status
)) {
385 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
386 gShellDriver1HiiHandle
,
387 L
"HiiDatabase->UpdatePackageList",
389 return (SHELL_DEVICE_ERROR
);
393 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
396 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
397 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
398 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
399 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
400 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
401 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
402 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
404 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
405 if (EFI_ERROR(Status
)) {
407 // print out an error.
409 TempDevPathString
= gDevPathToText
->ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
414 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
415 gShellDriver1HiiHandle
,
417 SHELL_FREE_NON_NULL(TempDevPathString
);
419 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
420 if (EFI_ERROR(Status
)) {
425 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
426 gShellDriver1HiiHandle
,
427 L
"HiiDatabase->UpdatePackageList",
429 return (SHELL_DEVICE_ERROR
);
431 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
432 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
433 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
438 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
439 gShellDriver1HiiHandle
,
448 SHELL_FREE_NON_NULL(MainBuffer
);
455 STRING_TOKEN(STR_DRVCFG_COMP
),
456 gShellDriver1HiiHandle
);
457 return (SHELL_SUCCESS
);
462 ShellCmdDriverConfigurationProcessActionRequired (
463 EFI_HANDLE DriverImageHandle
,
464 EFI_HANDLE ControllerHandle
,
465 EFI_HANDLE ChildHandle
,
466 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
469 EFI_HANDLE ConnectControllerContextOverride
[2];
471 switch (ActionRequired
) {
472 case EfiDriverConfigurationActionNone
:
473 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
476 case EfiDriverConfigurationActionStopController
:
477 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
478 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
479 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
481 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
482 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
485 case EfiDriverConfigurationActionRestartController
:
486 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
487 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
488 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
490 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
491 ConnectControllerContextOverride
[0] = DriverImageHandle
;
492 ConnectControllerContextOverride
[1] = NULL
;
493 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
494 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
497 case EfiDriverConfigurationActionRestartPlatform
:
498 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
499 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
500 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
502 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
506 return (EFI_INVALID_PARAMETER
);
516 IN CONST CHAR8
*Language
,
517 IN BOOLEAN ForceDefaults
,
518 IN UINT32 DefaultType
,
519 IN BOOLEAN AllChildren
,
520 IN BOOLEAN ValidateOptions
,
521 IN BOOLEAN SetOptions
,
522 IN EFI_HANDLE DriverImageHandle
,
523 IN EFI_HANDLE DeviceHandle
,
524 IN EFI_HANDLE ChildHandle
528 SHELL_STATUS ShellStatus
;
529 UINTN OuterLoopCounter
;
531 UINTN DriverImageHandleCount
;
532 EFI_HANDLE
*DriverImageHandleBuffer
;
534 EFI_HANDLE
*HandleBuffer
;
538 UINTN ChildHandleCount
;
539 EFI_HANDLE
*ChildHandleBuffer
;
540 UINTN
*ChildHandleType
;
541 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
542 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
543 BOOLEAN Iso639Language
;
548 ShellStatus
= SHELL_SUCCESS
;
550 if (ChildHandle
== NULL
&& AllChildren
) {
559 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
560 gShellDriver1HiiHandle
,
562 } else if (ValidateOptions
) {
567 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
568 gShellDriver1HiiHandle
);
569 } else if (SetOptions
) {
574 STRING_TOKEN (STR_DRVCFG_SET
),
575 gShellDriver1HiiHandle
);
578 if (DriverImageHandle
== 0) {
579 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
580 if (DriverImageHandleBuffer
== NULL
) {
581 ShellStatus
= SHELL_NOT_FOUND
;
585 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
586 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
587 ; HandleBuffer
++,DriverImageHandleCount
++);
589 DriverImageHandleCount
= 1;
591 // Allocate buffer to hold the image handle so as to
592 // keep consistent with the above clause
594 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
595 ASSERT (DriverImageHandleBuffer
);
596 DriverImageHandleBuffer
[0] = DriverImageHandle
;
599 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
600 Iso639Language
= FALSE
;
601 Status
= gBS
->OpenProtocol (
602 DriverImageHandleBuffer
[OuterLoopCounter
],
603 &gEfiDriverConfiguration2ProtocolGuid
,
604 (VOID
**) &DriverConfiguration
,
607 EFI_OPEN_PROTOCOL_GET_PROTOCOL
609 if (EFI_ERROR (Status
)) {
610 Iso639Language
= TRUE
;
611 Status
= gBS
->OpenProtocol (
612 DriverImageHandleBuffer
[OuterLoopCounter
],
613 &gEfiDriverConfigurationProtocolGuid
,
614 (VOID
**) &DriverConfiguration
,
617 EFI_OPEN_PROTOCOL_GET_PROTOCOL
620 if (EFI_ERROR (Status
)) {
625 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
626 // gShellDriver1HiiHandle,
627 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
629 ShellStatus
= SHELL_UNSUPPORTED
;
633 BestLanguage
= GetBestLanguage (
634 DriverConfiguration
->SupportedLanguages
,
636 Language
!=NULL
?Language
:"",
637 DriverConfiguration
->SupportedLanguages
,
640 if (BestLanguage
== NULL
) {
645 STRING_TOKEN (STR_GEN_PROBLEM_VAL
),
646 gShellDriver1HiiHandle
,
649 ShellStatus
= SHELL_INVALID_PARAMETER
;
653 Status
= ParseHandleDatabaseByRelationshipWithType (
654 DriverImageHandleBuffer
[OuterLoopCounter
],
660 if (EFI_ERROR (Status
)) {
664 if (SetOptions
&& DeviceHandle
== NULL
) {
666 gST
->ConOut
->ClearScreen (gST
->ConOut
);
667 Status
= DriverConfiguration
->SetOptions (
674 gST
->ConOut
->ClearScreen (gST
->ConOut
);
680 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
681 gShellDriver1HiiHandle
,
682 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
683 DriverConfiguration
->SupportedLanguages
685 if (!EFI_ERROR (Status
)) {
690 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
691 gShellDriver1HiiHandle
);
692 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
693 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
694 ShellCmdDriverConfigurationProcessActionRequired (
695 DriverImageHandleBuffer
[OuterLoopCounter
],
696 HandleBuffer
[LoopCounter
],
707 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
708 gShellDriver1HiiHandle
,
714 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
715 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
718 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
721 if (ChildHandle
== NULL
) {
722 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
723 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
728 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
729 gShellDriver1HiiHandle
,
732 DriverConfiguration
->SupportedLanguages
736 Status
= DriverConfiguration
->ForceDefaults (
738 HandleBuffer
[LoopCounter
],
744 if (!EFI_ERROR (Status
)) {
749 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
750 gShellDriver1HiiHandle
);
751 ShellCmdDriverConfigurationProcessActionRequired (
752 DriverImageHandleBuffer
[OuterLoopCounter
],
753 HandleBuffer
[LoopCounter
],
762 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
763 gShellDriver1HiiHandle
,
765 ShellStatus
= SHELL_DEVICE_ERROR
;
767 } else if (ValidateOptions
) {
768 Status
= DriverConfiguration
->OptionsValid (
770 HandleBuffer
[LoopCounter
],
774 if (!EFI_ERROR (Status
)) {
779 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
780 gShellDriver1HiiHandle
);
786 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
787 gShellDriver1HiiHandle
,
789 ShellStatus
= SHELL_DEVICE_ERROR
;
791 } else if (SetOptions
) {
792 gST
->ConOut
->ClearScreen (gST
->ConOut
);
793 Status
= DriverConfiguration
->SetOptions (
795 HandleBuffer
[LoopCounter
],
800 gST
->ConOut
->ClearScreen (gST
->ConOut
);
801 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
802 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
807 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
808 gShellDriver1HiiHandle
,
811 DriverConfiguration
->SupportedLanguages
813 if (!EFI_ERROR (Status
)) {
818 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
819 gShellDriver1HiiHandle
);
821 ShellCmdDriverConfigurationProcessActionRequired (
822 DriverImageHandleBuffer
[OuterLoopCounter
],
823 HandleBuffer
[LoopCounter
],
833 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
834 gShellDriver1HiiHandle
,
836 ShellStatus
= SHELL_DEVICE_ERROR
;
843 if (ChildHandle
== NULL
&& !AllChildren
) {
847 Status
= ParseHandleDatabaseByRelationshipWithType (
848 DriverImageHandleBuffer
[OuterLoopCounter
],
849 HandleBuffer
[LoopCounter
],
854 if (EFI_ERROR (Status
)) {
858 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
860 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
864 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
868 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
869 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
870 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
875 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
876 gShellDriver1HiiHandle
,
880 DriverConfiguration
->SupportedLanguages
);
883 Status
= DriverConfiguration
->ForceDefaults (
885 HandleBuffer
[LoopCounter
],
886 ChildHandleBuffer
[ChildIndex
],
891 if (!EFI_ERROR (Status
)) {
896 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
897 gShellDriver1HiiHandle
);
899 ShellCmdDriverConfigurationProcessActionRequired (
900 DriverImageHandleBuffer
[OuterLoopCounter
],
901 HandleBuffer
[LoopCounter
],
902 ChildHandleBuffer
[ChildIndex
],
911 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
912 gShellDriver1HiiHandle
,
914 ShellStatus
= SHELL_DEVICE_ERROR
;
916 } else if (ValidateOptions
) {
917 Status
= DriverConfiguration
->OptionsValid (
919 HandleBuffer
[LoopCounter
],
920 ChildHandleBuffer
[ChildIndex
]
923 if (!EFI_ERROR (Status
)) {
928 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
929 gShellDriver1HiiHandle
);
935 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
936 gShellDriver1HiiHandle
,
938 ShellStatus
= SHELL_DEVICE_ERROR
;
940 } else if (SetOptions
) {
941 gST
->ConOut
->ClearScreen (gST
->ConOut
);
942 Status
= DriverConfiguration
->SetOptions (
944 HandleBuffer
[LoopCounter
],
945 ChildHandleBuffer
[ChildIndex
],
949 gST
->ConOut
->ClearScreen (gST
->ConOut
);
950 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
951 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
952 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
957 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
958 gShellDriver1HiiHandle
,
962 DriverConfiguration
->SupportedLanguages
964 if (!EFI_ERROR (Status
)) {
969 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
970 gShellDriver1HiiHandle
);
972 ShellCmdDriverConfigurationProcessActionRequired (
973 DriverImageHandleBuffer
[OuterLoopCounter
],
974 HandleBuffer
[LoopCounter
],
975 ChildHandleBuffer
[ChildIndex
],
984 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
985 gShellDriver1HiiHandle
,
987 ShellStatus
= SHELL_DEVICE_ERROR
;
994 FreePool (ChildHandleBuffer
);
995 FreePool (ChildHandleType
);
998 FreePool (BestLanguage
);
999 FreePool (HandleBuffer
);
1000 FreePool (HandleType
);
1003 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1004 FreePool (DriverImageHandleBuffer
);
1012 Function to print out configuration information on all configurable handles.
1014 @param[in] ChildrenToo TRUE to tewst for children.
1015 @param[in] Language ASCII string for language code.
1016 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1018 @retval SHELL_SUCCESS The operation was successful.
1022 PrintConfigInfoOnAll(
1023 IN CONST BOOLEAN ChildrenToo
,
1024 IN CONST CHAR8
*Language
,
1025 IN CONST BOOLEAN UseHii
1028 EFI_HANDLE
*HandleList
;
1029 EFI_HANDLE
*CurrentHandle
;
1036 CurrentHandle
= NULL
;
1042 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1043 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1045 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1050 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1051 gShellDriver1HiiHandle
,
1055 SHELL_FREE_NON_NULL(HandleList
);
1067 0) == SHELL_SUCCESS
) {
1072 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
1073 return (SHELL_SUCCESS
);
1076 return (SHELL_SUCCESS
);
1079 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1087 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1097 Function for 'drvcfg' command.
1099 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1100 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1104 ShellCommandRunDrvCfg (
1105 IN EFI_HANDLE ImageHandle
,
1106 IN EFI_SYSTEM_TABLE
*SystemTable
1110 LIST_ENTRY
*Package
;
1111 CHAR16
*ProblemParam
;
1112 SHELL_STATUS ShellStatus
;
1115 CONST CHAR16
*HandleIndex1
;
1116 CONST CHAR16
*HandleIndex2
;
1117 CONST CHAR16
*HandleIndex3
;
1118 CONST CHAR16
*ForceTypeString
;
1124 BOOLEAN AllChildren
;
1127 UINT64 Intermediate
;
1131 CONST CHAR16
*FileName
;
1133 ShellStatus
= SHELL_SUCCESS
;
1134 Status
= EFI_SUCCESS
;
1139 // initialize the shell lib (we must be in non-auto-init...)
1141 Status
= ShellInitialize();
1142 ASSERT_EFI_ERROR(Status
);
1144 Status
= CommandInit();
1145 ASSERT_EFI_ERROR(Status
);
1148 // parse the command line
1150 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1151 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1153 if (Package
!= NULL
) {
1154 ShellCommandLineFreeVarList (Package
);
1156 SHELL_FREE_NON_NULL(ProblemParam
);
1157 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1158 if (EFI_ERROR(Status
)) {
1159 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1160 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
1161 FreePool(ProblemParam
);
1162 ShellStatus
= SHELL_INVALID_PARAMETER
;
1169 if (ShellStatus
== SHELL_SUCCESS
) {
1170 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1172 Language
= AllocateZeroPool(StrSize(Lang
));
1173 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1174 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1175 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
1176 ShellStatus
= SHELL_INVALID_PARAMETER
;
1179 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1180 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1181 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1182 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1183 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1184 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1185 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1188 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1189 } else if (InFromFile
) {
1190 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1195 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1196 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, FileName
);
1197 ShellStatus
= SHELL_INVALID_PARAMETER
;
1200 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1201 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, FileName
);
1202 ShellStatus
= SHELL_INVALID_PARAMETER
;
1205 if (Force
&& ForceTypeString
== NULL
) {
1206 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-f");
1207 ShellStatus
= SHELL_INVALID_PARAMETER
;
1211 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1212 if (EFI_ERROR(Status
)) {
1213 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"-f");
1214 ShellStatus
= SHELL_INVALID_PARAMETER
;
1217 ForceType
= (UINT32
)Intermediate
;
1221 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1223 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1224 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1225 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1226 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex1
);
1227 ShellStatus
= SHELL_INVALID_PARAMETER
;
1231 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1233 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1234 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1235 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1236 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex2
);
1237 ShellStatus
= SHELL_INVALID_PARAMETER
;
1241 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1243 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1244 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1245 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1246 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex3
);
1247 ShellStatus
= SHELL_INVALID_PARAMETER
;
1252 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1253 if (FileName
== NULL
) {
1254 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, InFromFile
?L
"-i":L
"-o");
1256 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
);
1258 ShellStatus
= SHELL_INVALID_PARAMETER
;
1261 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1263 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-i");
1264 ShellStatus
= SHELL_INVALID_PARAMETER
;
1268 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-o");
1269 ShellStatus
= SHELL_INVALID_PARAMETER
;
1273 if (Validate
&& Force
) {
1274 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-f");
1275 ShellStatus
= SHELL_INVALID_PARAMETER
;
1278 if (Validate
&& Set
) {
1279 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-s");
1280 ShellStatus
= SHELL_INVALID_PARAMETER
;
1284 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-s", L
"-f");
1285 ShellStatus
= SHELL_INVALID_PARAMETER
;
1288 if (OutToFile
&& InFromFile
) {
1289 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-i", L
"-o");
1290 ShellStatus
= SHELL_INVALID_PARAMETER
;
1298 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1300 // no HII on this handle.
1302 ShellStatus
= SHELL_UNSUPPORTED
;
1303 } else if (Validate
) {
1306 } else if (InFromFile
) {
1307 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1308 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1311 } else if (OutToFile
) {
1312 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1313 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1316 } else if (HandleIndex1
== NULL
) {
1318 // display all that are configurable
1320 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1323 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1328 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1329 gShellDriver1HiiHandle
,
1330 ConvertHandleToHandleIndex(Handle1
)
1338 // We allways need to do this one since it does both by default.
1340 if (!InFromFile
&& !OutToFile
) {
1341 ShellStatus
= PreHiiDrvCfg (
1353 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1358 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1359 gShellDriver1HiiHandle
,
1360 ConvertHandleToHandleIndex(Handle1
)
1366 ShellCommandLineFreeVarList (Package
);
1367 SHELL_FREE_NON_NULL(Language
);
1368 return (ShellStatus
);