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