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