2 Main file for DrvCfg shell Driver1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2016, 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.
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 if (HandleBuffer
== NULL
) {
60 Status
= EFI_OUT_OF_RESOURCES
;
62 Status
= HiiDb
->ListPackageLists (HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
65 if (EFI_ERROR(Status
)) {
66 SHELL_FREE_NON_NULL(HandleBuffer
);
70 if (HandleBuffer
== NULL
) {
74 for (LoopVariable
= 0 ; LoopVariable
< (HandleBufferSize
/sizeof(HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
77 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
78 if (Status
== EFI_BUFFER_TOO_SMALL
) {
79 MainBuffer
= AllocateZeroPool(MainBufferSize
);
80 if (MainBuffer
!= NULL
) {
81 Status
= HiiDb
->ExportPackageLists (HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
84 if (EFI_ERROR (Status
)) {
88 // Enumerate through the block of returned memory.
89 // This should actually be a small block, but we need to be sure.
91 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
92 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
93 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
94 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
95 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
96 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
97 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
98 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
99 if (DevicePathCompare(&DevPath1
, &DevPath2
) == 0) {
100 *HiiHandle
= HandleBuffer
[LoopVariable
];
106 SHELL_FREE_NON_NULL(MainBuffer
);
108 SHELL_FREE_NON_NULL(HandleBuffer
);
110 if (*HiiHandle
== NULL
) {
111 return (EFI_NOT_FOUND
);
113 return (EFI_SUCCESS
);
117 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
119 @param[in] Handle The EFI_HANDLE to convert.
120 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
121 @param[in] HiiDb The Hii database protocol
123 @retval EFI_SUCCESS The operation was successful.
126 ConvertHandleToHiiHandle(
127 IN CONST EFI_HANDLE Handle
,
128 OUT EFI_HII_HANDLE
*HiiHandle
,
129 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
133 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
135 if (HiiHandle
== NULL
|| HiiDb
== NULL
) {
136 return (EFI_INVALID_PARAMETER
);
140 if (Handle
== NULL
) {
141 return (EFI_SUCCESS
);
145 Status
= gBS
->OpenProtocol(Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
146 if (EFI_ERROR(Status
) || DevPath1
== NULL
) {
147 return (EFI_NOT_FOUND
);
150 return (FindHiiHandleViaDevPath(DevPath1
, HiiHandle
, HiiDb
));
154 Function to print out all HII configuration information to a file.
156 @param[in] Handle The handle to get info on. NULL to do all handles.
157 @param[in] FileName The filename to rwite the info to.
161 IN CONST EFI_HANDLE Handle
,
162 IN CONST CHAR16
*FileName
165 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
168 UINTN MainBufferSize
;
169 EFI_HII_HANDLE HiiHandle
;
170 SHELL_FILE_HANDLE FileHandle
;
177 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
178 if (EFI_ERROR(Status
)) {
183 STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL
),
184 gShellDriver1HiiHandle
,
188 return (SHELL_DEVICE_ERROR
);
192 // Locate HII Database protocol
194 Status
= gBS
->LocateProtocol (
195 &gEfiHiiDatabaseProtocolGuid
,
197 (VOID
**) &HiiDatabase
200 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
205 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
206 gShellDriver1HiiHandle
,
208 L
"EfiHiiDatabaseProtocol",
209 &gEfiHiiDatabaseProtocolGuid
);
210 ShellCloseFile(&FileHandle
);
211 return (SHELL_NOT_FOUND
);
215 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
216 if (EFI_ERROR(Status
)) {
221 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
222 gShellDriver1HiiHandle
,
224 ConvertHandleToHandleIndex(Handle
),
226 ShellCloseFile(&FileHandle
);
227 return (SHELL_DEVICE_ERROR
);
230 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
231 if (Status
== EFI_BUFFER_TOO_SMALL
) {
232 MainBuffer
= AllocateZeroPool(MainBufferSize
);
233 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
236 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
238 ShellCloseFile(&FileHandle
);
239 SHELL_FREE_NON_NULL(MainBuffer
);
241 if (EFI_ERROR(Status
)) {
246 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
247 gShellDriver1HiiHandle
,
250 return (SHELL_DEVICE_ERROR
);
256 STRING_TOKEN(STR_DRVCFG_COMP
),
257 gShellDriver1HiiHandle
);
259 return (SHELL_SUCCESS
);
263 Function to read in HII configuration information from a file.
265 @param[in] Handle The handle to get info for.
266 @param[in] FileName The filename to read the info from.
270 IN EFI_HANDLE Handle
,
271 IN CONST CHAR16
*FileName
274 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
278 UINTN MainBufferSize
;
279 EFI_HII_HANDLE HiiHandle
;
280 SHELL_FILE_HANDLE FileHandle
;
281 CHAR16
*TempDevPathString
;
282 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
283 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
284 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
292 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
293 if (EFI_ERROR(Status
)) {
298 STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL
),
299 gShellDriver1HiiHandle
,
303 return (SHELL_DEVICE_ERROR
);
307 // Locate HII Database protocol
309 Status
= gBS
->LocateProtocol (
310 &gEfiHiiDatabaseProtocolGuid
,
312 (VOID
**) &HiiDatabase
315 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
320 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
321 gShellDriver1HiiHandle
,
323 L
"EfiHiiDatabaseProtocol",
324 &gEfiHiiDatabaseProtocolGuid
);
325 ShellCloseFile(&FileHandle
);
326 return (SHELL_NOT_FOUND
);
329 Status
= ShellGetFileSize(FileHandle
, &Temp
);
330 MainBufferSize
= (UINTN
)Temp
;
331 if (EFI_ERROR(Status
)) {
336 STRING_TOKEN(STR_FILE_READ_FAIL
),
337 gShellDriver1HiiHandle
,
341 ShellCloseFile(&FileHandle
);
342 return (SHELL_DEVICE_ERROR
);
344 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
345 if (EFI_ERROR(Status
)) {
350 STRING_TOKEN(STR_GEN_OUT_MEM
),
351 gShellDriver1HiiHandle
, L
"drvcfg");
352 ShellCloseFile(&FileHandle
);
353 return (SHELL_DEVICE_ERROR
);
355 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
356 if (EFI_ERROR(Status
)) {
361 STRING_TOKEN(STR_FILE_READ_FAIL
),
362 gShellDriver1HiiHandle
,
366 ShellCloseFile(&FileHandle
);
367 SHELL_FREE_NON_NULL(MainBuffer
);
368 return (SHELL_DEVICE_ERROR
);
371 ShellCloseFile(&FileHandle
);
373 if (Handle
!= NULL
) {
375 // User override in place. Just do it.
378 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
379 if (EFI_ERROR(Status
)) {
384 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
385 gShellDriver1HiiHandle
, L
"drvcfg",
386 ConvertHandleToHandleIndex(Handle
),
388 ShellCloseFile(&FileHandle
);
389 return (SHELL_DEVICE_ERROR
);
391 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
392 if (EFI_ERROR(Status
)) {
397 STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN
),
398 gShellDriver1HiiHandle
,
400 L
"HiiDatabase->UpdatePackageList",
402 return (SHELL_DEVICE_ERROR
);
406 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
409 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
410 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
411 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
412 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
413 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
414 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
415 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
417 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
418 if (EFI_ERROR(Status
)) {
420 // print out an error.
422 TempDevPathString
= ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
427 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
428 gShellDriver1HiiHandle
,
430 SHELL_FREE_NON_NULL(TempDevPathString
);
432 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
433 if (EFI_ERROR(Status
)) {
438 STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN
),
439 gShellDriver1HiiHandle
,
441 L
"HiiDatabase->UpdatePackageList",
443 return (SHELL_DEVICE_ERROR
);
445 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
446 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
447 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
452 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
453 gShellDriver1HiiHandle
,
462 SHELL_FREE_NON_NULL(MainBuffer
);
469 STRING_TOKEN(STR_DRVCFG_COMP
),
470 gShellDriver1HiiHandle
);
471 return (SHELL_SUCCESS
);
475 Present a requested action to the user.
477 @param[in] DriverImageHandle The handle for the driver to configure.
478 @param[in] ControllerHandle The handle of the device being managed by the Driver specified.
479 @param[in] ChildHandle The handle of a child device of the specified device.
480 @param[in] ActionRequired The required HII action.
482 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
485 ShellCmdDriverConfigurationProcessActionRequired (
486 EFI_HANDLE DriverImageHandle
,
487 EFI_HANDLE ControllerHandle
,
488 EFI_HANDLE ChildHandle
,
489 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
492 EFI_HANDLE ConnectControllerContextOverride
[2];
494 switch (ActionRequired
) {
495 case EfiDriverConfigurationActionNone
:
496 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
499 case EfiDriverConfigurationActionStopController
:
500 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
501 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
502 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
504 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
505 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
508 case EfiDriverConfigurationActionRestartController
:
509 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
510 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
511 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
513 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
514 ConnectControllerContextOverride
[0] = DriverImageHandle
;
515 ConnectControllerContextOverride
[1] = NULL
;
516 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
517 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
520 case EfiDriverConfigurationActionRestartPlatform
:
521 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
522 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
523 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
525 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
529 return (EFI_INVALID_PARAMETER
);
536 Do the configuration in an environment without HII.
538 @param[in] Language The language code.
539 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.
540 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.
541 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.
542 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.
543 @param[in] SetOptions TRUE to set options, FALSE otherwise.
544 @param[in] DriverImageHandle The handle for the driver to configure.
545 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.
546 @param[in] ChildHandle The handle of a child device of the specified device.
548 @retval SHELL_NOT_FOUND A specified handle could not be found.
549 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
553 IN CONST CHAR8
*Language
,
554 IN BOOLEAN ForceDefaults
,
555 IN UINT32 DefaultType
,
556 IN BOOLEAN AllChildren
,
557 IN BOOLEAN ValidateOptions
,
558 IN BOOLEAN SetOptions
,
559 IN EFI_HANDLE DriverImageHandle
,
560 IN EFI_HANDLE DeviceHandle
,
561 IN EFI_HANDLE ChildHandle
565 SHELL_STATUS ShellStatus
;
566 UINTN OuterLoopCounter
;
568 UINTN DriverImageHandleCount
;
569 EFI_HANDLE
*DriverImageHandleBuffer
;
571 EFI_HANDLE
*HandleBuffer
;
575 UINTN ChildHandleCount
;
576 EFI_HANDLE
*ChildHandleBuffer
;
577 UINTN
*ChildHandleType
;
578 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
579 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
580 BOOLEAN Iso639Language
;
585 ShellStatus
= SHELL_SUCCESS
;
587 if (ChildHandle
== NULL
&& AllChildren
) {
596 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
597 gShellDriver1HiiHandle
,
599 } else if (ValidateOptions
) {
604 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
605 gShellDriver1HiiHandle
);
606 } else if (SetOptions
) {
611 STRING_TOKEN (STR_DRVCFG_SET
),
612 gShellDriver1HiiHandle
);
615 if (DriverImageHandle
== 0) {
616 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
617 if (DriverImageHandleBuffer
== NULL
) {
618 ShellStatus
= SHELL_NOT_FOUND
;
622 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
623 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
624 ; HandleBuffer
++,DriverImageHandleCount
++);
626 DriverImageHandleCount
= 1;
628 // Allocate buffer to hold the image handle so as to
629 // keep consistent with the above clause
631 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
632 ASSERT (DriverImageHandleBuffer
);
633 DriverImageHandleBuffer
[0] = DriverImageHandle
;
636 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
637 Iso639Language
= FALSE
;
638 Status
= gBS
->OpenProtocol (
639 DriverImageHandleBuffer
[OuterLoopCounter
],
640 &gEfiDriverConfiguration2ProtocolGuid
,
641 (VOID
**) &DriverConfiguration
,
644 EFI_OPEN_PROTOCOL_GET_PROTOCOL
646 if (EFI_ERROR (Status
)) {
647 Iso639Language
= TRUE
;
648 Status
= gBS
->OpenProtocol (
649 DriverImageHandleBuffer
[OuterLoopCounter
],
650 &gEfiDriverConfigurationProtocolGuid
,
651 (VOID
**) &DriverConfiguration
,
654 EFI_OPEN_PROTOCOL_GET_PROTOCOL
657 if (EFI_ERROR (Status
)) {
662 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
663 // gShellDriver1HiiHandle,
664 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
666 ShellStatus
= SHELL_UNSUPPORTED
;
670 BestLanguage
= GetBestLanguage (
671 DriverConfiguration
->SupportedLanguages
,
673 Language
!=NULL
?Language
:"",
674 DriverConfiguration
->SupportedLanguages
,
677 if (BestLanguage
== NULL
) {
682 STRING_TOKEN (STR_GEN_NO_VALUE
),
683 gShellDriver1HiiHandle
,
687 ShellStatus
= SHELL_INVALID_PARAMETER
;
691 Status
= ParseHandleDatabaseByRelationshipWithType (
692 DriverImageHandleBuffer
[OuterLoopCounter
],
698 if (EFI_ERROR (Status
)) {
702 if (SetOptions
&& DeviceHandle
== NULL
) {
704 gST
->ConOut
->ClearScreen (gST
->ConOut
);
705 Status
= DriverConfiguration
->SetOptions (
712 gST
->ConOut
->ClearScreen (gST
->ConOut
);
718 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
719 gShellDriver1HiiHandle
,
720 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
721 DriverConfiguration
->SupportedLanguages
723 if (!EFI_ERROR (Status
)) {
728 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
729 gShellDriver1HiiHandle
);
730 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
731 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
732 ShellCmdDriverConfigurationProcessActionRequired (
733 DriverImageHandleBuffer
[OuterLoopCounter
],
734 HandleBuffer
[LoopCounter
],
745 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
746 gShellDriver1HiiHandle
,
752 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
753 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
756 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
759 if (ChildHandle
== NULL
) {
760 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
761 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
766 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
767 gShellDriver1HiiHandle
,
770 DriverConfiguration
->SupportedLanguages
774 Status
= DriverConfiguration
->ForceDefaults (
776 HandleBuffer
[LoopCounter
],
782 if (!EFI_ERROR (Status
)) {
787 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
788 gShellDriver1HiiHandle
);
789 ShellCmdDriverConfigurationProcessActionRequired (
790 DriverImageHandleBuffer
[OuterLoopCounter
],
791 HandleBuffer
[LoopCounter
],
800 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
801 gShellDriver1HiiHandle
,
803 ShellStatus
= SHELL_DEVICE_ERROR
;
805 } else if (ValidateOptions
) {
806 Status
= DriverConfiguration
->OptionsValid (
808 HandleBuffer
[LoopCounter
],
812 if (!EFI_ERROR (Status
)) {
817 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
818 gShellDriver1HiiHandle
);
824 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
825 gShellDriver1HiiHandle
,
827 ShellStatus
= SHELL_DEVICE_ERROR
;
829 } else if (SetOptions
) {
830 gST
->ConOut
->ClearScreen (gST
->ConOut
);
831 Status
= DriverConfiguration
->SetOptions (
833 HandleBuffer
[LoopCounter
],
838 gST
->ConOut
->ClearScreen (gST
->ConOut
);
839 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
840 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
845 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
846 gShellDriver1HiiHandle
,
849 DriverConfiguration
->SupportedLanguages
851 if (!EFI_ERROR (Status
)) {
856 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
857 gShellDriver1HiiHandle
);
859 ShellCmdDriverConfigurationProcessActionRequired (
860 DriverImageHandleBuffer
[OuterLoopCounter
],
861 HandleBuffer
[LoopCounter
],
871 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
872 gShellDriver1HiiHandle
,
874 ShellStatus
= SHELL_DEVICE_ERROR
;
881 if (ChildHandle
== NULL
&& !AllChildren
) {
885 Status
= ParseHandleDatabaseByRelationshipWithType (
886 DriverImageHandleBuffer
[OuterLoopCounter
],
887 HandleBuffer
[LoopCounter
],
892 if (EFI_ERROR (Status
)) {
896 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
898 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
902 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
906 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
907 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
908 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
913 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
914 gShellDriver1HiiHandle
,
918 DriverConfiguration
->SupportedLanguages
);
921 Status
= DriverConfiguration
->ForceDefaults (
923 HandleBuffer
[LoopCounter
],
924 ChildHandleBuffer
[ChildIndex
],
929 if (!EFI_ERROR (Status
)) {
934 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
935 gShellDriver1HiiHandle
);
937 ShellCmdDriverConfigurationProcessActionRequired (
938 DriverImageHandleBuffer
[OuterLoopCounter
],
939 HandleBuffer
[LoopCounter
],
940 ChildHandleBuffer
[ChildIndex
],
949 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
950 gShellDriver1HiiHandle
,
952 ShellStatus
= SHELL_DEVICE_ERROR
;
954 } else if (ValidateOptions
) {
955 Status
= DriverConfiguration
->OptionsValid (
957 HandleBuffer
[LoopCounter
],
958 ChildHandleBuffer
[ChildIndex
]
961 if (!EFI_ERROR (Status
)) {
966 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
967 gShellDriver1HiiHandle
);
973 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
974 gShellDriver1HiiHandle
,
976 ShellStatus
= SHELL_DEVICE_ERROR
;
978 } else if (SetOptions
) {
979 gST
->ConOut
->ClearScreen (gST
->ConOut
);
980 Status
= DriverConfiguration
->SetOptions (
982 HandleBuffer
[LoopCounter
],
983 ChildHandleBuffer
[ChildIndex
],
987 gST
->ConOut
->ClearScreen (gST
->ConOut
);
988 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
989 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
990 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
995 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
996 gShellDriver1HiiHandle
,
1000 DriverConfiguration
->SupportedLanguages
1002 if (!EFI_ERROR (Status
)) {
1007 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
1008 gShellDriver1HiiHandle
);
1010 ShellCmdDriverConfigurationProcessActionRequired (
1011 DriverImageHandleBuffer
[OuterLoopCounter
],
1012 HandleBuffer
[LoopCounter
],
1013 ChildHandleBuffer
[ChildIndex
],
1022 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
1023 gShellDriver1HiiHandle
,
1025 ShellStatus
= SHELL_DEVICE_ERROR
;
1032 FreePool (ChildHandleBuffer
);
1033 FreePool (ChildHandleType
);
1036 FreePool (BestLanguage
);
1037 FreePool (HandleBuffer
);
1038 FreePool (HandleType
);
1041 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1042 FreePool (DriverImageHandleBuffer
);
1050 Function to print out configuration information on all configurable handles.
1052 @param[in] ChildrenToo TRUE to tewst for children.
1053 @param[in] Language ASCII string for language code.
1054 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1056 @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
;
1174 ProblemParam
= NULL
;
1177 // initialize the shell lib (we must be in non-auto-init...)
1179 Status
= ShellInitialize();
1180 ASSERT_EFI_ERROR(Status
);
1182 Status
= CommandInit();
1183 ASSERT_EFI_ERROR(Status
);
1186 // parse the command line
1188 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1189 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1191 if (Package
!= NULL
) {
1192 ShellCommandLineFreeVarList (Package
);
1194 SHELL_FREE_NON_NULL(ProblemParam
);
1195 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1196 if (EFI_ERROR(Status
)) {
1197 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1198 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"drvcfg", ProblemParam
);
1199 FreePool(ProblemParam
);
1200 ShellStatus
= SHELL_INVALID_PARAMETER
;
1207 if (ShellStatus
== SHELL_SUCCESS
) {
1208 if (ShellCommandLineGetCount(Package
) > 4) {
1209 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"drvcfg");
1210 ShellStatus
= SHELL_INVALID_PARAMETER
;
1213 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1215 Language
= AllocateZeroPool(StrSize(Lang
));
1216 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1217 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1218 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-l");
1219 ShellStatus
= SHELL_INVALID_PARAMETER
;
1222 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1223 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1224 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1225 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1226 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1227 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1228 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1231 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1232 } else if (InFromFile
) {
1233 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1238 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1239 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1240 ShellStatus
= SHELL_INVALID_PARAMETER
;
1243 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1244 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, L
"drvcfg", FileName
);
1245 ShellStatus
= SHELL_INVALID_PARAMETER
;
1248 if (Force
&& ForceTypeString
== NULL
) {
1249 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-f");
1250 ShellStatus
= SHELL_INVALID_PARAMETER
;
1254 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1255 if (EFI_ERROR(Status
)) {
1256 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"drvcfg", ForceTypeString
, L
"-f");
1257 ShellStatus
= SHELL_INVALID_PARAMETER
;
1260 ForceType
= (UINT32
)Intermediate
;
1264 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1266 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1267 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1268 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1269 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex1
);
1270 ShellStatus
= SHELL_INVALID_PARAMETER
;
1274 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1276 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1277 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1278 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1279 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex2
);
1280 ShellStatus
= SHELL_INVALID_PARAMETER
;
1284 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1286 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1287 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1288 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1289 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"drvcfg", HandleIndex3
);
1290 ShellStatus
= SHELL_INVALID_PARAMETER
;
1295 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1296 if (FileName
== NULL
) {
1297 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvcfg", InFromFile
?L
"-i":L
"-o");
1299 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
, L
"drvcfg");
1301 ShellStatus
= SHELL_INVALID_PARAMETER
;
1304 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1306 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i");
1307 ShellStatus
= SHELL_INVALID_PARAMETER
;
1311 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-o");
1312 ShellStatus
= SHELL_INVALID_PARAMETER
;
1316 if (Validate
&& Force
) {
1317 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-f");
1318 ShellStatus
= SHELL_INVALID_PARAMETER
;
1321 if (Validate
&& Set
) {
1322 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-v", L
"-s");
1323 ShellStatus
= SHELL_INVALID_PARAMETER
;
1327 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-s", L
"-f");
1328 ShellStatus
= SHELL_INVALID_PARAMETER
;
1331 if (OutToFile
&& InFromFile
) {
1332 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONFLICT
), gShellDriver1HiiHandle
, L
"drvcfg", L
"-i", L
"-o");
1333 ShellStatus
= SHELL_INVALID_PARAMETER
;
1341 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1343 // no HII on this handle.
1345 ShellStatus
= SHELL_UNSUPPORTED
;
1346 } else if (Validate
) {
1349 } else if (InFromFile
) {
1350 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1351 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1354 } else if (OutToFile
) {
1355 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1356 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1359 } else if (HandleIndex1
== NULL
) {
1361 // display all that are configurable
1363 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1366 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1371 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1372 gShellDriver1HiiHandle
,
1373 ConvertHandleToHandleIndex(Handle1
)
1381 // We allways need to do this one since it does both by default.
1383 if (!InFromFile
&& !OutToFile
) {
1384 ShellStatus
= PreHiiDrvCfg (
1396 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1401 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1402 gShellDriver1HiiHandle
,
1403 ConvertHandleToHandleIndex(Handle1
)
1409 ShellCommandLineFreeVarList (Package
);
1410 SHELL_FREE_NON_NULL(Language
);
1411 return (ShellStatus
);