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