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