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