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 for (LoopVariable
= 0 ; LoopVariable
< (HandleBufferSize
/sizeof(HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
70 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
71 if (Status
== EFI_BUFFER_TOO_SMALL
) {
72 MainBuffer
= AllocateZeroPool(MainBufferSize
);
73 ASSERT (MainBuffer
!= NULL
);
74 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
77 // Enumerate through the block of returned memory.
78 // This should actually be a small block, but we need to be sure.
80 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
81 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
82 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
83 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
84 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
85 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
86 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
87 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
88 if (DevicePathCompare(&DevPath1
, &DevPath2
) == 0) {
89 *HiiHandle
= HandleBuffer
[LoopVariable
];
95 SHELL_FREE_NON_NULL(MainBuffer
);
97 SHELL_FREE_NON_NULL(HandleBuffer
);
99 if (*HiiHandle
== NULL
) {
100 return (EFI_NOT_FOUND
);
102 return (EFI_SUCCESS
);
106 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
108 @param[in] Handle The EFI_HANDLE to convert.
109 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
110 @param[in] HiiDb The Hii database protocol
112 @retval EFI_SUCCESS The operation was successful.
116 ConvertHandleToHiiHandle(
117 IN CONST EFI_HANDLE Handle
,
118 OUT EFI_HII_HANDLE
*HiiHandle
,
119 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
123 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
125 if (HiiHandle
== NULL
|| HiiDb
== NULL
) {
126 return (EFI_INVALID_PARAMETER
);
130 if (Handle
== NULL
) {
131 return (EFI_SUCCESS
);
135 Status
= gBS
->OpenProtocol(Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
136 if (EFI_ERROR(Status
) || DevPath1
== NULL
) {
137 return (EFI_NOT_FOUND
);
140 return (FindHiiHandleViaDevPath(DevPath1
, HiiHandle
, HiiDb
));
144 Function to print out all HII configuration information to a file.
146 @param[in] Handle The handle to get info on. NULL to do all handles.
147 @param[in] FileName The filename to rwite the info to.
152 IN CONST EFI_HANDLE Handle
,
153 IN CONST CHAR16
*FileName
156 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
159 UINTN MainBufferSize
;
160 EFI_HII_HANDLE HiiHandle
;
161 SHELL_FILE_HANDLE FileHandle
;
168 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
169 if (EFI_ERROR(Status
)) {
174 STRING_TOKEN(STR_GEN_FILE_OPEN
),
175 gShellDriver1HiiHandle
,
178 return (SHELL_DEVICE_ERROR
);
182 // Locate HII Database protocol
184 Status
= gBS
->LocateProtocol (
185 &gEfiHiiDatabaseProtocolGuid
,
187 (VOID
**) &HiiDatabase
190 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
195 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
196 gShellDriver1HiiHandle
,
197 L
"EfiHiiDatabaseProtocol",
198 &gEfiHiiDatabaseProtocolGuid
);
199 ShellCloseFile(&FileHandle
);
200 return (SHELL_NOT_FOUND
);
203 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
204 if (EFI_ERROR(Status
)) {
209 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
210 gShellDriver1HiiHandle
,
211 ConvertHandleToHandleIndex(Handle
),
213 ShellCloseFile(&FileHandle
);
214 return (SHELL_DEVICE_ERROR
);
217 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
218 if (Status
== EFI_BUFFER_TOO_SMALL
) {
219 MainBuffer
= AllocateZeroPool(MainBufferSize
);
220 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
223 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
225 ShellCloseFile(&FileHandle
);
226 SHELL_FREE_NON_NULL(MainBuffer
);
228 if (EFI_ERROR(Status
)) {
233 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
234 gShellDriver1HiiHandle
,
237 return (SHELL_DEVICE_ERROR
);
243 STRING_TOKEN(STR_DRVCFG_COMP
),
244 gShellDriver1HiiHandle
);
246 return (SHELL_SUCCESS
);
250 Function to read in HII configuration information from a file.
252 @param[in] Handle The handle to get info for.
253 @param[in] FileName The filename to read the info from.
258 IN EFI_HANDLE Handle
,
259 IN CONST CHAR16
*FileName
262 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
266 UINTN MainBufferSize
;
267 EFI_HII_HANDLE HiiHandle
;
268 SHELL_FILE_HANDLE FileHandle
;
269 CHAR16
*TempDevPathString
;
270 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
271 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
272 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
280 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
281 if (EFI_ERROR(Status
)) {
286 STRING_TOKEN(STR_GEN_FILE_OPEN
),
287 gShellDriver1HiiHandle
,
290 return (SHELL_DEVICE_ERROR
);
294 // Locate HII Database protocol
296 Status
= gBS
->LocateProtocol (
297 &gEfiHiiDatabaseProtocolGuid
,
299 (VOID
**) &HiiDatabase
302 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
307 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
308 gShellDriver1HiiHandle
,
309 L
"EfiHiiDatabaseProtocol",
310 &gEfiHiiDatabaseProtocolGuid
);
311 ShellCloseFile(&FileHandle
);
312 return (SHELL_NOT_FOUND
);
315 Status
= ShellGetFileSize(FileHandle
, &Temp
);
316 MainBufferSize
= (UINTN
)Temp
;
317 if (EFI_ERROR(Status
)) {
322 STRING_TOKEN(STR_FILE_READ_FAIL
),
323 gShellDriver1HiiHandle
,
326 ShellCloseFile(&FileHandle
);
327 return (SHELL_DEVICE_ERROR
);
329 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
330 if (EFI_ERROR(Status
)) {
335 STRING_TOKEN(STR_GEN_OUT_MEM
),
336 gShellDriver1HiiHandle
);
337 ShellCloseFile(&FileHandle
);
338 return (SHELL_DEVICE_ERROR
);
340 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
341 if (EFI_ERROR(Status
)) {
346 STRING_TOKEN(STR_FILE_READ_FAIL
),
347 gShellDriver1HiiHandle
,
350 ShellCloseFile(&FileHandle
);
351 SHELL_FREE_NON_NULL(MainBuffer
);
352 return (SHELL_DEVICE_ERROR
);
355 ShellCloseFile(&FileHandle
);
357 if (Handle
!= NULL
) {
359 // User override in place. Just do it.
362 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
363 if (EFI_ERROR(Status
)) {
368 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
369 gShellDriver1HiiHandle
,
370 ConvertHandleToHandleIndex(Handle
),
372 ShellCloseFile(&FileHandle
);
373 return (SHELL_DEVICE_ERROR
);
375 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
376 if (EFI_ERROR(Status
)) {
381 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
382 gShellDriver1HiiHandle
,
383 L
"HiiDatabase->UpdatePackageList",
385 return (SHELL_DEVICE_ERROR
);
389 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
392 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
393 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
394 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
395 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
396 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
397 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
398 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
400 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
401 if (EFI_ERROR(Status
)) {
403 // print out an error.
405 TempDevPathString
= gDevPathToText
->ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
410 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
411 gShellDriver1HiiHandle
,
413 SHELL_FREE_NON_NULL(TempDevPathString
);
415 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
416 if (EFI_ERROR(Status
)) {
421 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
422 gShellDriver1HiiHandle
,
423 L
"HiiDatabase->UpdatePackageList",
425 return (SHELL_DEVICE_ERROR
);
427 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
428 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
429 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
434 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
435 gShellDriver1HiiHandle
,
444 SHELL_FREE_NON_NULL(MainBuffer
);
451 STRING_TOKEN(STR_DRVCFG_COMP
),
452 gShellDriver1HiiHandle
);
453 return (SHELL_SUCCESS
);
458 ShellCmdDriverConfigurationProcessActionRequired (
459 EFI_HANDLE DriverImageHandle
,
460 EFI_HANDLE ControllerHandle
,
461 EFI_HANDLE ChildHandle
,
462 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
465 EFI_HANDLE ConnectControllerContextOverride
[2];
467 switch (ActionRequired
) {
468 case EfiDriverConfigurationActionNone
:
469 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
472 case EfiDriverConfigurationActionStopController
:
473 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
474 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
475 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
477 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
478 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
481 case EfiDriverConfigurationActionRestartController
:
482 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
483 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
484 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
486 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
487 ConnectControllerContextOverride
[0] = DriverImageHandle
;
488 ConnectControllerContextOverride
[1] = NULL
;
489 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
490 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
493 case EfiDriverConfigurationActionRestartPlatform
:
494 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
495 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
496 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
498 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
502 return (EFI_INVALID_PARAMETER
);
512 IN CONST CHAR8
*Language
,
513 IN BOOLEAN ForceDefaults
,
514 IN UINT32 DefaultType
,
515 IN BOOLEAN AllChildren
,
516 IN BOOLEAN ValidateOptions
,
517 IN BOOLEAN SetOptions
,
518 IN EFI_HANDLE DriverImageHandle
,
519 IN EFI_HANDLE DeviceHandle
,
520 IN EFI_HANDLE ChildHandle
524 SHELL_STATUS ShellStatus
;
525 UINTN OuterLoopCounter
;
527 UINTN DriverImageHandleCount
;
528 EFI_HANDLE
*DriverImageHandleBuffer
;
530 EFI_HANDLE
*HandleBuffer
;
534 UINTN ChildHandleCount
;
535 EFI_HANDLE
*ChildHandleBuffer
;
536 UINTN
*ChildHandleType
;
537 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
538 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
539 BOOLEAN Iso639Language
;
544 ShellStatus
= SHELL_SUCCESS
;
546 if (ChildHandle
== NULL
&& AllChildren
) {
555 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
556 gShellDriver1HiiHandle
,
558 } else if (ValidateOptions
) {
563 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
564 gShellDriver1HiiHandle
);
565 } else if (SetOptions
) {
570 STRING_TOKEN (STR_DRVCFG_SET
),
571 gShellDriver1HiiHandle
);
574 if (DriverImageHandle
== 0) {
575 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
576 if (DriverImageHandleBuffer
== NULL
) {
577 ShellStatus
= SHELL_NOT_FOUND
;
581 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
582 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
583 ; HandleBuffer
++,DriverImageHandleCount
++);
585 DriverImageHandleCount
= 1;
587 // Allocate buffer to hold the image handle so as to
588 // keep consistent with the above clause
590 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
591 ASSERT (DriverImageHandleBuffer
);
592 DriverImageHandleBuffer
[0] = DriverImageHandle
;
595 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
596 Iso639Language
= FALSE
;
597 Status
= gBS
->OpenProtocol (
598 DriverImageHandleBuffer
[OuterLoopCounter
],
599 &gEfiDriverConfiguration2ProtocolGuid
,
600 (VOID
**) &DriverConfiguration
,
603 EFI_OPEN_PROTOCOL_GET_PROTOCOL
605 if (EFI_ERROR (Status
)) {
606 Iso639Language
= TRUE
;
607 Status
= gBS
->OpenProtocol (
608 DriverImageHandleBuffer
[OuterLoopCounter
],
609 &gEfiDriverConfigurationProtocolGuid
,
610 (VOID
**) &DriverConfiguration
,
613 EFI_OPEN_PROTOCOL_GET_PROTOCOL
616 if (EFI_ERROR (Status
)) {
621 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
622 // gShellDriver1HiiHandle,
623 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
625 ShellStatus
= SHELL_UNSUPPORTED
;
629 BestLanguage
= GetBestLanguage (
630 DriverConfiguration
->SupportedLanguages
,
632 Language
!=NULL
?Language
:"",
633 DriverConfiguration
->SupportedLanguages
,
636 if (BestLanguage
== NULL
) {
641 STRING_TOKEN (STR_GEN_PROBLEM_VAL
),
642 gShellDriver1HiiHandle
,
645 ShellStatus
= SHELL_INVALID_PARAMETER
;
649 Status
= ParseHandleDatabaseByRelationshipWithType (
650 DriverImageHandleBuffer
[OuterLoopCounter
],
656 if (EFI_ERROR (Status
)) {
660 if (SetOptions
&& DeviceHandle
== NULL
) {
662 gST
->ConOut
->ClearScreen (gST
->ConOut
);
663 Status
= DriverConfiguration
->SetOptions (
670 gST
->ConOut
->ClearScreen (gST
->ConOut
);
676 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
677 gShellDriver1HiiHandle
,
678 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
679 DriverConfiguration
->SupportedLanguages
681 if (!EFI_ERROR (Status
)) {
686 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
687 gShellDriver1HiiHandle
);
688 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
689 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
690 ShellCmdDriverConfigurationProcessActionRequired (
691 DriverImageHandleBuffer
[OuterLoopCounter
],
692 HandleBuffer
[LoopCounter
],
703 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
704 gShellDriver1HiiHandle
,
710 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
711 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
714 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
717 if (ChildHandle
== NULL
) {
718 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
719 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
724 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
725 gShellDriver1HiiHandle
,
728 DriverConfiguration
->SupportedLanguages
732 Status
= DriverConfiguration
->ForceDefaults (
734 HandleBuffer
[LoopCounter
],
740 if (!EFI_ERROR (Status
)) {
745 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
746 gShellDriver1HiiHandle
);
747 ShellCmdDriverConfigurationProcessActionRequired (
748 DriverImageHandleBuffer
[OuterLoopCounter
],
749 HandleBuffer
[LoopCounter
],
758 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
759 gShellDriver1HiiHandle
,
761 ShellStatus
= SHELL_DEVICE_ERROR
;
763 } else if (ValidateOptions
) {
764 Status
= DriverConfiguration
->OptionsValid (
766 HandleBuffer
[LoopCounter
],
770 if (!EFI_ERROR (Status
)) {
775 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
776 gShellDriver1HiiHandle
);
782 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
783 gShellDriver1HiiHandle
,
785 ShellStatus
= SHELL_DEVICE_ERROR
;
787 } else if (SetOptions
) {
788 gST
->ConOut
->ClearScreen (gST
->ConOut
);
789 Status
= DriverConfiguration
->SetOptions (
791 HandleBuffer
[LoopCounter
],
796 gST
->ConOut
->ClearScreen (gST
->ConOut
);
797 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
798 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
803 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
804 gShellDriver1HiiHandle
,
807 DriverConfiguration
->SupportedLanguages
809 if (!EFI_ERROR (Status
)) {
814 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
815 gShellDriver1HiiHandle
);
817 ShellCmdDriverConfigurationProcessActionRequired (
818 DriverImageHandleBuffer
[OuterLoopCounter
],
819 HandleBuffer
[LoopCounter
],
829 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
830 gShellDriver1HiiHandle
,
832 ShellStatus
= SHELL_DEVICE_ERROR
;
839 if (ChildHandle
== NULL
&& !AllChildren
) {
843 Status
= ParseHandleDatabaseByRelationshipWithType (
844 DriverImageHandleBuffer
[OuterLoopCounter
],
845 HandleBuffer
[LoopCounter
],
850 if (EFI_ERROR (Status
)) {
854 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
856 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
860 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
864 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
865 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
866 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
871 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
872 gShellDriver1HiiHandle
,
876 DriverConfiguration
->SupportedLanguages
);
879 Status
= DriverConfiguration
->ForceDefaults (
881 HandleBuffer
[LoopCounter
],
882 ChildHandleBuffer
[ChildIndex
],
887 if (!EFI_ERROR (Status
)) {
892 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
893 gShellDriver1HiiHandle
);
895 ShellCmdDriverConfigurationProcessActionRequired (
896 DriverImageHandleBuffer
[OuterLoopCounter
],
897 HandleBuffer
[LoopCounter
],
898 ChildHandleBuffer
[ChildIndex
],
907 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
908 gShellDriver1HiiHandle
,
910 ShellStatus
= SHELL_DEVICE_ERROR
;
912 } else if (ValidateOptions
) {
913 Status
= DriverConfiguration
->OptionsValid (
915 HandleBuffer
[LoopCounter
],
916 ChildHandleBuffer
[ChildIndex
]
919 if (!EFI_ERROR (Status
)) {
924 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
925 gShellDriver1HiiHandle
);
931 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
932 gShellDriver1HiiHandle
,
934 ShellStatus
= SHELL_DEVICE_ERROR
;
936 } else if (SetOptions
) {
937 gST
->ConOut
->ClearScreen (gST
->ConOut
);
938 Status
= DriverConfiguration
->SetOptions (
940 HandleBuffer
[LoopCounter
],
941 ChildHandleBuffer
[ChildIndex
],
945 gST
->ConOut
->ClearScreen (gST
->ConOut
);
946 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
947 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
948 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
953 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
954 gShellDriver1HiiHandle
,
958 DriverConfiguration
->SupportedLanguages
960 if (!EFI_ERROR (Status
)) {
965 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
966 gShellDriver1HiiHandle
);
968 ShellCmdDriverConfigurationProcessActionRequired (
969 DriverImageHandleBuffer
[OuterLoopCounter
],
970 HandleBuffer
[LoopCounter
],
971 ChildHandleBuffer
[ChildIndex
],
980 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
981 gShellDriver1HiiHandle
,
983 ShellStatus
= SHELL_DEVICE_ERROR
;
990 FreePool (ChildHandleBuffer
);
991 FreePool (ChildHandleType
);
994 FreePool (BestLanguage
);
995 FreePool (HandleBuffer
);
996 FreePool (HandleType
);
999 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1000 FreePool (DriverImageHandleBuffer
);
1008 Function to print out configuration information on all configurable handles.
1010 @param[in] ChildrenToo TRUE to tewst for children.
1011 @param[in] Language ASCII string for language code.
1012 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1014 @retval SHELL_SUCCESS The operation was successful.
1018 PrintConfigInfoOnAll(
1019 IN CONST BOOLEAN ChildrenToo
,
1020 IN CONST CHAR8
*Language
,
1021 IN CONST BOOLEAN UseHii
1024 EFI_HANDLE
*HandleList
;
1025 EFI_HANDLE
*CurrentHandle
;
1032 CurrentHandle
= NULL
;
1038 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1039 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1041 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1046 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1047 gShellDriver1HiiHandle
,
1051 SHELL_FREE_NON_NULL(HandleList
);
1063 0) == SHELL_SUCCESS
) {
1068 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
1069 return (SHELL_SUCCESS
);
1072 return (SHELL_SUCCESS
);
1075 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1083 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1093 Function for 'drvcfg' command.
1095 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1096 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1100 ShellCommandRunDrvCfg (
1101 IN EFI_HANDLE ImageHandle
,
1102 IN EFI_SYSTEM_TABLE
*SystemTable
1106 LIST_ENTRY
*Package
;
1107 CHAR16
*ProblemParam
;
1108 SHELL_STATUS ShellStatus
;
1111 CONST CHAR16
*HandleIndex1
;
1112 CONST CHAR16
*HandleIndex2
;
1113 CONST CHAR16
*HandleIndex3
;
1114 CONST CHAR16
*ForceTypeString
;
1120 BOOLEAN AllChildren
;
1123 UINT64 Intermediate
;
1127 CONST CHAR16
*FileName
;
1129 ShellStatus
= SHELL_SUCCESS
;
1130 Status
= EFI_SUCCESS
;
1135 // initialize the shell lib (we must be in non-auto-init...)
1137 Status
= ShellInitialize();
1138 ASSERT_EFI_ERROR(Status
);
1140 Status
= CommandInit();
1141 ASSERT_EFI_ERROR(Status
);
1144 // parse the command line
1146 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1147 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1149 if (Package
!= NULL
) {
1150 ShellCommandLineFreeVarList (Package
);
1152 SHELL_FREE_NON_NULL(ProblemParam
);
1153 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1154 if (EFI_ERROR(Status
)) {
1155 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1156 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
1157 FreePool(ProblemParam
);
1158 ShellStatus
= SHELL_INVALID_PARAMETER
;
1165 if (ShellStatus
== SHELL_SUCCESS
) {
1166 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1168 Language
= AllocateZeroPool(StrSize(Lang
));
1169 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1170 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1171 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
1172 ShellStatus
= SHELL_INVALID_PARAMETER
;
1175 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1176 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1177 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1178 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1179 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1180 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1181 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1184 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1185 } else if (InFromFile
) {
1186 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1191 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1192 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, FileName
);
1193 ShellStatus
= SHELL_INVALID_PARAMETER
;
1196 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1197 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, FileName
);
1198 ShellStatus
= SHELL_INVALID_PARAMETER
;
1201 if (Force
&& ForceTypeString
== NULL
) {
1202 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-f");
1203 ShellStatus
= SHELL_INVALID_PARAMETER
;
1207 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1208 if (EFI_ERROR(Status
)) {
1209 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"-f");
1210 ShellStatus
= SHELL_INVALID_PARAMETER
;
1213 ForceType
= (UINT32
)Intermediate
;
1217 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1219 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1220 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1221 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1222 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex1
);
1223 ShellStatus
= SHELL_INVALID_PARAMETER
;
1227 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1229 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1230 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1231 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1232 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex2
);
1233 ShellStatus
= SHELL_INVALID_PARAMETER
;
1237 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1239 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1240 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1241 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1242 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex3
);
1243 ShellStatus
= SHELL_INVALID_PARAMETER
;
1248 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1249 if (FileName
== NULL
) {
1250 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, InFromFile
?L
"-i":L
"-o");
1252 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
);
1254 ShellStatus
= SHELL_INVALID_PARAMETER
;
1257 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1259 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-i");
1260 ShellStatus
= SHELL_INVALID_PARAMETER
;
1264 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-o");
1265 ShellStatus
= SHELL_INVALID_PARAMETER
;
1269 if (Validate
&& Force
) {
1270 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-f");
1271 ShellStatus
= SHELL_INVALID_PARAMETER
;
1274 if (Validate
&& Set
) {
1275 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-s");
1276 ShellStatus
= SHELL_INVALID_PARAMETER
;
1280 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-s", L
"-f");
1281 ShellStatus
= SHELL_INVALID_PARAMETER
;
1284 if (OutToFile
&& InFromFile
) {
1285 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-i", L
"-o");
1286 ShellStatus
= SHELL_INVALID_PARAMETER
;
1294 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1296 // no HII on this handle.
1298 ShellStatus
= SHELL_UNSUPPORTED
;
1299 } else if (Validate
) {
1302 } else if (InFromFile
) {
1303 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1304 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1307 } else if (OutToFile
) {
1308 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1309 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1312 } else if (HandleIndex1
== NULL
) {
1314 // display all that are configurable
1316 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1319 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1324 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1325 gShellDriver1HiiHandle
,
1326 ConvertHandleToHandleIndex(Handle1
)
1334 // We allways need to do this one since it does both by default.
1336 if (!InFromFile
&& !OutToFile
) {
1337 ShellStatus
= PreHiiDrvCfg (
1349 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1354 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1355 gShellDriver1HiiHandle
,
1356 ConvertHandleToHandleIndex(Handle1
)
1362 ShellCommandLineFreeVarList (Package
);
1363 SHELL_FREE_NON_NULL(Language
);
1364 return (ShellStatus
);