2 Main file for DrvCfg shell Driver1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "UefiShellDriver1CommandsLib.h"
17 #include <Protocol/HiiConfigAccess.h>
18 #include <Protocol/HiiDatabase.h>
20 STATIC CONST EFI_GUID
*CfgGuidList
[] = {&gEfiDriverConfigurationProtocolGuid
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
};
23 Find the EFI_HII_HANDLE by device path.
25 @param[in] DevPath1 The Device Path to match.
26 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
27 @param[in] HiiDb The Hii database protocol
29 @retval EFI_SUCCESS The operation was successful.
30 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.
34 FindHiiHandleViaDevPath(
35 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath1
,
36 OUT EFI_HII_HANDLE
*HiiHandle
,
37 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
40 EFI_HII_HANDLE
*HandleBuffer
;
41 UINTN HandleBufferSize
;
44 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
45 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
47 EFI_DEVICE_PATH_PROTOCOL
*DevPath2
;
50 ASSERT(DevPath1
!= NULL
);
51 ASSERT(HiiHandle
!= NULL
);
52 ASSERT(*HiiHandle
== NULL
);
53 ASSERT(HiiDb
!= NULL
);
57 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
58 if (Status
== EFI_BUFFER_TOO_SMALL
) {
59 HandleBuffer
= AllocateZeroPool(HandleBufferSize
);
60 ASSERT (HandleBuffer
!= NULL
);
61 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
63 if (EFI_ERROR(Status
)) {
64 SHELL_FREE_NON_NULL(HandleBuffer
);
68 if (HandleBuffer
== NULL
) {
72 for (LoopVariable
= 0 ; LoopVariable
< (HandleBufferSize
/sizeof(HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
75 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
76 if (Status
== EFI_BUFFER_TOO_SMALL
) {
77 MainBuffer
= AllocateZeroPool(MainBufferSize
);
78 ASSERT (MainBuffer
!= NULL
);
79 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
82 // Enumerate through the block of returned memory.
83 // This should actually be a small block, but we need to be sure.
85 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
86 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
87 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
88 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
89 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
90 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
91 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
92 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
93 if (DevicePathCompare(&DevPath1
, &DevPath2
) == 0) {
94 *HiiHandle
= HandleBuffer
[LoopVariable
];
100 SHELL_FREE_NON_NULL(MainBuffer
);
102 SHELL_FREE_NON_NULL(HandleBuffer
);
104 if (*HiiHandle
== NULL
) {
105 return (EFI_NOT_FOUND
);
107 return (EFI_SUCCESS
);
111 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
113 @param[in] Handle The EFI_HANDLE to convert.
114 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
115 @param[in] HiiDb The Hii database protocol
117 @retval EFI_SUCCESS The operation was successful.
121 ConvertHandleToHiiHandle(
122 IN CONST EFI_HANDLE Handle
,
123 OUT EFI_HII_HANDLE
*HiiHandle
,
124 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
128 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
130 if (HiiHandle
== NULL
|| HiiDb
== NULL
) {
131 return (EFI_INVALID_PARAMETER
);
135 if (Handle
== NULL
) {
136 return (EFI_SUCCESS
);
140 Status
= gBS
->OpenProtocol(Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
141 if (EFI_ERROR(Status
) || DevPath1
== NULL
) {
142 return (EFI_NOT_FOUND
);
145 return (FindHiiHandleViaDevPath(DevPath1
, HiiHandle
, HiiDb
));
149 Function to print out all HII configuration information to a file.
151 @param[in] Handle The handle to get info on. NULL to do all handles.
152 @param[in] FileName The filename to rwite the info to.
157 IN CONST EFI_HANDLE Handle
,
158 IN CONST CHAR16
*FileName
161 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
164 UINTN MainBufferSize
;
165 EFI_HII_HANDLE HiiHandle
;
166 SHELL_FILE_HANDLE FileHandle
;
173 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
174 if (EFI_ERROR(Status
)) {
179 STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL
),
180 gShellDriver1HiiHandle
,
184 return (SHELL_DEVICE_ERROR
);
188 // Locate HII Database protocol
190 Status
= gBS
->LocateProtocol (
191 &gEfiHiiDatabaseProtocolGuid
,
193 (VOID
**) &HiiDatabase
196 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
201 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
202 gShellDriver1HiiHandle
,
204 L
"EfiHiiDatabaseProtocol",
205 &gEfiHiiDatabaseProtocolGuid
);
206 ShellCloseFile(&FileHandle
);
207 return (SHELL_NOT_FOUND
);
210 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
211 if (EFI_ERROR(Status
)) {
216 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
217 gShellDriver1HiiHandle
,
219 ConvertHandleToHandleIndex(Handle
),
221 ShellCloseFile(&FileHandle
);
222 return (SHELL_DEVICE_ERROR
);
225 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
226 if (Status
== EFI_BUFFER_TOO_SMALL
) {
227 MainBuffer
= AllocateZeroPool(MainBufferSize
);
228 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
231 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
233 ShellCloseFile(&FileHandle
);
234 SHELL_FREE_NON_NULL(MainBuffer
);
236 if (EFI_ERROR(Status
)) {
241 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
242 gShellDriver1HiiHandle
,
245 return (SHELL_DEVICE_ERROR
);
251 STRING_TOKEN(STR_DRVCFG_COMP
),
252 gShellDriver1HiiHandle
);
254 return (SHELL_SUCCESS
);
258 Function to read in HII configuration information from a file.
260 @param[in] Handle The handle to get info for.
261 @param[in] FileName The filename to read the info from.
266 IN EFI_HANDLE Handle
,
267 IN CONST CHAR16
*FileName
270 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
274 UINTN MainBufferSize
;
275 EFI_HII_HANDLE HiiHandle
;
276 SHELL_FILE_HANDLE FileHandle
;
277 CHAR16
*TempDevPathString
;
278 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
279 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
280 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
288 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
289 if (EFI_ERROR(Status
)) {
294 STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL
),
295 gShellDriver1HiiHandle
,
299 return (SHELL_DEVICE_ERROR
);
303 // Locate HII Database protocol
305 Status
= gBS
->LocateProtocol (
306 &gEfiHiiDatabaseProtocolGuid
,
308 (VOID
**) &HiiDatabase
311 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
316 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
317 gShellDriver1HiiHandle
,
319 L
"EfiHiiDatabaseProtocol",
320 &gEfiHiiDatabaseProtocolGuid
);
321 ShellCloseFile(&FileHandle
);
322 return (SHELL_NOT_FOUND
);
325 Status
= ShellGetFileSize(FileHandle
, &Temp
);
326 MainBufferSize
= (UINTN
)Temp
;
327 if (EFI_ERROR(Status
)) {
332 STRING_TOKEN(STR_FILE_READ_FAIL
),
333 gShellDriver1HiiHandle
,
337 ShellCloseFile(&FileHandle
);
338 return (SHELL_DEVICE_ERROR
);
340 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
341 if (EFI_ERROR(Status
)) {
346 STRING_TOKEN(STR_GEN_OUT_MEM
),
347 gShellDriver1HiiHandle
, L
"drvcfg");
348 ShellCloseFile(&FileHandle
);
349 return (SHELL_DEVICE_ERROR
);
351 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
352 if (EFI_ERROR(Status
)) {
357 STRING_TOKEN(STR_FILE_READ_FAIL
),
358 gShellDriver1HiiHandle
,
362 ShellCloseFile(&FileHandle
);
363 SHELL_FREE_NON_NULL(MainBuffer
);
364 return (SHELL_DEVICE_ERROR
);
367 ShellCloseFile(&FileHandle
);
369 if (Handle
!= NULL
) {
371 // User override in place. Just do it.
374 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
375 if (EFI_ERROR(Status
)) {
380 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
381 gShellDriver1HiiHandle
, L
"drvcfg",
382 ConvertHandleToHandleIndex(Handle
),
384 ShellCloseFile(&FileHandle
);
385 return (SHELL_DEVICE_ERROR
);
387 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
388 if (EFI_ERROR(Status
)) {
393 STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN
),
394 gShellDriver1HiiHandle
,
396 L
"HiiDatabase->UpdatePackageList",
398 return (SHELL_DEVICE_ERROR
);
402 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
405 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
406 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
407 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
408 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
409 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
410 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
411 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
413 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
414 if (EFI_ERROR(Status
)) {
416 // print out an error.
418 TempDevPathString
= ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
423 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
424 gShellDriver1HiiHandle
,
426 SHELL_FREE_NON_NULL(TempDevPathString
);
428 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
429 if (EFI_ERROR(Status
)) {
434 STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN
),
435 gShellDriver1HiiHandle
,
437 L
"HiiDatabase->UpdatePackageList",
439 return (SHELL_DEVICE_ERROR
);
441 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
442 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
443 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
448 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
449 gShellDriver1HiiHandle
,
458 SHELL_FREE_NON_NULL(MainBuffer
);
465 STRING_TOKEN(STR_DRVCFG_COMP
),
466 gShellDriver1HiiHandle
);
467 return (SHELL_SUCCESS
);
471 Present a requested action to the user.
473 @param[in] DriverImageHandle The handle for the driver to configure.
474 @param[in] ControllerHandle The handle of the device being managed by the Driver specified.
475 @param[in] ChildHandle The handle of a child device of the specified device.
476 @param[in] ActionRequired The required HII action.
478 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
482 ShellCmdDriverConfigurationProcessActionRequired (
483 EFI_HANDLE DriverImageHandle
,
484 EFI_HANDLE ControllerHandle
,
485 EFI_HANDLE ChildHandle
,
486 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
489 EFI_HANDLE ConnectControllerContextOverride
[2];
491 switch (ActionRequired
) {
492 case EfiDriverConfigurationActionNone
:
493 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
496 case EfiDriverConfigurationActionStopController
:
497 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
498 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
499 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
501 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
502 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
505 case EfiDriverConfigurationActionRestartController
:
506 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
507 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
508 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
510 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
511 ConnectControllerContextOverride
[0] = DriverImageHandle
;
512 ConnectControllerContextOverride
[1] = NULL
;
513 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
514 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
517 case EfiDriverConfigurationActionRestartPlatform
:
518 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
519 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
520 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
522 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
526 return (EFI_INVALID_PARAMETER
);
533 Do the configuration in an environment without HII.
535 @param[in] Language The language code.
536 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.
537 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.
538 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.
539 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.
540 @param[in] SetOptions TRUE to set options, FALSE otherwise.
541 @param[in] DriverImageHandle The handle for the driver to configure.
542 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.
543 @param[in] ChildHandle The handle of a child device of the specified device.
545 @retval SHELL_NOT_FOUND A specified handle could not be found.
546 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
551 IN CONST CHAR8
*Language
,
552 IN BOOLEAN ForceDefaults
,
553 IN UINT32 DefaultType
,
554 IN BOOLEAN AllChildren
,
555 IN BOOLEAN ValidateOptions
,
556 IN BOOLEAN SetOptions
,
557 IN EFI_HANDLE DriverImageHandle
,
558 IN EFI_HANDLE DeviceHandle
,
559 IN EFI_HANDLE ChildHandle
563 SHELL_STATUS ShellStatus
;
564 UINTN OuterLoopCounter
;
566 UINTN DriverImageHandleCount
;
567 EFI_HANDLE
*DriverImageHandleBuffer
;
569 EFI_HANDLE
*HandleBuffer
;
573 UINTN ChildHandleCount
;
574 EFI_HANDLE
*ChildHandleBuffer
;
575 UINTN
*ChildHandleType
;
576 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
577 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
578 BOOLEAN Iso639Language
;
583 ShellStatus
= SHELL_SUCCESS
;
585 if (ChildHandle
== NULL
&& AllChildren
) {
594 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
595 gShellDriver1HiiHandle
,
597 } else if (ValidateOptions
) {
602 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
603 gShellDriver1HiiHandle
);
604 } else if (SetOptions
) {
609 STRING_TOKEN (STR_DRVCFG_SET
),
610 gShellDriver1HiiHandle
);
613 if (DriverImageHandle
== 0) {
614 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
615 if (DriverImageHandleBuffer
== NULL
) {
616 ShellStatus
= SHELL_NOT_FOUND
;
620 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
621 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
622 ; HandleBuffer
++,DriverImageHandleCount
++);
624 DriverImageHandleCount
= 1;
626 // Allocate buffer to hold the image handle so as to
627 // keep consistent with the above clause
629 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
630 ASSERT (DriverImageHandleBuffer
);
631 DriverImageHandleBuffer
[0] = DriverImageHandle
;
634 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
635 Iso639Language
= FALSE
;
636 Status
= gBS
->OpenProtocol (
637 DriverImageHandleBuffer
[OuterLoopCounter
],
638 &gEfiDriverConfiguration2ProtocolGuid
,
639 (VOID
**) &DriverConfiguration
,
642 EFI_OPEN_PROTOCOL_GET_PROTOCOL
644 if (EFI_ERROR (Status
)) {
645 Iso639Language
= TRUE
;
646 Status
= gBS
->OpenProtocol (
647 DriverImageHandleBuffer
[OuterLoopCounter
],
648 &gEfiDriverConfigurationProtocolGuid
,
649 (VOID
**) &DriverConfiguration
,
652 EFI_OPEN_PROTOCOL_GET_PROTOCOL
655 if (EFI_ERROR (Status
)) {
660 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
661 // gShellDriver1HiiHandle,
662 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
664 ShellStatus
= SHELL_UNSUPPORTED
;
668 BestLanguage
= GetBestLanguage (
669 DriverConfiguration
->SupportedLanguages
,
671 Language
!=NULL
?Language
:"",
672 DriverConfiguration
->SupportedLanguages
,
675 if (BestLanguage
== NULL
) {
680 STRING_TOKEN (STR_GEN_NO_VALUE
),
681 gShellDriver1HiiHandle
,
685 ShellStatus
= SHELL_INVALID_PARAMETER
;
689 Status
= ParseHandleDatabaseByRelationshipWithType (
690 DriverImageHandleBuffer
[OuterLoopCounter
],
696 if (EFI_ERROR (Status
)) {
700 if (SetOptions
&& DeviceHandle
== NULL
) {
702 gST
->ConOut
->ClearScreen (gST
->ConOut
);
703 Status
= DriverConfiguration
->SetOptions (
710 gST
->ConOut
->ClearScreen (gST
->ConOut
);
716 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
717 gShellDriver1HiiHandle
,
718 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
719 DriverConfiguration
->SupportedLanguages
721 if (!EFI_ERROR (Status
)) {
726 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
727 gShellDriver1HiiHandle
);
728 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
729 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
730 ShellCmdDriverConfigurationProcessActionRequired (
731 DriverImageHandleBuffer
[OuterLoopCounter
],
732 HandleBuffer
[LoopCounter
],
743 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
744 gShellDriver1HiiHandle
,
750 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
751 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
754 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
757 if (ChildHandle
== NULL
) {
758 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
759 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
764 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
765 gShellDriver1HiiHandle
,
768 DriverConfiguration
->SupportedLanguages
772 Status
= DriverConfiguration
->ForceDefaults (
774 HandleBuffer
[LoopCounter
],
780 if (!EFI_ERROR (Status
)) {
785 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
786 gShellDriver1HiiHandle
);
787 ShellCmdDriverConfigurationProcessActionRequired (
788 DriverImageHandleBuffer
[OuterLoopCounter
],
789 HandleBuffer
[LoopCounter
],
798 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
799 gShellDriver1HiiHandle
,
801 ShellStatus
= SHELL_DEVICE_ERROR
;
803 } else if (ValidateOptions
) {
804 Status
= DriverConfiguration
->OptionsValid (
806 HandleBuffer
[LoopCounter
],
810 if (!EFI_ERROR (Status
)) {
815 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
816 gShellDriver1HiiHandle
);
822 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
823 gShellDriver1HiiHandle
,
825 ShellStatus
= SHELL_DEVICE_ERROR
;
827 } else if (SetOptions
) {
828 gST
->ConOut
->ClearScreen (gST
->ConOut
);
829 Status
= DriverConfiguration
->SetOptions (
831 HandleBuffer
[LoopCounter
],
836 gST
->ConOut
->ClearScreen (gST
->ConOut
);
837 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
838 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
843 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
844 gShellDriver1HiiHandle
,
847 DriverConfiguration
->SupportedLanguages
849 if (!EFI_ERROR (Status
)) {
854 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
855 gShellDriver1HiiHandle
);
857 ShellCmdDriverConfigurationProcessActionRequired (
858 DriverImageHandleBuffer
[OuterLoopCounter
],
859 HandleBuffer
[LoopCounter
],
869 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
870 gShellDriver1HiiHandle
,
872 ShellStatus
= SHELL_DEVICE_ERROR
;
879 if (ChildHandle
== NULL
&& !AllChildren
) {
883 Status
= ParseHandleDatabaseByRelationshipWithType (
884 DriverImageHandleBuffer
[OuterLoopCounter
],
885 HandleBuffer
[LoopCounter
],
890 if (EFI_ERROR (Status
)) {
894 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
896 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
900 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
904 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
905 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
906 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
911 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
912 gShellDriver1HiiHandle
,
916 DriverConfiguration
->SupportedLanguages
);
919 Status
= DriverConfiguration
->ForceDefaults (
921 HandleBuffer
[LoopCounter
],
922 ChildHandleBuffer
[ChildIndex
],
927 if (!EFI_ERROR (Status
)) {
932 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
933 gShellDriver1HiiHandle
);
935 ShellCmdDriverConfigurationProcessActionRequired (
936 DriverImageHandleBuffer
[OuterLoopCounter
],
937 HandleBuffer
[LoopCounter
],
938 ChildHandleBuffer
[ChildIndex
],
947 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
948 gShellDriver1HiiHandle
,
950 ShellStatus
= SHELL_DEVICE_ERROR
;
952 } else if (ValidateOptions
) {
953 Status
= DriverConfiguration
->OptionsValid (
955 HandleBuffer
[LoopCounter
],
956 ChildHandleBuffer
[ChildIndex
]
959 if (!EFI_ERROR (Status
)) {
964 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
965 gShellDriver1HiiHandle
);
971 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
972 gShellDriver1HiiHandle
,
974 ShellStatus
= SHELL_DEVICE_ERROR
;
976 } else if (SetOptions
) {
977 gST
->ConOut
->ClearScreen (gST
->ConOut
);
978 Status
= DriverConfiguration
->SetOptions (
980 HandleBuffer
[LoopCounter
],
981 ChildHandleBuffer
[ChildIndex
],
985 gST
->ConOut
->ClearScreen (gST
->ConOut
);
986 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
987 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
988 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
993 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
994 gShellDriver1HiiHandle
,
998 DriverConfiguration
->SupportedLanguages
1000 if (!EFI_ERROR (Status
)) {
1005 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
1006 gShellDriver1HiiHandle
);
1008 ShellCmdDriverConfigurationProcessActionRequired (
1009 DriverImageHandleBuffer
[OuterLoopCounter
],
1010 HandleBuffer
[LoopCounter
],
1011 ChildHandleBuffer
[ChildIndex
],
1020 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
1021 gShellDriver1HiiHandle
,
1023 ShellStatus
= SHELL_DEVICE_ERROR
;
1030 FreePool (ChildHandleBuffer
);
1031 FreePool (ChildHandleType
);
1034 FreePool (BestLanguage
);
1035 FreePool (HandleBuffer
);
1036 FreePool (HandleType
);
1039 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1040 FreePool (DriverImageHandleBuffer
);
1048 Function to print out configuration information on all configurable handles.
1050 @param[in] ChildrenToo TRUE to tewst for children.
1051 @param[in] Language ASCII string for language code.
1052 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1054 @retval SHELL_SUCCESS The operation was successful.
1058 PrintConfigInfoOnAll(
1059 IN CONST BOOLEAN ChildrenToo
,
1060 IN CONST CHAR8
*Language
,
1061 IN CONST BOOLEAN UseHii
1064 EFI_HANDLE
*HandleList
;
1065 EFI_HANDLE
*CurrentHandle
;
1072 CurrentHandle
= NULL
;
1078 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1079 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1081 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1086 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1087 gShellDriver1HiiHandle
,
1091 SHELL_FREE_NON_NULL(HandleList
);
1103 0) == SHELL_SUCCESS
) {
1108 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE_FOUND
), gShellDriver1HiiHandle
);
1109 return (SHELL_SUCCESS
);
1112 return (SHELL_SUCCESS
);
1115 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1123 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1133 Function for 'drvcfg' command.
1135 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1136 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1140 ShellCommandRunDrvCfg (
1141 IN EFI_HANDLE ImageHandle
,
1142 IN EFI_SYSTEM_TABLE
*SystemTable
1146 LIST_ENTRY
*Package
;
1147 CHAR16
*ProblemParam
;
1148 SHELL_STATUS ShellStatus
;
1151 CONST CHAR16
*HandleIndex1
;
1152 CONST CHAR16
*HandleIndex2
;
1153 CONST CHAR16
*HandleIndex3
;
1154 CONST CHAR16
*ForceTypeString
;
1160 BOOLEAN AllChildren
;
1163 UINT64 Intermediate
;
1167 CONST CHAR16
*FileName
;
1169 ShellStatus
= SHELL_SUCCESS
;
1170 Status
= EFI_SUCCESS
;
1175 // initialize the shell lib (we must be in non-auto-init...)
1177 Status
= ShellInitialize();
1178 ASSERT_EFI_ERROR(Status
);
1180 Status
= CommandInit();
1181 ASSERT_EFI_ERROR(Status
);
1184 // parse the command line
1186 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1187 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1189 if (Package
!= NULL
) {
1190 ShellCommandLineFreeVarList (Package
);
1192 SHELL_FREE_NON_NULL(ProblemParam
);
1193 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1194 if (EFI_ERROR(Status
)) {
1195 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1196 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"drvcfg", ProblemParam
);
1197 FreePool(ProblemParam
);
1198 ShellStatus
= SHELL_INVALID_PARAMETER
;
1205 if (ShellStatus
== SHELL_SUCCESS
) {
1206 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1208 Language
= AllocateZeroPool(StrSize(Lang
));
1209 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1210 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1211 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-l");
1212 ShellStatus
= SHELL_INVALID_PARAMETER
;
1215 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1216 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1217 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1218 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1219 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1220 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1221 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1224 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1225 } else if (InFromFile
) {
1226 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1231 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1232 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1233 ShellStatus
= SHELL_INVALID_PARAMETER
;
1236 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1237 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1238 ShellStatus
= SHELL_INVALID_PARAMETER
;
1241 if (Force
&& ForceTypeString
== NULL
) {
1242 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-f");
1243 ShellStatus
= SHELL_INVALID_PARAMETER
;
1247 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1248 if (EFI_ERROR(Status
)) {
1249 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"drvcfg", ForceTypeString
, L
"-f");
1250 ShellStatus
= SHELL_INVALID_PARAMETER
;
1253 ForceType
= (UINT32
)Intermediate
;
1257 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1259 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1260 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1261 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1262 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex1
);
1263 ShellStatus
= SHELL_INVALID_PARAMETER
;
1267 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1269 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1270 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1271 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1272 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex2
);
1273 ShellStatus
= SHELL_INVALID_PARAMETER
;
1277 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1279 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1280 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1281 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1282 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex3
);
1283 ShellStatus
= SHELL_INVALID_PARAMETER
;
1288 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1289 if (FileName
== NULL
) {
1290 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", InFromFile
?L
"-i":L
"-o");
1292 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
, L
"drvcfg");
1294 ShellStatus
= SHELL_INVALID_PARAMETER
;
1297 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1299 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i");
1300 ShellStatus
= SHELL_INVALID_PARAMETER
;
1304 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-o");
1305 ShellStatus
= SHELL_INVALID_PARAMETER
;
1309 if (Validate
&& Force
) {
1310 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-f");
1311 ShellStatus
= SHELL_INVALID_PARAMETER
;
1314 if (Validate
&& Set
) {
1315 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-s");
1316 ShellStatus
= SHELL_INVALID_PARAMETER
;
1320 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-s", L
"-f");
1321 ShellStatus
= SHELL_INVALID_PARAMETER
;
1324 if (OutToFile
&& InFromFile
) {
1325 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i", L
"-o");
1326 ShellStatus
= SHELL_INVALID_PARAMETER
;
1334 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1336 // no HII on this handle.
1338 ShellStatus
= SHELL_UNSUPPORTED
;
1339 } else if (Validate
) {
1342 } else if (InFromFile
) {
1343 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1344 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1347 } else if (OutToFile
) {
1348 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1349 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1352 } else if (HandleIndex1
== NULL
) {
1354 // display all that are configurable
1356 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1359 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1364 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1365 gShellDriver1HiiHandle
,
1366 ConvertHandleToHandleIndex(Handle1
)
1374 // We allways need to do this one since it does both by default.
1376 if (!InFromFile
&& !OutToFile
) {
1377 ShellStatus
= PreHiiDrvCfg (
1389 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1394 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1395 gShellDriver1HiiHandle
,
1396 ConvertHandleToHandleIndex(Handle1
)
1402 ShellCommandLineFreeVarList (Package
);
1403 SHELL_FREE_NON_NULL(Language
);
1404 return (ShellStatus
);