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