]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c
ShellPkg: Remove PerformancePkg requirement and add the header itself.
[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
517 break;\r
518 }\r
519\r
520 return EFI_SUCCESS;\r
521}\r
522\r
6a5aa4d6 523/**\r
524 Do the configuration in an environment without HII.\r
525\r
526 @param[in] Language The language code.\r
527 @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise.\r
528 @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type.\r
529 @param[in] AllChildren TRUE to configure all children, FALSE otherwise.\r
530 @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise.\r
531 @param[in] SetOptions TRUE to set options, FALSE otherwise.\r
532 @param[in] DriverImageHandle The handle for the driver to configure.\r
533 @param[in] DeviceHandle The handle of the device being managed by the Driver specified.\r
534 @param[in] ChildHandle The handle of a child device of the specified device.\r
535\r
536 @retval SHELL_NOT_FOUND A specified handle could not be found.\r
537 @retval SHELL_INVALID_PARAMETER A parameter has a invalid value.\r
538**/\r
4880c2c9 539SHELL_STATUS\r
540EFIAPI\r
541PreHiiDrvCfg (\r
542 IN CONST CHAR8 *Language,\r
543 IN BOOLEAN ForceDefaults,\r
544 IN UINT32 DefaultType,\r
545 IN BOOLEAN AllChildren,\r
546 IN BOOLEAN ValidateOptions,\r
547 IN BOOLEAN SetOptions,\r
548 IN EFI_HANDLE DriverImageHandle,\r
549 IN EFI_HANDLE DeviceHandle,\r
550 IN EFI_HANDLE ChildHandle\r
551 )\r
552{\r
553 EFI_STATUS Status;\r
554 SHELL_STATUS ShellStatus;\r
555 UINTN OuterLoopCounter;\r
556 CHAR8 *BestLanguage;\r
557 UINTN DriverImageHandleCount;\r
558 EFI_HANDLE *DriverImageHandleBuffer;\r
559 UINTN HandleCount;\r
560 EFI_HANDLE *HandleBuffer;\r
561 UINTN *HandleType;\r
562 UINTN LoopCounter;\r
563 UINTN ChildIndex;\r
564 UINTN ChildHandleCount;\r
565 EFI_HANDLE *ChildHandleBuffer;\r
566 UINTN *ChildHandleType;\r
567 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired;\r
568 EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration;\r
569 BOOLEAN Iso639Language;\r
570 UINTN HandleIndex1;\r
571 UINTN HandleIndex2;\r
572 UINTN HandleIndex3;\r
573\r
574 ShellStatus = SHELL_SUCCESS;\r
575\r
576 if (ChildHandle == NULL && AllChildren) {\r
577 SetOptions = FALSE;\r
578 }\r
579\r
580 if (ForceDefaults) {\r
581 ShellPrintHiiEx(\r
582 -1,\r
583 -1,\r
584 NULL,\r
585 STRING_TOKEN (STR_DRVCFG_FORCE_D), \r
586 gShellDriver1HiiHandle, \r
587 DefaultType);\r
588 } else if (ValidateOptions) {\r
589 ShellPrintHiiEx(\r
590 -1,\r
591 -1,\r
592 NULL,\r
593 STRING_TOKEN (STR_DRVCFG_VALIDATE), \r
594 gShellDriver1HiiHandle);\r
595 } else if (SetOptions) {\r
596 ShellPrintHiiEx(\r
597 -1,\r
598 -1,\r
599 NULL,\r
600 STRING_TOKEN (STR_DRVCFG_SET), \r
601 gShellDriver1HiiHandle);\r
602 }\r
603\r
604 if (DriverImageHandle == 0) {\r
605 DriverImageHandleBuffer = GetHandleListByProtocolList(CfgGuidList);\r
606 if (DriverImageHandleBuffer == NULL) {\r
607 ShellStatus = SHELL_NOT_FOUND;\r
608 goto Done;\r
609 }\r
610 for (\r
611 HandleBuffer = DriverImageHandleBuffer, DriverImageHandleCount = 0 \r
612 ; HandleBuffer != NULL && *HandleBuffer != NULL \r
613 ; HandleBuffer++,DriverImageHandleCount++);\r
614 } else {\r
615 DriverImageHandleCount = 1;\r
616 //\r
617 // Allocate buffer to hold the image handle so as to\r
618 // keep consistent with the above clause\r
619 //\r
620 DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE));\r
621 ASSERT (DriverImageHandleBuffer);\r
622 DriverImageHandleBuffer[0] = DriverImageHandle;\r
623 }\r
624\r
625 for (OuterLoopCounter = 0; OuterLoopCounter < DriverImageHandleCount; OuterLoopCounter++) {\r
626 Iso639Language = FALSE;\r
627 Status = gBS->OpenProtocol (\r
628 DriverImageHandleBuffer[OuterLoopCounter],\r
629 &gEfiDriverConfiguration2ProtocolGuid,\r
630 (VOID **) &DriverConfiguration,\r
631 NULL,\r
632 NULL,\r
633 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
634 );\r
635 if (EFI_ERROR (Status)) {\r
636 Iso639Language = TRUE;\r
637 Status = gBS->OpenProtocol (\r
638 DriverImageHandleBuffer[OuterLoopCounter],\r
639 &gEfiDriverConfigurationProtocolGuid,\r
640 (VOID **) &DriverConfiguration,\r
641 NULL,\r
642 NULL,\r
643 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
644 );\r
645 }\r
646 if (EFI_ERROR (Status)) {\r
647// ShellPrintHiiEx(\r
648// -1,\r
649// -1,\r
650// NULL,\r
651// STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),\r
652// gShellDriver1HiiHandle,\r
653// ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])\r
654// );\r
655 ShellStatus = SHELL_UNSUPPORTED;\r
656 continue;\r
657 }\r
658 \r
659 BestLanguage = GetBestLanguage (\r
660 DriverConfiguration->SupportedLanguages,\r
661 Iso639Language,\r
662 Language!=NULL?Language:"",\r
663 DriverConfiguration->SupportedLanguages,\r
664 NULL\r
665 );\r
666 if (BestLanguage == NULL) {\r
667 ShellPrintHiiEx(\r
668 -1,\r
669 -1,\r
670 NULL,\r
671 STRING_TOKEN (STR_GEN_PROBLEM_VAL),\r
672 gShellDriver1HiiHandle,\r
673 L"-l"\r
674 );\r
675 ShellStatus = SHELL_INVALID_PARAMETER;\r
676 continue;\r
677 }\r
678\r
679 Status = ParseHandleDatabaseByRelationshipWithType (\r
680 DriverImageHandleBuffer[OuterLoopCounter],\r
681 NULL,\r
682 &HandleCount,\r
683 &HandleBuffer,\r
684 &HandleType\r
685 );\r
686 if (EFI_ERROR (Status)) {\r
687 continue;\r
688 }\r
689\r
690 if (SetOptions && DeviceHandle == NULL) {\r
691\r
692 gST->ConOut->ClearScreen (gST->ConOut);\r
693 Status = DriverConfiguration->SetOptions (\r
694 DriverConfiguration,\r
695 NULL,\r
696 NULL,\r
697 BestLanguage,\r
698 &ActionRequired\r
699 );\r
700 gST->ConOut->ClearScreen (gST->ConOut);\r
701\r
702 ShellPrintHiiEx(\r
703 -1,\r
704 -1,\r
705 NULL,\r
706 STRING_TOKEN (STR_DRVCFG_ALL_LANG),\r
707 gShellDriver1HiiHandle,\r
708 ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]),\r
709 DriverConfiguration->SupportedLanguages\r
710 );\r
711 if (!EFI_ERROR (Status)) {\r
712 ShellPrintHiiEx(\r
713 -1,\r
714 -1,\r
715 NULL,\r
716 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
717 gShellDriver1HiiHandle);\r
718 for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {\r
719 if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) == HR_CONTROLLER_HANDLE) {\r
720 ShellCmdDriverConfigurationProcessActionRequired (\r
721 DriverImageHandleBuffer[OuterLoopCounter],\r
722 HandleBuffer[LoopCounter],\r
723 NULL,\r
724 ActionRequired\r
725 );\r
726 }\r
727 }\r
728 } else {\r
729 ShellPrintHiiEx(\r
730 -1,\r
731 -1,\r
732 NULL,\r
733 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
734 gShellDriver1HiiHandle, \r
735 Status);\r
736 }\r
737 continue;\r
738 }\r
739\r
740 for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {\r
741 if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) != HR_CONTROLLER_HANDLE) {\r
742 continue;\r
743 }\r
744 if (DeviceHandle != NULL && DeviceHandle != HandleBuffer[LoopCounter]) {\r
745 continue;\r
746 }\r
747 if (ChildHandle == NULL) {\r
748 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
749 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
750 ShellPrintHiiEx(\r
751 -1,\r
752 -1,\r
753 NULL,\r
754 STRING_TOKEN (STR_DRVCFG_CTRL_LANG),\r
755 gShellDriver1HiiHandle,\r
756 HandleIndex1,\r
757 HandleIndex2,\r
758 DriverConfiguration->SupportedLanguages\r
759 );\r
760\r
761 if (ForceDefaults) {\r
762 Status = DriverConfiguration->ForceDefaults (\r
763 DriverConfiguration,\r
764 HandleBuffer[LoopCounter],\r
765 NULL,\r
766 DefaultType,\r
767 &ActionRequired\r
768 );\r
769\r
770 if (!EFI_ERROR (Status)) {\r
771 ShellPrintHiiEx(\r
772 -1,\r
773 -1,\r
774 NULL,\r
775 STRING_TOKEN (STR_DRVCFG_DEF_FORCED), \r
776 gShellDriver1HiiHandle);\r
777 ShellCmdDriverConfigurationProcessActionRequired (\r
778 DriverImageHandleBuffer[OuterLoopCounter],\r
779 HandleBuffer[LoopCounter],\r
780 NULL,\r
781 ActionRequired\r
782 );\r
783 } else {\r
784 ShellPrintHiiEx(\r
785 -1,\r
786 -1,\r
787 NULL,\r
788 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), \r
789 gShellDriver1HiiHandle, \r
790 Status);\r
791 ShellStatus = SHELL_DEVICE_ERROR;\r
792 }\r
793 } else if (ValidateOptions) {\r
794 Status = DriverConfiguration->OptionsValid (\r
795 DriverConfiguration,\r
796 HandleBuffer[LoopCounter],\r
797 NULL\r
798 );\r
799\r
800 if (!EFI_ERROR (Status)) {\r
801 ShellPrintHiiEx(\r
802 -1,\r
803 -1,\r
804 NULL,\r
805 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), \r
806 gShellDriver1HiiHandle);\r
807 } else {\r
808 ShellPrintHiiEx(\r
809 -1,\r
810 -1,\r
811 NULL,\r
812 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), \r
813 gShellDriver1HiiHandle, \r
814 Status);\r
815 ShellStatus = SHELL_DEVICE_ERROR;\r
816 }\r
817 } else if (SetOptions) {\r
818 gST->ConOut->ClearScreen (gST->ConOut);\r
819 Status = DriverConfiguration->SetOptions (\r
820 DriverConfiguration,\r
821 HandleBuffer[LoopCounter],\r
822 NULL,\r
823 BestLanguage,\r
824 &ActionRequired\r
825 );\r
826 gST->ConOut->ClearScreen (gST->ConOut);\r
827 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
828 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
829 ShellPrintHiiEx(\r
830 -1,\r
831 -1,\r
832 NULL,\r
833 STRING_TOKEN (STR_DRVCFG_CTRL_LANG),\r
834 gShellDriver1HiiHandle,\r
835 HandleIndex1,\r
836 HandleIndex2,\r
837 DriverConfiguration->SupportedLanguages\r
838 );\r
839 if (!EFI_ERROR (Status)) {\r
840 ShellPrintHiiEx(\r
841 -1,\r
842 -1,\r
843 NULL,\r
844 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
845 gShellDriver1HiiHandle);\r
846\r
847 ShellCmdDriverConfigurationProcessActionRequired (\r
848 DriverImageHandleBuffer[OuterLoopCounter],\r
849 HandleBuffer[LoopCounter],\r
850 NULL,\r
851 ActionRequired\r
852 );\r
853\r
854 } else {\r
855 ShellPrintHiiEx(\r
856 -1,\r
857 -1,\r
858 NULL,\r
859 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
860 gShellDriver1HiiHandle, \r
861 Status);\r
862 ShellStatus = SHELL_DEVICE_ERROR;\r
863 }\r
864 } else {\r
865 Print (L"\n");\r
866 }\r
867 }\r
868\r
869 if (ChildHandle == NULL && !AllChildren) {\r
870 continue;\r
871 }\r
872\r
873 Status = ParseHandleDatabaseByRelationshipWithType (\r
874 DriverImageHandleBuffer[OuterLoopCounter],\r
875 HandleBuffer[LoopCounter],\r
876 &ChildHandleCount,\r
877 &ChildHandleBuffer,\r
878 &ChildHandleType\r
879 );\r
880 if (EFI_ERROR (Status)) {\r
881 continue;\r
882 }\r
883\r
884 for (ChildIndex = 0; ChildIndex < ChildHandleCount; ChildIndex++) {\r
885\r
886 if ((ChildHandleType[ChildIndex] & HR_CHILD_HANDLE) != HR_CHILD_HANDLE) {\r
887 continue;\r
888 }\r
889\r
890 if (ChildHandle != NULL && ChildHandle != ChildHandleBuffer[ChildIndex]) {\r
891 continue;\r
892 }\r
893\r
894 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
895 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
896 HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);\r
897 ShellPrintHiiEx(\r
898 -1,\r
899 -1,\r
900 NULL,\r
901 STRING_TOKEN (STR_DRVCFG_CHILD_LANG),\r
902 gShellDriver1HiiHandle,\r
903 HandleIndex1,\r
904 HandleIndex2,\r
905 HandleIndex3,\r
906 DriverConfiguration->SupportedLanguages);\r
907\r
908 if (ForceDefaults) {\r
909 Status = DriverConfiguration->ForceDefaults (\r
910 DriverConfiguration,\r
911 HandleBuffer[LoopCounter],\r
912 ChildHandleBuffer[ChildIndex],\r
913 DefaultType,\r
914 &ActionRequired\r
915 );\r
916\r
917 if (!EFI_ERROR (Status)) {\r
918 ShellPrintHiiEx(\r
919 -1,\r
920 -1,\r
921 NULL,\r
922 STRING_TOKEN (STR_DRVCFG_DEF_FORCED), \r
923 gShellDriver1HiiHandle);\r
924\r
925 ShellCmdDriverConfigurationProcessActionRequired (\r
926 DriverImageHandleBuffer[OuterLoopCounter],\r
927 HandleBuffer[LoopCounter],\r
928 ChildHandleBuffer[ChildIndex],\r
929 ActionRequired\r
930 );\r
931\r
932 } else {\r
933 ShellPrintHiiEx(\r
934 -1,\r
935 -1,\r
936 NULL,\r
937 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), \r
938 gShellDriver1HiiHandle, \r
939 Status);\r
940 ShellStatus = SHELL_DEVICE_ERROR;\r
941 }\r
942 } else if (ValidateOptions) {\r
943 Status = DriverConfiguration->OptionsValid (\r
944 DriverConfiguration,\r
945 HandleBuffer[LoopCounter],\r
946 ChildHandleBuffer[ChildIndex]\r
947 );\r
948\r
949 if (!EFI_ERROR (Status)) {\r
950 ShellPrintHiiEx(\r
951 -1,\r
952 -1,\r
953 NULL,\r
954 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), \r
955 gShellDriver1HiiHandle);\r
956 } else {\r
957 ShellPrintHiiEx(\r
958 -1,\r
959 -1,\r
960 NULL,\r
961 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), \r
962 gShellDriver1HiiHandle, \r
963 Status);\r
964 ShellStatus = SHELL_DEVICE_ERROR;\r
965 }\r
966 } else if (SetOptions) {\r
967 gST->ConOut->ClearScreen (gST->ConOut);\r
968 Status = DriverConfiguration->SetOptions (\r
969 DriverConfiguration,\r
970 HandleBuffer[LoopCounter],\r
971 ChildHandleBuffer[ChildIndex],\r
972 BestLanguage,\r
973 &ActionRequired\r
974 );\r
975 gST->ConOut->ClearScreen (gST->ConOut);\r
976 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
977 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
978 HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);\r
979 ShellPrintHiiEx(\r
980 -1,\r
981 -1,\r
982 NULL,\r
983 STRING_TOKEN (STR_DRVCFG_CHILD_LANG),\r
984 gShellDriver1HiiHandle,\r
985 HandleIndex1,\r
986 HandleIndex2,\r
987 HandleIndex3,\r
988 DriverConfiguration->SupportedLanguages\r
989 );\r
990 if (!EFI_ERROR (Status)) {\r
991 ShellPrintHiiEx(\r
992 -1,\r
993 -1,\r
994 NULL,\r
995 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
996 gShellDriver1HiiHandle);\r
997\r
998 ShellCmdDriverConfigurationProcessActionRequired (\r
999 DriverImageHandleBuffer[OuterLoopCounter],\r
1000 HandleBuffer[LoopCounter],\r
1001 ChildHandleBuffer[ChildIndex],\r
1002 ActionRequired\r
1003 );\r
1004\r
1005 } else {\r
1006 ShellPrintHiiEx(\r
1007 -1,\r
1008 -1,\r
1009 NULL,\r
1010 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
1011 gShellDriver1HiiHandle, \r
1012 Status);\r
1013 ShellStatus = SHELL_DEVICE_ERROR;\r
1014 }\r
1015 } else {\r
1016 Print (L"\n");\r
1017 }\r
1018 }\r
1019\r
1020 FreePool (ChildHandleBuffer);\r
1021 FreePool (ChildHandleType);\r
1022 }\r
1023\r
1024 FreePool (BestLanguage);\r
1025 FreePool (HandleBuffer);\r
1026 FreePool (HandleType);\r
1027 }\r
1028\r
1029 if (DriverImageHandle != NULL && DriverImageHandleCount != 0) {\r
1030 FreePool (DriverImageHandleBuffer);\r
1031 }\r
1032\r
1033Done:\r
1034 return ShellStatus;\r
1035}\r
1036\r
4ba49616 1037/**\r
1038 Function to print out configuration information on all configurable handles.\r
1039\r
1040 @param[in] ChildrenToo TRUE to tewst for children.\r
4880c2c9 1041 @param[in] Language ASCII string for language code.\r
1042 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.\r
4ba49616 1043\r
1044 @retval SHELL_SUCCESS The operation was successful.\r
1045**/\r
1046SHELL_STATUS\r
1047EFIAPI\r
1048PrintConfigInfoOnAll(\r
4880c2c9 1049 IN CONST BOOLEAN ChildrenToo,\r
1050 IN CONST CHAR8 *Language,\r
1051 IN CONST BOOLEAN UseHii\r
4ba49616 1052 )\r
1053{\r
4ba49616 1054 EFI_HANDLE *HandleList;\r
1055 EFI_HANDLE *CurrentHandle;\r
4ba49616 1056 BOOLEAN Found;\r
4880c2c9 1057 UINTN Index2;\r
1058\r
4ba49616 1059\r
1060 Found = FALSE;\r
4ba49616 1061 HandleList = NULL;\r
1062 CurrentHandle = NULL;\r
4ba49616 1063\r
4880c2c9 1064 if (UseHii) {\r
1065 //\r
1066 // HII method\r
1067 //\r
1068 HandleList = GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid);\r
1069 for (CurrentHandle = HandleList ; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++){\r
1070 Found = TRUE;\r
1071 Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex(*CurrentHandle);\r
1072 ShellPrintHiiEx(\r
1073 -1, \r
1074 -1, \r
1075 NULL, \r
1076 STRING_TOKEN (STR_DRVCFG_LINE_HII), \r
1077 gShellDriver1HiiHandle, \r
1078 Index2\r
1079 );\r
4ba49616 1080 }\r
4880c2c9 1081 SHELL_FREE_NON_NULL(HandleList);\r
4ba49616 1082 }\r
4ba49616 1083\r
4880c2c9 1084 if (PreHiiDrvCfg (\r
1085 Language,\r
1086 FALSE,\r
1087 0,\r
1088 ChildrenToo,\r
1089 FALSE,\r
1090 FALSE,\r
1091 0,\r
1092 0,\r
1093 0) == SHELL_SUCCESS) {\r
1094 Found = TRUE;\r
4ba49616 1095 }\r
4880c2c9 1096\r
4ba49616 1097 if (!Found) {\r
1098 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);\r
1099 return (SHELL_SUCCESS);\r
1100 }\r
4880c2c9 1101\r
1102 return (SHELL_SUCCESS);\r
4ba49616 1103}\r
1104\r
4880c2c9 1105STATIC CONST SHELL_PARAM_ITEM ParamListHii[] = {\r
4ba49616 1106 {L"-s", TypeFlag},\r
4ba49616 1107 {L"-l", TypeValue},\r
1108 {L"-f", TypeValue},\r
1109 {L"-o", TypeValue},\r
1110 {L"-i", TypeValue},\r
1111 {NULL, TypeMax}\r
1112 };\r
4880c2c9 1113STATIC CONST SHELL_PARAM_ITEM ParamListPreHii[] = {\r
1114 {L"-c", TypeFlag},\r
1115 {L"-s", TypeFlag},\r
1116 {L"-v", TypeFlag},\r
1117 {L"-l", TypeValue},\r
1118 {L"-f", TypeValue},\r
1119 {NULL, TypeMax}\r
1120 };\r
4ba49616 1121\r
361a8267 1122/**\r
1123 Function for 'drvcfg' command.\r
1124\r
1125 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1126 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1127**/\r
4ba49616 1128SHELL_STATUS\r
1129EFIAPI\r
1130ShellCommandRunDrvCfg (\r
1131 IN EFI_HANDLE ImageHandle,\r
1132 IN EFI_SYSTEM_TABLE *SystemTable\r
1133 )\r
1134{\r
1135 EFI_STATUS Status;\r
1136 LIST_ENTRY *Package;\r
1137 CHAR16 *ProblemParam;\r
1138 SHELL_STATUS ShellStatus;\r
1139 CHAR8 *Language;\r
1140 CONST CHAR16 *Lang;\r
4880c2c9 1141 CONST CHAR16 *HandleIndex1;\r
1142 CONST CHAR16 *HandleIndex2;\r
1143 CONST CHAR16 *HandleIndex3;\r
1144 CONST CHAR16 *ForceTypeString;\r
1145 BOOLEAN Force;\r
1146 BOOLEAN Set;\r
1147 BOOLEAN Validate;\r
1148 BOOLEAN InFromFile;\r
1149 BOOLEAN OutToFile;\r
1150 BOOLEAN AllChildren;\r
1151 BOOLEAN UseHii;\r
1152 UINT32 ForceType;\r
1153 UINT64 Intermediate;\r
1154 EFI_HANDLE Handle1;\r
1155 EFI_HANDLE Handle2;\r
1156 EFI_HANDLE Handle3;\r
1157 CONST CHAR16 *FileName;\r
4ba49616 1158\r
1159 ShellStatus = SHELL_SUCCESS;\r
1160 Status = EFI_SUCCESS;\r
1161 Language = NULL;\r
4880c2c9 1162 UseHii = TRUE;\r
4ba49616 1163\r
1164 //\r
1165 // initialize the shell lib (we must be in non-auto-init...)\r
1166 //\r
1167 Status = ShellInitialize();\r
1168 ASSERT_EFI_ERROR(Status);\r
1169\r
1170 Status = CommandInit();\r
1171 ASSERT_EFI_ERROR(Status);\r
1172\r
1173 //\r
1174 // parse the command line\r
1175 //\r
4880c2c9 1176 Status = ShellCommandLineParse (ParamListHii, &Package, &ProblemParam, TRUE);\r
1177 if (EFI_ERROR(Status) || ShellCommandLineGetCount(Package) > 2) {\r
1178 UseHii = FALSE;\r
1179 if (Package != NULL) {\r
1180 ShellCommandLineFreeVarList (Package);\r
4ba49616 1181 }\r
4880c2c9 1182 SHELL_FREE_NON_NULL(ProblemParam);\r
1183 Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE);\r
1184 if (EFI_ERROR(Status)) {\r
1185 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1186 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
1187 FreePool(ProblemParam);\r
1188 ShellStatus = SHELL_INVALID_PARAMETER;\r
1189 goto Done;\r
1190 } else {\r
1191 ASSERT(FALSE);\r
1192 }\r
1193 }\r
1194 } \r
1195 if (ShellStatus == SHELL_SUCCESS) {\r
4ba49616 1196 Lang = ShellCommandLineGetValue(Package, L"-l");\r
1197 if (Lang != NULL) {\r
1198 Language = AllocateZeroPool(StrSize(Lang));\r
1199 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
4880c2c9 1200 } else if (ShellCommandLineGetFlag(Package, L"-l")){\r
4ba49616 1201 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
4880c2c9 1202 ShellStatus = SHELL_INVALID_PARAMETER;\r
1203 goto Done;\r
1204 }\r
1205 Set = ShellCommandLineGetFlag (Package, L"-s");\r
1206 Validate = ShellCommandLineGetFlag (Package, L"-v");\r
1207 InFromFile = ShellCommandLineGetFlag (Package, L"-i");\r
1208 OutToFile = ShellCommandLineGetFlag (Package, L"-o");\r
1209 AllChildren = ShellCommandLineGetFlag (Package, L"-c");\r
1210 Force = ShellCommandLineGetFlag (Package, L"-f");\r
1211 ForceTypeString = ShellCommandLineGetValue(Package, L"-f");\r
1212\r
1213 if (OutToFile) {\r
1214 FileName = ShellCommandLineGetValue(Package, L"-o");\r
1215 } else if (InFromFile) {\r
1216 FileName = ShellCommandLineGetValue(Package, L"-i");\r
1217 } else {\r
1218 FileName = NULL;\r
1219 }\r
1220\r
1221 if (InFromFile && EFI_ERROR(ShellFileExists(FileName))) {\r
1222 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, FileName);\r
1223 ShellStatus = SHELL_INVALID_PARAMETER;\r
1224 goto Done; \r
1225 }\r
1226 if (OutToFile && !EFI_ERROR(ShellFileExists(FileName))) {\r
1227 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, FileName);\r
1228 ShellStatus = SHELL_INVALID_PARAMETER;\r
1229 goto Done; \r
1230 }\r
1231 if (Force && ForceTypeString == NULL) {\r
1232 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-f");\r
1233 ShellStatus = SHELL_INVALID_PARAMETER;\r
1234 goto Done;\r
1235 } \r
1236 if (Force) {\r
1237 Status = ShellConvertStringToUint64(ForceTypeString, &Intermediate, FALSE, FALSE);\r
1238 if (EFI_ERROR(Status)) {\r
1239 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"-f");\r
1240 ShellStatus = SHELL_INVALID_PARAMETER;\r
1241 goto Done;\r
1242 }\r
1243 ForceType = (UINT32)Intermediate;\r
1244 } else {\r
1245 ForceType = 0;\r
1246 }\r
1247 HandleIndex1 = ShellCommandLineGetRawValue(Package, 1);\r
1248 Handle1 = NULL;\r
1249 if (HandleIndex1 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1, &Intermediate, TRUE, FALSE))) {\r
1250 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1251 if (Handle1 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1252 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex1);\r
1253 ShellStatus = SHELL_INVALID_PARAMETER;\r
1254 goto Done;\r
1255 }\r
1256 }\r
1257 HandleIndex2 = ShellCommandLineGetRawValue(Package, 2);\r
1258 Handle2 = NULL;\r
1259 if (HandleIndex2 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2, &Intermediate, TRUE, FALSE))) {\r
1260 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1261 if (Handle2 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1262 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex2);\r
1263 ShellStatus = SHELL_INVALID_PARAMETER;\r
1264 goto Done;\r
1265 }\r
1266 }\r
1267 HandleIndex3 = ShellCommandLineGetRawValue(Package, 3);\r
1268 Handle3 = NULL;\r
1269 if (HandleIndex3 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3, &Intermediate, TRUE, FALSE))) {\r
1270 Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1271 if (Handle3 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1272 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex3);\r
1273 ShellStatus = SHELL_INVALID_PARAMETER;\r
1274 goto Done;\r
1275 }\r
1276 }\r
1277\r
1278 if ((InFromFile || OutToFile) && (FileName == NULL)) {\r
1279 if (FileName == NULL) {\r
1280 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, InFromFile?L"-i":L"-o");\r
1281 } else {\r
1282 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle);\r
1283 }\r
1284 ShellStatus = SHELL_INVALID_PARAMETER;\r
1285 goto Done;\r
1286 }\r
1287 if (!UseHii && (InFromFile || OutToFile)) {\r
1288 if (InFromFile) {\r
1289 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-i");\r
1290 ShellStatus = SHELL_INVALID_PARAMETER;\r
1291 goto Done;\r
1292 } \r
1293 if (OutToFile) {\r
1294 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-o");\r
1295 ShellStatus = SHELL_INVALID_PARAMETER;\r
1296 goto Done;\r
1297 }\r
1298 }\r
1299 if (Validate && Force) {\r
1300 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-f");\r
1301 ShellStatus = SHELL_INVALID_PARAMETER;\r
1302 goto Done;\r
1303 } \r
1304 if (Validate && Set) {\r
1305 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-s");\r
1306 ShellStatus = SHELL_INVALID_PARAMETER;\r
1307 goto Done;\r
1308 } \r
1309 if (Set && Force) {\r
1310 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-s", L"-f");\r
1311 ShellStatus = SHELL_INVALID_PARAMETER;\r
1312 goto Done;\r
1313 }\r
1314 if (OutToFile && InFromFile) {\r
1315 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-i", L"-o");\r
1316 ShellStatus = SHELL_INVALID_PARAMETER;\r
1317 goto Done;\r
4ba49616 1318 }\r
1319\r
1320 //\r
4880c2c9 1321 // We do HII first.\r
4ba49616 1322 //\r
4880c2c9 1323 if (UseHii) {\r
1324 if (Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
4ba49616 1325 //\r
4880c2c9 1326 // no HII on this handle.\r
4ba49616 1327 //\r
4880c2c9 1328 ShellStatus = SHELL_UNSUPPORTED;\r
1329 } else if (Validate) {\r
1330 } else if (Force) {\r
1331 } else if (Set) {\r
1332 } else if (InFromFile) {\r
1333 ShellStatus = ConfigFromFile(Handle1, FileName);\r
1334 if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {\r
1335 goto Done;\r
1336 }\r
1337 } else if (OutToFile) {\r
1338 ShellStatus = ConfigToFile(Handle1, FileName);\r
1339 if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {\r
1340 goto Done;\r
1341 }\r
1342 } else if (HandleIndex1 == NULL) {\r
1343 //\r
1344 // display all that are configurable\r
1345 //\r
1346 ShellStatus = PrintConfigInfoOnAll(AllChildren, Language, UseHii);\r
1347 goto Done;\r
1348 } else {\r
1349 if (!EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
1350 ShellPrintHiiEx(\r
1351 -1, \r
1352 -1, \r
1353 NULL, \r
1354 STRING_TOKEN (STR_DRVCFG_LINE_HII), \r
1355 gShellDriver1HiiHandle, \r
1356 ConvertHandleToHandleIndex(Handle1)\r
1357 );\r
1358 goto Done;\r
4ba49616 1359 }\r
1360 }\r
4880c2c9 1361 }\r
1362\r
1363 //\r
1364 // We allways need to do this one since it does both by default.\r
1365 //\r
1366 if (!InFromFile && !OutToFile) {\r
1367 ShellStatus = PreHiiDrvCfg (\r
1368 Language,\r
1369 Force,\r
1370 ForceType,\r
1371 AllChildren,\r
1372 Validate,\r
1373 Set,\r
1374 Handle1,\r
1375 Handle2,\r
1376 Handle3);\r
1377 }\r
1378\r
1379 if (ShellStatus == SHELL_UNSUPPORTED) {\r
1380 ShellPrintHiiEx(\r
1381 -1,\r
1382 -1,\r
1383 NULL,\r
1384 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),\r
1385 gShellDriver1HiiHandle, \r
1386 ConvertHandleToHandleIndex(Handle1)\r
1387 );\r
4ba49616 1388 }\r
1389 }\r
4880c2c9 1390\r
1391Done:\r
4ba49616 1392 ShellCommandLineFreeVarList (Package);\r
1393 SHELL_FREE_NON_NULL(Language);\r
1394 return (ShellStatus);\r
1395}\r