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