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