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