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