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