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