]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
SecurityPkg: Replace UnicodeStrToAsciiStr/AsciiStrToUnicodeStr
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordDxe / OpalHii.c
CommitLineData
a06875e1
ED
1/** @file\r
2 Implementation of the HII for the Opal UEFI Driver.\r
3\r
4Copyright (c) 2016, 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
16#include "OpalDriver.h"\r
17#include "OpalHiiPrivate.h"\r
18\r
19//\r
20// This is the generated IFR binary Data for each formset defined in VFR.\r
21// This Data array is ready to be used as input of HiiAddPackages() to\r
22// create a packagelist (which contains Form packages, String packages, etc).\r
23//\r
24extern UINT8 OpalPasswordFormBin[];\r
25\r
26//\r
27// This is the generated String package Data for all .UNI files.\r
28// This Data array is ready to be used as input of HiiAddPackages() to\r
29// create a packagelist (which contains Form packages, String packages, etc).\r
30//\r
31extern UINT8 OpalPasswordDxeStrings[];\r
32\r
eafbd7a2
DB
33CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig";\r
34\r
a06875e1
ED
35EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
36\r
37//\r
38// Handle to the list of HII packages (forms and strings) for this driver\r
39//\r
40EFI_HII_HANDLE gHiiPackageListHandle = NULL;\r
41\r
42//\r
43// Package List GUID containing all form and string packages\r
44//\r
45const EFI_GUID gHiiPackageListGuid = PACKAGE_LIST_GUID;\r
46const EFI_GUID gHiiSetupVariableGuid = SETUP_VARIABLE_GUID;\r
47\r
48//\r
49// Structure that contains state of the HII\r
50// This structure is updated by Hii.cpp and its contents\r
51// is rendered in the HII.\r
52//\r
53OPAL_HII_CONFIGURATION gHiiConfiguration;\r
54\r
55CHAR8 gHiiOldPassword[MAX_PASSWORD_CHARACTER_LENGTH] = {0};\r
56UINT32 gHiiOldPasswordLength = 0;\r
57\r
58//\r
59// The device path containing the VENDOR_DEVICE_PATH and EFI_DEVICE_PATH_PROTOCOL\r
60//\r
61HII_VENDOR_DEVICE_PATH gHiiVendorDevicePath = {\r
62 {\r
63 {\r
64 HARDWARE_DEVICE_PATH,\r
65 HW_VENDOR_DP,\r
66 {\r
67 (UINT8)(sizeof(VENDOR_DEVICE_PATH)),\r
68 (UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8)\r
69 }\r
70 },\r
71 OPAL_PASSWORD_CONFIG_GUID\r
72 },\r
73 {\r
74 END_DEVICE_PATH_TYPE,\r
75 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
76 {\r
77 (UINT8)(END_DEVICE_PATH_LENGTH),\r
78 (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
79 }\r
80 }\r
81};\r
82\r
83\r
84/**\r
85 Sets the current system state of global config variables.\r
86\r
87**/\r
88VOID\r
89HiiSetCurrentConfiguration(\r
90 VOID\r
91 )\r
92{\r
93 EFI_STATUS Status;\r
94 OPAL_EXTRA_INFO_VAR OpalExtraInfo;\r
95 UINTN DataSize;\r
96\r
97 gHiiConfiguration.NumDisks = GetDeviceCount();\r
98\r
99 DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
100 Status = gRT->GetVariable (\r
101 OPAL_EXTRA_INFO_VAR_NAME,\r
102 &gOpalExtraInfoVariableGuid,\r
103 NULL,\r
104 &DataSize,\r
105 &OpalExtraInfo\r
106 );\r
a06875e1
ED
107 if (!EFI_ERROR (Status)) {\r
108 gHiiConfiguration.EnableBlockSid = OpalExtraInfo.EnableBlockSid;\r
109 }\r
110}\r
111\r
a06875e1
ED
112/**\r
113 Install the HII related resources.\r
114\r
115 @retval EFI_SUCCESS Install all the resources success.\r
116 @retval other Error occur when install the resources.\r
117**/\r
118EFI_STATUS\r
119HiiInstall(\r
120 VOID\r
121 )\r
122{\r
123 EFI_STATUS Status;\r
124 EFI_HANDLE DriverHandle;\r
125\r
a06875e1
ED
126 //\r
127 // Clear the global configuration.\r
128 //\r
129 ZeroMem(&gHiiConfiguration, sizeof(gHiiConfiguration));\r
130\r
131 //\r
132 // Obtain the driver handle that the BIOS assigned us\r
133 //\r
134 DriverHandle = HiiGetDriverImageHandleCB();\r
135\r
136 //\r
137 // Populate the config access protocol with the three functions we are publishing\r
138 //\r
139 gHiiConfigAccessProtocol.ExtractConfig = ExtractConfig;\r
140 gHiiConfigAccessProtocol.RouteConfig = RouteConfig;\r
141 gHiiConfigAccessProtocol.Callback = DriverCallback;\r
142\r
143 //\r
144 // Associate the required protocols with our driver handle\r
145 //\r
146 Status = gBS->InstallMultipleProtocolInterfaces(\r
147 &DriverHandle,\r
148 &gEfiHiiConfigAccessProtocolGuid,\r
149 &gHiiConfigAccessProtocol, // HII callback\r
150 &gEfiDevicePathProtocolGuid,\r
151 &gHiiVendorDevicePath, // required for HII callback allow all disks to be shown in same hii\r
152 NULL\r
153 );\r
154\r
155 if (EFI_ERROR(Status)) {\r
156 return Status;\r
157 }\r
158\r
159 return OpalHiiAddPackages();\r
160}\r
161\r
162/**\r
163 Install the HII form and string packages.\r
164\r
165 @retval EFI_SUCCESS Install all the resources success.\r
166 @retval EFI_OUT_OF_RESOURCES Out of resource error.\r
167**/\r
168EFI_STATUS\r
169OpalHiiAddPackages(\r
170 VOID\r
171 )\r
172{\r
173 EFI_HANDLE DriverHandle;\r
174 CHAR16 *NewString;\r
175\r
176 DriverHandle = HiiGetDriverImageHandleCB();\r
177\r
178 //\r
179 // Publish the HII form and HII string packages\r
180 //\r
181 gHiiPackageListHandle = HiiAddPackages(\r
182 &gHiiPackageListGuid,\r
183 DriverHandle,\r
184 OpalPasswordDxeStrings,\r
185 OpalPasswordFormBin,\r
186 (VOID*)NULL\r
187 );\r
188\r
189 //\r
190 // Make sure the packages installed successfully\r
191 //\r
192 if (gHiiPackageListHandle == NULL) {\r
193 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages failed\n"));\r
194 return EFI_OUT_OF_RESOURCES;\r
195 }\r
196\r
197 //\r
198 // Update Version String in main window\r
199 //\r
200 NewString = HiiGetDriverNameCB ();\r
201 if (HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_MAIN_OPAL_VERSION), NewString, NULL) == 0) {\r
202 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages: HiiSetString( ) failed\n"));\r
203 return EFI_OUT_OF_RESOURCES;\r
204 }\r
205\r
206 return EFI_SUCCESS;\r
207}\r
208\r
209/**\r
210 Uninstall the HII capability.\r
211\r
212 @retval EFI_SUCCESS Uninstall all the resources success.\r
213 @retval others Other errors occur when unistall the hii resource.\r
214**/\r
215EFI_STATUS\r
216HiiUninstall(\r
217 VOID\r
218 )\r
219{\r
220 EFI_STATUS Status;\r
221\r
222 //\r
223 // Remove the packages we've provided to the BIOS\r
224 //\r
225 HiiRemovePackages(gHiiPackageListHandle);\r
226\r
227 //\r
228 // Remove the protocols from our driver handle\r
229 //\r
230 Status = gBS->UninstallMultipleProtocolInterfaces(\r
231 HiiGetDriverImageHandleCB(),\r
232 &gEfiHiiConfigAccessProtocolGuid,\r
233 &gHiiConfigAccessProtocol, // HII callback\r
234 &gEfiDevicePathProtocolGuid,\r
235 &gHiiVendorDevicePath, // required for HII callback\r
236 NULL\r
237 );\r
238 if (EFI_ERROR(Status)) {\r
239 DEBUG ((DEBUG_INFO, "Cannot uninstall Hii Protocols: %r\n", Status));\r
240 }\r
241\r
242 return Status;\r
243}\r
244\r
245/**\r
246 Updates the main menu form.\r
247\r
248 @retval EFI_SUCCESS update the main form success.\r
249**/\r
250EFI_STATUS\r
251HiiPopulateMainMenuForm (\r
252 VOID\r
253 )\r
254{\r
255 UINT8 Index;\r
256 CHAR8 *DiskName;\r
257 EFI_STRING_ID DiskNameId;\r
258 OPAL_DISK *OpalDisk;\r
259\r
260 HiiSetCurrentConfiguration();\r
261\r
262 gHiiConfiguration.SupportedDisks = 0;\r
263\r
264 for (Index = 0; Index < gHiiConfiguration.NumDisks; Index++) {\r
265 OpalDisk = HiiGetOpalDiskCB (Index);\r
266 if ((OpalDisk != NULL) && OpalFeatureSupported (&OpalDisk->SupportedAttributes)) {\r
267 gHiiConfiguration.SupportedDisks |= (1 << Index);\r
268 DiskNameId = GetDiskNameStringId (Index);\r
269 DiskName = HiiDiskGetNameCB (Index);\r
270 if ((DiskName == NULL) || (DiskNameId == 0)) {\r
271 return EFI_UNSUPPORTED;\r
272 }\r
273 HiiSetFormString(DiskNameId, DiskName);\r
274 }\r
275 }\r
276\r
277 OpalHiiSetBrowserData ();\r
278 return EFI_SUCCESS;\r
279}\r
280\r
281/**\r
282 Update the disk action info.\r
283\r
284 @param ActionString\r
285 @param SelectedAction\r
286\r
287 @retval EFI_SUCCESS Uninstall all the resources success.\r
288**/\r
289EFI_STATUS\r
290HiiSelectDiskAction (\r
291 CHAR8 *ActionString,\r
292 UINT8 SelectedAction\r
293 )\r
294{\r
295 OPAL_DISK *OpalDisk;\r
296 OPAL_DISK_ACTIONS AvailActions;\r
297\r
298 OpalHiiGetBrowserData ();\r
299\r
300 HiiSetFormString(STRING_TOKEN(STR_DISK_ACTION_LBL), ActionString);\r
301 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), " ");\r
302\r
303 gHiiConfiguration.SelectedAction = SelectedAction;\r
304 gHiiConfiguration.AvailableFields = 0;\r
305\r
306 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
307 if (OpalDisk == NULL) {\r
308 return EFI_INVALID_PARAMETER;\r
309 }\r
310\r
311 if (OpalSupportGetAvailableActions (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions) != TcgResultSuccess) {\r
312 return EFI_DEVICE_ERROR;\r
313 }\r
314\r
315 switch (SelectedAction) {\r
316 case HII_KEY_ID_GOTO_LOCK:\r
317 case HII_KEY_ID_GOTO_UNLOCK:\r
318 case HII_KEY_ID_GOTO_SET_ADMIN_PWD:\r
319 case HII_KEY_ID_GOTO_SET_USER_PWD:\r
320 case HII_KEY_ID_GOTO_SECURE_ERASE:\r
321 case HII_KEY_ID_GOTO_DISABLE_USER:\r
322 case HII_KEY_ID_GOTO_ENABLE_FEATURE: // User is required to enter Password to enable Feature\r
323 gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD;\r
324 break;\r
325\r
326 case HII_KEY_ID_GOTO_PSID_REVERT:\r
327 gHiiConfiguration.AvailableFields |= HII_FIELD_PSID;\r
328 break;\r
329\r
330 case HII_KEY_ID_GOTO_REVERT:\r
331 gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD;\r
0efc3be0 332 gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA;\r
a06875e1
ED
333 if (AvailActions.RevertKeepDataForced) {\r
334 gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA_FORCED;\r
335 }\r
336 break;\r
337 }\r
338\r
339 OpalHiiSetBrowserData ();\r
340\r
341 return EFI_SUCCESS;\r
342}\r
343\r
344/**\r
345 Get disk name string id.\r
346\r
347 @param DiskIndex The input disk index info.\r
348\r
349 @retval The disk name string id.\r
350\r
351**/\r
352EFI_STRING_ID\r
353GetDiskNameStringId(\r
354 UINT8 DiskIndex\r
355 )\r
356{\r
357 switch (DiskIndex) {\r
358 case 0: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0);\r
359 case 1: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1);\r
360 case 2: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2);\r
361 case 3: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3);\r
362 case 4: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4);\r
363 case 5: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5);\r
364 }\r
365 return 0;\r
366}\r
367\r
368/**\r
369 This function processes the results of changes in configuration.\r
370\r
371 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
372 @param Action Specifies the type of action taken by the browser.\r
373 @param QuestionId A unique value which is sent to the original\r
374 exporting driver so that it can identify the type\r
375 of data to expect.\r
376 @param Type The type of value for the question.\r
377 @param Value A pointer to the data being sent to the original\r
378 exporting driver.\r
379 @param ActionRequest On return, points to the action requested by the\r
380 callback function.\r
381\r
382 @retval EFI_SUCCESS The callback successfully handled the action.\r
383 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
384 variable and its data.\r
385 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
386 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
387 callback.\r
388\r
389**/\r
390EFI_STATUS\r
391EFIAPI\r
392DriverCallback(\r
b4ddf0eb 393 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
a06875e1
ED
394 EFI_BROWSER_ACTION Action,\r
395 EFI_QUESTION_ID QuestionId,\r
396 UINT8 Type,\r
b4ddf0eb
ED
397 EFI_IFR_TYPE_VALUE *Value,\r
398 EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
a06875e1
ED
399 )\r
400{\r
401 HII_KEY HiiKey;\r
402 UINT8 HiiKeyId;\r
403\r
404 if (ActionRequest != NULL) {\r
405 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
b4ddf0eb
ED
406 } else {\r
407 return EFI_INVALID_PARAMETER;\r
a06875e1
ED
408 }\r
409\r
410 //\r
411 // If QuestionId is an auto-generated key (label, empty line, etc.), ignore it.\r
412 //\r
413 if ((QuestionId & HII_KEY_FLAG) == 0) {\r
414 return EFI_SUCCESS;\r
415 }\r
416\r
417 HiiKey.Raw = QuestionId;\r
418 HiiKeyId = (UINT8) HiiKey.KeyBits.Id;\r
419\r
420 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
421 switch (HiiKeyId) {\r
422 case HII_KEY_ID_VAR_SUPPORTED_DISKS:\r
423 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SUPPORTED_DISKS\n"));\r
424 return HiiPopulateMainMenuForm ();\r
425\r
426 case HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS:\r
427 return HiiPopulateDiskInfoForm();\r
428 }\r
429 } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
430 switch (HiiKeyId) {\r
431 case HII_KEY_ID_GOTO_DISK_INFO:\r
432 return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index);\r
433\r
434 case HII_KEY_ID_GOTO_LOCK:\r
435 return HiiSelectDiskAction("Action: Lock", HiiKeyId);\r
436\r
437 case HII_KEY_ID_GOTO_UNLOCK:\r
438 return HiiSelectDiskAction("Action: Unlock", HiiKeyId);\r
439\r
440 case HII_KEY_ID_GOTO_SET_ADMIN_PWD:\r
441 return HiiSelectDiskAction("Action: Set Administrator Password", HiiKeyId);\r
442\r
443 case HII_KEY_ID_GOTO_SET_USER_PWD:\r
444 return HiiSelectDiskAction("Action: Set User Password", HiiKeyId);\r
445\r
446 case HII_KEY_ID_GOTO_SECURE_ERASE:\r
447 return HiiSelectDiskAction("Action: Secure Erase", HiiKeyId);\r
448\r
449 case HII_KEY_ID_GOTO_PSID_REVERT:\r
450 return HiiSelectDiskAction("Action: Revert to Factory Defaults with PSID", HiiKeyId);\r
451\r
452 case HII_KEY_ID_GOTO_REVERT:\r
453 return HiiSelectDiskAction("Action: Revert to Factory Defaults", HiiKeyId);\r
454\r
455 case HII_KEY_ID_GOTO_DISABLE_USER:\r
456 return HiiSelectDiskAction("Action: Disable User", HiiKeyId);\r
457\r
458 case HII_KEY_ID_GOTO_ENABLE_FEATURE:\r
459 return HiiSelectDiskAction("Action: Enable Feature", HiiKeyId);\r
460\r
461 case HII_KEY_ID_ENTER_PASSWORD:\r
462 return HiiPasswordEntered(Value->string);\r
a06875e1
ED
463 }\r
464 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
465 switch (HiiKeyId) {\r
466 case HII_KEY_ID_ENTER_PSID:\r
467 HiiPsidRevert();\r
468 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
469 return EFI_SUCCESS;\r
8d3d8450
ED
470\r
471 case HII_KEY_ID_BLOCKSID:\r
472 HiiSetBlockSid(Value->b);\r
473 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
474 return EFI_SUCCESS;\r
a06875e1
ED
475 }\r
476 }\r
477\r
478 return EFI_UNSUPPORTED;\r
479}\r
480\r
481/**\r
482 Update the global Disk index info.\r
483\r
484 @param Index The input disk index info.\r
485\r
486 @retval EFI_SUCCESS Update the disk index info success.\r
487\r
488**/\r
489EFI_STATUS\r
490HiiSelectDisk(\r
491 UINT8 Index\r
492 )\r
493{\r
494 OpalHiiGetBrowserData();\r
495 gHiiConfiguration.SelectedDiskIndex = Index;\r
496 OpalHiiSetBrowserData ();\r
497\r
498 return EFI_SUCCESS;\r
499}\r
500\r
501/**\r
502 Draws the disk info form.\r
503\r
504 @retval EFI_SUCCESS Draw the disk info success.\r
505\r
506**/\r
507EFI_STATUS\r
508HiiPopulateDiskInfoForm(\r
509 VOID\r
510 )\r
511{\r
512 OPAL_DISK* OpalDisk;\r
513 OPAL_DISK_ACTIONS AvailActions;\r
514 TCG_RESULT Ret;\r
515 CHAR8 *DiskName;\r
516\r
517 OpalHiiGetBrowserData();\r
518\r
519 DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex);\r
520 if (DiskName == NULL) {\r
521 return EFI_UNSUPPORTED;\r
522 }\r
523 HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName);\r
524\r
525 ZeroMem(gHiiConfiguration.Psid, sizeof(gHiiConfiguration.Psid));\r
526\r
527 gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE;\r
528\r
529 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
530\r
531 if (OpalDisk != NULL) {\r
532 OpalDiskUpdateStatus (OpalDisk);\r
533 Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions);\r
534 if (Ret == TcgResultSuccess) {\r
535 //\r
536 // Update actions, always allow PSID Revert\r
537 //\r
538 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE;\r
539\r
540 //\r
541 // Always allow unlock to handle device migration\r
542 //\r
543 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE;\r
544\r
545 if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
546 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
547 gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE;\r
548\r
549 //\r
550 // Update strings\r
551 //\r
552 HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default");\r
553 } else {\r
554 DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n"));\r
555 }\r
556 } else {\r
557 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE;\r
558 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE;\r
559 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
560 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
561 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
a06875e1
ED
562\r
563 HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
564\r
565 //\r
566 // Determine revert options for disk\r
567 // Default initialize keep user Data to be true\r
568 //\r
569 gHiiConfiguration.KeepUserData = 1;\r
570 }\r
571 }\r
572 }\r
573\r
574 //\r
575 // Pass the current configuration to the BIOS\r
576 //\r
577 OpalHiiSetBrowserData ();\r
578\r
579 return EFI_SUCCESS;\r
580}\r
581\r
582/**\r
583 Reverts the Opal disk to factory default.\r
584\r
585 @retval EFI_SUCCESS Do the required action success.\r
586\r
587**/\r
588EFI_STATUS\r
589HiiPsidRevert(\r
590 VOID\r
591 )\r
592{\r
593 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
594 TCG_PSID Psid;\r
595 OPAL_DISK *OpalDisk;\r
596 TCG_RESULT Ret;\r
597 OPAL_SESSION Session;\r
598\r
599 Ret = TcgResultFailure;\r
600\r
601 OpalHiiGetBrowserData();\r
602\r
b7c71793 603 UnicodeStrToAsciiStrS (gHiiConfiguration.Psid, (CHAR8*)Psid.Psid, PSID_CHARACTER_LENGTH);\r
a06875e1 604\r
b4ddf0eb 605 OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
a06875e1 606 if (OpalDisk != NULL) {\r
b4ddf0eb
ED
607 ZeroMem(&Session, sizeof(Session));\r
608 Session.Sscp = OpalDisk->Sscp;\r
609 Session.MediaId = OpalDisk->MediaId;\r
610 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
611\r
a06875e1
ED
612 Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
613 }\r
614\r
615 if (Ret == TcgResultSuccess) {\r
616 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
617 } else {\r
618 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Failure" );\r
619 }\r
620\r
621 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
622\r
623 return EFI_SUCCESS;\r
624}\r
625\r
626/**\r
627 Set password for the disk.\r
628\r
629 @param OpalDisk The disk need to set the password.\r
630 @param Password The input password.\r
631 @param PassLength The input password length.\r
632\r
633 @retval EFI_SUCCESS Do the required action success.\r
634\r
635**/\r
636EFI_STATUS\r
637HiiSetPassword(\r
638 OPAL_DISK *OpalDisk,\r
639 VOID *Password,\r
640 UINT32 PassLength\r
641 )\r
642{\r
643 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
644 TCG_RESULT Ret;\r
645 BOOLEAN ExistingPassword;\r
646 OPAL_SESSION Session;\r
647\r
648 ExistingPassword = FALSE;\r
649\r
650 //\r
651 // PassLength = 0 means check whether exist old password.\r
652 //\r
653 if (PassLength == 0) {\r
654 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
655 gHiiOldPasswordLength = 0;\r
656\r
657 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_ENABLE_FEATURE) {\r
658 ExistingPassword = FALSE;\r
659 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_ADMIN_PWD) {\r
660 ExistingPassword = OpalUtilAdminPasswordExists(OpalDisk->Owner, &OpalDisk->LockingFeature);\r
661 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
662 //\r
663 // Set user Password option shall only be shown if an Admin Password exists\r
664 // so a Password is always required (Admin or Existing User Password)\r
665 //\r
666 ExistingPassword = TRUE;\r
667 }\r
668\r
669 //\r
670 // Return error if there is a previous Password\r
671 // see UEFI 2.4 errata B, Figure 121. Password Flowchart\r
672 //\r
673 return ExistingPassword ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
674 }\r
675\r
676 ZeroMem(&Session, sizeof(Session));\r
677 Session.Sscp = OpalDisk->Sscp;\r
678 Session.MediaId = OpalDisk->MediaId;\r
679 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
680\r
681 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Failure");\r
682 //\r
683 // Password entered.\r
684 // No current Owner, so set new Password, must be admin Password\r
685 //\r
686 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
687 Ret = OpalSupportEnableOpalFeature (&Session, OpalDisk->Msid, OpalDisk->MsidLength,Password, PassLength, OpalDisk->OpalDevicePath);\r
688 if (Ret == TcgResultSuccess) {\r
689 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
690 }\r
691\r
692 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
693 return EFI_SUCCESS;\r
694 }\r
695\r
696 //\r
697 // 1st Password entered\r
698 //\r
699 if (OpalDisk->Owner == OpalOwnershipUnknown && gHiiOldPasswordLength == 0) {\r
700\r
701 //\r
702 // Unknown ownership - prompt for old Password, then new\r
703 // old Password is not set yet - first time through\r
704 // assume authority provided is admin1, overwritten if user1 authority works below\r
705 //\r
706 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
707 //\r
708 // First try to login as USER1 to Locking SP to see if we're simply updating its Password\r
709 //\r
710 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_USER1_AUTHORITY);\r
711 if (Ret == TcgResultSuccess) {\r
712 //\r
713 // User1 worked so authority 1 means user 1\r
714 //\r
715 CopyMem(gHiiOldPassword, Password, PassLength);\r
716 gHiiOldPasswordLength = PassLength;\r
717\r
718 return EFI_SUCCESS;\r
719 }\r
720 }\r
721\r
722 //\r
723 // Else try admin1 below\r
724 //\r
725 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_ADMIN1_AUTHORITY);\r
726 if (Ret == TcgResultSuccess) {\r
727 CopyMem(gHiiOldPassword, Password, PassLength);\r
728 gHiiOldPasswordLength = PassLength;\r
729\r
730 return EFI_SUCCESS;\r
731 } else {\r
732 DEBUG ((DEBUG_INFO, "start session with old PW failed - return EFI_NOT_READY - mistyped old PW\n"));\r
733 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Authentication Failure");\r
734\r
735 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
736 gHiiOldPasswordLength = 0;\r
737\r
738 return EFI_NOT_READY;\r
739 }\r
740 }\r
741\r
742 //\r
743 // New Password entered\r
744 //\r
745 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
746 Ret = OpalSupportSetPassword(\r
747 &Session,\r
748 gHiiOldPassword,\r
749 gHiiOldPasswordLength,\r
750 Password,\r
751 PassLength,\r
752 OpalDisk->OpalDevicePath,\r
753 FALSE\r
754 );\r
755 } else {\r
756 Ret = OpalSupportSetPassword(\r
757 &Session,\r
758 gHiiOldPassword,\r
759 gHiiOldPasswordLength,\r
760 Password,\r
761 PassLength,\r
762 OpalDisk->OpalDevicePath,\r
763 TRUE\r
764 );\r
765 }\r
766\r
767 if (Ret == TcgResultSuccess) {\r
768 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
769 }\r
770\r
771 //\r
772 // Reset old Password storage\r
773 //\r
774 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
775 gHiiOldPasswordLength = 0;\r
776\r
777 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
778 return Ret == TcgResultSuccess ? EFI_SUCCESS : EFI_NOT_READY;\r
779}\r
780\r
781/**\r
782 Secure Erases Opal Disk.\r
783\r
784 @param OpalDisk The disk need to erase data.\r
785 @param Password The input password.\r
786 @param PassLength The input password length.\r
787\r
788 @retval EFI_SUCCESS Do the required action success.\r
789\r
790**/\r
791EFI_STATUS\r
792HiiSecureErase(\r
793 OPAL_DISK *OpalDisk,\r
794 const VOID *Password,\r
795 UINT32 PassLength\r
796 )\r
797{\r
798 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
799 BOOLEAN PasswordFailed;\r
800 TCG_RESULT Ret;\r
801 OPAL_SESSION AdminSpSession;\r
802\r
803 if (PassLength == 0) {\r
804 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
805 }\r
806\r
807 ZeroMem(&AdminSpSession, sizeof(AdminSpSession));\r
808 AdminSpSession.Sscp = OpalDisk->Sscp;\r
809 AdminSpSession.MediaId = OpalDisk->MediaId;\r
810 AdminSpSession.OpalBaseComId = OpalDisk->OpalBaseComId;\r
811\r
812 Ret = OpalUtilSecureErase(&AdminSpSession, Password, PassLength, &PasswordFailed);\r
813 if (Ret == TcgResultSuccess) {\r
814 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Success" );\r
815 } else {\r
816 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Failure" );\r
817 }\r
818 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
819\r
820 //\r
821 // If Password failed, return invalid passowrd\r
822 //\r
823 if (PasswordFailed) {\r
824 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
825 return EFI_NOT_READY;\r
826 }\r
827\r
828 //\r
829 // Indicates Password was valid and is not changing to UEFI\r
830 // Response string will indicate action error\r
831 //\r
832 return EFI_DEVICE_ERROR;\r
833}\r
834\r
835\r
836/**\r
837 Disables User for Opal Disk.\r
838\r
839 @param OpalDisk The disk need to the action.\r
840 @param Password The input password.\r
841 @param PassLength The input password length.\r
842\r
843 @retval EFI_SUCCESS Do the required action success.\r
844\r
845**/\r
846EFI_STATUS\r
847HiiDisableUser(\r
848 OPAL_DISK *OpalDisk,\r
849 VOID *Password,\r
850 UINT32 PassLength\r
851 )\r
852{\r
853 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
854 BOOLEAN PasswordFailed;\r
855 TCG_RESULT Ret;\r
856 OPAL_SESSION Session;\r
857\r
858 if (PassLength == 0) {\r
859 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
860 }\r
861\r
862 ZeroMem(&Session, sizeof(Session));\r
863 Session.Sscp = OpalDisk->Sscp;\r
864 Session.MediaId = OpalDisk->MediaId;\r
865 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
866\r
867 Ret = OpalSupportDisableUser(&Session, Password, PassLength, &PasswordFailed, OpalDisk->OpalDevicePath);\r
868 if (Ret == TcgResultSuccess) {\r
869 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Success" );\r
870 } else {\r
871 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Failure" );\r
872 }\r
873 HiiSetFormString (STRING_TOKEN(STR_ACTION_STATUS), Response);\r
874\r
875 //\r
876 // If Password failed, return invalid passowrd\r
877 //\r
878 if (PasswordFailed) {\r
879 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
880 return EFI_NOT_READY;\r
881 }\r
882\r
883 //\r
884 // Indicates Password was valid and is not changing to UEFI\r
885 // Response string will indicate action error\r
886 //\r
887 return EFI_DEVICE_ERROR;\r
888}\r
889\r
890/**\r
891 Revert Opal Disk as Admin1.\r
892\r
893 @param OpalDisk The disk need to the action.\r
894 @param Password The input password.\r
895 @param PassLength The input password length.\r
896 @param KeepUserData Whether need to keey user data.\r
897\r
898 @retval EFI_SUCCESS Do the required action success.\r
899\r
900**/\r
901EFI_STATUS\r
902HiiRevert(\r
903 OPAL_DISK *OpalDisk,\r
904 VOID *Password,\r
905 UINT32 PassLength,\r
906 BOOLEAN KeepUserData\r
907 )\r
908{\r
909 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
910 BOOLEAN PasswordFailed;\r
911 TCG_RESULT Ret;\r
912 OPAL_SESSION Session;\r
913\r
914 if (PassLength == 0) {\r
915 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
916 // return error to indicate there is an existing Password\r
917 return EFI_DEVICE_ERROR;\r
918 }\r
919\r
920 ZeroMem(&Session, sizeof(Session));\r
921 Session.Sscp = OpalDisk->Sscp;\r
922 Session.MediaId = OpalDisk->MediaId;\r
923 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
924\r
925 Ret = OpalSupportRevert(\r
926 &Session,\r
927 KeepUserData,\r
928 Password,\r
929 PassLength,\r
930 OpalDisk->Msid,\r
931 OpalDisk->MsidLength,\r
932 &PasswordFailed,\r
933 OpalDisk->OpalDevicePath\r
934 );\r
935 if (Ret == TcgResultSuccess) {\r
936 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Success" );\r
937 } else {\r
938 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Failure" );\r
939 }\r
940 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
941\r
942 //\r
943 // If Password failed, return invalid passowrd\r
944 //\r
945 if (PasswordFailed) {\r
946 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
947 return EFI_NOT_READY;\r
948 }\r
949\r
950 //\r
951 // Indicates Password was valid and is not changing to UEFI\r
952 // Response string will indicate action error\r
953 //\r
954 return EFI_DEVICE_ERROR;\r
955}\r
956\r
957/**\r
958 Unlocks Opal Disk.\r
959\r
960 @param OpalDisk The disk need to the action.\r
961 @param Password The input password.\r
962 @param PassLength The input password length.\r
963\r
964 @retval EFI_SUCCESS Do the required action success.\r
965\r
966**/\r
967EFI_STATUS\r
968HiiUnlock(\r
969 OPAL_DISK *OpalDisk,\r
970 VOID *Password,\r
971 UINT32 PassLength\r
972 )\r
973{\r
974 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
975 TCG_RESULT Ret;\r
976 OPAL_SESSION Session;\r
977\r
978 if (PassLength == 0) {\r
979 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
980 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
981 }\r
982\r
983 ZeroMem(&Session, sizeof(Session));\r
984 Session.Sscp = OpalDisk->Sscp;\r
985 Session.MediaId = OpalDisk->MediaId;\r
986 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
987\r
988 Ret = OpalSupportUnlock(&Session, Password, PassLength, OpalDisk->OpalDevicePath);\r
989 if (Ret == TcgResultSuccess) {\r
990 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Success" );\r
991 } else {\r
992 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Failure" );\r
993 }\r
994\r
995 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
996\r
997 if (Ret == TcgResultSuccess) {\r
998 DEBUG ((DEBUG_INFO, "returning error to indicate Password was correct but is not changing\n"));\r
999 return EFI_DEVICE_ERROR;\r
1000 } else {\r
1001 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1002 return EFI_NOT_READY;\r
1003 }\r
1004}\r
1005\r
1006/**\r
1007 Use the input password to do the specified action.\r
1008\r
1009 @param Str The input password saved in.\r
1010\r
1011 @retval EFI_SUCCESS Do the required action success.\r
1012 @retval Others Other error occur.\r
1013\r
1014**/\r
1015EFI_STATUS\r
1016HiiPasswordEntered(\r
1017 EFI_STRING_ID Str\r
1018 )\r
1019{\r
1020 OPAL_DISK* OpalDisk;\r
1021 CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
1022 CHAR16* UniStr;\r
1023 UINT32 PassLength;\r
1024 EFI_STATUS Status;\r
1025\r
1026 OpalHiiGetBrowserData();\r
1027\r
1028 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
1029 if (OpalDisk == NULL) {\r
1030 DEBUG ((DEBUG_INFO, "ERROR: disk %u not found\n", gHiiConfiguration.SelectedDiskIndex));\r
1031 return EFI_NOT_FOUND;\r
1032 }\r
1033\r
1034 if (Str == 0) {\r
1035 DEBUG ((DEBUG_INFO, "ERROR: str=NULL\n"));\r
1036 return EFI_INVALID_PARAMETER;\r
1037 }\r
1038\r
1039 ZeroMem(Password, sizeof(Password));\r
1040\r
1041 UniStr = HiiGetString(gHiiPackageListHandle, Str, NULL);\r
1042 if (UniStr == NULL) {\r
1043 return EFI_NOT_FOUND;\r
1044 }\r
1045 PassLength = (UINT32) StrLen (UniStr);\r
1046 if (PassLength >= sizeof(Password)) {\r
1047 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
1048 gBS->FreePool(UniStr);\r
1049 return EFI_BUFFER_TOO_SMALL;\r
1050 }\r
1051\r
b7c71793 1052 UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
a06875e1
ED
1053 gBS->FreePool(UniStr);\r
1054\r
a06875e1
ED
1055 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
1056 Status = HiiUnlock (OpalDisk, Password, PassLength);\r
1057 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SECURE_ERASE) {\r
1058 Status = HiiSecureErase (OpalDisk, Password, PassLength);\r
1059 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
1060 Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
1061 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
0efc3be0
ED
1062 if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) {\r
1063 //\r
1064 // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter.\r
1065 // So here hardcode a FALSE for this case.\r
1066 //\r
1067 Status = HiiRevert(OpalDisk, Password, PassLength, FALSE);\r
1068 } else {\r
1069 Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
1070 }\r
a06875e1
ED
1071 } else {\r
1072 Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
1073 }\r
1074\r
1075 OpalHiiSetBrowserData ();\r
1076\r
1077 return Status;\r
1078}\r
1079\r
1080/**\r
1081 Update block sid info.\r
1082\r
1083 @param Enable Enable/disable BlockSid.\r
1084\r
1085 @retval EFI_SUCCESS Do the required action success.\r
1086 @retval Others Other error occur.\r
1087\r
1088**/\r
1089EFI_STATUS\r
1090HiiSetBlockSid (\r
1091 BOOLEAN Enable\r
1092 )\r
1093{\r
1094 EFI_STATUS Status;\r
1095 OPAL_EXTRA_INFO_VAR OpalExtraInfo;\r
1096 UINTN DataSize;\r
1097\r
1098 Status = EFI_SUCCESS;\r
1099\r
a06875e1
ED
1100 OpalExtraInfo.EnableBlockSid = Enable;\r
1101 DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
1102 Status = gRT->SetVariable (\r
1103 OPAL_EXTRA_INFO_VAR_NAME,\r
1104 &gOpalExtraInfoVariableGuid,\r
1105 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
1106 DataSize,\r
1107 &OpalExtraInfo\r
1108 );\r
a06875e1
ED
1109\r
1110 return Status;\r
1111}\r
1112\r
1113/**\r
1114 This function processes the results of changes in configuration.\r
1115\r
1116 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1117 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
1118 format.\r
1119 @param Progress A pointer to a string filled in with the offset of\r
1120 the most recent '&' before the first failing\r
1121 name/value pair (or the beginning of the string if\r
1122 the failure is in the first name/value pair) or\r
1123 the terminating NULL if all was successful.\r
1124\r
1125 @retval EFI_SUCCESS The Results is processed successfully.\r
1126 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
1127 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1128 driver.\r
1129\r
1130**/\r
1131EFI_STATUS\r
1132EFIAPI\r
1133RouteConfig(\r
1134 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1135 CONST EFI_STRING Configuration,\r
1136 EFI_STRING *Progress\r
1137 )\r
1138{\r
a06875e1
ED
1139 if (Configuration == NULL || Progress == NULL) {\r
1140 return (EFI_INVALID_PARAMETER);\r
1141 }\r
1142\r
eafbd7a2
DB
1143 *Progress = Configuration;\r
1144 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1145 return EFI_NOT_FOUND;\r
1146 }\r
1147\r
1148 *Progress = Configuration + StrLen (Configuration);\r
1149\r
a06875e1
ED
1150 return EFI_SUCCESS;\r
1151}\r
1152\r
1153/**\r
1154 This function allows a caller to extract the current configuration for one\r
1155 or more named elements from the target driver.\r
1156\r
1157 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1158 @param Request A null-terminated Unicode string in\r
1159 <ConfigRequest> format.\r
1160 @param Progress On return, points to a character in the Request\r
1161 string. Points to the string's null terminator if\r
1162 request was successful. Points to the most recent\r
1163 '&' before the first failing name/value pair (or\r
1164 the beginning of the string if the failure is in\r
1165 the first name/value pair) if the request was not\r
1166 successful.\r
1167 @param Results A null-terminated Unicode string in\r
1168 <ConfigAltResp> format which has all values filled\r
1169 in for the names in the Request string. String to\r
1170 be allocated by the called function.\r
1171\r
1172 @retval EFI_SUCCESS The Results is filled with the requested values.\r
1173 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
1174 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
1175 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1176 driver.\r
1177\r
1178**/\r
1179EFI_STATUS\r
1180EFIAPI\r
1181ExtractConfig(\r
1182 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1183 CONST EFI_STRING Request,\r
1184 EFI_STRING *Progress,\r
1185 EFI_STRING *Results\r
1186 )\r
1187{\r
1188 EFI_STATUS Status;\r
1189\r
a06875e1
ED
1190 //\r
1191 // Check for valid parameters\r
1192 //\r
1193 if (Progress == NULL || Results == NULL) {\r
1194 return (EFI_INVALID_PARAMETER);\r
1195 }\r
1196\r
eafbd7a2
DB
1197 *Progress = Request;\r
1198 if ((Request != NULL) &&\r
1199 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1200 return EFI_NOT_FOUND;\r
1201 }\r
1202\r
a06875e1
ED
1203 //\r
1204 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
1205 //\r
1206 Status = gHiiConfigRouting->BlockToConfig(\r
1207 gHiiConfigRouting,\r
1208 Request,\r
1209 (UINT8*)&gHiiConfiguration,\r
1210 sizeof(OPAL_HII_CONFIGURATION),\r
1211 Results,\r
1212 Progress\r
1213 );\r
1214\r
1215 return (Status);\r
1216}\r
1217\r
1218\r
1219/**\r
1220\r
1221 Pass the current system state to the bios via the hii_G_Configuration.\r
1222\r
1223**/\r
1224VOID\r
1225OpalHiiSetBrowserData (\r
1226 VOID\r
1227 )\r
1228{\r
a06875e1
ED
1229 HiiSetBrowserData(\r
1230 &gHiiSetupVariableGuid,\r
1231 (CHAR16*)L"OpalHiiConfig",\r
1232 sizeof(gHiiConfiguration),\r
1233 (UINT8*)&gHiiConfiguration,\r
1234 NULL\r
1235 );\r
1236}\r
1237\r
1238\r
1239/**\r
1240\r
1241 Populate the hii_g_Configuraton with the browser Data.\r
1242\r
1243**/\r
1244VOID\r
1245OpalHiiGetBrowserData (\r
1246 VOID\r
1247 )\r
1248{\r
a06875e1
ED
1249 HiiGetBrowserData(\r
1250 &gHiiSetupVariableGuid,\r
1251 (CHAR16*)L"OpalHiiConfig",\r
1252 sizeof(gHiiConfiguration),\r
1253 (UINT8*)&gHiiConfiguration\r
1254 );\r
1255}\r
1256\r
1257/**\r
1258 Set a string Value in a form.\r
1259\r
1260 @param DestStringId The stringid which need to update.\r
1261 @param SrcAsciiStr The string nned to update.\r
1262\r
1263 @retval EFI_SUCCESS Do the required action success.\r
1264 @retval Others Other error occur.\r
1265\r
1266**/\r
1267EFI_STATUS\r
1268HiiSetFormString(\r
1269 EFI_STRING_ID DestStringId,\r
1270 CHAR8 *SrcAsciiStr\r
1271 )\r
1272{\r
1273 UINT32 Len;\r
1274 UINT32 UniSize;\r
1275 CHAR16* UniStr;\r
1276\r
a06875e1
ED
1277 //\r
1278 // Determine the Length of the sting\r
1279 //\r
1280 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1281\r
1282 //\r
1283 // Allocate space for the unicode string, including terminator\r
1284 //\r
1285 UniSize = (Len + 1) * sizeof(CHAR16);\r
1286 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1287\r
1288 //\r
1289 // Copy into unicode string, then copy into string id\r
1290 //\r
b7c71793 1291 AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
a06875e1
ED
1292\r
1293 //\r
1294 // Update the string in the form\r
1295 //\r
1296 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1297 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1298 FreePool(UniStr);\r
1299 return (EFI_OUT_OF_RESOURCES);\r
1300 }\r
1301\r
1302 //\r
1303 // Free the memory\r
1304 //\r
1305 FreePool(UniStr);\r
1306\r
1307 return (EFI_SUCCESS);\r
1308}\r
1309\r
1310/**\r
1311 Initialize the Opal disk base on the hardware info get from device.\r
1312\r
1313 @param Dev The Opal device.\r
1314\r
1315 @retval EFI_SUCESS Initialize the device success.\r
1316 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1317\r
1318**/\r
1319EFI_STATUS\r
1320OpalDiskInitialize (\r
1321 IN OPAL_DRIVER_DEVICE *Dev\r
1322 )\r
1323{\r
1324 TCG_RESULT TcgResult;\r
1325 OPAL_SESSION Session;\r
1326\r
1327 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1328 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1329 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1330 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1331\r
1332 ZeroMem(&Session, sizeof(Session));\r
1333 Session.Sscp = Dev->Sscp;\r
1334 Session.MediaId = Dev->MediaId;\r
1335\r
1336 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1337 if (TcgResult != TcgResultSuccess) {\r
1338 return EFI_DEVICE_ERROR;\r
1339 }\r
1340 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1341\r
1342 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1343 if (TcgResult != TcgResultSuccess) {\r
1344 return EFI_DEVICE_ERROR;\r
1345 }\r
1346\r
1347 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1348}\r
1349\r
1350/**\r
1351 Update the device info.\r
1352\r
1353 @param OpalDisk The Opal device.\r
1354\r
1355 @retval EFI_SUCESS Initialize the device success.\r
1356 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1357 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1358\r
1359**/\r
1360EFI_STATUS\r
1361OpalDiskUpdateStatus (\r
1362 OPAL_DISK *OpalDisk\r
1363 )\r
1364{\r
1365 TCG_RESULT TcgResult;\r
1366 OPAL_SESSION Session;\r
1367\r
1368 ZeroMem(&Session, sizeof(Session));\r
1369 Session.Sscp = OpalDisk->Sscp;\r
1370 Session.MediaId = OpalDisk->MediaId;\r
1371 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1372\r
1373 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1374 if (TcgResult != TcgResultSuccess) {\r
1375 return EFI_DEVICE_ERROR;\r
1376 }\r
1377\r
1378 if (OpalDisk->MsidLength == 0) {\r
1379 return EFI_INVALID_PARAMETER;\r
1380 } else {\r
1381 //\r
1382 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1383 //\r
1384 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1385 }\r
1386\r
1387 return EFI_SUCCESS;\r
1388}\r
1389\r