]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c
InOsEmuPkg: Add TimerLib for PEI, DXE_CORE, and DXE/EFI drivers/applications.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / DrvCfg.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for DrvCfg shell Driver1 function.\r
3\r
361a8267 4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
4ba49616 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDriver1CommandsLib.h"\r
16#include <Protocol/HiiConfigAccess.h>\r
17#include <Protocol/HiiDatabase.h>\r
18\r
4880c2c9 19STATIC CONST EFI_GUID *CfgGuidList[] = {&gEfiDriverConfigurationProtocolGuid, &gEfiDriverConfiguration2ProtocolGuid, NULL};\r
20\r
4ba49616 21/**\r
4880c2c9 22 Find the EFI_HII_HANDLE by device path.\r
4ba49616 23\r
4880c2c9 24 @param[in] DevPath1 The Device Path to match.\r
25 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.\r
26 @param[in] HiiDb The Hii database protocol\r
4ba49616 27\r
4880c2c9 28 @retval EFI_SUCCESS The operation was successful.\r
29 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.\r
4ba49616 30**/\r
31EFI_STATUS\r
32EFIAPI\r
4880c2c9 33FindHiiHandleViaDevPath(\r
34 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath1,\r
35 OUT EFI_HII_HANDLE *HiiHandle,\r
36 IN EFI_HII_DATABASE_PROTOCOL *HiiDb\r
4ba49616 37 )\r
38{\r
4880c2c9 39 EFI_HII_HANDLE *HandleBuffer;\r
40 UINTN HandleBufferSize;\r
41 VOID *MainBuffer;\r
42 UINTN MainBufferSize;\r
43 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
44 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
45 UINTN LoopVariable;\r
46 EFI_DEVICE_PATH_PROTOCOL *DevPath2;\r
47 EFI_STATUS Status;\r
4ba49616 48\r
4880c2c9 49 ASSERT(DevPath1 != NULL);\r
50 ASSERT(HiiHandle != NULL);\r
51 ASSERT(*HiiHandle == NULL);\r
52 ASSERT(HiiDb != NULL);\r
4ba49616 53\r
4880c2c9 54 HandleBufferSize = 0;\r
55 HandleBuffer = NULL;\r
56 Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
4ba49616 57 if (Status == EFI_BUFFER_TOO_SMALL) {\r
4880c2c9 58 HandleBuffer = AllocateZeroPool(HandleBufferSize);\r
cd8462ea 59 ASSERT (HandleBuffer != NULL);\r
4880c2c9 60 Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
4ba49616 61 }\r
62 if (EFI_ERROR(Status)) {\r
4880c2c9 63 SHELL_FREE_NON_NULL(HandleBuffer);\r
4ba49616 64 return (Status);\r
65 }\r
66\r
4880c2c9 67 for (LoopVariable = 0 ; LoopVariable < (HandleBufferSize/sizeof(HandleBuffer[0])) && *HiiHandle == NULL ; LoopVariable++) {\r
68 MainBufferSize = 0;\r
69 MainBuffer = NULL;\r
70 Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
71 if (Status == EFI_BUFFER_TOO_SMALL) {\r
72 MainBuffer = AllocateZeroPool(MainBufferSize);\r
cd8462ea 73 ASSERT (MainBuffer != NULL);\r
4880c2c9 74 Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
75 }\r
76 //\r
77 // Enumerate through the block of returned memory.\r
78 // This should actually be a small block, but we need to be sure.\r
79 //\r
80 for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer\r
81 ; PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && *HiiHandle == NULL\r
82 ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) {\r
83 for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER))\r
84 ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END && *HiiHandle == NULL\r
85 ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) {\r
86 if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {\r
87 DevPath2 = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER));\r
88 if (DevicePathCompare(&DevPath1, &DevPath2) == 0) {\r
89 *HiiHandle = HandleBuffer[LoopVariable];\r
90 break;\r
91 }\r
92 }\r
93 }\r
4ba49616 94 }\r
4880c2c9 95 SHELL_FREE_NON_NULL(MainBuffer);\r
4ba49616 96 }\r
4880c2c9 97 SHELL_FREE_NON_NULL(HandleBuffer);\r
4ba49616 98\r
4880c2c9 99 if (*HiiHandle == NULL) {\r
100 return (EFI_NOT_FOUND);\r
101 }\r
102 return (EFI_SUCCESS);\r
103}\r
4ba49616 104\r
4880c2c9 105/**\r
106 Convert a EFI_HANDLE to a EFI_HII_HANDLE.\r
4ba49616 107\r
4880c2c9 108 @param[in] Handle The EFI_HANDLE to convert.\r
109 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.\r
110 @param[in] HiiDb The Hii database protocol\r
4ba49616 111\r
4880c2c9 112 @retval EFI_SUCCESS The operation was successful.\r
113**/\r
114EFI_STATUS\r
115EFIAPI\r
116ConvertHandleToHiiHandle(\r
117 IN CONST EFI_HANDLE Handle,\r
118 OUT EFI_HII_HANDLE *HiiHandle,\r
119 IN EFI_HII_DATABASE_PROTOCOL *HiiDb\r
120 )\r
121{\r
122 EFI_STATUS Status;\r
123 EFI_DEVICE_PATH_PROTOCOL *DevPath1;\r
4ba49616 124\r
4880c2c9 125 if (HiiHandle == NULL || HiiDb == NULL) {\r
126 return (EFI_INVALID_PARAMETER);\r
127 }\r
128 *HiiHandle = NULL;\r
129\r
130 if (Handle == NULL) {\r
131 return (EFI_SUCCESS);\r
132 }\r
133\r
134 DevPath1 = NULL;\r
135 Status = gBS->OpenProtocol(Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath1, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
136 if (EFI_ERROR(Status) || DevPath1 == NULL) {\r
137 return (EFI_NOT_FOUND);\r
138 }\r
139\r
140 return (FindHiiHandleViaDevPath(DevPath1, HiiHandle, HiiDb));\r
4ba49616 141}\r
142\r
143/**\r
4880c2c9 144 Function to print out all HII configuration information to a file.\r
4ba49616 145\r
4880c2c9 146 @param[in] Handle The handle to get info on. NULL to do all handles.\r
147 @param[in] FileName The filename to rwite the info to.\r
4ba49616 148**/\r
149SHELL_STATUS\r
150EFIAPI\r
4880c2c9 151ConfigToFile(\r
152 IN CONST EFI_HANDLE Handle,\r
153 IN CONST CHAR16 *FileName\r
4ba49616 154 )\r
155{\r
4880c2c9 156 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
157 EFI_STATUS Status;\r
158 VOID *MainBuffer;\r
159 UINTN MainBufferSize;\r
160 EFI_HII_HANDLE HiiHandle;\r
161 SHELL_FILE_HANDLE FileHandle;\r
4ba49616 162\r
4880c2c9 163 HiiDatabase = NULL;\r
164 MainBufferSize = 0;\r
165 MainBuffer = NULL;\r
166 FileHandle = NULL;\r
4ba49616 167\r
4880c2c9 168 Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);\r
4ba49616 169 if (EFI_ERROR(Status)) {\r
4880c2c9 170 ShellPrintHiiEx(\r
171 -1,\r
172 -1,\r
173 NULL,\r
174 STRING_TOKEN(STR_GEN_FILE_OPEN), \r
175 gShellDriver1HiiHandle, \r
176 FileName, \r
177 Status);\r
178 return (SHELL_DEVICE_ERROR);\r
4ba49616 179 }\r
180\r
4ba49616 181 //\r
4880c2c9 182 // Locate HII Database protocol\r
4ba49616 183 //\r
4880c2c9 184 Status = gBS->LocateProtocol (\r
185 &gEfiHiiDatabaseProtocolGuid,\r
186 NULL,\r
187 (VOID **) &HiiDatabase\r
188 );\r
189\r
190 if (EFI_ERROR(Status) || HiiDatabase == NULL) {\r
191 ShellPrintHiiEx(\r
192 -1, \r
193 -1, \r
194 NULL,\r
195 STRING_TOKEN(STR_GEN_PROTOCOL_NF), \r
196 gShellDriver1HiiHandle, \r
197 L"EfiHiiDatabaseProtocol", \r
198 &gEfiHiiDatabaseProtocolGuid);\r
199 ShellCloseFile(&FileHandle);\r
200 return (SHELL_NOT_FOUND);\r
4ba49616 201 }\r
4ba49616 202\r
4880c2c9 203 Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);\r
204 if (EFI_ERROR(Status)) {\r
205 ShellPrintHiiEx(\r
206 -1, \r
207 -1, \r
208 NULL, \r
209 STRING_TOKEN(STR_GEN_HANDLE_NOT), \r
210 gShellDriver1HiiHandle, \r
211 ConvertHandleToHandleIndex(Handle), \r
212 L"Device");\r
213 ShellCloseFile(&FileHandle);\r
214 return (SHELL_DEVICE_ERROR); \r
4ba49616 215 }\r
216\r
4880c2c9 217 Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);\r
218 if (Status == EFI_BUFFER_TOO_SMALL) {\r
219 MainBuffer = AllocateZeroPool(MainBufferSize);\r
220 Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);\r
4ba49616 221 }\r
222\r
4880c2c9 223 Status = ShellWriteFile(FileHandle, &MainBufferSize, MainBuffer);\r
224\r
225 ShellCloseFile(&FileHandle);\r
226 SHELL_FREE_NON_NULL(MainBuffer);\r
227\r
228 if (EFI_ERROR(Status)) {\r
229 ShellPrintHiiEx(\r
230 -1, \r
231 -1,\r
232 NULL,\r
233 STRING_TOKEN(STR_FILE_WRITE_FAIL), \r
234 gShellDriver1HiiHandle, \r
235 FileName, \r
236 Status);\r
237 return (SHELL_DEVICE_ERROR); \r
238 }\r
239 ShellPrintHiiEx(\r
240 -1, \r
241 -1,\r
242 NULL,\r
243 STRING_TOKEN(STR_DRVCFG_COMP), \r
244 gShellDriver1HiiHandle);\r
245\r
246 return (SHELL_SUCCESS);\r
4ba49616 247}\r
248\r
249/**\r
4880c2c9 250 Function to read in HII configuration information from a file.\r
4ba49616 251\r
4880c2c9 252 @param[in] Handle The handle to get info for.\r
253 @param[in] FileName The filename to read the info from.\r
4ba49616 254**/\r
255SHELL_STATUS\r
256EFIAPI\r
4880c2c9 257ConfigFromFile(\r
258 IN EFI_HANDLE Handle,\r
259 IN CONST CHAR16 *FileName\r
4ba49616 260 )\r
261{\r
4880c2c9 262 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
263 EFI_STATUS Status;\r
264 VOID *MainBuffer;\r
265 UINT64 Temp;\r
266 UINTN MainBufferSize;\r
267 EFI_HII_HANDLE HiiHandle;\r
268 SHELL_FILE_HANDLE FileHandle;\r
269 CHAR16 *TempDevPathString;\r
270 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
271 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
272 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
273 UINTN HandleIndex;\r
274\r
275 HiiDatabase = NULL;\r
276 MainBufferSize = 0;\r
277 MainBuffer = NULL;\r
278 FileHandle = NULL;\r
279\r
280 Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ, 0);\r
281 if (EFI_ERROR(Status)) {\r
282 ShellPrintHiiEx(\r
283 -1,\r
284 -1,\r
285 NULL,\r
286 STRING_TOKEN(STR_GEN_FILE_OPEN), \r
287 gShellDriver1HiiHandle, \r
288 FileName, \r
289 Status);\r
290 return (SHELL_DEVICE_ERROR);\r
291 }\r
292\r
293 //\r
294 // Locate HII Database protocol\r
295 //\r
296 Status = gBS->LocateProtocol (\r
297 &gEfiHiiDatabaseProtocolGuid,\r
298 NULL,\r
299 (VOID **) &HiiDatabase\r
300 );\r
4ba49616 301\r
4880c2c9 302 if (EFI_ERROR(Status) || HiiDatabase == NULL) {\r
303 ShellPrintHiiEx(\r
304 -1, \r
305 -1, \r
306 NULL,\r
307 STRING_TOKEN(STR_GEN_PROTOCOL_NF), \r
308 gShellDriver1HiiHandle, \r
309 L"EfiHiiDatabaseProtocol", \r
310 &gEfiHiiDatabaseProtocolGuid);\r
311 ShellCloseFile(&FileHandle);\r
312 return (SHELL_NOT_FOUND);\r
313 }\r
4ba49616 314\r
4880c2c9 315 Status = ShellGetFileSize(FileHandle, &Temp);\r
316 MainBufferSize = (UINTN)Temp;\r
317 if (EFI_ERROR(Status)) {\r
4ba49616 318 ShellPrintHiiEx(\r
319 -1, \r
320 -1, \r
321 NULL, \r
4880c2c9 322 STRING_TOKEN(STR_FILE_READ_FAIL), \r
4ba49616 323 gShellDriver1HiiHandle, \r
4880c2c9 324 FileName,\r
325 Status);\r
326 ShellCloseFile(&FileHandle);\r
327 return (SHELL_DEVICE_ERROR); \r
328 }\r
329 MainBuffer = AllocateZeroPool((UINTN)MainBufferSize); \r
330 if (EFI_ERROR(Status)) {\r
331 ShellPrintHiiEx(\r
332 -1, \r
333 -1, \r
334 NULL, \r
335 STRING_TOKEN(STR_GEN_OUT_MEM), \r
336 gShellDriver1HiiHandle);\r
337 ShellCloseFile(&FileHandle);\r
338 return (SHELL_DEVICE_ERROR); \r
4ba49616 339 }\r
4880c2c9 340 Status = ShellReadFile(FileHandle, &MainBufferSize, MainBuffer);\r
341 if (EFI_ERROR(Status)) {\r
342 ShellPrintHiiEx(\r
343 -1, \r
344 -1, \r
345 NULL, \r
346 STRING_TOKEN(STR_FILE_READ_FAIL), \r
347 gShellDriver1HiiHandle, \r
348 FileName,\r
349 Status);\r
350 ShellCloseFile(&FileHandle);\r
351 SHELL_FREE_NON_NULL(MainBuffer);\r
352 return (SHELL_DEVICE_ERROR); \r
353 }\r
354\r
355 ShellCloseFile(&FileHandle);\r
356\r
357 if (Handle != NULL) {\r
358 //\r
359 // User override in place. Just do it.\r
360 //\r
361 HiiHandle = NULL;\r
362 Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);\r
363 if (EFI_ERROR(Status)) {\r
4ba49616 364 ShellPrintHiiEx(\r
365 -1, \r
366 -1, \r
367 NULL, \r
4880c2c9 368 STRING_TOKEN(STR_GEN_HANDLE_NOT), \r
4ba49616 369 gShellDriver1HiiHandle, \r
4880c2c9 370 ConvertHandleToHandleIndex(Handle), \r
371 L"Device");\r
372 ShellCloseFile(&FileHandle);\r
373 return (SHELL_DEVICE_ERROR); \r
374 }\r
375 Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, MainBuffer);\r
376 if (EFI_ERROR(Status)) {\r
377 ShellPrintHiiEx(\r
378 -1, \r
379 -1, \r
380 NULL, \r
381 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), \r
382 gShellDriver1HiiHandle, \r
383 L"HiiDatabase->UpdatePackageList", \r
384 Status);\r
385 return (SHELL_DEVICE_ERROR); \r
386 }\r
387 } else {\r
388 //\r
389 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.\r
390 //\r
391\r
392 for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer\r
393 ; PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize)\r
394 ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) {\r
395 for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER))\r
396 ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END\r
397 ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) {\r
398 if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {\r
399 HiiHandle = NULL;\r
400 Status = FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase);\r
401 if (EFI_ERROR(Status)) {\r
402 //\r
403 // print out an error.\r
404 //\r
405 TempDevPathString = gDevPathToText->ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), TRUE, TRUE);\r
406 ShellPrintHiiEx(\r
407 -1, \r
408 -1, \r
409 NULL, \r
410 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF), \r
411 gShellDriver1HiiHandle, \r
412 TempDevPathString);\r
413 SHELL_FREE_NON_NULL(TempDevPathString);\r
414 } else {\r
415 Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, PackageListHeader);\r
416 if (EFI_ERROR(Status)) {\r
417 ShellPrintHiiEx(\r
418 -1, \r
419 -1, \r
420 NULL, \r
421 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), \r
422 gShellDriver1HiiHandle, \r
423 L"HiiDatabase->UpdatePackageList", \r
424 Status);\r
425 return (SHELL_DEVICE_ERROR);\r
426 } else {\r
427 DevPath = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER));\r
428 gBS->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle);\r
429 HandleIndex = ConvertHandleToHandleIndex(Handle);\r
430 ShellPrintHiiEx(\r
431 -1, \r
432 -1, \r
433 NULL, \r
434 STRING_TOKEN(STR_DRVCFG_DONE_HII), \r
435 gShellDriver1HiiHandle, \r
436 HandleIndex);\r
437 }\r
438 } \r
439 }\r
440 }\r
4ba49616 441 }\r
442 }\r
4880c2c9 443\r
444 SHELL_FREE_NON_NULL(MainBuffer);\r
445\r
446\r
447 ShellPrintHiiEx(\r
448 -1, \r
449 -1,\r
450 NULL,\r
451 STRING_TOKEN(STR_DRVCFG_COMP), \r
452 gShellDriver1HiiHandle);\r
4ba49616 453 return (SHELL_SUCCESS);\r
454}\r
455\r
4880c2c9 456EFI_STATUS\r
457EFIAPI\r
458ShellCmdDriverConfigurationProcessActionRequired (\r
459 EFI_HANDLE DriverImageHandle,\r
460 EFI_HANDLE ControllerHandle,\r
461 EFI_HANDLE ChildHandle,\r
462 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired\r
463 )\r
464{\r
465 EFI_HANDLE ConnectControllerContextOverride[2];\r
466\r
467 switch (ActionRequired) {\r
468 case EfiDriverConfigurationActionNone:\r
469 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);\r
470 break;\r
471\r
472 case EfiDriverConfigurationActionStopController:\r
473 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_STOP), gShellDriver1HiiHandle);\r
474 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"stop controller");\r
475 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);\r
476\r
477 gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);\r
478 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"stopped");\r
479 break;\r
480\r
481 case EfiDriverConfigurationActionRestartController:\r
482 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"controller");\r
483 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart controller");\r
484 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);\r
485\r
486 gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);\r
487 ConnectControllerContextOverride[0] = DriverImageHandle;\r
488 ConnectControllerContextOverride[1] = NULL;\r
489 gBS->ConnectController (ControllerHandle, ConnectControllerContextOverride, NULL, TRUE);\r
490 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"restarted");\r
491 break;\r
492\r
493 case EfiDriverConfigurationActionRestartPlatform:\r
494 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"platform");\r
495 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart platform");\r
496 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);\r
497\r
498 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
499 break;\r
500\r
501 default:\r
502 return (EFI_INVALID_PARAMETER);\r
503 break;\r
504 }\r
505\r
506 return EFI_SUCCESS;\r
507}\r
508\r
509SHELL_STATUS\r
510EFIAPI\r
511PreHiiDrvCfg (\r
512 IN CONST CHAR8 *Language,\r
513 IN BOOLEAN ForceDefaults,\r
514 IN UINT32 DefaultType,\r
515 IN BOOLEAN AllChildren,\r
516 IN BOOLEAN ValidateOptions,\r
517 IN BOOLEAN SetOptions,\r
518 IN EFI_HANDLE DriverImageHandle,\r
519 IN EFI_HANDLE DeviceHandle,\r
520 IN EFI_HANDLE ChildHandle\r
521 )\r
522{\r
523 EFI_STATUS Status;\r
524 SHELL_STATUS ShellStatus;\r
525 UINTN OuterLoopCounter;\r
526 CHAR8 *BestLanguage;\r
527 UINTN DriverImageHandleCount;\r
528 EFI_HANDLE *DriverImageHandleBuffer;\r
529 UINTN HandleCount;\r
530 EFI_HANDLE *HandleBuffer;\r
531 UINTN *HandleType;\r
532 UINTN LoopCounter;\r
533 UINTN ChildIndex;\r
534 UINTN ChildHandleCount;\r
535 EFI_HANDLE *ChildHandleBuffer;\r
536 UINTN *ChildHandleType;\r
537 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired;\r
538 EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration;\r
539 BOOLEAN Iso639Language;\r
540 UINTN HandleIndex1;\r
541 UINTN HandleIndex2;\r
542 UINTN HandleIndex3;\r
543\r
544 ShellStatus = SHELL_SUCCESS;\r
545\r
546 if (ChildHandle == NULL && AllChildren) {\r
547 SetOptions = FALSE;\r
548 }\r
549\r
550 if (ForceDefaults) {\r
551 ShellPrintHiiEx(\r
552 -1,\r
553 -1,\r
554 NULL,\r
555 STRING_TOKEN (STR_DRVCFG_FORCE_D), \r
556 gShellDriver1HiiHandle, \r
557 DefaultType);\r
558 } else if (ValidateOptions) {\r
559 ShellPrintHiiEx(\r
560 -1,\r
561 -1,\r
562 NULL,\r
563 STRING_TOKEN (STR_DRVCFG_VALIDATE), \r
564 gShellDriver1HiiHandle);\r
565 } else if (SetOptions) {\r
566 ShellPrintHiiEx(\r
567 -1,\r
568 -1,\r
569 NULL,\r
570 STRING_TOKEN (STR_DRVCFG_SET), \r
571 gShellDriver1HiiHandle);\r
572 }\r
573\r
574 if (DriverImageHandle == 0) {\r
575 DriverImageHandleBuffer = GetHandleListByProtocolList(CfgGuidList);\r
576 if (DriverImageHandleBuffer == NULL) {\r
577 ShellStatus = SHELL_NOT_FOUND;\r
578 goto Done;\r
579 }\r
580 for (\r
581 HandleBuffer = DriverImageHandleBuffer, DriverImageHandleCount = 0 \r
582 ; HandleBuffer != NULL && *HandleBuffer != NULL \r
583 ; HandleBuffer++,DriverImageHandleCount++);\r
584 } else {\r
585 DriverImageHandleCount = 1;\r
586 //\r
587 // Allocate buffer to hold the image handle so as to\r
588 // keep consistent with the above clause\r
589 //\r
590 DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE));\r
591 ASSERT (DriverImageHandleBuffer);\r
592 DriverImageHandleBuffer[0] = DriverImageHandle;\r
593 }\r
594\r
595 for (OuterLoopCounter = 0; OuterLoopCounter < DriverImageHandleCount; OuterLoopCounter++) {\r
596 Iso639Language = FALSE;\r
597 Status = gBS->OpenProtocol (\r
598 DriverImageHandleBuffer[OuterLoopCounter],\r
599 &gEfiDriverConfiguration2ProtocolGuid,\r
600 (VOID **) &DriverConfiguration,\r
601 NULL,\r
602 NULL,\r
603 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
604 );\r
605 if (EFI_ERROR (Status)) {\r
606 Iso639Language = TRUE;\r
607 Status = gBS->OpenProtocol (\r
608 DriverImageHandleBuffer[OuterLoopCounter],\r
609 &gEfiDriverConfigurationProtocolGuid,\r
610 (VOID **) &DriverConfiguration,\r
611 NULL,\r
612 NULL,\r
613 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
614 );\r
615 }\r
616 if (EFI_ERROR (Status)) {\r
617// ShellPrintHiiEx(\r
618// -1,\r
619// -1,\r
620// NULL,\r
621// STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),\r
622// gShellDriver1HiiHandle,\r
623// ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])\r
624// );\r
625 ShellStatus = SHELL_UNSUPPORTED;\r
626 continue;\r
627 }\r
628 \r
629 BestLanguage = GetBestLanguage (\r
630 DriverConfiguration->SupportedLanguages,\r
631 Iso639Language,\r
632 Language!=NULL?Language:"",\r
633 DriverConfiguration->SupportedLanguages,\r
634 NULL\r
635 );\r
636 if (BestLanguage == NULL) {\r
637 ShellPrintHiiEx(\r
638 -1,\r
639 -1,\r
640 NULL,\r
641 STRING_TOKEN (STR_GEN_PROBLEM_VAL),\r
642 gShellDriver1HiiHandle,\r
643 L"-l"\r
644 );\r
645 ShellStatus = SHELL_INVALID_PARAMETER;\r
646 continue;\r
647 }\r
648\r
649 Status = ParseHandleDatabaseByRelationshipWithType (\r
650 DriverImageHandleBuffer[OuterLoopCounter],\r
651 NULL,\r
652 &HandleCount,\r
653 &HandleBuffer,\r
654 &HandleType\r
655 );\r
656 if (EFI_ERROR (Status)) {\r
657 continue;\r
658 }\r
659\r
660 if (SetOptions && DeviceHandle == NULL) {\r
661\r
662 gST->ConOut->ClearScreen (gST->ConOut);\r
663 Status = DriverConfiguration->SetOptions (\r
664 DriverConfiguration,\r
665 NULL,\r
666 NULL,\r
667 BestLanguage,\r
668 &ActionRequired\r
669 );\r
670 gST->ConOut->ClearScreen (gST->ConOut);\r
671\r
672 ShellPrintHiiEx(\r
673 -1,\r
674 -1,\r
675 NULL,\r
676 STRING_TOKEN (STR_DRVCFG_ALL_LANG),\r
677 gShellDriver1HiiHandle,\r
678 ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]),\r
679 DriverConfiguration->SupportedLanguages\r
680 );\r
681 if (!EFI_ERROR (Status)) {\r
682 ShellPrintHiiEx(\r
683 -1,\r
684 -1,\r
685 NULL,\r
686 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
687 gShellDriver1HiiHandle);\r
688 for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {\r
689 if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) == HR_CONTROLLER_HANDLE) {\r
690 ShellCmdDriverConfigurationProcessActionRequired (\r
691 DriverImageHandleBuffer[OuterLoopCounter],\r
692 HandleBuffer[LoopCounter],\r
693 NULL,\r
694 ActionRequired\r
695 );\r
696 }\r
697 }\r
698 } else {\r
699 ShellPrintHiiEx(\r
700 -1,\r
701 -1,\r
702 NULL,\r
703 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
704 gShellDriver1HiiHandle, \r
705 Status);\r
706 }\r
707 continue;\r
708 }\r
709\r
710 for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {\r
711 if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) != HR_CONTROLLER_HANDLE) {\r
712 continue;\r
713 }\r
714 if (DeviceHandle != NULL && DeviceHandle != HandleBuffer[LoopCounter]) {\r
715 continue;\r
716 }\r
717 if (ChildHandle == NULL) {\r
718 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
719 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
720 ShellPrintHiiEx(\r
721 -1,\r
722 -1,\r
723 NULL,\r
724 STRING_TOKEN (STR_DRVCFG_CTRL_LANG),\r
725 gShellDriver1HiiHandle,\r
726 HandleIndex1,\r
727 HandleIndex2,\r
728 DriverConfiguration->SupportedLanguages\r
729 );\r
730\r
731 if (ForceDefaults) {\r
732 Status = DriverConfiguration->ForceDefaults (\r
733 DriverConfiguration,\r
734 HandleBuffer[LoopCounter],\r
735 NULL,\r
736 DefaultType,\r
737 &ActionRequired\r
738 );\r
739\r
740 if (!EFI_ERROR (Status)) {\r
741 ShellPrintHiiEx(\r
742 -1,\r
743 -1,\r
744 NULL,\r
745 STRING_TOKEN (STR_DRVCFG_DEF_FORCED), \r
746 gShellDriver1HiiHandle);\r
747 ShellCmdDriverConfigurationProcessActionRequired (\r
748 DriverImageHandleBuffer[OuterLoopCounter],\r
749 HandleBuffer[LoopCounter],\r
750 NULL,\r
751 ActionRequired\r
752 );\r
753 } else {\r
754 ShellPrintHiiEx(\r
755 -1,\r
756 -1,\r
757 NULL,\r
758 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), \r
759 gShellDriver1HiiHandle, \r
760 Status);\r
761 ShellStatus = SHELL_DEVICE_ERROR;\r
762 }\r
763 } else if (ValidateOptions) {\r
764 Status = DriverConfiguration->OptionsValid (\r
765 DriverConfiguration,\r
766 HandleBuffer[LoopCounter],\r
767 NULL\r
768 );\r
769\r
770 if (!EFI_ERROR (Status)) {\r
771 ShellPrintHiiEx(\r
772 -1,\r
773 -1,\r
774 NULL,\r
775 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), \r
776 gShellDriver1HiiHandle);\r
777 } else {\r
778 ShellPrintHiiEx(\r
779 -1,\r
780 -1,\r
781 NULL,\r
782 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), \r
783 gShellDriver1HiiHandle, \r
784 Status);\r
785 ShellStatus = SHELL_DEVICE_ERROR;\r
786 }\r
787 } else if (SetOptions) {\r
788 gST->ConOut->ClearScreen (gST->ConOut);\r
789 Status = DriverConfiguration->SetOptions (\r
790 DriverConfiguration,\r
791 HandleBuffer[LoopCounter],\r
792 NULL,\r
793 BestLanguage,\r
794 &ActionRequired\r
795 );\r
796 gST->ConOut->ClearScreen (gST->ConOut);\r
797 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
798 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
799 ShellPrintHiiEx(\r
800 -1,\r
801 -1,\r
802 NULL,\r
803 STRING_TOKEN (STR_DRVCFG_CTRL_LANG),\r
804 gShellDriver1HiiHandle,\r
805 HandleIndex1,\r
806 HandleIndex2,\r
807 DriverConfiguration->SupportedLanguages\r
808 );\r
809 if (!EFI_ERROR (Status)) {\r
810 ShellPrintHiiEx(\r
811 -1,\r
812 -1,\r
813 NULL,\r
814 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
815 gShellDriver1HiiHandle);\r
816\r
817 ShellCmdDriverConfigurationProcessActionRequired (\r
818 DriverImageHandleBuffer[OuterLoopCounter],\r
819 HandleBuffer[LoopCounter],\r
820 NULL,\r
821 ActionRequired\r
822 );\r
823\r
824 } else {\r
825 ShellPrintHiiEx(\r
826 -1,\r
827 -1,\r
828 NULL,\r
829 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
830 gShellDriver1HiiHandle, \r
831 Status);\r
832 ShellStatus = SHELL_DEVICE_ERROR;\r
833 }\r
834 } else {\r
835 Print (L"\n");\r
836 }\r
837 }\r
838\r
839 if (ChildHandle == NULL && !AllChildren) {\r
840 continue;\r
841 }\r
842\r
843 Status = ParseHandleDatabaseByRelationshipWithType (\r
844 DriverImageHandleBuffer[OuterLoopCounter],\r
845 HandleBuffer[LoopCounter],\r
846 &ChildHandleCount,\r
847 &ChildHandleBuffer,\r
848 &ChildHandleType\r
849 );\r
850 if (EFI_ERROR (Status)) {\r
851 continue;\r
852 }\r
853\r
854 for (ChildIndex = 0; ChildIndex < ChildHandleCount; ChildIndex++) {\r
855\r
856 if ((ChildHandleType[ChildIndex] & HR_CHILD_HANDLE) != HR_CHILD_HANDLE) {\r
857 continue;\r
858 }\r
859\r
860 if (ChildHandle != NULL && ChildHandle != ChildHandleBuffer[ChildIndex]) {\r
861 continue;\r
862 }\r
863\r
864 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
865 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
866 HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);\r
867 ShellPrintHiiEx(\r
868 -1,\r
869 -1,\r
870 NULL,\r
871 STRING_TOKEN (STR_DRVCFG_CHILD_LANG),\r
872 gShellDriver1HiiHandle,\r
873 HandleIndex1,\r
874 HandleIndex2,\r
875 HandleIndex3,\r
876 DriverConfiguration->SupportedLanguages);\r
877\r
878 if (ForceDefaults) {\r
879 Status = DriverConfiguration->ForceDefaults (\r
880 DriverConfiguration,\r
881 HandleBuffer[LoopCounter],\r
882 ChildHandleBuffer[ChildIndex],\r
883 DefaultType,\r
884 &ActionRequired\r
885 );\r
886\r
887 if (!EFI_ERROR (Status)) {\r
888 ShellPrintHiiEx(\r
889 -1,\r
890 -1,\r
891 NULL,\r
892 STRING_TOKEN (STR_DRVCFG_DEF_FORCED), \r
893 gShellDriver1HiiHandle);\r
894\r
895 ShellCmdDriverConfigurationProcessActionRequired (\r
896 DriverImageHandleBuffer[OuterLoopCounter],\r
897 HandleBuffer[LoopCounter],\r
898 ChildHandleBuffer[ChildIndex],\r
899 ActionRequired\r
900 );\r
901\r
902 } else {\r
903 ShellPrintHiiEx(\r
904 -1,\r
905 -1,\r
906 NULL,\r
907 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), \r
908 gShellDriver1HiiHandle, \r
909 Status);\r
910 ShellStatus = SHELL_DEVICE_ERROR;\r
911 }\r
912 } else if (ValidateOptions) {\r
913 Status = DriverConfiguration->OptionsValid (\r
914 DriverConfiguration,\r
915 HandleBuffer[LoopCounter],\r
916 ChildHandleBuffer[ChildIndex]\r
917 );\r
918\r
919 if (!EFI_ERROR (Status)) {\r
920 ShellPrintHiiEx(\r
921 -1,\r
922 -1,\r
923 NULL,\r
924 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), \r
925 gShellDriver1HiiHandle);\r
926 } else {\r
927 ShellPrintHiiEx(\r
928 -1,\r
929 -1,\r
930 NULL,\r
931 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), \r
932 gShellDriver1HiiHandle, \r
933 Status);\r
934 ShellStatus = SHELL_DEVICE_ERROR;\r
935 }\r
936 } else if (SetOptions) {\r
937 gST->ConOut->ClearScreen (gST->ConOut);\r
938 Status = DriverConfiguration->SetOptions (\r
939 DriverConfiguration,\r
940 HandleBuffer[LoopCounter],\r
941 ChildHandleBuffer[ChildIndex],\r
942 BestLanguage,\r
943 &ActionRequired\r
944 );\r
945 gST->ConOut->ClearScreen (gST->ConOut);\r
946 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
947 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
948 HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);\r
949 ShellPrintHiiEx(\r
950 -1,\r
951 -1,\r
952 NULL,\r
953 STRING_TOKEN (STR_DRVCFG_CHILD_LANG),\r
954 gShellDriver1HiiHandle,\r
955 HandleIndex1,\r
956 HandleIndex2,\r
957 HandleIndex3,\r
958 DriverConfiguration->SupportedLanguages\r
959 );\r
960 if (!EFI_ERROR (Status)) {\r
961 ShellPrintHiiEx(\r
962 -1,\r
963 -1,\r
964 NULL,\r
965 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
966 gShellDriver1HiiHandle);\r
967\r
968 ShellCmdDriverConfigurationProcessActionRequired (\r
969 DriverImageHandleBuffer[OuterLoopCounter],\r
970 HandleBuffer[LoopCounter],\r
971 ChildHandleBuffer[ChildIndex],\r
972 ActionRequired\r
973 );\r
974\r
975 } else {\r
976 ShellPrintHiiEx(\r
977 -1,\r
978 -1,\r
979 NULL,\r
980 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
981 gShellDriver1HiiHandle, \r
982 Status);\r
983 ShellStatus = SHELL_DEVICE_ERROR;\r
984 }\r
985 } else {\r
986 Print (L"\n");\r
987 }\r
988 }\r
989\r
990 FreePool (ChildHandleBuffer);\r
991 FreePool (ChildHandleType);\r
992 }\r
993\r
994 FreePool (BestLanguage);\r
995 FreePool (HandleBuffer);\r
996 FreePool (HandleType);\r
997 }\r
998\r
999 if (DriverImageHandle != NULL && DriverImageHandleCount != 0) {\r
1000 FreePool (DriverImageHandleBuffer);\r
1001 }\r
1002\r
1003Done:\r
1004 return ShellStatus;\r
1005}\r
1006\r
4ba49616 1007/**\r
1008 Function to print out configuration information on all configurable handles.\r
1009\r
1010 @param[in] ChildrenToo TRUE to tewst for children.\r
4880c2c9 1011 @param[in] Language ASCII string for language code.\r
1012 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.\r
4ba49616 1013\r
1014 @retval SHELL_SUCCESS The operation was successful.\r
1015**/\r
1016SHELL_STATUS\r
1017EFIAPI\r
1018PrintConfigInfoOnAll(\r
4880c2c9 1019 IN CONST BOOLEAN ChildrenToo,\r
1020 IN CONST CHAR8 *Language,\r
1021 IN CONST BOOLEAN UseHii\r
4ba49616 1022 )\r
1023{\r
4ba49616 1024 EFI_HANDLE *HandleList;\r
1025 EFI_HANDLE *CurrentHandle;\r
4ba49616 1026 BOOLEAN Found;\r
4880c2c9 1027 UINTN Index2;\r
1028\r
4ba49616 1029\r
1030 Found = FALSE;\r
4ba49616 1031 HandleList = NULL;\r
1032 CurrentHandle = NULL;\r
4ba49616 1033\r
4880c2c9 1034 if (UseHii) {\r
1035 //\r
1036 // HII method\r
1037 //\r
1038 HandleList = GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid);\r
1039 for (CurrentHandle = HandleList ; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++){\r
1040 Found = TRUE;\r
1041 Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex(*CurrentHandle);\r
1042 ShellPrintHiiEx(\r
1043 -1, \r
1044 -1, \r
1045 NULL, \r
1046 STRING_TOKEN (STR_DRVCFG_LINE_HII), \r
1047 gShellDriver1HiiHandle, \r
1048 Index2\r
1049 );\r
4ba49616 1050 }\r
4880c2c9 1051 SHELL_FREE_NON_NULL(HandleList);\r
4ba49616 1052 }\r
4ba49616 1053\r
4880c2c9 1054 if (PreHiiDrvCfg (\r
1055 Language,\r
1056 FALSE,\r
1057 0,\r
1058 ChildrenToo,\r
1059 FALSE,\r
1060 FALSE,\r
1061 0,\r
1062 0,\r
1063 0) == SHELL_SUCCESS) {\r
1064 Found = TRUE;\r
4ba49616 1065 }\r
4880c2c9 1066\r
4ba49616 1067 if (!Found) {\r
1068 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);\r
1069 return (SHELL_SUCCESS);\r
1070 }\r
4880c2c9 1071\r
1072 return (SHELL_SUCCESS);\r
4ba49616 1073}\r
1074\r
4880c2c9 1075STATIC CONST SHELL_PARAM_ITEM ParamListHii[] = {\r
4ba49616 1076 {L"-s", TypeFlag},\r
4ba49616 1077 {L"-l", TypeValue},\r
1078 {L"-f", TypeValue},\r
1079 {L"-o", TypeValue},\r
1080 {L"-i", TypeValue},\r
1081 {NULL, TypeMax}\r
1082 };\r
4880c2c9 1083STATIC CONST SHELL_PARAM_ITEM ParamListPreHii[] = {\r
1084 {L"-c", TypeFlag},\r
1085 {L"-s", TypeFlag},\r
1086 {L"-v", TypeFlag},\r
1087 {L"-l", TypeValue},\r
1088 {L"-f", TypeValue},\r
1089 {NULL, TypeMax}\r
1090 };\r
4ba49616 1091\r
361a8267 1092/**\r
1093 Function for 'drvcfg' command.\r
1094\r
1095 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1096 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1097**/\r
4ba49616 1098SHELL_STATUS\r
1099EFIAPI\r
1100ShellCommandRunDrvCfg (\r
1101 IN EFI_HANDLE ImageHandle,\r
1102 IN EFI_SYSTEM_TABLE *SystemTable\r
1103 )\r
1104{\r
1105 EFI_STATUS Status;\r
1106 LIST_ENTRY *Package;\r
1107 CHAR16 *ProblemParam;\r
1108 SHELL_STATUS ShellStatus;\r
1109 CHAR8 *Language;\r
1110 CONST CHAR16 *Lang;\r
4880c2c9 1111 CONST CHAR16 *HandleIndex1;\r
1112 CONST CHAR16 *HandleIndex2;\r
1113 CONST CHAR16 *HandleIndex3;\r
1114 CONST CHAR16 *ForceTypeString;\r
1115 BOOLEAN Force;\r
1116 BOOLEAN Set;\r
1117 BOOLEAN Validate;\r
1118 BOOLEAN InFromFile;\r
1119 BOOLEAN OutToFile;\r
1120 BOOLEAN AllChildren;\r
1121 BOOLEAN UseHii;\r
1122 UINT32 ForceType;\r
1123 UINT64 Intermediate;\r
1124 EFI_HANDLE Handle1;\r
1125 EFI_HANDLE Handle2;\r
1126 EFI_HANDLE Handle3;\r
1127 CONST CHAR16 *FileName;\r
4ba49616 1128\r
1129 ShellStatus = SHELL_SUCCESS;\r
1130 Status = EFI_SUCCESS;\r
1131 Language = NULL;\r
4880c2c9 1132 UseHii = TRUE;\r
4ba49616 1133\r
1134 //\r
1135 // initialize the shell lib (we must be in non-auto-init...)\r
1136 //\r
1137 Status = ShellInitialize();\r
1138 ASSERT_EFI_ERROR(Status);\r
1139\r
1140 Status = CommandInit();\r
1141 ASSERT_EFI_ERROR(Status);\r
1142\r
1143 //\r
1144 // parse the command line\r
1145 //\r
4880c2c9 1146 Status = ShellCommandLineParse (ParamListHii, &Package, &ProblemParam, TRUE);\r
1147 if (EFI_ERROR(Status) || ShellCommandLineGetCount(Package) > 2) {\r
1148 UseHii = FALSE;\r
1149 if (Package != NULL) {\r
1150 ShellCommandLineFreeVarList (Package);\r
4ba49616 1151 }\r
4880c2c9 1152 SHELL_FREE_NON_NULL(ProblemParam);\r
1153 Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE);\r
1154 if (EFI_ERROR(Status)) {\r
1155 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1156 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
1157 FreePool(ProblemParam);\r
1158 ShellStatus = SHELL_INVALID_PARAMETER;\r
1159 goto Done;\r
1160 } else {\r
1161 ASSERT(FALSE);\r
1162 }\r
1163 }\r
1164 } \r
1165 if (ShellStatus == SHELL_SUCCESS) {\r
4ba49616 1166 Lang = ShellCommandLineGetValue(Package, L"-l");\r
1167 if (Lang != NULL) {\r
1168 Language = AllocateZeroPool(StrSize(Lang));\r
1169 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
4880c2c9 1170 } else if (ShellCommandLineGetFlag(Package, L"-l")){\r
4ba49616 1171 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
4880c2c9 1172 ShellStatus = SHELL_INVALID_PARAMETER;\r
1173 goto Done;\r
1174 }\r
1175 Set = ShellCommandLineGetFlag (Package, L"-s");\r
1176 Validate = ShellCommandLineGetFlag (Package, L"-v");\r
1177 InFromFile = ShellCommandLineGetFlag (Package, L"-i");\r
1178 OutToFile = ShellCommandLineGetFlag (Package, L"-o");\r
1179 AllChildren = ShellCommandLineGetFlag (Package, L"-c");\r
1180 Force = ShellCommandLineGetFlag (Package, L"-f");\r
1181 ForceTypeString = ShellCommandLineGetValue(Package, L"-f");\r
1182\r
1183 if (OutToFile) {\r
1184 FileName = ShellCommandLineGetValue(Package, L"-o");\r
1185 } else if (InFromFile) {\r
1186 FileName = ShellCommandLineGetValue(Package, L"-i");\r
1187 } else {\r
1188 FileName = NULL;\r
1189 }\r
1190\r
1191 if (InFromFile && EFI_ERROR(ShellFileExists(FileName))) {\r
1192 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, FileName);\r
1193 ShellStatus = SHELL_INVALID_PARAMETER;\r
1194 goto Done; \r
1195 }\r
1196 if (OutToFile && !EFI_ERROR(ShellFileExists(FileName))) {\r
1197 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, FileName);\r
1198 ShellStatus = SHELL_INVALID_PARAMETER;\r
1199 goto Done; \r
1200 }\r
1201 if (Force && ForceTypeString == NULL) {\r
1202 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-f");\r
1203 ShellStatus = SHELL_INVALID_PARAMETER;\r
1204 goto Done;\r
1205 } \r
1206 if (Force) {\r
1207 Status = ShellConvertStringToUint64(ForceTypeString, &Intermediate, FALSE, FALSE);\r
1208 if (EFI_ERROR(Status)) {\r
1209 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"-f");\r
1210 ShellStatus = SHELL_INVALID_PARAMETER;\r
1211 goto Done;\r
1212 }\r
1213 ForceType = (UINT32)Intermediate;\r
1214 } else {\r
1215 ForceType = 0;\r
1216 }\r
1217 HandleIndex1 = ShellCommandLineGetRawValue(Package, 1);\r
1218 Handle1 = NULL;\r
1219 if (HandleIndex1 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1, &Intermediate, TRUE, FALSE))) {\r
1220 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1221 if (Handle1 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1222 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex1);\r
1223 ShellStatus = SHELL_INVALID_PARAMETER;\r
1224 goto Done;\r
1225 }\r
1226 }\r
1227 HandleIndex2 = ShellCommandLineGetRawValue(Package, 2);\r
1228 Handle2 = NULL;\r
1229 if (HandleIndex2 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2, &Intermediate, TRUE, FALSE))) {\r
1230 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1231 if (Handle2 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1232 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex2);\r
1233 ShellStatus = SHELL_INVALID_PARAMETER;\r
1234 goto Done;\r
1235 }\r
1236 }\r
1237 HandleIndex3 = ShellCommandLineGetRawValue(Package, 3);\r
1238 Handle3 = NULL;\r
1239 if (HandleIndex3 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3, &Intermediate, TRUE, FALSE))) {\r
1240 Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1241 if (Handle3 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1242 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex3);\r
1243 ShellStatus = SHELL_INVALID_PARAMETER;\r
1244 goto Done;\r
1245 }\r
1246 }\r
1247\r
1248 if ((InFromFile || OutToFile) && (FileName == NULL)) {\r
1249 if (FileName == NULL) {\r
1250 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, InFromFile?L"-i":L"-o");\r
1251 } else {\r
1252 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle);\r
1253 }\r
1254 ShellStatus = SHELL_INVALID_PARAMETER;\r
1255 goto Done;\r
1256 }\r
1257 if (!UseHii && (InFromFile || OutToFile)) {\r
1258 if (InFromFile) {\r
1259 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-i");\r
1260 ShellStatus = SHELL_INVALID_PARAMETER;\r
1261 goto Done;\r
1262 } \r
1263 if (OutToFile) {\r
1264 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-o");\r
1265 ShellStatus = SHELL_INVALID_PARAMETER;\r
1266 goto Done;\r
1267 }\r
1268 }\r
1269 if (Validate && Force) {\r
1270 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-f");\r
1271 ShellStatus = SHELL_INVALID_PARAMETER;\r
1272 goto Done;\r
1273 } \r
1274 if (Validate && Set) {\r
1275 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-s");\r
1276 ShellStatus = SHELL_INVALID_PARAMETER;\r
1277 goto Done;\r
1278 } \r
1279 if (Set && Force) {\r
1280 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-s", L"-f");\r
1281 ShellStatus = SHELL_INVALID_PARAMETER;\r
1282 goto Done;\r
1283 }\r
1284 if (OutToFile && InFromFile) {\r
1285 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-i", L"-o");\r
1286 ShellStatus = SHELL_INVALID_PARAMETER;\r
1287 goto Done;\r
4ba49616 1288 }\r
1289\r
1290 //\r
4880c2c9 1291 // We do HII first.\r
4ba49616 1292 //\r
4880c2c9 1293 if (UseHii) {\r
1294 if (Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
4ba49616 1295 //\r
4880c2c9 1296 // no HII on this handle.\r
4ba49616 1297 //\r
4880c2c9 1298 ShellStatus = SHELL_UNSUPPORTED;\r
1299 } else if (Validate) {\r
1300 } else if (Force) {\r
1301 } else if (Set) {\r
1302 } else if (InFromFile) {\r
1303 ShellStatus = ConfigFromFile(Handle1, FileName);\r
1304 if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {\r
1305 goto Done;\r
1306 }\r
1307 } else if (OutToFile) {\r
1308 ShellStatus = ConfigToFile(Handle1, FileName);\r
1309 if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {\r
1310 goto Done;\r
1311 }\r
1312 } else if (HandleIndex1 == NULL) {\r
1313 //\r
1314 // display all that are configurable\r
1315 //\r
1316 ShellStatus = PrintConfigInfoOnAll(AllChildren, Language, UseHii);\r
1317 goto Done;\r
1318 } else {\r
1319 if (!EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
1320 ShellPrintHiiEx(\r
1321 -1, \r
1322 -1, \r
1323 NULL, \r
1324 STRING_TOKEN (STR_DRVCFG_LINE_HII), \r
1325 gShellDriver1HiiHandle, \r
1326 ConvertHandleToHandleIndex(Handle1)\r
1327 );\r
1328 goto Done;\r
4ba49616 1329 }\r
1330 }\r
4880c2c9 1331 }\r
1332\r
1333 //\r
1334 // We allways need to do this one since it does both by default.\r
1335 //\r
1336 if (!InFromFile && !OutToFile) {\r
1337 ShellStatus = PreHiiDrvCfg (\r
1338 Language,\r
1339 Force,\r
1340 ForceType,\r
1341 AllChildren,\r
1342 Validate,\r
1343 Set,\r
1344 Handle1,\r
1345 Handle2,\r
1346 Handle3);\r
1347 }\r
1348\r
1349 if (ShellStatus == SHELL_UNSUPPORTED) {\r
1350 ShellPrintHiiEx(\r
1351 -1,\r
1352 -1,\r
1353 NULL,\r
1354 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),\r
1355 gShellDriver1HiiHandle, \r
1356 ConvertHandleToHandleIndex(Handle1)\r
1357 );\r
4ba49616 1358 }\r
1359 }\r
4880c2c9 1360\r
1361Done:\r
4ba49616 1362 ShellCommandLineFreeVarList (Package);\r
1363 SHELL_FREE_NON_NULL(Language);\r
1364 return (ShellStatus);\r
1365}\r