2 Main file for DrvCfg shell Driver1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2015, 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
);
211 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
212 if (EFI_ERROR(Status
)) {
217 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
218 gShellDriver1HiiHandle
,
220 ConvertHandleToHandleIndex(Handle
),
222 ShellCloseFile(&FileHandle
);
223 return (SHELL_DEVICE_ERROR
);
226 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
227 if (Status
== EFI_BUFFER_TOO_SMALL
) {
228 MainBuffer
= AllocateZeroPool(MainBufferSize
);
229 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
232 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
234 ShellCloseFile(&FileHandle
);
235 SHELL_FREE_NON_NULL(MainBuffer
);
237 if (EFI_ERROR(Status
)) {
242 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
243 gShellDriver1HiiHandle
,
246 return (SHELL_DEVICE_ERROR
);
252 STRING_TOKEN(STR_DRVCFG_COMP
),
253 gShellDriver1HiiHandle
);
255 return (SHELL_SUCCESS
);
259 Function to read in HII configuration information from a file.
261 @param[in] Handle The handle to get info for.
262 @param[in] FileName The filename to read the info from.
267 IN EFI_HANDLE Handle
,
268 IN CONST CHAR16
*FileName
271 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
275 UINTN MainBufferSize
;
276 EFI_HII_HANDLE HiiHandle
;
277 SHELL_FILE_HANDLE FileHandle
;
278 CHAR16
*TempDevPathString
;
279 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
280 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
281 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
289 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
290 if (EFI_ERROR(Status
)) {
295 STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL
),
296 gShellDriver1HiiHandle
,
300 return (SHELL_DEVICE_ERROR
);
304 // Locate HII Database protocol
306 Status
= gBS
->LocateProtocol (
307 &gEfiHiiDatabaseProtocolGuid
,
309 (VOID
**) &HiiDatabase
312 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
317 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
318 gShellDriver1HiiHandle
,
320 L
"EfiHiiDatabaseProtocol",
321 &gEfiHiiDatabaseProtocolGuid
);
322 ShellCloseFile(&FileHandle
);
323 return (SHELL_NOT_FOUND
);
326 Status
= ShellGetFileSize(FileHandle
, &Temp
);
327 MainBufferSize
= (UINTN
)Temp
;
328 if (EFI_ERROR(Status
)) {
333 STRING_TOKEN(STR_FILE_READ_FAIL
),
334 gShellDriver1HiiHandle
,
338 ShellCloseFile(&FileHandle
);
339 return (SHELL_DEVICE_ERROR
);
341 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
342 if (EFI_ERROR(Status
)) {
347 STRING_TOKEN(STR_GEN_OUT_MEM
),
348 gShellDriver1HiiHandle
, L
"drvcfg");
349 ShellCloseFile(&FileHandle
);
350 return (SHELL_DEVICE_ERROR
);
352 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
353 if (EFI_ERROR(Status
)) {
358 STRING_TOKEN(STR_FILE_READ_FAIL
),
359 gShellDriver1HiiHandle
,
363 ShellCloseFile(&FileHandle
);
364 SHELL_FREE_NON_NULL(MainBuffer
);
365 return (SHELL_DEVICE_ERROR
);
368 ShellCloseFile(&FileHandle
);
370 if (Handle
!= NULL
) {
372 // User override in place. Just do it.
375 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
376 if (EFI_ERROR(Status
)) {
381 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
382 gShellDriver1HiiHandle
, L
"drvcfg",
383 ConvertHandleToHandleIndex(Handle
),
385 ShellCloseFile(&FileHandle
);
386 return (SHELL_DEVICE_ERROR
);
388 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
389 if (EFI_ERROR(Status
)) {
394 STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN
),
395 gShellDriver1HiiHandle
,
397 L
"HiiDatabase->UpdatePackageList",
399 return (SHELL_DEVICE_ERROR
);
403 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
406 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
407 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
408 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
409 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
410 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
411 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
412 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
414 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
415 if (EFI_ERROR(Status
)) {
417 // print out an error.
419 TempDevPathString
= ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
424 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
425 gShellDriver1HiiHandle
,
427 SHELL_FREE_NON_NULL(TempDevPathString
);
429 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
430 if (EFI_ERROR(Status
)) {
435 STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN
),
436 gShellDriver1HiiHandle
,
438 L
"HiiDatabase->UpdatePackageList",
440 return (SHELL_DEVICE_ERROR
);
442 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
443 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
444 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
449 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
450 gShellDriver1HiiHandle
,
459 SHELL_FREE_NON_NULL(MainBuffer
);
466 STRING_TOKEN(STR_DRVCFG_COMP
),
467 gShellDriver1HiiHandle
);
468 return (SHELL_SUCCESS
);
472 Present a requested action to the user.
474 @param[in] DriverImageHandle The handle for the driver to configure.
475 @param[in] ControllerHandle The handle of the device being managed by the Driver specified.
476 @param[in] ChildHandle The handle of a child device of the specified device.
477 @param[in] ActionRequired The required HII action.
479 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
483 ShellCmdDriverConfigurationProcessActionRequired (
484 EFI_HANDLE DriverImageHandle
,
485 EFI_HANDLE ControllerHandle
,
486 EFI_HANDLE ChildHandle
,
487 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
490 EFI_HANDLE ConnectControllerContextOverride
[2];
492 switch (ActionRequired
) {
493 case EfiDriverConfigurationActionNone
:
494 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
497 case EfiDriverConfigurationActionStopController
:
498 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
499 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
500 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
502 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
503 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
506 case EfiDriverConfigurationActionRestartController
:
507 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
508 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
509 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
511 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
512 ConnectControllerContextOverride
[0] = DriverImageHandle
;
513 ConnectControllerContextOverride
[1] = NULL
;
514 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
515 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
518 case EfiDriverConfigurationActionRestartPlatform
:
519 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
520 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
521 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
523 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
527 return (EFI_INVALID_PARAMETER
);
534 Do the configuration in an environment without HII.
536 @param[in] Language The language code.
537 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.
538 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.
539 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.
540 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.
541 @param[in] SetOptions TRUE to set options, FALSE otherwise.
542 @param[in] DriverImageHandle The handle for the driver to configure.
543 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.
544 @param[in] ChildHandle The handle of a child device of the specified device.
546 @retval SHELL_NOT_FOUND A specified handle could not be found.
547 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
552 IN CONST CHAR8
*Language
,
553 IN BOOLEAN ForceDefaults
,
554 IN UINT32 DefaultType
,
555 IN BOOLEAN AllChildren
,
556 IN BOOLEAN ValidateOptions
,
557 IN BOOLEAN SetOptions
,
558 IN EFI_HANDLE DriverImageHandle
,
559 IN EFI_HANDLE DeviceHandle
,
560 IN EFI_HANDLE ChildHandle
564 SHELL_STATUS ShellStatus
;
565 UINTN OuterLoopCounter
;
567 UINTN DriverImageHandleCount
;
568 EFI_HANDLE
*DriverImageHandleBuffer
;
570 EFI_HANDLE
*HandleBuffer
;
574 UINTN ChildHandleCount
;
575 EFI_HANDLE
*ChildHandleBuffer
;
576 UINTN
*ChildHandleType
;
577 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
578 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
579 BOOLEAN Iso639Language
;
584 ShellStatus
= SHELL_SUCCESS
;
586 if (ChildHandle
== NULL
&& AllChildren
) {
595 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
596 gShellDriver1HiiHandle
,
598 } else if (ValidateOptions
) {
603 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
604 gShellDriver1HiiHandle
);
605 } else if (SetOptions
) {
610 STRING_TOKEN (STR_DRVCFG_SET
),
611 gShellDriver1HiiHandle
);
614 if (DriverImageHandle
== 0) {
615 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
616 if (DriverImageHandleBuffer
== NULL
) {
617 ShellStatus
= SHELL_NOT_FOUND
;
621 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
622 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
623 ; HandleBuffer
++,DriverImageHandleCount
++);
625 DriverImageHandleCount
= 1;
627 // Allocate buffer to hold the image handle so as to
628 // keep consistent with the above clause
630 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
631 ASSERT (DriverImageHandleBuffer
);
632 DriverImageHandleBuffer
[0] = DriverImageHandle
;
635 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
636 Iso639Language
= FALSE
;
637 Status
= gBS
->OpenProtocol (
638 DriverImageHandleBuffer
[OuterLoopCounter
],
639 &gEfiDriverConfiguration2ProtocolGuid
,
640 (VOID
**) &DriverConfiguration
,
643 EFI_OPEN_PROTOCOL_GET_PROTOCOL
645 if (EFI_ERROR (Status
)) {
646 Iso639Language
= TRUE
;
647 Status
= gBS
->OpenProtocol (
648 DriverImageHandleBuffer
[OuterLoopCounter
],
649 &gEfiDriverConfigurationProtocolGuid
,
650 (VOID
**) &DriverConfiguration
,
653 EFI_OPEN_PROTOCOL_GET_PROTOCOL
656 if (EFI_ERROR (Status
)) {
661 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
662 // gShellDriver1HiiHandle,
663 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
665 ShellStatus
= SHELL_UNSUPPORTED
;
669 BestLanguage
= GetBestLanguage (
670 DriverConfiguration
->SupportedLanguages
,
672 Language
!=NULL
?Language
:"",
673 DriverConfiguration
->SupportedLanguages
,
676 if (BestLanguage
== NULL
) {
681 STRING_TOKEN (STR_GEN_NO_VALUE
),
682 gShellDriver1HiiHandle
,
686 ShellStatus
= SHELL_INVALID_PARAMETER
;
690 Status
= ParseHandleDatabaseByRelationshipWithType (
691 DriverImageHandleBuffer
[OuterLoopCounter
],
697 if (EFI_ERROR (Status
)) {
701 if (SetOptions
&& DeviceHandle
== NULL
) {
703 gST
->ConOut
->ClearScreen (gST
->ConOut
);
704 Status
= DriverConfiguration
->SetOptions (
711 gST
->ConOut
->ClearScreen (gST
->ConOut
);
717 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
718 gShellDriver1HiiHandle
,
719 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
720 DriverConfiguration
->SupportedLanguages
722 if (!EFI_ERROR (Status
)) {
727 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
728 gShellDriver1HiiHandle
);
729 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
730 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
731 ShellCmdDriverConfigurationProcessActionRequired (
732 DriverImageHandleBuffer
[OuterLoopCounter
],
733 HandleBuffer
[LoopCounter
],
744 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
745 gShellDriver1HiiHandle
,
751 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
752 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
755 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
758 if (ChildHandle
== NULL
) {
759 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
760 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
765 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
766 gShellDriver1HiiHandle
,
769 DriverConfiguration
->SupportedLanguages
773 Status
= DriverConfiguration
->ForceDefaults (
775 HandleBuffer
[LoopCounter
],
781 if (!EFI_ERROR (Status
)) {
786 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
787 gShellDriver1HiiHandle
);
788 ShellCmdDriverConfigurationProcessActionRequired (
789 DriverImageHandleBuffer
[OuterLoopCounter
],
790 HandleBuffer
[LoopCounter
],
799 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
800 gShellDriver1HiiHandle
,
802 ShellStatus
= SHELL_DEVICE_ERROR
;
804 } else if (ValidateOptions
) {
805 Status
= DriverConfiguration
->OptionsValid (
807 HandleBuffer
[LoopCounter
],
811 if (!EFI_ERROR (Status
)) {
816 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
817 gShellDriver1HiiHandle
);
823 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
824 gShellDriver1HiiHandle
,
826 ShellStatus
= SHELL_DEVICE_ERROR
;
828 } else if (SetOptions
) {
829 gST
->ConOut
->ClearScreen (gST
->ConOut
);
830 Status
= DriverConfiguration
->SetOptions (
832 HandleBuffer
[LoopCounter
],
837 gST
->ConOut
->ClearScreen (gST
->ConOut
);
838 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
839 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
844 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
845 gShellDriver1HiiHandle
,
848 DriverConfiguration
->SupportedLanguages
850 if (!EFI_ERROR (Status
)) {
855 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
856 gShellDriver1HiiHandle
);
858 ShellCmdDriverConfigurationProcessActionRequired (
859 DriverImageHandleBuffer
[OuterLoopCounter
],
860 HandleBuffer
[LoopCounter
],
870 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
871 gShellDriver1HiiHandle
,
873 ShellStatus
= SHELL_DEVICE_ERROR
;
880 if (ChildHandle
== NULL
&& !AllChildren
) {
884 Status
= ParseHandleDatabaseByRelationshipWithType (
885 DriverImageHandleBuffer
[OuterLoopCounter
],
886 HandleBuffer
[LoopCounter
],
891 if (EFI_ERROR (Status
)) {
895 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
897 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
901 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
905 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
906 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
907 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
912 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
913 gShellDriver1HiiHandle
,
917 DriverConfiguration
->SupportedLanguages
);
920 Status
= DriverConfiguration
->ForceDefaults (
922 HandleBuffer
[LoopCounter
],
923 ChildHandleBuffer
[ChildIndex
],
928 if (!EFI_ERROR (Status
)) {
933 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
934 gShellDriver1HiiHandle
);
936 ShellCmdDriverConfigurationProcessActionRequired (
937 DriverImageHandleBuffer
[OuterLoopCounter
],
938 HandleBuffer
[LoopCounter
],
939 ChildHandleBuffer
[ChildIndex
],
948 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
949 gShellDriver1HiiHandle
,
951 ShellStatus
= SHELL_DEVICE_ERROR
;
953 } else if (ValidateOptions
) {
954 Status
= DriverConfiguration
->OptionsValid (
956 HandleBuffer
[LoopCounter
],
957 ChildHandleBuffer
[ChildIndex
]
960 if (!EFI_ERROR (Status
)) {
965 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
966 gShellDriver1HiiHandle
);
972 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
973 gShellDriver1HiiHandle
,
975 ShellStatus
= SHELL_DEVICE_ERROR
;
977 } else if (SetOptions
) {
978 gST
->ConOut
->ClearScreen (gST
->ConOut
);
979 Status
= DriverConfiguration
->SetOptions (
981 HandleBuffer
[LoopCounter
],
982 ChildHandleBuffer
[ChildIndex
],
986 gST
->ConOut
->ClearScreen (gST
->ConOut
);
987 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
988 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
989 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
994 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
995 gShellDriver1HiiHandle
,
999 DriverConfiguration
->SupportedLanguages
1001 if (!EFI_ERROR (Status
)) {
1006 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
1007 gShellDriver1HiiHandle
);
1009 ShellCmdDriverConfigurationProcessActionRequired (
1010 DriverImageHandleBuffer
[OuterLoopCounter
],
1011 HandleBuffer
[LoopCounter
],
1012 ChildHandleBuffer
[ChildIndex
],
1021 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
1022 gShellDriver1HiiHandle
,
1024 ShellStatus
= SHELL_DEVICE_ERROR
;
1031 FreePool (ChildHandleBuffer
);
1032 FreePool (ChildHandleType
);
1035 FreePool (BestLanguage
);
1036 FreePool (HandleBuffer
);
1037 FreePool (HandleType
);
1040 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1041 FreePool (DriverImageHandleBuffer
);
1049 Function to print out configuration information on all configurable handles.
1051 @param[in] ChildrenToo TRUE to tewst for children.
1052 @param[in] Language ASCII string for language code.
1053 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1055 @retval SHELL_SUCCESS The operation was successful.
1059 PrintConfigInfoOnAll(
1060 IN CONST BOOLEAN ChildrenToo
,
1061 IN CONST CHAR8
*Language
,
1062 IN CONST BOOLEAN UseHii
1065 EFI_HANDLE
*HandleList
;
1066 EFI_HANDLE
*CurrentHandle
;
1073 CurrentHandle
= NULL
;
1079 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1080 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1082 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1087 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1088 gShellDriver1HiiHandle
,
1092 SHELL_FREE_NON_NULL(HandleList
);
1104 0) == SHELL_SUCCESS
) {
1109 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE_FOUND
), gShellDriver1HiiHandle
);
1110 return (SHELL_SUCCESS
);
1113 return (SHELL_SUCCESS
);
1116 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1124 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1134 Function for 'drvcfg' command.
1136 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1137 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1141 ShellCommandRunDrvCfg (
1142 IN EFI_HANDLE ImageHandle
,
1143 IN EFI_SYSTEM_TABLE
*SystemTable
1147 LIST_ENTRY
*Package
;
1148 CHAR16
*ProblemParam
;
1149 SHELL_STATUS ShellStatus
;
1152 CONST CHAR16
*HandleIndex1
;
1153 CONST CHAR16
*HandleIndex2
;
1154 CONST CHAR16
*HandleIndex3
;
1155 CONST CHAR16
*ForceTypeString
;
1161 BOOLEAN AllChildren
;
1164 UINT64 Intermediate
;
1168 CONST CHAR16
*FileName
;
1170 ShellStatus
= SHELL_SUCCESS
;
1171 Status
= EFI_SUCCESS
;
1176 // initialize the shell lib (we must be in non-auto-init...)
1178 Status
= ShellInitialize();
1179 ASSERT_EFI_ERROR(Status
);
1181 Status
= CommandInit();
1182 ASSERT_EFI_ERROR(Status
);
1185 // parse the command line
1187 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1188 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1190 if (Package
!= NULL
) {
1191 ShellCommandLineFreeVarList (Package
);
1193 SHELL_FREE_NON_NULL(ProblemParam
);
1194 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1195 if (EFI_ERROR(Status
)) {
1196 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1197 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"drvcfg", ProblemParam
);
1198 FreePool(ProblemParam
);
1199 ShellStatus
= SHELL_INVALID_PARAMETER
;
1206 if (ShellStatus
== SHELL_SUCCESS
) {
1207 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1209 Language
= AllocateZeroPool(StrSize(Lang
));
1210 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1211 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1212 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-l");
1213 ShellStatus
= SHELL_INVALID_PARAMETER
;
1216 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1217 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1218 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1219 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1220 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1221 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1222 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1225 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1226 } else if (InFromFile
) {
1227 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1232 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1233 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1234 ShellStatus
= SHELL_INVALID_PARAMETER
;
1237 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1238 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1239 ShellStatus
= SHELL_INVALID_PARAMETER
;
1242 if (Force
&& ForceTypeString
== NULL
) {
1243 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-f");
1244 ShellStatus
= SHELL_INVALID_PARAMETER
;
1248 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1249 if (EFI_ERROR(Status
)) {
1250 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"drvcfg", ForceTypeString
, L
"-f");
1251 ShellStatus
= SHELL_INVALID_PARAMETER
;
1254 ForceType
= (UINT32
)Intermediate
;
1258 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1260 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1261 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1262 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1263 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex1
);
1264 ShellStatus
= SHELL_INVALID_PARAMETER
;
1268 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1270 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1271 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1272 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1273 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex2
);
1274 ShellStatus
= SHELL_INVALID_PARAMETER
;
1278 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1280 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1281 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1282 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1283 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex3
);
1284 ShellStatus
= SHELL_INVALID_PARAMETER
;
1289 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1290 if (FileName
== NULL
) {
1291 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", InFromFile
?L
"-i":L
"-o");
1293 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
, L
"drvcfg");
1295 ShellStatus
= SHELL_INVALID_PARAMETER
;
1298 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1300 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i");
1301 ShellStatus
= SHELL_INVALID_PARAMETER
;
1305 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-o");
1306 ShellStatus
= SHELL_INVALID_PARAMETER
;
1310 if (Validate
&& Force
) {
1311 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-f");
1312 ShellStatus
= SHELL_INVALID_PARAMETER
;
1315 if (Validate
&& Set
) {
1316 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-s");
1317 ShellStatus
= SHELL_INVALID_PARAMETER
;
1321 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-s", L
"-f");
1322 ShellStatus
= SHELL_INVALID_PARAMETER
;
1325 if (OutToFile
&& InFromFile
) {
1326 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i", L
"-o");
1327 ShellStatus
= SHELL_INVALID_PARAMETER
;
1335 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1337 // no HII on this handle.
1339 ShellStatus
= SHELL_UNSUPPORTED
;
1340 } else if (Validate
) {
1343 } else if (InFromFile
) {
1344 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1345 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1348 } else if (OutToFile
) {
1349 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1350 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1353 } else if (HandleIndex1
== NULL
) {
1355 // display all that are configurable
1357 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1360 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1365 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1366 gShellDriver1HiiHandle
,
1367 ConvertHandleToHandleIndex(Handle1
)
1375 // We allways need to do this one since it does both by default.
1377 if (!InFromFile
&& !OutToFile
) {
1378 ShellStatus
= PreHiiDrvCfg (
1390 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1395 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1396 gShellDriver1HiiHandle
,
1397 ConvertHandleToHandleIndex(Handle1
)
1403 ShellCommandLineFreeVarList (Package
);
1404 SHELL_FREE_NON_NULL(Language
);
1405 return (ShellStatus
);