2 Main file for DrvCfg shell Driver1 function.
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDriver1CommandsLib.h"
16 #include <Protocol/HiiConfigAccess.h>
17 #include <Protocol/HiiDatabase.h>
19 STATIC CONST EFI_GUID
*CfgGuidList
[] = {&gEfiDriverConfigurationProtocolGuid
, &gEfiDriverConfiguration2ProtocolGuid
, NULL
};
22 Find the EFI_HII_HANDLE by device path.
24 @param[in] DevPath1 The Device Path to match.
25 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.
26 @param[in] HiiDb The Hii database protocol
28 @retval EFI_SUCCESS The operation was successful.
29 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.
33 FindHiiHandleViaDevPath(
34 IN CONST EFI_DEVICE_PATH_PROTOCOL
*DevPath1
,
35 OUT EFI_HII_HANDLE
*HiiHandle
,
36 IN EFI_HII_DATABASE_PROTOCOL
*HiiDb
39 EFI_HII_HANDLE
*HandleBuffer
;
40 UINTN HandleBufferSize
;
43 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
44 EFI_HII_PACKAGE_HEADER
*PackageHeader
;
46 EFI_DEVICE_PATH_PROTOCOL
*DevPath2
;
49 ASSERT(DevPath1
!= NULL
);
50 ASSERT(HiiHandle
!= NULL
);
51 ASSERT(*HiiHandle
== NULL
);
52 ASSERT(HiiDb
!= NULL
);
56 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
57 if (Status
== EFI_BUFFER_TOO_SMALL
) {
58 HandleBuffer
= AllocateZeroPool(HandleBufferSize
);
59 ASSERT (HandleBuffer
!= NULL
);
60 Status
= HiiDb
->ListPackageLists(HiiDb
, EFI_HII_PACKAGE_DEVICE_PATH
, NULL
, &HandleBufferSize
, HandleBuffer
);
62 if (EFI_ERROR(Status
)) {
63 SHELL_FREE_NON_NULL(HandleBuffer
);
67 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
= gDevPathToText
->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
);
524 Do the configuration in an environment without HII.
526 @param[in] Language The language code.
527 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.
528 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.
529 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.
530 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.
531 @param[in] SetOptions TRUE to set options, FALSE otherwise.
532 @param[in] DriverImageHandle The handle for the driver to configure.
533 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.
534 @param[in] ChildHandle The handle of a child device of the specified device.
536 @retval SHELL_NOT_FOUND A specified handle could not be found.
537 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.
542 IN CONST CHAR8
*Language
,
543 IN BOOLEAN ForceDefaults
,
544 IN UINT32 DefaultType
,
545 IN BOOLEAN AllChildren
,
546 IN BOOLEAN ValidateOptions
,
547 IN BOOLEAN SetOptions
,
548 IN EFI_HANDLE DriverImageHandle
,
549 IN EFI_HANDLE DeviceHandle
,
550 IN EFI_HANDLE ChildHandle
554 SHELL_STATUS ShellStatus
;
555 UINTN OuterLoopCounter
;
557 UINTN DriverImageHandleCount
;
558 EFI_HANDLE
*DriverImageHandleBuffer
;
560 EFI_HANDLE
*HandleBuffer
;
564 UINTN ChildHandleCount
;
565 EFI_HANDLE
*ChildHandleBuffer
;
566 UINTN
*ChildHandleType
;
567 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired
;
568 EFI_DRIVER_CONFIGURATION_PROTOCOL
*DriverConfiguration
;
569 BOOLEAN Iso639Language
;
574 ShellStatus
= SHELL_SUCCESS
;
576 if (ChildHandle
== NULL
&& AllChildren
) {
585 STRING_TOKEN (STR_DRVCFG_FORCE_D
),
586 gShellDriver1HiiHandle
,
588 } else if (ValidateOptions
) {
593 STRING_TOKEN (STR_DRVCFG_VALIDATE
),
594 gShellDriver1HiiHandle
);
595 } else if (SetOptions
) {
600 STRING_TOKEN (STR_DRVCFG_SET
),
601 gShellDriver1HiiHandle
);
604 if (DriverImageHandle
== 0) {
605 DriverImageHandleBuffer
= GetHandleListByProtocolList(CfgGuidList
);
606 if (DriverImageHandleBuffer
== NULL
) {
607 ShellStatus
= SHELL_NOT_FOUND
;
611 HandleBuffer
= DriverImageHandleBuffer
, DriverImageHandleCount
= 0
612 ; HandleBuffer
!= NULL
&& *HandleBuffer
!= NULL
613 ; HandleBuffer
++,DriverImageHandleCount
++);
615 DriverImageHandleCount
= 1;
617 // Allocate buffer to hold the image handle so as to
618 // keep consistent with the above clause
620 DriverImageHandleBuffer
= AllocatePool (sizeof (EFI_HANDLE
));
621 ASSERT (DriverImageHandleBuffer
);
622 DriverImageHandleBuffer
[0] = DriverImageHandle
;
625 for (OuterLoopCounter
= 0; OuterLoopCounter
< DriverImageHandleCount
; OuterLoopCounter
++) {
626 Iso639Language
= FALSE
;
627 Status
= gBS
->OpenProtocol (
628 DriverImageHandleBuffer
[OuterLoopCounter
],
629 &gEfiDriverConfiguration2ProtocolGuid
,
630 (VOID
**) &DriverConfiguration
,
633 EFI_OPEN_PROTOCOL_GET_PROTOCOL
635 if (EFI_ERROR (Status
)) {
636 Iso639Language
= TRUE
;
637 Status
= gBS
->OpenProtocol (
638 DriverImageHandleBuffer
[OuterLoopCounter
],
639 &gEfiDriverConfigurationProtocolGuid
,
640 (VOID
**) &DriverConfiguration
,
643 EFI_OPEN_PROTOCOL_GET_PROTOCOL
646 if (EFI_ERROR (Status
)) {
651 // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
652 // gShellDriver1HiiHandle,
653 // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
655 ShellStatus
= SHELL_UNSUPPORTED
;
659 BestLanguage
= GetBestLanguage (
660 DriverConfiguration
->SupportedLanguages
,
662 Language
!=NULL
?Language
:"",
663 DriverConfiguration
->SupportedLanguages
,
666 if (BestLanguage
== NULL
) {
671 STRING_TOKEN (STR_GEN_PROBLEM_VAL
),
672 gShellDriver1HiiHandle
,
675 ShellStatus
= SHELL_INVALID_PARAMETER
;
679 Status
= ParseHandleDatabaseByRelationshipWithType (
680 DriverImageHandleBuffer
[OuterLoopCounter
],
686 if (EFI_ERROR (Status
)) {
690 if (SetOptions
&& DeviceHandle
== NULL
) {
692 gST
->ConOut
->ClearScreen (gST
->ConOut
);
693 Status
= DriverConfiguration
->SetOptions (
700 gST
->ConOut
->ClearScreen (gST
->ConOut
);
706 STRING_TOKEN (STR_DRVCFG_ALL_LANG
),
707 gShellDriver1HiiHandle
,
708 ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]),
709 DriverConfiguration
->SupportedLanguages
711 if (!EFI_ERROR (Status
)) {
716 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
717 gShellDriver1HiiHandle
);
718 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
719 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) == HR_CONTROLLER_HANDLE
) {
720 ShellCmdDriverConfigurationProcessActionRequired (
721 DriverImageHandleBuffer
[OuterLoopCounter
],
722 HandleBuffer
[LoopCounter
],
733 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
734 gShellDriver1HiiHandle
,
740 for (LoopCounter
= 0; LoopCounter
< HandleCount
; LoopCounter
++) {
741 if ((HandleType
[LoopCounter
] & HR_CONTROLLER_HANDLE
) != HR_CONTROLLER_HANDLE
) {
744 if (DeviceHandle
!= NULL
&& DeviceHandle
!= HandleBuffer
[LoopCounter
]) {
747 if (ChildHandle
== NULL
) {
748 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
749 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
754 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
755 gShellDriver1HiiHandle
,
758 DriverConfiguration
->SupportedLanguages
762 Status
= DriverConfiguration
->ForceDefaults (
764 HandleBuffer
[LoopCounter
],
770 if (!EFI_ERROR (Status
)) {
775 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
776 gShellDriver1HiiHandle
);
777 ShellCmdDriverConfigurationProcessActionRequired (
778 DriverImageHandleBuffer
[OuterLoopCounter
],
779 HandleBuffer
[LoopCounter
],
788 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
789 gShellDriver1HiiHandle
,
791 ShellStatus
= SHELL_DEVICE_ERROR
;
793 } else if (ValidateOptions
) {
794 Status
= DriverConfiguration
->OptionsValid (
796 HandleBuffer
[LoopCounter
],
800 if (!EFI_ERROR (Status
)) {
805 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
806 gShellDriver1HiiHandle
);
812 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
813 gShellDriver1HiiHandle
,
815 ShellStatus
= SHELL_DEVICE_ERROR
;
817 } else if (SetOptions
) {
818 gST
->ConOut
->ClearScreen (gST
->ConOut
);
819 Status
= DriverConfiguration
->SetOptions (
821 HandleBuffer
[LoopCounter
],
826 gST
->ConOut
->ClearScreen (gST
->ConOut
);
827 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
828 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
833 STRING_TOKEN (STR_DRVCFG_CTRL_LANG
),
834 gShellDriver1HiiHandle
,
837 DriverConfiguration
->SupportedLanguages
839 if (!EFI_ERROR (Status
)) {
844 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
845 gShellDriver1HiiHandle
);
847 ShellCmdDriverConfigurationProcessActionRequired (
848 DriverImageHandleBuffer
[OuterLoopCounter
],
849 HandleBuffer
[LoopCounter
],
859 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
860 gShellDriver1HiiHandle
,
862 ShellStatus
= SHELL_DEVICE_ERROR
;
869 if (ChildHandle
== NULL
&& !AllChildren
) {
873 Status
= ParseHandleDatabaseByRelationshipWithType (
874 DriverImageHandleBuffer
[OuterLoopCounter
],
875 HandleBuffer
[LoopCounter
],
880 if (EFI_ERROR (Status
)) {
884 for (ChildIndex
= 0; ChildIndex
< ChildHandleCount
; ChildIndex
++) {
886 if ((ChildHandleType
[ChildIndex
] & HR_CHILD_HANDLE
) != HR_CHILD_HANDLE
) {
890 if (ChildHandle
!= NULL
&& ChildHandle
!= ChildHandleBuffer
[ChildIndex
]) {
894 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
895 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
896 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
901 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
902 gShellDriver1HiiHandle
,
906 DriverConfiguration
->SupportedLanguages
);
909 Status
= DriverConfiguration
->ForceDefaults (
911 HandleBuffer
[LoopCounter
],
912 ChildHandleBuffer
[ChildIndex
],
917 if (!EFI_ERROR (Status
)) {
922 STRING_TOKEN (STR_DRVCFG_DEF_FORCED
),
923 gShellDriver1HiiHandle
);
925 ShellCmdDriverConfigurationProcessActionRequired (
926 DriverImageHandleBuffer
[OuterLoopCounter
],
927 HandleBuffer
[LoopCounter
],
928 ChildHandleBuffer
[ChildIndex
],
937 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED
),
938 gShellDriver1HiiHandle
,
940 ShellStatus
= SHELL_DEVICE_ERROR
;
942 } else if (ValidateOptions
) {
943 Status
= DriverConfiguration
->OptionsValid (
945 HandleBuffer
[LoopCounter
],
946 ChildHandleBuffer
[ChildIndex
]
949 if (!EFI_ERROR (Status
)) {
954 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID
),
955 gShellDriver1HiiHandle
);
961 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV
),
962 gShellDriver1HiiHandle
,
964 ShellStatus
= SHELL_DEVICE_ERROR
;
966 } else if (SetOptions
) {
967 gST
->ConOut
->ClearScreen (gST
->ConOut
);
968 Status
= DriverConfiguration
->SetOptions (
970 HandleBuffer
[LoopCounter
],
971 ChildHandleBuffer
[ChildIndex
],
975 gST
->ConOut
->ClearScreen (gST
->ConOut
);
976 HandleIndex1
= ConvertHandleToHandleIndex (DriverImageHandleBuffer
[OuterLoopCounter
]);
977 HandleIndex2
= ConvertHandleToHandleIndex (HandleBuffer
[LoopCounter
]);
978 HandleIndex3
= ConvertHandleToHandleIndex (ChildHandleBuffer
[ChildIndex
]);
983 STRING_TOKEN (STR_DRVCFG_CHILD_LANG
),
984 gShellDriver1HiiHandle
,
988 DriverConfiguration
->SupportedLanguages
990 if (!EFI_ERROR (Status
)) {
995 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET
),
996 gShellDriver1HiiHandle
);
998 ShellCmdDriverConfigurationProcessActionRequired (
999 DriverImageHandleBuffer
[OuterLoopCounter
],
1000 HandleBuffer
[LoopCounter
],
1001 ChildHandleBuffer
[ChildIndex
],
1010 STRING_TOKEN (STR_DRVCFG_NOT_SET
),
1011 gShellDriver1HiiHandle
,
1013 ShellStatus
= SHELL_DEVICE_ERROR
;
1020 FreePool (ChildHandleBuffer
);
1021 FreePool (ChildHandleType
);
1024 FreePool (BestLanguage
);
1025 FreePool (HandleBuffer
);
1026 FreePool (HandleType
);
1029 if (DriverImageHandle
!= NULL
&& DriverImageHandleCount
!= 0) {
1030 FreePool (DriverImageHandleBuffer
);
1038 Function to print out configuration information on all configurable handles.
1040 @param[in] ChildrenToo TRUE to tewst for children.
1041 @param[in] Language ASCII string for language code.
1042 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.
1044 @retval SHELL_SUCCESS The operation was successful.
1048 PrintConfigInfoOnAll(
1049 IN CONST BOOLEAN ChildrenToo
,
1050 IN CONST CHAR8
*Language
,
1051 IN CONST BOOLEAN UseHii
1054 EFI_HANDLE
*HandleList
;
1055 EFI_HANDLE
*CurrentHandle
;
1062 CurrentHandle
= NULL
;
1068 HandleList
= GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid
);
1069 for (CurrentHandle
= HandleList
; CurrentHandle
!= NULL
&& *CurrentHandle
!= NULL
; CurrentHandle
++){
1071 Index2
= *CurrentHandle
== NULL
? 0 : ConvertHandleToHandleIndex(*CurrentHandle
);
1076 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1077 gShellDriver1HiiHandle
,
1081 SHELL_FREE_NON_NULL(HandleList
);
1093 0) == SHELL_SUCCESS
) {
1098 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
1099 return (SHELL_SUCCESS
);
1102 return (SHELL_SUCCESS
);
1105 STATIC CONST SHELL_PARAM_ITEM ParamListHii
[] = {
1113 STATIC CONST SHELL_PARAM_ITEM ParamListPreHii
[] = {
1123 Function for 'drvcfg' command.
1125 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1126 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1130 ShellCommandRunDrvCfg (
1131 IN EFI_HANDLE ImageHandle
,
1132 IN EFI_SYSTEM_TABLE
*SystemTable
1136 LIST_ENTRY
*Package
;
1137 CHAR16
*ProblemParam
;
1138 SHELL_STATUS ShellStatus
;
1141 CONST CHAR16
*HandleIndex1
;
1142 CONST CHAR16
*HandleIndex2
;
1143 CONST CHAR16
*HandleIndex3
;
1144 CONST CHAR16
*ForceTypeString
;
1150 BOOLEAN AllChildren
;
1153 UINT64 Intermediate
;
1157 CONST CHAR16
*FileName
;
1159 ShellStatus
= SHELL_SUCCESS
;
1160 Status
= EFI_SUCCESS
;
1165 // initialize the shell lib (we must be in non-auto-init...)
1167 Status
= ShellInitialize();
1168 ASSERT_EFI_ERROR(Status
);
1170 Status
= CommandInit();
1171 ASSERT_EFI_ERROR(Status
);
1174 // parse the command line
1176 Status
= ShellCommandLineParse (ParamListHii
, &Package
, &ProblemParam
, TRUE
);
1177 if (EFI_ERROR(Status
) || ShellCommandLineGetCount(Package
) > 2) {
1179 if (Package
!= NULL
) {
1180 ShellCommandLineFreeVarList (Package
);
1182 SHELL_FREE_NON_NULL(ProblemParam
);
1183 Status
= ShellCommandLineParse (ParamListPreHii
, &Package
, &ProblemParam
, TRUE
);
1184 if (EFI_ERROR(Status
)) {
1185 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1186 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
1187 FreePool(ProblemParam
);
1188 ShellStatus
= SHELL_INVALID_PARAMETER
;
1195 if (ShellStatus
== SHELL_SUCCESS
) {
1196 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
1198 Language
= AllocateZeroPool(StrSize(Lang
));
1199 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
1200 } else if (ShellCommandLineGetFlag(Package
, L
"-l")){
1201 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
1202 ShellStatus
= SHELL_INVALID_PARAMETER
;
1205 Set
= ShellCommandLineGetFlag (Package
, L
"-s");
1206 Validate
= ShellCommandLineGetFlag (Package
, L
"-v");
1207 InFromFile
= ShellCommandLineGetFlag (Package
, L
"-i");
1208 OutToFile
= ShellCommandLineGetFlag (Package
, L
"-o");
1209 AllChildren
= ShellCommandLineGetFlag (Package
, L
"-c");
1210 Force
= ShellCommandLineGetFlag (Package
, L
"-f");
1211 ForceTypeString
= ShellCommandLineGetValue(Package
, L
"-f");
1214 FileName
= ShellCommandLineGetValue(Package
, L
"-o");
1215 } else if (InFromFile
) {
1216 FileName
= ShellCommandLineGetValue(Package
, L
"-i");
1221 if (InFromFile
&& EFI_ERROR(ShellFileExists(FileName
))) {
1222 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FIND_FAIL
), gShellDriver1HiiHandle
, FileName
);
1223 ShellStatus
= SHELL_INVALID_PARAMETER
;
1226 if (OutToFile
&& !EFI_ERROR(ShellFileExists(FileName
))) {
1227 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_EXIST
), gShellDriver1HiiHandle
, FileName
);
1228 ShellStatus
= SHELL_INVALID_PARAMETER
;
1231 if (Force
&& ForceTypeString
== NULL
) {
1232 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-f");
1233 ShellStatus
= SHELL_INVALID_PARAMETER
;
1237 Status
= ShellConvertStringToUint64(ForceTypeString
, &Intermediate
, FALSE
, FALSE
);
1238 if (EFI_ERROR(Status
)) {
1239 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellDriver1HiiHandle
, L
"-f");
1240 ShellStatus
= SHELL_INVALID_PARAMETER
;
1243 ForceType
= (UINT32
)Intermediate
;
1247 HandleIndex1
= ShellCommandLineGetRawValue(Package
, 1);
1249 if (HandleIndex1
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1
, &Intermediate
, TRUE
, FALSE
))) {
1250 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1251 if (Handle1
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1252 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex1
);
1253 ShellStatus
= SHELL_INVALID_PARAMETER
;
1257 HandleIndex2
= ShellCommandLineGetRawValue(Package
, 2);
1259 if (HandleIndex2
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2
, &Intermediate
, TRUE
, FALSE
))) {
1260 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1261 if (Handle2
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1262 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex2
);
1263 ShellStatus
= SHELL_INVALID_PARAMETER
;
1267 HandleIndex3
= ShellCommandLineGetRawValue(Package
, 3);
1269 if (HandleIndex3
!= NULL
&& !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3
, &Intermediate
, TRUE
, FALSE
))) {
1270 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
1271 if (Handle3
== NULL
|| (UINT64
)(UINTN
)Intermediate
!= Intermediate
) {
1272 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, HandleIndex3
);
1273 ShellStatus
= SHELL_INVALID_PARAMETER
;
1278 if ((InFromFile
|| OutToFile
) && (FileName
== NULL
)) {
1279 if (FileName
== NULL
) {
1280 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, InFromFile
?L
"-i":L
"-o");
1282 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_REQ
), gShellDriver1HiiHandle
);
1284 ShellStatus
= SHELL_INVALID_PARAMETER
;
1287 if (!UseHii
&& (InFromFile
|| OutToFile
)) {
1289 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-i");
1290 ShellStatus
= SHELL_INVALID_PARAMETER
;
1294 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-o");
1295 ShellStatus
= SHELL_INVALID_PARAMETER
;
1299 if (Validate
&& Force
) {
1300 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-f");
1301 ShellStatus
= SHELL_INVALID_PARAMETER
;
1304 if (Validate
&& Set
) {
1305 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-v", L
"-s");
1306 ShellStatus
= SHELL_INVALID_PARAMETER
;
1310 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-s", L
"-f");
1311 ShellStatus
= SHELL_INVALID_PARAMETER
;
1314 if (OutToFile
&& InFromFile
) {
1315 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CONF
), gShellDriver1HiiHandle
, L
"-i", L
"-o");
1316 ShellStatus
= SHELL_INVALID_PARAMETER
;
1324 if (Handle1
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1326 // no HII on this handle.
1328 ShellStatus
= SHELL_UNSUPPORTED
;
1329 } else if (Validate
) {
1332 } else if (InFromFile
) {
1333 ShellStatus
= ConfigFromFile(Handle1
, FileName
);
1334 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1337 } else if (OutToFile
) {
1338 ShellStatus
= ConfigToFile(Handle1
, FileName
);
1339 if (Handle1
!= NULL
&& ShellStatus
== SHELL_SUCCESS
) {
1342 } else if (HandleIndex1
== NULL
) {
1344 // display all that are configurable
1346 ShellStatus
= PrintConfigInfoOnAll(AllChildren
, Language
, UseHii
);
1349 if (!EFI_ERROR(gBS
->OpenProtocol(Handle1
, &gEfiHiiConfigAccessProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
1354 STRING_TOKEN (STR_DRVCFG_LINE_HII
),
1355 gShellDriver1HiiHandle
,
1356 ConvertHandleToHandleIndex(Handle1
)
1364 // We allways need to do this one since it does both by default.
1366 if (!InFromFile
&& !OutToFile
) {
1367 ShellStatus
= PreHiiDrvCfg (
1379 if (ShellStatus
== SHELL_UNSUPPORTED
) {
1384 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT
),
1385 gShellDriver1HiiHandle
,
1386 ConvertHandleToHandleIndex(Handle1
)
1392 ShellCommandLineFreeVarList (Package
);
1393 SHELL_FREE_NON_NULL(Language
);
1394 return (ShellStatus
);