2 Main file for DrvCfg shell Driver1 function.
4 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDriver1CommandsLib.h"
16 #include <Protocol/HiiConfigAccess.h>
17 #include <Protocol/HiiDatabase.h>
19 STATIC CONST EFI_GUID
*CfgGuidList
[] = {&gEfiDriverConfigurationProtocolGuid
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
};
22 Find the EFI_HII_HANDLE by device path.
24 @param[in] DevPath1 The Device Path to match.
25 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
26 @param[in] HiiDb The Hii database protocol
28 @retval EFI_SUCCESS The operation was successful.
29 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.
33 FindHiiHandleViaDevPath(
34 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath1
,
35 OUT EFI_HII_HANDLE
*HiiHandle
,
36 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
39 EFI_HII_HANDLE
*HandleBuffer
;
40 UINTN HandleBufferSize
;
43 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
44 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
46 EFI_DEVICE_PATH_PROTOCOL
*DevPath2
;
49 ASSERT(DevPath1
!= NULL
);
50 ASSERT(HiiHandle
!= NULL
);
51 ASSERT(*HiiHandle
== NULL
);
52 ASSERT(HiiDb
!= NULL
);
56 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
57 if (Status
== EFI_BUFFER_TOO_SMALL
) {
58 HandleBuffer
= AllocateZeroPool(HandleBufferSize
);
59 ASSERT (HandleBuffer
!= NULL
);
60 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
62 if (EFI_ERROR(Status
)) {
63 SHELL_FREE_NON_NULL(HandleBuffer
);
67 if (HandleBuffer
== NULL
) {
71 for (LoopVariable
= 0 ; LoopVariable
< (HandleBufferSize
/sizeof(HandleBuffer
[0])) && *HiiHandle
== NULL
; LoopVariable
++) {
74 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
75 if (Status
== EFI_BUFFER_TOO_SMALL
) {
76 MainBuffer
= AllocateZeroPool(MainBufferSize
);
77 ASSERT (MainBuffer
!= NULL
);
78 Status
= HiiDb
->ExportPackageLists(HiiDb
, HandleBuffer
[LoopVariable
], &MainBufferSize
, MainBuffer
);
81 // Enumerate through the block of returned memory.
82 // This should actually be a small block, but we need to be sure.
84 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
85 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && *HiiHandle
== NULL
86 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
87 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
88 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
&& *HiiHandle
== NULL
89 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
90 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
91 DevPath2
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
92 if (DevicePathCompare(&DevPath1
, &DevPath2
) == 0) {
93 *HiiHandle
= HandleBuffer
[LoopVariable
];
99 SHELL_FREE_NON_NULL(MainBuffer
);
101 SHELL_FREE_NON_NULL(HandleBuffer
);
103 if (*HiiHandle
== NULL
) {
104 return (EFI_NOT_FOUND
);
106 return (EFI_SUCCESS
);
110 Convert a EFI_HANDLE to a EFI_HII_HANDLE.
112 @param[in] Handle The EFI_HANDLE to convert.
113 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
114 @param[in] HiiDb The Hii database protocol
116 @retval EFI_SUCCESS The operation was successful.
120 ConvertHandleToHiiHandle(
121 IN CONST EFI_HANDLE Handle
,
122 OUT EFI_HII_HANDLE
*HiiHandle
,
123 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
127 EFI_DEVICE_PATH_PROTOCOL
*DevPath1
;
129 if (HiiHandle
== NULL
|| HiiDb
== NULL
) {
130 return (EFI_INVALID_PARAMETER
);
134 if (Handle
== NULL
) {
135 return (EFI_SUCCESS
);
139 Status
= gBS
->OpenProtocol(Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**)&DevPath1
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
140 if (EFI_ERROR(Status
) || DevPath1
== NULL
) {
141 return (EFI_NOT_FOUND
);
144 return (FindHiiHandleViaDevPath(DevPath1
, HiiHandle
, HiiDb
));
148 Function to print out all HII configuration information to a file.
150 @param[in] Handle The handle to get info on. NULL to do all handles.
151 @param[in] FileName The filename to rwite the info to.
156 IN CONST EFI_HANDLE Handle
,
157 IN CONST CHAR16
*FileName
160 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
163 UINTN MainBufferSize
;
164 EFI_HII_HANDLE HiiHandle
;
165 SHELL_FILE_HANDLE FileHandle
;
172 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
173 if (EFI_ERROR(Status
)) {
178 STRING_TOKEN(STR_GEN_FILE_OPEN
),
179 gShellDriver1HiiHandle
,
182 return (SHELL_DEVICE_ERROR
);
186 // Locate HII Database protocol
188 Status
= gBS
->LocateProtocol (
189 &gEfiHiiDatabaseProtocolGuid
,
191 (VOID
**) &HiiDatabase
194 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
199 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
200 gShellDriver1HiiHandle
,
201 L
"EfiHiiDatabaseProtocol",
202 &gEfiHiiDatabaseProtocolGuid
);
203 ShellCloseFile(&FileHandle
);
204 return (SHELL_NOT_FOUND
);
207 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
208 if (EFI_ERROR(Status
)) {
213 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
214 gShellDriver1HiiHandle
,
215 ConvertHandleToHandleIndex(Handle
),
217 ShellCloseFile(&FileHandle
);
218 return (SHELL_DEVICE_ERROR
);
221 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
222 if (Status
== EFI_BUFFER_TOO_SMALL
) {
223 MainBuffer
= AllocateZeroPool(MainBufferSize
);
224 Status
= HiiDatabase
->ExportPackageLists(HiiDatabase
, HiiHandle
, &MainBufferSize
, MainBuffer
);
227 Status
= ShellWriteFile(FileHandle
, &MainBufferSize
, MainBuffer
);
229 ShellCloseFile(&FileHandle
);
230 SHELL_FREE_NON_NULL(MainBuffer
);
232 if (EFI_ERROR(Status
)) {
237 STRING_TOKEN(STR_FILE_WRITE_FAIL
),
238 gShellDriver1HiiHandle
,
241 return (SHELL_DEVICE_ERROR
);
247 STRING_TOKEN(STR_DRVCFG_COMP
),
248 gShellDriver1HiiHandle
);
250 return (SHELL_SUCCESS
);
254 Function to read in HII configuration information from a file.
256 @param[in] Handle The handle to get info for.
257 @param[in] FileName The filename to read the info from.
262 IN EFI_HANDLE Handle
,
263 IN CONST CHAR16
*FileName
266 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
270 UINTN MainBufferSize
;
271 EFI_HII_HANDLE HiiHandle
;
272 SHELL_FILE_HANDLE FileHandle
;
273 CHAR16
*TempDevPathString
;
274 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
275 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
276 EFI_DEVICE_PATH_PROTOCOL
*DevPath
;
284 Status
= ShellOpenFileByName(FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
285 if (EFI_ERROR(Status
)) {
290 STRING_TOKEN(STR_GEN_FILE_OPEN
),
291 gShellDriver1HiiHandle
,
294 return (SHELL_DEVICE_ERROR
);
298 // Locate HII Database protocol
300 Status
= gBS
->LocateProtocol (
301 &gEfiHiiDatabaseProtocolGuid
,
303 (VOID
**) &HiiDatabase
306 if (EFI_ERROR(Status
) || HiiDatabase
== NULL
) {
311 STRING_TOKEN(STR_GEN_PROTOCOL_NF
),
312 gShellDriver1HiiHandle
,
313 L
"EfiHiiDatabaseProtocol",
314 &gEfiHiiDatabaseProtocolGuid
);
315 ShellCloseFile(&FileHandle
);
316 return (SHELL_NOT_FOUND
);
319 Status
= ShellGetFileSize(FileHandle
, &Temp
);
320 MainBufferSize
= (UINTN
)Temp
;
321 if (EFI_ERROR(Status
)) {
326 STRING_TOKEN(STR_FILE_READ_FAIL
),
327 gShellDriver1HiiHandle
,
330 ShellCloseFile(&FileHandle
);
331 return (SHELL_DEVICE_ERROR
);
333 MainBuffer
= AllocateZeroPool((UINTN
)MainBufferSize
);
334 if (EFI_ERROR(Status
)) {
339 STRING_TOKEN(STR_GEN_OUT_MEM
),
340 gShellDriver1HiiHandle
);
341 ShellCloseFile(&FileHandle
);
342 return (SHELL_DEVICE_ERROR
);
344 Status
= ShellReadFile(FileHandle
, &MainBufferSize
, MainBuffer
);
345 if (EFI_ERROR(Status
)) {
350 STRING_TOKEN(STR_FILE_READ_FAIL
),
351 gShellDriver1HiiHandle
,
354 ShellCloseFile(&FileHandle
);
355 SHELL_FREE_NON_NULL(MainBuffer
);
356 return (SHELL_DEVICE_ERROR
);
359 ShellCloseFile(&FileHandle
);
361 if (Handle
!= NULL
) {
363 // User override in place. Just do it.
366 Status
= ConvertHandleToHiiHandle(Handle
, &HiiHandle
, HiiDatabase
);
367 if (EFI_ERROR(Status
)) {
372 STRING_TOKEN(STR_GEN_HANDLE_NOT
),
373 gShellDriver1HiiHandle
,
374 ConvertHandleToHandleIndex(Handle
),
376 ShellCloseFile(&FileHandle
);
377 return (SHELL_DEVICE_ERROR
);
379 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, MainBuffer
);
380 if (EFI_ERROR(Status
)) {
385 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
386 gShellDriver1HiiHandle
,
387 L
"HiiDatabase->UpdatePackageList",
389 return (SHELL_DEVICE_ERROR
);
393 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
396 for (PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)MainBuffer
397 ; PackageListHeader
!= NULL
&& ((CHAR8
*)PackageListHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
)
398 ; PackageListHeader
= (EFI_HII_PACKAGE_LIST_HEADER
*)(((CHAR8
*)(PackageListHeader
)) + PackageListHeader
->PackageLength
)) {
399 for (PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageListHeader
))+sizeof(EFI_HII_PACKAGE_LIST_HEADER
))
400 ; PackageHeader
!= NULL
&& ((CHAR8
*)PackageHeader
) < (((CHAR8
*)MainBuffer
)+MainBufferSize
) && PackageHeader
->Type
!= EFI_HII_PACKAGE_END
401 ; PackageHeader
= (EFI_HII_PACKAGE_HEADER
*)(((CHAR8
*)(PackageHeader
))+PackageHeader
->Length
)) {
402 if (PackageHeader
->Type
== EFI_HII_PACKAGE_DEVICE_PATH
) {
404 Status
= FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), &HiiHandle
, HiiDatabase
);
405 if (EFI_ERROR(Status
)) {
407 // print out an error.
409 TempDevPathString
= ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
)), TRUE
, TRUE
);
414 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF
),
415 gShellDriver1HiiHandle
,
417 SHELL_FREE_NON_NULL(TempDevPathString
);
419 Status
= HiiDatabase
->UpdatePackageList(HiiDatabase
, HiiHandle
, PackageListHeader
);
420 if (EFI_ERROR(Status
)) {
425 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR
),
426 gShellDriver1HiiHandle
,
427 L
"HiiDatabase->UpdatePackageList",
429 return (SHELL_DEVICE_ERROR
);
431 DevPath
= (EFI_DEVICE_PATH_PROTOCOL
*)(((CHAR8
*)PackageHeader
) + sizeof(EFI_HII_PACKAGE_HEADER
));
432 gBS
->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid
, &DevPath
, &Handle
);
433 HandleIndex
= ConvertHandleToHandleIndex(Handle
);
438 STRING_TOKEN(STR_DRVCFG_DONE_HII
),
439 gShellDriver1HiiHandle
,
448 SHELL_FREE_NON_NULL(MainBuffer
);
455 STRING_TOKEN(STR_DRVCFG_COMP
),
456 gShellDriver1HiiHandle
);
457 return (SHELL_SUCCESS
);
461 Present a requested action to the user.
463 @param[in] DriverImageHandle The handle for the driver to configure.
464 @param[in] ControllerHandle The handle of the device being managed by the Driver specified.
465 @param[in] ChildHandle The handle of a child device of the specified device.
466 @param[in] ActionRequired The required HII action.
468 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
472 ShellCmdDriverConfigurationProcessActionRequired (
473 EFI_HANDLE DriverImageHandle
,
474 EFI_HANDLE ControllerHandle
,
475 EFI_HANDLE ChildHandle
,
476 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
479 EFI_HANDLE ConnectControllerContextOverride
[2];
481 switch (ActionRequired
) {
482 case EfiDriverConfigurationActionNone
:
483 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
486 case EfiDriverConfigurationActionStopController
:
487 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_STOP
), gShellDriver1HiiHandle
);
488 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"stop controller");
489 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
491 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
492 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"stopped");
495 case EfiDriverConfigurationActionRestartController
:
496 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"controller");
497 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart controller");
498 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
500 gBS
->DisconnectController (ControllerHandle
, DriverImageHandle
, ChildHandle
);
501 ConnectControllerContextOverride
[0] = DriverImageHandle
;
502 ConnectControllerContextOverride
[1] = NULL
;
503 gBS
->ConnectController (ControllerHandle
, ConnectControllerContextOverride
, NULL
, TRUE
);
504 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_CTLR_S
), gShellDriver1HiiHandle
, L
"restarted");
507 case EfiDriverConfigurationActionRestartPlatform
:
508 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_RESTART_S
), gShellDriver1HiiHandle
, L
"platform");
509 ShellPrintHiiEx(-1,-1,NULL
,STRING_TOKEN (STR_DRVCFG_ENTER_S
), gShellDriver1HiiHandle
, L
"restart platform");
510 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue
, NULL
, NULL
);
512 gRT
->ResetSystem (EfiResetCold
, EFI_SUCCESS
, 0, NULL
);
516 return (EFI_INVALID_PARAMETER
);
523 Do the configuration in an environment without HII.
525 @param[in] Language The language code.
526 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.
527 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.
528 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.
529 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.
530 @param[in] SetOptions TRUE to set options, FALSE otherwise.
531 @param[in] DriverImageHandle The handle for the driver to configure.
532 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.
533 @param[in] ChildHandle The handle of a child device of the specified device.
535 @retval SHELL_NOT_FOUND A specified handle could not be found.
536 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
541 IN CONST CHAR8
*Language
,
542 IN BOOLEAN ForceDefaults
,
543 IN UINT32 DefaultType
,
544 IN BOOLEAN AllChildren
,
545 IN BOOLEAN ValidateOptions
,
546 IN BOOLEAN SetOptions
,
547 IN EFI_HANDLE DriverImageHandle
,
548 IN EFI_HANDLE DeviceHandle
,
549 IN EFI_HANDLE ChildHandle
553 SHELL_STATUS ShellStatus
;
554 UINTN OuterLoopCounter
;
556 UINTN DriverImageHandleCount
;
557 EFI_HANDLE
*DriverImageHandleBuffer
;
559 EFI_HANDLE
*HandleBuffer
;
563 UINTN ChildHandleCount
;
564 EFI_HANDLE
*ChildHandleBuffer
;
565 UINTN
*ChildHandleType
;
566 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
567 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
568 BOOLEAN Iso639Language
;
573 ShellStatus
= SHELL_SUCCESS
;
575 if (ChildHandle
== NULL
&& AllChildren
) {
584 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
585 gShellDriver1HiiHandle
,
587 } else if (ValidateOptions
) {
592 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
593 gShellDriver1HiiHandle
);
594 } else if (SetOptions
) {
599 STRING_TOKEN (STR_DRVCFG_SET
),
600 gShellDriver1HiiHandle
);
603 if (DriverImageHandle
== 0) {
604 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
605 if (DriverImageHandleBuffer
== NULL
) {
606 ShellStatus
= SHELL_NOT_FOUND
;
610 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
611 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
612 ; HandleBuffer
++,DriverImageHandleCount
++);
614 DriverImageHandleCount
= 1;
616 // Allocate buffer to hold the image handle so as to
617 // keep consistent with the above clause
619 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
620 ASSERT (DriverImageHandleBuffer
);
621 DriverImageHandleBuffer
[0] = DriverImageHandle
;
624 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
625 Iso639Language
= FALSE
;
626 Status
= gBS
->OpenProtocol (
627 DriverImageHandleBuffer
[OuterLoopCounter
],
628 &gEfiDriverConfiguration2ProtocolGuid
,
629 (VOID
**) &DriverConfiguration
,
632 EFI_OPEN_PROTOCOL_GET_PROTOCOL
634 if (EFI_ERROR (Status
)) {
635 Iso639Language
= TRUE
;
636 Status
= gBS
->OpenProtocol (
637 DriverImageHandleBuffer
[OuterLoopCounter
],
638 &gEfiDriverConfigurationProtocolGuid
,
639 (VOID
**) &DriverConfiguration
,
642 EFI_OPEN_PROTOCOL_GET_PROTOCOL
645 if (EFI_ERROR (Status
)) {
650 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
651 // gShellDriver1HiiHandle,
652 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
654 ShellStatus
= SHELL_UNSUPPORTED
;
658 BestLanguage
= GetBestLanguage (
659 DriverConfiguration
->SupportedLanguages
,
661 Language
!=NULL
?Language
:"",
662 DriverConfiguration
->SupportedLanguages
,
665 if (BestLanguage
== NULL
) {
670 STRING_TOKEN (STR_GEN_PROBLEM_VAL
),
671 gShellDriver1HiiHandle
,
674 ShellStatus
= SHELL_INVALID_PARAMETER
;
678 Status
= ParseHandleDatabaseByRelationshipWithType (
679 DriverImageHandleBuffer
[OuterLoopCounter
],
685 if (EFI_ERROR (Status
)) {
689 if (SetOptions
&& DeviceHandle
== NULL
) {
691 gST
->ConOut
->ClearScreen (gST
->ConOut
);
692 Status
= DriverConfiguration
->SetOptions (
699 gST
->ConOut
->ClearScreen (gST
->ConOut
);
705 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
706 gShellDriver1HiiHandle
,
707 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
708 DriverConfiguration
->SupportedLanguages
710 if (!EFI_ERROR (Status
)) {
715 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
716 gShellDriver1HiiHandle
);
717 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
718 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
719 ShellCmdDriverConfigurationProcessActionRequired (
720 DriverImageHandleBuffer
[OuterLoopCounter
],
721 HandleBuffer
[LoopCounter
],
732 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
733 gShellDriver1HiiHandle
,
739 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
740 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
743 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
746 if (ChildHandle
== NULL
) {
747 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
748 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
753 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
754 gShellDriver1HiiHandle
,
757 DriverConfiguration
->SupportedLanguages
761 Status
= DriverConfiguration
->ForceDefaults (
763 HandleBuffer
[LoopCounter
],
769 if (!EFI_ERROR (Status
)) {
774 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
775 gShellDriver1HiiHandle
);
776 ShellCmdDriverConfigurationProcessActionRequired (
777 DriverImageHandleBuffer
[OuterLoopCounter
],
778 HandleBuffer
[LoopCounter
],
787 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
788 gShellDriver1HiiHandle
,
790 ShellStatus
= SHELL_DEVICE_ERROR
;
792 } else if (ValidateOptions
) {
793 Status
= DriverConfiguration
->OptionsValid (
795 HandleBuffer
[LoopCounter
],
799 if (!EFI_ERROR (Status
)) {
804 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
805 gShellDriver1HiiHandle
);
811 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
812 gShellDriver1HiiHandle
,
814 ShellStatus
= SHELL_DEVICE_ERROR
;
816 } else if (SetOptions
) {
817 gST
->ConOut
->ClearScreen (gST
->ConOut
);
818 Status
= DriverConfiguration
->SetOptions (
820 HandleBuffer
[LoopCounter
],
825 gST
->ConOut
->ClearScreen (gST
->ConOut
);
826 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
827 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
832 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
833 gShellDriver1HiiHandle
,
836 DriverConfiguration
->SupportedLanguages
838 if (!EFI_ERROR (Status
)) {
843 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
844 gShellDriver1HiiHandle
);
846 ShellCmdDriverConfigurationProcessActionRequired (
847 DriverImageHandleBuffer
[OuterLoopCounter
],
848 HandleBuffer
[LoopCounter
],
858 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
859 gShellDriver1HiiHandle
,
861 ShellStatus
= SHELL_DEVICE_ERROR
;
868 if (ChildHandle
== NULL
&& !AllChildren
) {
872 Status
= ParseHandleDatabaseByRelationshipWithType (
873 DriverImageHandleBuffer
[OuterLoopCounter
],
874 HandleBuffer
[LoopCounter
],
879 if (EFI_ERROR (Status
)) {
883 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
885 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
889 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
893 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
894 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
895 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
900 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
901 gShellDriver1HiiHandle
,
905 DriverConfiguration
->SupportedLanguages
);
908 Status
= DriverConfiguration
->ForceDefaults (
910 HandleBuffer
[LoopCounter
],
911 ChildHandleBuffer
[ChildIndex
],
916 if (!EFI_ERROR (Status
)) {
921 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
922 gShellDriver1HiiHandle
);
924 ShellCmdDriverConfigurationProcessActionRequired (
925 DriverImageHandleBuffer
[OuterLoopCounter
],
926 HandleBuffer
[LoopCounter
],
927 ChildHandleBuffer
[ChildIndex
],
936 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
937 gShellDriver1HiiHandle
,
939 ShellStatus
= SHELL_DEVICE_ERROR
;
941 } else if (ValidateOptions
) {
942 Status
= DriverConfiguration
->OptionsValid (
944 HandleBuffer
[LoopCounter
],
945 ChildHandleBuffer
[ChildIndex
]
948 if (!EFI_ERROR (Status
)) {
953 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
954 gShellDriver1HiiHandle
);
960 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
961 gShellDriver1HiiHandle
,
963 ShellStatus
= SHELL_DEVICE_ERROR
;
965 } else if (SetOptions
) {
966 gST
->ConOut
->ClearScreen (gST
->ConOut
);
967 Status
= DriverConfiguration
->SetOptions (
969 HandleBuffer
[LoopCounter
],
970 ChildHandleBuffer
[ChildIndex
],
974 gST
->ConOut
->ClearScreen (gST
->ConOut
);
975 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
976 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
977 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
982 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
983 gShellDriver1HiiHandle
,
987 DriverConfiguration
->SupportedLanguages
989 if (!EFI_ERROR (Status
)) {
994 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
995 gShellDriver1HiiHandle
);
997 ShellCmdDriverConfigurationProcessActionRequired (
998 DriverImageHandleBuffer
[OuterLoopCounter
],
999 HandleBuffer
[LoopCounter
],
1000 ChildHandleBuffer
[ChildIndex
],
1009 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
1010 gShellDriver1HiiHandle
,
1012 ShellStatus
= SHELL_DEVICE_ERROR
;
1019 FreePool (ChildHandleBuffer
);
1020 FreePool (ChildHandleType
);
1023 FreePool (BestLanguage
);
1024 FreePool (HandleBuffer
);
1025 FreePool (HandleType
);
1028 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1029 FreePool (DriverImageHandleBuffer
);
1037 Function to print out configuration information on all configurable handles.
1039 @param[in] ChildrenToo TRUE to tewst for children.
1040 @param[in] Language ASCII string for language code.
1041 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1043 @retval SHELL_SUCCESS The operation was successful.
1047 PrintConfigInfoOnAll(
1048 IN CONST BOOLEAN ChildrenToo
,
1049 IN CONST CHAR8
*Language
,
1050 IN CONST BOOLEAN UseHii
1053 EFI_HANDLE
*HandleList
;
1054 EFI_HANDLE
*CurrentHandle
;
1061 CurrentHandle
= NULL
;
1067 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1068 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1070 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1075 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1076 gShellDriver1HiiHandle
,
1080 SHELL_FREE_NON_NULL(HandleList
);
1092 0) == SHELL_SUCCESS
) {
1097 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE_FOUND
), gShellDriver1HiiHandle
);
1098 return (SHELL_SUCCESS
);
1101 return (SHELL_SUCCESS
);
1104 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1112 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1122 Function for 'drvcfg' command.
1124 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1125 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1129 ShellCommandRunDrvCfg (
1130 IN EFI_HANDLE ImageHandle
,
1131 IN EFI_SYSTEM_TABLE
*SystemTable
1135 LIST_ENTRY
*Package
;
1136 CHAR16
*ProblemParam
;
1137 SHELL_STATUS ShellStatus
;
1140 CONST CHAR16
*HandleIndex1
;
1141 CONST CHAR16
*HandleIndex2
;
1142 CONST CHAR16
*HandleIndex3
;
1143 CONST CHAR16
*ForceTypeString
;
1149 BOOLEAN AllChildren
;
1152 UINT64 Intermediate
;
1156 CONST CHAR16
*FileName
;
1158 ShellStatus
= SHELL_SUCCESS
;
1159 Status
= EFI_SUCCESS
;
1164 // initialize the shell lib (we must be in non-auto-init...)
1166 Status
= ShellInitialize();
1167 ASSERT_EFI_ERROR(Status
);
1169 Status
= CommandInit();
1170 ASSERT_EFI_ERROR(Status
);
1173 // parse the command line
1175 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1176 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1178 if (Package
!= NULL
) {
1179 ShellCommandLineFreeVarList (Package
);
1181 SHELL_FREE_NON_NULL(ProblemParam
);
1182 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1183 if (EFI_ERROR(Status
)) {
1184 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1185 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
1186 FreePool(ProblemParam
);
1187 ShellStatus
= SHELL_INVALID_PARAMETER
;
1194 if (ShellStatus
== SHELL_SUCCESS
) {
1195 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1197 Language
= AllocateZeroPool(StrSize(Lang
));
1198 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1199 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1200 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
1201 ShellStatus
= SHELL_INVALID_PARAMETER
;
1204 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1205 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1206 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1207 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1208 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1209 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1210 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1213 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1214 } else if (InFromFile
) {
1215 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1220 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1221 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, FileName
);
1222 ShellStatus
= SHELL_INVALID_PARAMETER
;
1225 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1226 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, FileName
);
1227 ShellStatus
= SHELL_INVALID_PARAMETER
;
1230 if (Force
&& ForceTypeString
== NULL
) {
1231 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-f");
1232 ShellStatus
= SHELL_INVALID_PARAMETER
;
1236 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1237 if (EFI_ERROR(Status
)) {
1238 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"-f");
1239 ShellStatus
= SHELL_INVALID_PARAMETER
;
1242 ForceType
= (UINT32
)Intermediate
;
1246 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1248 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1249 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1250 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1251 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex1
);
1252 ShellStatus
= SHELL_INVALID_PARAMETER
;
1256 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1258 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1259 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1260 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1261 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex2
);
1262 ShellStatus
= SHELL_INVALID_PARAMETER
;
1266 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1268 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1269 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1270 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1271 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex3
);
1272 ShellStatus
= SHELL_INVALID_PARAMETER
;
1277 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1278 if (FileName
== NULL
) {
1279 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, InFromFile
?L
"-i":L
"-o");
1281 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
);
1283 ShellStatus
= SHELL_INVALID_PARAMETER
;
1286 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1288 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-i");
1289 ShellStatus
= SHELL_INVALID_PARAMETER
;
1293 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-o");
1294 ShellStatus
= SHELL_INVALID_PARAMETER
;
1298 if (Validate
&& Force
) {
1299 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-f");
1300 ShellStatus
= SHELL_INVALID_PARAMETER
;
1303 if (Validate
&& Set
) {
1304 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-s");
1305 ShellStatus
= SHELL_INVALID_PARAMETER
;
1309 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-s", L
"-f");
1310 ShellStatus
= SHELL_INVALID_PARAMETER
;
1313 if (OutToFile
&& InFromFile
) {
1314 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-i", L
"-o");
1315 ShellStatus
= SHELL_INVALID_PARAMETER
;
1323 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1325 // no HII on this handle.
1327 ShellStatus
= SHELL_UNSUPPORTED
;
1328 } else if (Validate
) {
1331 } else if (InFromFile
) {
1332 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1333 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1336 } else if (OutToFile
) {
1337 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1338 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1341 } else if (HandleIndex1
== NULL
) {
1343 // display all that are configurable
1345 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1348 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1353 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1354 gShellDriver1HiiHandle
,
1355 ConvertHandleToHandleIndex(Handle1
)
1363 // We allways need to do this one since it does both by default.
1365 if (!InFromFile
&& !OutToFile
) {
1366 ShellStatus
= PreHiiDrvCfg (
1378 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1383 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1384 gShellDriver1HiiHandle
,
1385 ConvertHandleToHandleIndex(Handle1
)
1391 ShellCommandLineFreeVarList (Package
);
1392 SHELL_FREE_NON_NULL(Language
);
1393 return (ShellStatus
);