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