]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
SecurityPkg/OpalPassword: Fixed input correct password not works issue
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPassword / OpalHii.c
CommitLineData
112e584b
SZ
1/** @file\r
2 Implementation of the HII for the Opal UEFI Driver.\r
3\r
4Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "OpalHii.h"\r
40d32e79
ED
16//\r
17// Character definitions\r
18//\r
19#define UPPER_LOWER_CASE_OFFSET 0x20\r
112e584b
SZ
20\r
21//\r
22// This is the generated IFR binary Data for each formset defined in VFR.\r
23// This Data array is ready to be used as input of HiiAddPackages() to\r
24// create a packagelist (which contains Form packages, String packages, etc).\r
25//\r
26extern UINT8 OpalPasswordFormBin[];\r
27\r
28//\r
29// This is the generated String package Data for all .UNI files.\r
30// This Data array is ready to be used as input of HiiAddPackages() to\r
31// create a packagelist (which contains Form packages, String packages, etc).\r
32//\r
33extern UINT8 OpalPasswordDxeStrings[];\r
34\r
35CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig";\r
36\r
37EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
38\r
39//\r
40// Handle to the list of HII packages (forms and strings) for this driver\r
41//\r
42EFI_HII_HANDLE gHiiPackageListHandle = NULL;\r
43\r
44//\r
45// Package List GUID containing all form and string packages\r
46//\r
47const EFI_GUID gHiiPackageListGuid = PACKAGE_LIST_GUID;\r
48const EFI_GUID gHiiSetupVariableGuid = SETUP_VARIABLE_GUID;\r
49\r
50//\r
51// Structure that contains state of the HII\r
52// This structure is updated by Hii.cpp and its contents\r
53// is rendered in the HII.\r
54//\r
55OPAL_HII_CONFIGURATION gHiiConfiguration;\r
56\r
57//\r
58// The device path containing the VENDOR_DEVICE_PATH and EFI_DEVICE_PATH_PROTOCOL\r
59//\r
60HII_VENDOR_DEVICE_PATH gHiiVendorDevicePath = {\r
61 {\r
62 {\r
63 HARDWARE_DEVICE_PATH,\r
64 HW_VENDOR_DP,\r
65 {\r
66 (UINT8)(sizeof(VENDOR_DEVICE_PATH)),\r
67 (UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8)\r
68 }\r
69 },\r
70 OPAL_PASSWORD_CONFIG_GUID\r
71 },\r
72 {\r
73 END_DEVICE_PATH_TYPE,\r
74 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
75 {\r
76 (UINT8)(END_DEVICE_PATH_LENGTH),\r
77 (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
78 }\r
79 }\r
80};\r
81\r
82/**\r
83 Get saved OPAL request.\r
84\r
85 @param[in] OpalDisk The disk needs to get the saved OPAL request.\r
86 @param[out] OpalRequest OPAL request got.\r
87\r
88**/\r
89VOID\r
90GetSavedOpalRequest (\r
91 IN OPAL_DISK *OpalDisk,\r
92 OUT OPAL_REQUEST *OpalRequest\r
93 )\r
94{\r
95 EFI_STATUS Status;\r
96 OPAL_REQUEST_VARIABLE *TempVariable;\r
97 OPAL_REQUEST_VARIABLE *Variable;\r
98 UINTN VariableSize;\r
99 EFI_DEVICE_PATH_PROTOCOL *DevicePathInVariable;\r
100 UINTN DevicePathSizeInVariable;\r
101 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
102 UINTN DevicePathSize;\r
103\r
104 DEBUG ((DEBUG_INFO, "%a() - enter\n", __FUNCTION__));\r
105\r
106 Variable = NULL;\r
107 VariableSize = 0;\r
108\r
109 Status = GetVariable2 (\r
110 OPAL_REQUEST_VARIABLE_NAME,\r
111 &gHiiSetupVariableGuid,\r
112 (VOID **) &Variable,\r
113 &VariableSize\r
114 );\r
115 if (EFI_ERROR (Status) || (Variable == NULL)) {\r
116 return;\r
117 }\r
118\r
119 TempVariable = Variable;\r
120 while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&\r
121 (VariableSize >= TempVariable->Length) &&\r
122 (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) {\r
123 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) TempVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
124 DevicePathSizeInVariable = GetDevicePathSize (DevicePathInVariable);\r
125 DevicePath = OpalDisk->OpalDevicePath;\r
126 DevicePathSize = GetDevicePathSize (DevicePath);\r
127 if ((DevicePathSize == DevicePathSizeInVariable) &&\r
128 (CompareMem (DevicePath, DevicePathInVariable, DevicePathSize) == 0)) {\r
129 //\r
130 // Found the node for the OPAL device.\r
131 // Get the OPAL request.\r
132 //\r
133 CopyMem (OpalRequest, &TempVariable->OpalRequest, sizeof (OPAL_REQUEST));\r
134 DEBUG ((\r
135 DEBUG_INFO,\r
136 "OpalRequest got: 0x%x\n",\r
137 *OpalRequest\r
138 ));\r
139 break;\r
140 }\r
141 VariableSize -= TempVariable->Length;\r
142 TempVariable = (OPAL_REQUEST_VARIABLE *) ((UINTN) TempVariable + TempVariable->Length);\r
143 }\r
144\r
145 FreePool (Variable);\r
146\r
147 DEBUG ((DEBUG_INFO, "%a() - exit\n", __FUNCTION__));\r
148}\r
149\r
150/**\r
151 Save OPAL request.\r
152\r
153 @param[in] OpalDisk The disk has OPAL request to save.\r
154 @param[in] OpalRequest OPAL request to save.\r
155\r
156**/\r
157VOID\r
158SaveOpalRequest (\r
159 IN OPAL_DISK *OpalDisk,\r
160 IN OPAL_REQUEST OpalRequest\r
161 )\r
162{\r
163 EFI_STATUS Status;\r
164 OPAL_REQUEST_VARIABLE *TempVariable;\r
165 UINTN TempVariableSize;\r
166 OPAL_REQUEST_VARIABLE *Variable;\r
167 UINTN VariableSize;\r
168 OPAL_REQUEST_VARIABLE *NewVariable;\r
169 UINTN NewVariableSize;\r
170 EFI_DEVICE_PATH_PROTOCOL *DevicePathInVariable;\r
171 UINTN DevicePathSizeInVariable;\r
172 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
173 UINTN DevicePathSize;\r
174\r
175 DEBUG ((DEBUG_INFO, "%a() - enter\n", __FUNCTION__));\r
176\r
177 DEBUG ((\r
178 DEBUG_INFO,\r
179 "OpalRequest to save: 0x%x\n",\r
180 OpalRequest\r
181 ));\r
182\r
183 Variable = NULL;\r
184 VariableSize = 0;\r
185 NewVariable = NULL;\r
186 NewVariableSize = 0;\r
187\r
188 Status = GetVariable2 (\r
189 OPAL_REQUEST_VARIABLE_NAME,\r
190 &gHiiSetupVariableGuid,\r
191 (VOID **) &Variable,\r
192 &VariableSize\r
193 );\r
194 if (!EFI_ERROR (Status) && (Variable != NULL)) {\r
195 TempVariable = Variable;\r
196 TempVariableSize = VariableSize;\r
197 while ((TempVariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&\r
198 (TempVariableSize >= TempVariable->Length) &&\r
199 (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) {\r
200 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) TempVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
201 DevicePathSizeInVariable = GetDevicePathSize (DevicePathInVariable);\r
202 DevicePath = OpalDisk->OpalDevicePath;\r
203 DevicePathSize = GetDevicePathSize (DevicePath);\r
204 if ((DevicePathSize == DevicePathSizeInVariable) &&\r
205 (CompareMem (DevicePath, DevicePathInVariable, DevicePathSize) == 0)) {\r
206 //\r
207 // Found the node for the OPAL device.\r
208 // Update the OPAL request.\r
209 //\r
210 CopyMem (&TempVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));\r
211 NewVariable = Variable;\r
212 NewVariableSize = VariableSize;\r
213 break;\r
214 }\r
215 TempVariableSize -= TempVariable->Length;\r
216 TempVariable = (OPAL_REQUEST_VARIABLE *) ((UINTN) TempVariable + TempVariable->Length);\r
217 }\r
218 if (NewVariable == NULL) {\r
219 //\r
220 // The node for the OPAL device is not found.\r
221 // Create node for the OPAL device.\r
222 //\r
223 DevicePath = OpalDisk->OpalDevicePath;\r
224 DevicePathSize = GetDevicePathSize (DevicePath);\r
225 NewVariableSize = VariableSize + sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize;\r
226 NewVariable = AllocatePool (NewVariableSize);\r
227 ASSERT (NewVariable != NULL);\r
228 CopyMem (NewVariable, Variable, VariableSize);\r
229 TempVariable = (OPAL_REQUEST_VARIABLE *) ((UINTN) NewVariable + VariableSize);\r
230 TempVariable->Length = (UINT32) (sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize);\r
231 CopyMem (&TempVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));\r
232 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) TempVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
233 CopyMem (DevicePathInVariable, DevicePath, DevicePathSize);\r
234 }\r
235 } else {\r
236 DevicePath = OpalDisk->OpalDevicePath;\r
237 DevicePathSize = GetDevicePathSize (DevicePath);\r
238 NewVariableSize = sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize;\r
239 NewVariable = AllocatePool (NewVariableSize);\r
240 ASSERT (NewVariable != NULL);\r
241 NewVariable->Length = (UINT32) (sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize);\r
242 CopyMem (&NewVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));\r
243 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) NewVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
244 CopyMem (DevicePathInVariable, DevicePath, DevicePathSize);\r
245 }\r
246 Status = gRT->SetVariable (\r
247 OPAL_REQUEST_VARIABLE_NAME,\r
248 (EFI_GUID *) &gHiiSetupVariableGuid,\r
249 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
250 NewVariableSize,\r
251 NewVariable\r
252 );\r
253 if (EFI_ERROR (Status)) {\r
254 DEBUG ((DEBUG_INFO, "OpalRequest variable set failed (%r)\n", Status));\r
255 }\r
256 if (NewVariable != Variable) {\r
257 FreePool (NewVariable);\r
258 }\r
259 if (Variable != NULL) {\r
260 FreePool (Variable);\r
261 }\r
262\r
263 DEBUG ((DEBUG_INFO, "%a() - exit\n", __FUNCTION__));\r
264}\r
265\r
266/**\r
267 Sets the current system state of global config variables.\r
268\r
269**/\r
270VOID\r
271HiiSetCurrentConfiguration(\r
272 VOID\r
273 )\r
274{\r
275 UINT32 PpStorageFlag;\r
276 EFI_STRING NewString;\r
277\r
278 gHiiConfiguration.NumDisks = GetDeviceCount();\r
279\r
280 //\r
281 // Update the BlockSID status string.\r
282 //\r
283 PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
284\r
285 if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\r
286 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL);\r
287 if (NewString == NULL) {\r
288 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
289 return;\r
290 }\r
291 } else {\r
292 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL);\r
293 if (NewString == NULL) {\r
294 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
295 return;\r
296 }\r
297 }\r
298 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
299 FreePool (NewString);\r
300\r
301 if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\r
302 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL);\r
303 if (NewString == NULL) {\r
304 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
305 return;\r
306 }\r
307 } else {\r
308 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL);\r
309 if (NewString == NULL) {\r
310 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
311 return;\r
312 }\r
313 }\r
314 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
315 FreePool (NewString);\r
316\r
317 if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\r
318 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL);\r
319 if (NewString == NULL) {\r
320 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
321 return;\r
322 }\r
323 } else {\r
324 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL);\r
325 if (NewString == NULL) {\r
326 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
327 return;\r
328 }\r
329 }\r
330 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL);\r
331 FreePool (NewString);\r
332}\r
333\r
334/**\r
335 Install the HII related resources.\r
336\r
337 @retval EFI_SUCCESS Install all the resources success.\r
338 @retval other Error occur when install the resources.\r
339**/\r
340EFI_STATUS\r
341HiiInstall(\r
342 VOID\r
343 )\r
344{\r
345 EFI_STATUS Status;\r
346 EFI_HANDLE DriverHandle;\r
347\r
348 //\r
349 // Clear the global configuration.\r
350 //\r
351 ZeroMem(&gHiiConfiguration, sizeof(gHiiConfiguration));\r
352\r
353 //\r
354 // Obtain the driver handle that the BIOS assigned us\r
355 //\r
356 DriverHandle = HiiGetDriverImageHandleCB();\r
357\r
358 //\r
359 // Populate the config access protocol with the three functions we are publishing\r
360 //\r
361 gHiiConfigAccessProtocol.ExtractConfig = ExtractConfig;\r
362 gHiiConfigAccessProtocol.RouteConfig = RouteConfig;\r
363 gHiiConfigAccessProtocol.Callback = DriverCallback;\r
364\r
365 //\r
366 // Associate the required protocols with our driver handle\r
367 //\r
368 Status = gBS->InstallMultipleProtocolInterfaces(\r
369 &DriverHandle,\r
370 &gEfiHiiConfigAccessProtocolGuid,\r
371 &gHiiConfigAccessProtocol, // HII callback\r
372 &gEfiDevicePathProtocolGuid,\r
373 &gHiiVendorDevicePath, // required for HII callback allow all disks to be shown in same hii\r
374 NULL\r
375 );\r
376\r
377 if (EFI_ERROR(Status)) {\r
378 return Status;\r
379 }\r
380\r
381 return OpalHiiAddPackages();\r
382}\r
383\r
384/**\r
385 Install the HII form and string packages.\r
386\r
387 @retval EFI_SUCCESS Install all the resources success.\r
388 @retval EFI_OUT_OF_RESOURCES Out of resource error.\r
389**/\r
390EFI_STATUS\r
391OpalHiiAddPackages(\r
392 VOID\r
393 )\r
394{\r
395 EFI_HANDLE DriverHandle;\r
396 CHAR16 *NewString;\r
397\r
398 DriverHandle = HiiGetDriverImageHandleCB();\r
399\r
400 //\r
401 // Publish the HII form and HII string packages\r
402 //\r
403 gHiiPackageListHandle = HiiAddPackages(\r
404 &gHiiPackageListGuid,\r
405 DriverHandle,\r
406 OpalPasswordDxeStrings,\r
407 OpalPasswordFormBin,\r
408 (VOID*)NULL\r
409 );\r
410\r
411 //\r
412 // Make sure the packages installed successfully\r
413 //\r
414 if (gHiiPackageListHandle == NULL) {\r
415 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages failed\n"));\r
416 return EFI_OUT_OF_RESOURCES;\r
417 }\r
418\r
419 //\r
420 // Update Version String in main window\r
421 //\r
422 NewString = HiiGetDriverNameCB ();\r
423 if (HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_MAIN_OPAL_VERSION), NewString, NULL) == 0) {\r
424 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages: HiiSetString( ) failed\n"));\r
425 return EFI_OUT_OF_RESOURCES;\r
426 }\r
427\r
428 return EFI_SUCCESS;\r
429}\r
430\r
431/**\r
432 Uninstall the HII capability.\r
433\r
434 @retval EFI_SUCCESS Uninstall all the resources success.\r
435 @retval others Other errors occur when unistall the hii resource.\r
436**/\r
437EFI_STATUS\r
438HiiUninstall(\r
439 VOID\r
440 )\r
441{\r
442 EFI_STATUS Status;\r
443\r
444 //\r
445 // Remove the packages we've provided to the BIOS\r
446 //\r
447 HiiRemovePackages(gHiiPackageListHandle);\r
448\r
449 //\r
450 // Remove the protocols from our driver handle\r
451 //\r
452 Status = gBS->UninstallMultipleProtocolInterfaces(\r
453 HiiGetDriverImageHandleCB(),\r
454 &gEfiHiiConfigAccessProtocolGuid,\r
455 &gHiiConfigAccessProtocol, // HII callback\r
456 &gEfiDevicePathProtocolGuid,\r
457 &gHiiVendorDevicePath, // required for HII callback\r
458 NULL\r
459 );\r
460 if (EFI_ERROR(Status)) {\r
461 DEBUG ((DEBUG_INFO, "Cannot uninstall Hii Protocols: %r\n", Status));\r
462 }\r
463\r
464 return Status;\r
465}\r
466\r
467/**\r
468 Updates the main menu form.\r
469\r
470 @retval EFI_SUCCESS update the main form success.\r
471**/\r
472EFI_STATUS\r
473HiiPopulateMainMenuForm (\r
474 VOID\r
475 )\r
476{\r
477 UINT8 Index;\r
478 CHAR8 *DiskName;\r
479 EFI_STRING_ID DiskNameId;\r
480 OPAL_DISK *OpalDisk;\r
481\r
482 HiiSetCurrentConfiguration();\r
483\r
484 gHiiConfiguration.SupportedDisks = 0;\r
485\r
486 for (Index = 0; Index < gHiiConfiguration.NumDisks; Index++) {\r
487 OpalDisk = HiiGetOpalDiskCB (Index);\r
488 if ((OpalDisk != NULL) && OpalFeatureSupported (&OpalDisk->SupportedAttributes)) {\r
489 gHiiConfiguration.SupportedDisks |= (1 << Index);\r
490 DiskNameId = GetDiskNameStringId (Index);\r
491 DiskName = HiiDiskGetNameCB (Index);\r
492 if ((DiskName == NULL) || (DiskNameId == 0)) {\r
493 return EFI_UNSUPPORTED;\r
494 }\r
495 HiiSetFormString(DiskNameId, DiskName);\r
496 }\r
497 }\r
498\r
499 OpalHiiSetBrowserData ();\r
500 return EFI_SUCCESS;\r
501}\r
502\r
503/**\r
504 Get disk name string id.\r
505\r
506 @param DiskIndex The input disk index info.\r
507\r
508 @retval The disk name string id.\r
509\r
510**/\r
511EFI_STRING_ID\r
512GetDiskNameStringId(\r
513 UINT8 DiskIndex\r
514 )\r
515{\r
516 switch (DiskIndex) {\r
517 case 0: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0);\r
518 case 1: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1);\r
519 case 2: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2);\r
520 case 3: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3);\r
521 case 4: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4);\r
522 case 5: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5);\r
523 }\r
524 return 0;\r
525}\r
526\r
40d32e79
ED
527/**\r
528 Confirm whether user truly want to do the revert action.\r
529\r
530 @param OpalDisk The device which need to do the revert action.\r
531\r
532 @retval EFI_SUCCESS Confirmed user want to do the revert action.\r
533**/\r
534EFI_STATUS\r
535HiiConfirmRevertAction (\r
536 IN OPAL_DISK *OpalDisk\r
537\r
538 )\r
539{\r
540 CHAR16 Unicode[512];\r
541 EFI_INPUT_KEY Key;\r
542 CHAR16 ApproveResponse;\r
543 CHAR16 RejectResponse;\r
544\r
545 //\r
546 // When the estimate cost time bigger than MAX_ACCEPTABLE_REVERTING_TIME, pop up dialog to let user confirm\r
547 // the revert action.\r
548 //\r
549 if (OpalDisk->EstimateTimeCost < MAX_ACCEPTABLE_REVERTING_TIME) {\r
550 return EFI_SUCCESS;\r
551 }\r
552\r
553 ApproveResponse = L'Y';\r
554 RejectResponse = L'N';\r
555\r
556 UnicodeSPrint(Unicode, StrSize(L"WARNING: Revert device needs about ####### seconds"), L"WARNING: Revert device needs about %d seconds", OpalDisk->EstimateTimeCost);\r
557\r
558 do {\r
559 CreatePopUp(\r
560 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
561 &Key,\r
562 Unicode,\r
563 L" System should not be powered off until revert completion ",\r
564 L" ",\r
565 L" Press 'Y/y' to continue, press 'N/n' to cancal ",\r
566 NULL\r
567 );\r
568 } while (\r
569 ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (ApproveResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
570 ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (RejectResponse | UPPER_LOWER_CASE_OFFSET))\r
571 );\r
572\r
573 if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (RejectResponse | UPPER_LOWER_CASE_OFFSET)) {\r
574 return EFI_ABORTED;\r
575 }\r
576\r
577 return EFI_SUCCESS;\r
578}\r
579\r
112e584b
SZ
580/**\r
581 This function processes the results of changes in configuration.\r
582\r
583 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
584 @param Action Specifies the type of action taken by the browser.\r
585 @param QuestionId A unique value which is sent to the original\r
586 exporting driver so that it can identify the type\r
587 of data to expect.\r
588 @param Type The type of value for the question.\r
589 @param Value A pointer to the data being sent to the original\r
590 exporting driver.\r
591 @param ActionRequest On return, points to the action requested by the\r
592 callback function.\r
593\r
594 @retval EFI_SUCCESS The callback successfully handled the action.\r
595 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
596 variable and its data.\r
597 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
598 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
599 callback.\r
600\r
601**/\r
602EFI_STATUS\r
603EFIAPI\r
604DriverCallback(\r
605 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
606 EFI_BROWSER_ACTION Action,\r
607 EFI_QUESTION_ID QuestionId,\r
608 UINT8 Type,\r
609 EFI_IFR_TYPE_VALUE *Value,\r
610 EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
611 )\r
612{\r
613 HII_KEY HiiKey;\r
614 UINT8 HiiKeyId;\r
615 UINT32 PpRequest;\r
616 OPAL_DISK *OpalDisk;\r
617\r
618 if (ActionRequest != NULL) {\r
619 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
620 } else {\r
621 return EFI_INVALID_PARAMETER;\r
622 }\r
623\r
624 //\r
625 // If QuestionId is an auto-generated key (label, empty line, etc.), ignore it.\r
626 //\r
627 if ((QuestionId & HII_KEY_FLAG) == 0) {\r
628 return EFI_SUCCESS;\r
629 }\r
630\r
631 HiiKey.Raw = QuestionId;\r
632 HiiKeyId = (UINT8) HiiKey.KeyBits.Id;\r
633\r
634 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
635 switch (HiiKeyId) {\r
636 case HII_KEY_ID_VAR_SUPPORTED_DISKS:\r
637 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SUPPORTED_DISKS\n"));\r
638 return HiiPopulateMainMenuForm ();\r
639\r
640 case HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS:\r
641 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS\n"));\r
642 return HiiPopulateDiskInfoForm();\r
643 }\r
644 } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
645 switch (HiiKeyId) {\r
646 case HII_KEY_ID_GOTO_DISK_INFO:\r
647 return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index);\r
40d32e79
ED
648\r
649 case HII_KEY_ID_REVERT:\r
650 case HII_KEY_ID_PSID_REVERT:\r
651 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
652 if (OpalDisk != NULL) {\r
653 return HiiConfirmRevertAction (OpalDisk);\r
654 } else {\r
655 ASSERT (FALSE);\r
656 return EFI_SUCCESS;\r
657 }\r
658\r
112e584b
SZ
659 }\r
660 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
661 switch (HiiKeyId) {\r
662 case HII_KEY_ID_BLOCKSID:\r
663 switch (Value->u8) {\r
664 case 0:\r
665 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
666 break;\r
667\r
668 case 1:\r
669 PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
670 break;\r
671\r
672 case 2:\r
673 PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
674 break;\r
675\r
676 case 3:\r
677 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
678 break;\r
679\r
680 case 4:\r
681 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
682 break;\r
683\r
684 case 5:\r
685 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
686 break;\r
687\r
688 case 6:\r
689 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
690 break;\r
691\r
692 default:\r
693 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
694 DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
695 break;\r
696 }\r
697 HiiSetBlockSidAction(PpRequest);\r
698\r
699 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
700 return EFI_SUCCESS;\r
701\r
702 case HII_KEY_ID_SET_ADMIN_PWD:\r
703 DEBUG ((DEBUG_INFO, "HII_KEY_ID_SET_ADMIN_PWD\n"));\r
704 gHiiConfiguration.OpalRequest.SetAdminPwd = Value->b;\r
705 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
706 if (OpalDisk != NULL) {\r
707 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
708 }\r
709 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
710 return EFI_SUCCESS;\r
711\r
712 case HII_KEY_ID_SET_USER_PWD:\r
713 DEBUG ((DEBUG_INFO, "HII_KEY_ID_SET_USER_PWD\n"));\r
714 gHiiConfiguration.OpalRequest.SetUserPwd = Value->b;\r
715 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
716 if (OpalDisk != NULL) {\r
717 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
718 }\r
719 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
720 return EFI_SUCCESS;\r
721\r
722 case HII_KEY_ID_SECURE_ERASE:\r
723 DEBUG ((DEBUG_INFO, "HII_KEY_ID_SECURE_ERASE\n"));\r
724 gHiiConfiguration.OpalRequest.SecureErase = Value->b;\r
725 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
726 if (OpalDisk != NULL) {\r
727 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
728 }\r
729 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
730 return EFI_SUCCESS;\r
b3548d32 731\r
112e584b
SZ
732 case HII_KEY_ID_REVERT:\r
733 DEBUG ((DEBUG_INFO, "HII_KEY_ID_REVERT\n"));\r
734 gHiiConfiguration.OpalRequest.Revert = Value->b;\r
735 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
736 if (OpalDisk != NULL) {\r
737 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
738 }\r
739 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
740 return EFI_SUCCESS;\r
741 case HII_KEY_ID_KEEP_USER_DATA:\r
742 DEBUG ((DEBUG_INFO, "HII_KEY_ID_KEEP_USER_DATA\n"));\r
743 gHiiConfiguration.OpalRequest.KeepUserData = Value->b;\r
744 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
745 if (OpalDisk != NULL) {\r
746 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
747 }\r
748 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
749 return EFI_SUCCESS;\r
750\r
751 case HII_KEY_ID_PSID_REVERT:\r
752 DEBUG ((DEBUG_INFO, "HII_KEY_ID_PSID_REVERT\n"));\r
753 gHiiConfiguration.OpalRequest.PsidRevert = Value->b;\r
754 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
755 if (OpalDisk != NULL) {\r
756 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
757 }\r
758 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
759 return EFI_SUCCESS;\r
760\r
761 case HII_KEY_ID_DISABLE_USER:\r
762 DEBUG ((DEBUG_INFO, "HII_KEY_ID_DISABLE_USER\n"));\r
763 gHiiConfiguration.OpalRequest.DisableUser = Value->b;\r
764 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
765 if (OpalDisk != NULL) {\r
766 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
767 }\r
768 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
769 return EFI_SUCCESS;\r
770\r
771 case HII_KEY_ID_ENABLE_FEATURE:\r
772 DEBUG ((DEBUG_INFO, "HII_KEY_ID_ENABLE_FEATURE\n"));\r
773 gHiiConfiguration.OpalRequest.EnableFeature = Value->b;\r
774 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
775 if (OpalDisk != NULL) {\r
776 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
777 }\r
778 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
779 return EFI_SUCCESS;\r
780\r
781 default:\r
782 break;\r
783 }\r
784 }\r
785\r
786 return EFI_UNSUPPORTED;\r
787}\r
788\r
789/**\r
790 Update the global Disk index info.\r
791\r
792 @param Index The input disk index info.\r
793\r
794 @retval EFI_SUCCESS Update the disk index info success.\r
795\r
796**/\r
797EFI_STATUS\r
798HiiSelectDisk(\r
799 UINT8 Index\r
800 )\r
801{\r
802 OpalHiiGetBrowserData();\r
803 gHiiConfiguration.SelectedDiskIndex = Index;\r
804 OpalHiiSetBrowserData ();\r
805\r
806 return EFI_SUCCESS;\r
807}\r
808\r
809/**\r
810 Draws the disk info form.\r
811\r
812 @retval EFI_SUCCESS Draw the disk info success.\r
813\r
814**/\r
815EFI_STATUS\r
816HiiPopulateDiskInfoForm(\r
817 VOID\r
818 )\r
819{\r
820 OPAL_DISK* OpalDisk;\r
821 OPAL_DISK_ACTIONS AvailActions;\r
822 TCG_RESULT Ret;\r
823 CHAR8 *DiskName;\r
824\r
825 OpalHiiGetBrowserData();\r
826\r
827 DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex);\r
828 if (DiskName == NULL) {\r
829 return EFI_UNSUPPORTED;\r
830 }\r
831 HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName);\r
832\r
833 gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE;\r
834 ZeroMem (&gHiiConfiguration.OpalRequest, sizeof (OPAL_REQUEST));\r
835 gHiiConfiguration.KeepUserDataForced = FALSE;\r
836\r
837 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
838\r
839 if (OpalDisk != NULL) {\r
840 OpalDiskUpdateStatus (OpalDisk);\r
841 Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions);\r
842 if (Ret == TcgResultSuccess) {\r
843 //\r
844 // Update actions, always allow PSID Revert\r
845 //\r
846 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE;\r
847\r
848 //\r
849 // Always allow unlock to handle device migration\r
850 //\r
851 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE;\r
852\r
853 if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
854 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
855 gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE;\r
856\r
857 //\r
858 // Update strings\r
859 //\r
860 HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default");\r
861 } else {\r
862 DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n"));\r
863 }\r
864 } else {\r
865 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE;\r
866 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE;\r
867 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
868 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
869 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
870\r
871 HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
872\r
873 //\r
874 // Determine revert options for disk\r
875 // Default initialize keep user Data to be true\r
876 //\r
877 gHiiConfiguration.OpalRequest.KeepUserData = 1;\r
878 if (AvailActions.RevertKeepDataForced) {\r
879 gHiiConfiguration.KeepUserDataForced = TRUE;\r
880 }\r
881 }\r
882 }\r
883\r
884 GetSavedOpalRequest (OpalDisk, &gHiiConfiguration.OpalRequest);\r
885 }\r
886\r
887 //\r
888 // Pass the current configuration to the BIOS\r
889 //\r
890 OpalHiiSetBrowserData ();\r
891\r
892 return EFI_SUCCESS;\r
893}\r
894\r
895/**\r
896 Send BlockSid request through TPM physical presence module.\r
897\r
898 @param PpRequest TPM physical presence operation request.\r
899\r
900 @retval EFI_SUCCESS Do the required action success.\r
901 @retval Others Other error occur.\r
902\r
903**/\r
904EFI_STATUS\r
905HiiSetBlockSidAction (\r
906 IN UINT32 PpRequest\r
907 )\r
908{\r
909 UINT32 ReturnCode;\r
910 EFI_STATUS Status;\r
911\r
912 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
913 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
914 Status = EFI_SUCCESS;\r
915 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
916 Status = EFI_OUT_OF_RESOURCES;\r
917 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
918 Status = EFI_UNSUPPORTED;\r
919 } else {\r
920 Status = EFI_DEVICE_ERROR;\r
921 }\r
922\r
923 return Status;\r
924}\r
925\r
926/**\r
927 This function processes the results of changes in configuration.\r
928\r
929 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
930 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
931 format.\r
932 @param Progress A pointer to a string filled in with the offset of\r
933 the most recent '&' before the first failing\r
934 name/value pair (or the beginning of the string if\r
935 the failure is in the first name/value pair) or\r
936 the terminating NULL if all was successful.\r
937\r
938 @retval EFI_SUCCESS The Results is processed successfully.\r
939 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
940 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
941 driver.\r
942\r
943**/\r
944EFI_STATUS\r
945EFIAPI\r
946RouteConfig(\r
947 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
948 CONST EFI_STRING Configuration,\r
949 EFI_STRING *Progress\r
950 )\r
951{\r
952 if (Configuration == NULL || Progress == NULL) {\r
953 return (EFI_INVALID_PARAMETER);\r
954 }\r
955\r
956 *Progress = Configuration;\r
957 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
958 return EFI_NOT_FOUND;\r
959 }\r
960\r
961 *Progress = Configuration + StrLen (Configuration);\r
962\r
963 return EFI_SUCCESS;\r
964}\r
965\r
966/**\r
967 This function allows a caller to extract the current configuration for one\r
968 or more named elements from the target driver.\r
969\r
970 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
971 @param Request A null-terminated Unicode string in\r
972 <ConfigRequest> format.\r
973 @param Progress On return, points to a character in the Request\r
974 string. Points to the string's null terminator if\r
975 request was successful. Points to the most recent\r
976 '&' before the first failing name/value pair (or\r
977 the beginning of the string if the failure is in\r
978 the first name/value pair) if the request was not\r
979 successful.\r
980 @param Results A null-terminated Unicode string in\r
981 <ConfigAltResp> format which has all values filled\r
982 in for the names in the Request string. String to\r
983 be allocated by the called function.\r
984\r
985 @retval EFI_SUCCESS The Results is filled with the requested values.\r
986 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
987 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
988 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
989 driver.\r
990\r
991**/\r
992EFI_STATUS\r
993EFIAPI\r
994ExtractConfig(\r
995 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
996 CONST EFI_STRING Request,\r
997 EFI_STRING *Progress,\r
998 EFI_STRING *Results\r
999 )\r
1000{\r
1001 EFI_STATUS Status;\r
1002 EFI_STRING ConfigRequest;\r
1003 EFI_STRING ConfigRequestHdr;\r
1004 UINTN BufferSize;\r
1005 UINTN Size;\r
1006 BOOLEAN AllocatedRequest;\r
1007 EFI_HANDLE DriverHandle;\r
1008\r
1009 //\r
1010 // Check for valid parameters\r
1011 //\r
1012 if (Progress == NULL || Results == NULL) {\r
1013 return (EFI_INVALID_PARAMETER);\r
1014 }\r
1015\r
1016 *Progress = Request;\r
1017 if ((Request != NULL) &&\r
1018 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1019 return EFI_NOT_FOUND;\r
1020 }\r
1021\r
1022 AllocatedRequest = FALSE;\r
1023 BufferSize = sizeof (OPAL_HII_CONFIGURATION);\r
1024 ConfigRequest = Request;\r
1025 if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
1026 //\r
1027 // Request has no request element, construct full request string.\r
1028 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
1029 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
1030 //\r
1031 DriverHandle = HiiGetDriverImageHandleCB();\r
1032 ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);\r
1033 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
1034 ConfigRequest = AllocateZeroPool (Size);\r
1035 if (ConfigRequest == NULL) {\r
1036 return EFI_OUT_OF_RESOURCES;\r
1037 }\r
1038 AllocatedRequest = TRUE;\r
1039 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
1040 FreePool (ConfigRequestHdr);\r
1041 }\r
1042\r
1043 //\r
1044 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
1045 //\r
1046 Status = gHiiConfigRouting->BlockToConfig(\r
1047 gHiiConfigRouting,\r
1048 ConfigRequest,\r
1049 (UINT8*)&gHiiConfiguration,\r
1050 sizeof(OPAL_HII_CONFIGURATION),\r
1051 Results,\r
1052 Progress\r
1053 );\r
1054\r
1055 //\r
1056 // Free the allocated config request string.\r
1057 //\r
1058 if (AllocatedRequest) {\r
1059 FreePool (ConfigRequest);\r
1060 ConfigRequest = NULL;\r
1061 }\r
1062\r
1063 //\r
1064 // Set Progress string to the original request string.\r
1065 //\r
1066 if (Request == NULL) {\r
1067 *Progress = NULL;\r
1068 } else if (StrStr (Request, L"OFFSET") == NULL) {\r
1069 *Progress = Request + StrLen (Request);\r
1070 }\r
1071\r
1072 return (Status);\r
1073}\r
1074\r
1075\r
1076/**\r
1077\r
1078 Pass the current system state to the bios via the hii_G_Configuration.\r
1079\r
1080**/\r
1081VOID\r
1082OpalHiiSetBrowserData (\r
1083 VOID\r
1084 )\r
1085{\r
1086 HiiSetBrowserData(\r
1087 &gHiiSetupVariableGuid,\r
1088 (CHAR16*)L"OpalHiiConfig",\r
1089 sizeof(gHiiConfiguration),\r
1090 (UINT8*)&gHiiConfiguration,\r
1091 NULL\r
1092 );\r
1093}\r
1094\r
1095\r
1096/**\r
1097\r
1098 Populate the hii_g_Configuraton with the browser Data.\r
1099\r
1100**/\r
1101VOID\r
1102OpalHiiGetBrowserData (\r
1103 VOID\r
1104 )\r
1105{\r
1106 HiiGetBrowserData(\r
1107 &gHiiSetupVariableGuid,\r
1108 (CHAR16*)L"OpalHiiConfig",\r
1109 sizeof(gHiiConfiguration),\r
1110 (UINT8*)&gHiiConfiguration\r
1111 );\r
1112}\r
1113\r
1114/**\r
1115 Set a string Value in a form.\r
1116\r
1117 @param DestStringId The stringid which need to update.\r
1118 @param SrcAsciiStr The string nned to update.\r
1119\r
1120 @retval EFI_SUCCESS Do the required action success.\r
1121 @retval Others Other error occur.\r
1122\r
1123**/\r
1124EFI_STATUS\r
1125HiiSetFormString(\r
1126 EFI_STRING_ID DestStringId,\r
1127 CHAR8 *SrcAsciiStr\r
1128 )\r
1129{\r
1130 UINT32 Len;\r
1131 UINT32 UniSize;\r
1132 CHAR16* UniStr;\r
1133\r
1134 //\r
1135 // Determine the Length of the sting\r
1136 //\r
1137 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1138\r
1139 //\r
1140 // Allocate space for the unicode string, including terminator\r
1141 //\r
1142 UniSize = (Len + 1) * sizeof(CHAR16);\r
1143 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1144\r
1145 //\r
1146 // Copy into unicode string, then copy into string id\r
1147 //\r
1148 AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
1149\r
1150 //\r
1151 // Update the string in the form\r
1152 //\r
1153 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1154 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1155 FreePool(UniStr);\r
1156 return (EFI_OUT_OF_RESOURCES);\r
1157 }\r
1158\r
1159 //\r
1160 // Free the memory\r
1161 //\r
1162 FreePool(UniStr);\r
1163\r
1164 return (EFI_SUCCESS);\r
1165}\r
1166\r
1167/**\r
1168 Initialize the Opal disk base on the hardware info get from device.\r
1169\r
1170 @param Dev The Opal device.\r
1171\r
1172 @retval EFI_SUCESS Initialize the device success.\r
1173 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1174\r
1175**/\r
1176EFI_STATUS\r
1177OpalDiskInitialize (\r
1178 IN OPAL_DRIVER_DEVICE *Dev\r
1179 )\r
1180{\r
1181 TCG_RESULT TcgResult;\r
1182 OPAL_SESSION Session;\r
40d32e79
ED
1183 UINT8 ActiveDataRemovalMechanism;\r
1184 UINT32 RemovalMechanishLists[ResearvedMechanism];\r
112e584b
SZ
1185\r
1186 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1187 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1188 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1189 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1190\r
1191 ZeroMem(&Session, sizeof(Session));\r
1192 Session.Sscp = Dev->Sscp;\r
1193 Session.MediaId = Dev->MediaId;\r
1194\r
1195 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1196 if (TcgResult != TcgResultSuccess) {\r
1197 return EFI_DEVICE_ERROR;\r
1198 }\r
1199 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1200\r
1201 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1202 if (TcgResult != TcgResultSuccess) {\r
1203 return EFI_DEVICE_ERROR;\r
1204 }\r
1205\r
40d32e79
ED
1206 if (Dev->OpalDisk.SupportedAttributes.DataRemoval) {\r
1207 TcgResult = OpalUtilGetDataRemovalMechanismLists (&Session, RemovalMechanishLists);\r
1208 if (TcgResult != TcgResultSuccess) {\r
1209 return EFI_DEVICE_ERROR;\r
1210 }\r
1211\r
1212 TcgResult = OpalUtilGetActiveDataRemovalMechanism (&Session, Dev->OpalDisk.Msid, Dev->OpalDisk.MsidLength, &ActiveDataRemovalMechanism);\r
1213 if (TcgResult != TcgResultSuccess) {\r
1214 return EFI_DEVICE_ERROR;\r
1215 }\r
1216\r
1217 Dev->OpalDisk.EstimateTimeCost = RemovalMechanishLists[ActiveDataRemovalMechanism];\r
1218 }\r
1219\r
112e584b
SZ
1220 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1221}\r
1222\r
1223/**\r
1224 Update the device info.\r
1225\r
1226 @param OpalDisk The Opal device.\r
1227\r
1228 @retval EFI_SUCESS Initialize the device success.\r
1229 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1230 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1231\r
1232**/\r
1233EFI_STATUS\r
1234OpalDiskUpdateStatus (\r
1235 OPAL_DISK *OpalDisk\r
1236 )\r
1237{\r
1238 TCG_RESULT TcgResult;\r
1239 OPAL_SESSION Session;\r
1240\r
1241 ZeroMem(&Session, sizeof(Session));\r
1242 Session.Sscp = OpalDisk->Sscp;\r
1243 Session.MediaId = OpalDisk->MediaId;\r
1244 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1245\r
1246 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1247 if (TcgResult != TcgResultSuccess) {\r
1248 return EFI_DEVICE_ERROR;\r
1249 }\r
1250\r
1251 if (OpalDisk->MsidLength == 0) {\r
1252 return EFI_INVALID_PARAMETER;\r
1253 } else {\r
1254 //\r
1255 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1256 //\r
1257 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1258 }\r
1259\r
1260 return EFI_SUCCESS;\r
1261}\r
1262\r